-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
119 lines (109 loc) · 4.5 KB
/
CMakeLists.txt
File metadata and controls
119 lines (109 loc) · 4.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
add_definitions(-DNAPI_VERSION=6)
add_definitions(-DNODE_RUNTIME=node)
add_definitions(-DBUILDING_NODE_EXTENSION)
# If on Windows use npx.cmd instead of npx
if(WIN32)
set(NPX_CMD npx.cmd)
else()
set(NPX_CMD npx)
endif()
execute_process(
COMMAND ${NPX_CMD} cmake-js print-cmakejs-include
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE CMAKE_JS_INC
ERROR_QUIET
)
execute_process(
COMMAND ${NPX_CMD} cmake-js print-cmakejs-lib
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE CMAKE_JS_LIB
ERROR_QUIET
)
execute_process(
COMMAND ${NPX_CMD} cmake-js print-cmakejs-src
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE CMAKE_JS_SRC
ERROR_QUIET
)
# Without this windows breaks with: Invalid character escape '\P'.
string(REPLACE "\\" "/" CMAKE_JS_INC "${CMAKE_JS_INC}")
string(REPLACE "\\" "/" CMAKE_JS_LIB "${CMAKE_JS_LIB}")
string(REPLACE "\\" "/" CMAKE_JS_SRC "${CMAKE_JS_SRC}")
# cmake-js v8 pollutes stdout with log messages (INFO, WARN) before printing
# the actual value. The actual value is always the LAST line of output (from
# console.info() in bin/cmake-js). Some log messages span multiple lines (e.g.
# find-visualstudio: "INFO ... found at:\n\"C:/path\"\nrun with --verbose"),
# so we can't simply strip lines starting with INFO/WARN.
#
# Strategy: strip trailing whitespace, extract only the last line (everything
# after the final \n), then clear any remaining value that isn't a valid path.
# On Linux, when cmake-js returns an empty value, the only output is the INFO
# log line itself (single line, no \n), which must also be cleared.
string(STRIP "${CMAKE_JS_INC}" CMAKE_JS_INC)
string(STRIP "${CMAKE_JS_LIB}" CMAKE_JS_LIB)
string(STRIP "${CMAKE_JS_SRC}" CMAKE_JS_SRC)
# Extract last line: remove everything up to and including the last newline.
string(REGEX REPLACE ".*\n" "" CMAKE_JS_INC "${CMAKE_JS_INC}")
string(REGEX REPLACE ".*\n" "" CMAKE_JS_LIB "${CMAKE_JS_LIB}")
string(REGEX REPLACE ".*\n" "" CMAKE_JS_SRC "${CMAKE_JS_SRC}")
# Clear any value that is not a valid path (e.g. a leftover single-line INFO/WARN log).
# Valid cmake-js values are absolute paths starting with / or a drive letter (e.g. C:/).
if(NOT CMAKE_JS_INC MATCHES "^(/|[A-Za-z]:)")
set(CMAKE_JS_INC "")
endif()
if(NOT CMAKE_JS_LIB MATCHES "^(/|[A-Za-z]:)")
set(CMAKE_JS_LIB "")
endif()
if(NOT CMAKE_JS_SRC MATCHES "^(/|[A-Za-z]:)")
set(CMAKE_JS_SRC "")
endif()
# Print CMAKE_JS variables
message(STATUS "CMake.js configurations: LIB=${CMAKE_JS_LIB}, INC=${CMAKE_JS_INC}, SRC=${CMAKE_JS_SRC}")
get_filename_component(NODE_ADDON_API_INCLUDE_PATH ./node_modules/node-addon-api ABSOLUTE)
include_directories(${CMAKE_JS_INC})
include_directories(${NODE_ADDON_API_INCLUDE_PATH})
file(GLOB CPP_SOURCE_FILES ./src_cpp/*)
file(GLOB JS_SOURCE_FILES
./src_js/*.js
./src_js/*.mjs
./src_js/*.d.ts
)
# Copy all JS/TS files to build directory
file(COPY ${JS_SOURCE_FILES} DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/build")
set(NODEJS_LBUG_LINK_DEPS "")
if(NOT TARGET lbug)
if(NOT LBUG_NODEJS_USE_PRECOMPILED_LIB)
message(FATAL_ERROR "The Node.js addon requires the lbug target or LBUG_NODEJS_USE_PRECOMPILED_LIB=TRUE.")
endif()
if(NOT LBUG_NODEJS_PRECOMPILED_LIB_PATH)
message(FATAL_ERROR "LBUG_NODEJS_PRECOMPILED_LIB_PATH must point to a precompiled static liblbug archive.")
endif()
if(NOT EXISTS "${LBUG_NODEJS_PRECOMPILED_LIB_PATH}")
message(FATAL_ERROR "Precompiled liblbug archive not found: ${LBUG_NODEJS_PRECOMPILED_LIB_PATH}")
endif()
add_library(lbug STATIC IMPORTED GLOBAL)
set_target_properties(lbug PROPERTIES IMPORTED_LOCATION "${LBUG_NODEJS_PRECOMPILED_LIB_PATH}")
target_include_directories(lbug INTERFACE
"${PROJECT_SOURCE_DIR}/src/include"
"${PROJECT_BINARY_DIR}/src/include")
if(WIN32)
target_compile_definitions(lbug INTERFACE LBUG_STATIC_DEFINE)
endif()
set(NODEJS_LBUG_LINK_DEPS "$<LINK_ONLY:lbug_link_deps>")
endif()
add_library(lbugjs SHARED ${CPP_SOURCE_FILES})
if(CMAKE_JS_SRC)
target_sources(lbugjs PRIVATE "${CMAKE_JS_SRC}")
endif()
set_target_properties(lbugjs PROPERTIES PREFIX "" SUFFIX ".node")
set_target_properties(lbugjs
PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build"
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build")
if(APPLE)
target_link_options(lbugjs PRIVATE -undefined dynamic_lookup)
else()
target_link_options(lbugjs PRIVATE -Wl,--export-dynamic)
endif()
target_link_libraries(lbugjs PRIVATE lbug ${NODEJS_LBUG_LINK_DEPS} ${CMAKE_JS_LIB})