1
1
cmake_minimum_required (VERSION 3.16)
2
2
3
+ include (FetchContent)
4
+
5
+ if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0" )
6
+ cmake_policy (SET CMP0135 NEW)
7
+ endif ()
8
+
9
+ # Add project_options from https://github.com/aminya/project_options
10
+ set (PROJECT_OPTIONS_VERSION "v0.41.0" )
11
+ FetchContent_Declare(
12
+ _project_options
13
+ URL https://github.com/aminya/project_options/archive/refs/tags/${PROJECT_OPTIONS_VERSION} .zip
14
+ )
15
+ FetchContent_MakeAvailable(_project_options)
16
+ include (${_project_options_SOURCE_DIR} /Index.cmake)
17
+
18
+ # Detect ZeroMQ options from environment variables
3
19
macro (set_option_from_env OPTION_NAME)
4
20
string (TOLOWER ${OPTION_NAME} OPTION_NAME_LOWER)
5
21
@@ -50,33 +66,34 @@ set_option_from_env(ZMQ_WEBSOCKETS_SECURE)
50
66
option (ZMQ_NO_SYNC_RESOLVE "send/receive on the socket immediately" OFF )
51
67
set_option_from_env(ZMQ_NO_SYNC_RESOLVE)
52
68
53
- if (APPLE )
54
- option (MACOSX_DEPLOYMENT_TARGET "MacOS deployment target" "10.15" )
55
- set_option_from_env(MACOSX_DEPLOYMENT_TARGET)
56
- set (CMAKE_OSX_DEPLOYMENT_TARGET ${MACOSX_DEPLOYMENT_TARGET} )
57
- endif ()
58
-
69
+ # Add undefined behavior sanitizer if requested
59
70
option (ZMQ_ENABLE_SANITIZER_UNDEFINED "Enable undefined behavior sanitizer" OFF )
60
71
set_option_from_env(ZMQ_ENABLE_SANITIZER_UNDEFINED)
61
72
62
73
if (${ZMQ_ENABLE_SANITIZER_UNDEFINED} )
63
74
set (ENABLE_SANITIZER_UNDEFINED "ENABLE_SANITIZER_UNDEFINED" )
64
75
endif ()
65
76
66
- # target system on Windows (for cross-compiling x86) and static linking runtimes
77
+ # Set MacOS deployment target
78
+ if (APPLE )
79
+ option (MACOSX_DEPLOYMENT_TARGET "MacOS deployment target" "10.15" )
80
+ set_option_from_env(MACOSX_DEPLOYMENT_TARGET)
81
+ set (CMAKE_OSX_DEPLOYMENT_TARGET ${MACOSX_DEPLOYMENT_TARGET} )
82
+ endif ()
83
+
84
+ # Set position independent code on all platforms
85
+ set (CMAKE_POSITION_INDEPENDENT_CODE TRUE )
86
+
87
+ # Set static runtime on Windows
67
88
if (WIN32 )
68
89
if ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "" )
69
- if ("$ENV{Platform} " STREQUAL "x86" )
70
- set (CMAKE_SYSTEM_PROCESSOR "x86" )
71
- elseif (NOT "$ENV{PROCESSOR_ARCHITEW6432} " STREQUAL "" )
72
- set (CMAKE_SYSTEM_PROCESSOR "$ENV{PROCESSOR_ARCHITEW6432} " )
73
- else ()
74
- set (CMAKE_SYSTEM_PROCESSOR "$ENV{PROCESSOR_ARCHITECTURE} " )
75
- endif ()
90
+ detect_compiler()
91
+ string (TOLOWER "${DETECTED_CMAKE_HOST_SYSTEM_PROCESSOR} " CMAKE_SYSTEM_PROCESSOR_LOWER)
92
+ else ()
93
+ string (TOLOWER "${CMAKE_SYSTEM_PROCESSOR} " CMAKE_SYSTEM_PROCESSOR_LOWER)
76
94
endif ()
77
95
78
- string (TOLOWER "${CMAKE_SYSTEM_PROCESSOR} " CMAKE_SYSTEM_PROCESSOR_LOWER)
79
-
96
+ # set vcpkg triplet to static runtime
80
97
if ("${CMAKE_SYSTEM_PROCESSOR_LOWER} " STREQUAL "amd64" OR "${CMAKE_SYSTEM_PROCESSOR_LOWER} " STREQUAL "x64" )
81
98
set (VCPKG_TARGET_TRIPLET "x64-windows-static" )
82
99
elseif ("${CMAKE_SYSTEM_PROCESSOR_LOWER} " STREQUAL "arm64" OR "${CMAKE_SYSTEM_PROCESSOR_LOWER} " STREQUAL "aarch64" )
@@ -87,33 +104,11 @@ if(WIN32)
87
104
message (STATUS "Not setting VCPKG_TARGET_TRIPLET for ${CMAKE_SYSTEM_PROCESSOR} " )
88
105
endif ()
89
106
90
- # Avoid loading of project_optinos/WindowsToolchain
91
- set (CMAKE_TOOLCHAIN_FILE ";" )
92
-
93
107
# use static runtime library
94
108
set (CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>" )
95
109
endif ()
96
110
97
- include (FetchContent)
98
-
99
- if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0" )
100
- cmake_policy (SET CMP0135 NEW)
101
- endif ()
102
-
103
- set (CMAKE_POSITION_INDEPENDENT_CODE TRUE )
104
-
105
- # Add project_options from https://github.com/aminya/project_options Change the
106
- # version in the following URL to update the package (watch the releases of the
107
- # repository for future updates)
108
- set (PROJECT_OPTIONS_VERSION "v0.36.6" )
109
- FetchContent_Declare(
110
- _project_options
111
- URL https://github.com/aminya/project_options/archive/refs/tags/${PROJECT_OPTIONS_VERSION} .zip
112
- )
113
- FetchContent_MakeAvailable(_project_options)
114
- include (${_project_options_SOURCE_DIR} /Index.cmake)
115
-
116
- # MacOS flags that should be set prior to any project calls
111
+ # Defer undefined symbol resolution to runtime on MacOS
117
112
if (APPLE )
118
113
set (CMAKE_SHARED_LINKER_FLAGS
119
114
"${CMAKE_SHARED_LINKER_FLAGS} -undefined dynamic_lookup" )
@@ -122,7 +117,7 @@ endif()
122
117
run_vcpkg(VCPKG_URL "https://github.com/microsoft/vcpkg.git" VCPKG_REV
123
118
"608d1dbcd6969679f82b1ca6b89d58939c9b228e" )
124
119
125
- # Name of the project (will be the name of the plugin)
120
+ # Name of the addon
126
121
project (addon LANGUAGES C CXX)
127
122
128
123
project_options(
@@ -158,12 +153,14 @@ target_link_system_libraries(addon PRIVATE libzmq libzmq-static)
158
153
target_include_system_directories(addon PRIVATE ${CMAKE_JS_INC} )
159
154
target_link_system_libraries(addon PRIVATE ${CMAKE_JS_LIB} )
160
155
156
+ # Node flags
161
157
target_compile_definitions (addon PRIVATE V8_COMPRESS_POINTERS)
162
158
target_compile_definitions (addon PRIVATE V8_31BIT_SMIS_ON_64BIT_ARCH)
163
159
target_compile_definitions (addon PRIVATE V8_REVERSE_JSARGS)
164
160
target_compile_definitions (addon PRIVATE BUILDING_NODE_EXTENSION)
165
161
target_compile_definitions (addon PRIVATE NAPI_CPP_EXCEPTIONS)
166
162
163
+ # Windows definitions
167
164
if (WIN32 )
168
165
target_compile_definitions (addon PRIVATE "NOMINMAX" )
169
166
target_compile_definitions (addon PRIVATE "NOGDI" )
@@ -173,7 +170,7 @@ endif()
173
170
# Use `.node` for the library without any "lib" prefix
174
171
set_target_properties (addon PROPERTIES PREFIX "" SUFFIX ".node" )
175
172
176
- # Windows
173
+ # Windows delay load node.exe
177
174
if (WIN32 )
178
175
set_property (TARGET addon PROPERTY LINK_FLAGS "-Xlinker /DELAYLOAD:NODE.EXE" )
179
176
target_link_libraries (addon PRIVATE "ShLwApi.lib" "delayimp.lib" )
0 commit comments