|
| 1 | +cmake_minimum_required(VERSION 3.15) |
| 2 | +cmake_policy(SET CMP0091 NEW) |
| 3 | +cmake_policy(SET CMP0042 NEW) |
| 4 | + |
| 5 | +set (CMAKE_CXX_STANDARD 20) |
| 6 | + |
| 7 | +project(node_canbridge) |
| 8 | + |
| 9 | +if(NOT CMAKE_JS_INC) |
| 10 | + include("cmake-js.cmake") |
| 11 | + setup_cmakejs() |
| 12 | +endif () |
| 13 | + |
| 14 | +if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/node_modules) |
| 15 | + message(FATAL_ERROR "You must run 'npm install' in order for NAPI to be available") |
| 16 | +endif() |
| 17 | + |
| 18 | +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) |
| 19 | + |
| 20 | +if(MSVC AND CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET) |
| 21 | + # Generate node.lib |
| 22 | + execute_process(COMMAND ${CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS}) |
| 23 | +endif() |
| 24 | + |
| 25 | +# Set some things up for cross-compiling on Linux using clang |
| 26 | +if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") |
| 27 | + if(SYSTEM STREQUAL "LinuxX64") |
| 28 | + add_compile_options("-target" "x86_64-pc-linux-gnu") |
| 29 | + elseif(SYSTEM STREQUAL "LinuxArm64") |
| 30 | + add_compile_options("-target" "aarch64-pc-linux-gnu") |
| 31 | + add_link_options("-target" "aarch64-pc-linux-gnu" "-fuse-ld=/usr/bin/aarch64-linux-gnu-ld") |
| 32 | + endif() |
| 33 | +endif() |
| 34 | + |
| 35 | +add_definitions(-DNAPI_VERSION=9) # Keep in sync with binding-options.cjs, package.json binary.napi_version, and package.json prepublishOnly |
| 36 | +add_definitions(-DNAPI_DISABLE_CPP_EXCEPTIONS) |
| 37 | + |
| 38 | +set(SOURCES |
| 39 | + src/addon.cc |
| 40 | + src/canWrapper.cc |
| 41 | +) |
| 42 | + |
| 43 | +# Include the node-addon-api wrapper for Node-API |
| 44 | +# TODO: Figure out if this todo applies. I honestly copied it from an older project |
| 45 | +# TODO: Figure out why the build breaks without this, given that the CMake.js README |
| 46 | +# says that it will "add [node-addon-api] to the include search path automatically" |
| 47 | +# https://github.com/cmake-js/cmake-js/tree/6a2a50ba3d2e82a0ea80a8bb77cd2d3a03fb838c#node-api-and-node-addon-api |
| 48 | +execute_process(COMMAND node -p "require('node-addon-api').include" |
| 49 | + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} |
| 50 | + OUTPUT_VARIABLE NODE_ADDON_API_DIR |
| 51 | +) |
| 52 | + |
| 53 | +string(REPLACE "\n" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR}) |
| 54 | +string(REPLACE "\"" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR}) |
| 55 | + |
| 56 | +include_directories(${NODE_ADDON_API_DIR} ${CMAKE_JS_INC} ${CMAKE_CURRENT_SOURCE_DIR}/src |
| 57 | + ${CMAKE_CURRENT_SOURCE_DIR}/externalCompileTimeDeps/include) |
| 58 | + |
| 59 | +add_library(${PROJECT_NAME} SHARED ${SOURCES} ${CMAKE_JS_SRC}) |
| 60 | +set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node") |
| 61 | +target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB} CANBridge wpiHal wpiutil) |
| 62 | + |
| 63 | +target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/externalCompileTimeDeps) |
| 64 | + |
| 65 | +# The ones that don't exist are just skipped |
| 66 | +target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-x64) |
| 67 | +target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-arm64) |
| 68 | +target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-arm32) |
| 69 | +target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-darwin-osxuniversal) |
| 70 | + |
| 71 | +include(move-files.cmake) |
| 72 | + |
| 73 | +foreach(CONFIG_TYPE IN LISTS CMAKE_CONFIGURATION_TYPES) |
| 74 | + # Windows |
| 75 | + create_move_target(CANBridge.dll ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-win32-x64/CANBridge.dll ${CONFIG_TYPE}/CANBridge.dll) |
| 76 | + create_move_target(wpiHal.dll ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-win32-x64/wpiHal.dll ${CONFIG_TYPE}/wpiHal.dll) |
| 77 | + create_move_target(wpiUtil.dll ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-win32-x64/wpiUtil.dll ${CONFIG_TYPE}/wpiUtil.dll) |
| 78 | + |
| 79 | + # Linux x64 |
| 80 | + create_move_target(CANBridge.so ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-x64/CANBridge.so ${CONFIG_TYPE}/CANBridge.so) |
| 81 | + create_move_target(wpiHal.so ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-x64/wpiHal.so ${CONFIG_TYPE}/wpiHal.so) |
| 82 | + create_move_target(wpiUtil.so ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-x64/wpiUtil.so ${CONFIG_TYPE}/wpiUtil.so) |
| 83 | + |
| 84 | + # Linux Arm 32 |
| 85 | + create_move_target(CANBridge.so ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-arm32/CANBridge.so ${CONFIG_TYPE}/CANBridge.so) |
| 86 | + create_move_target(wpiHal.so ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-arm32/wpiHal.so ${CONFIG_TYPE}/wpiHal.so) |
| 87 | + create_move_target(wpiUtil.so ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-arm32/wpiUtil.so ${CONFIG_TYPE}/wpiUtil.so) |
| 88 | + |
| 89 | + # Linux Arm 64 |
| 90 | + create_move_target(CANBridge.so ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-arm64/CANBridge.so ${CONFIG_TYPE}/CANBridge.so) |
| 91 | + create_move_target(wpiHal.so ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-arm64/wpiHal.so ${CONFIG_TYPE}/wpiHal.so) |
| 92 | + create_move_target(wpiUtil.so ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-linux-arm64/wpiUtil.so ${CONFIG_TYPE}/wpiUtil.so) |
| 93 | + |
| 94 | + # macOS |
| 95 | + create_move_target(CANBridge.dylib ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-darwin-osxuniversal/CANBridge.dylib ${CONFIG_TYPE}/CANBridge.dylib) |
| 96 | + create_move_target(wpiHal.dylib ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-darwin-osxuniversal/wpiHal.dylib ${CONFIG_TYPE}/wpiHal.dylib) |
| 97 | + create_move_target(wpiUtil.dylib ${CMAKE_CURRENT_SOURCE_DIR}/prebuilds/node_canbridge-darwin-osxuniversal/wpiUtil.dylib ${CONFIG_TYPE}/wpiUtil.dylib) |
| 98 | +endforeach() |
0 commit comments