1 | cmake_minimum_required(VERSION 3.16)
|
2 |
|
3 | macro(set_option_from_env OPTION_NAME)
|
4 | string(TOLOWER ${OPTION_NAME} OPTION_NAME_LOWER)
|
5 |
|
6 | if(DEFINED ENV{npm_config_${OPTION_NAME_LOWER}})
|
7 | if("$ENV{npm_config_${OPTION_NAME_LOWER}}" STREQUAL "true")
|
8 | set("${OPTION_NAME}"
|
9 | ON
|
10 | CACHE BOOL "npm_config_${OPTION_NAME_LOWER}")
|
11 | elseif("$ENV{npm_config_${OPTION_NAME_LOWER}}" STREQUAL "false")
|
12 | set("${OPTION_NAME}"
|
13 | OFF
|
14 | CACHE BOOL "npm_config_${OPTION_NAME_LOWER}")
|
15 | else()
|
16 | set("${OPTION_NAME}"
|
17 | "$ENV{npm_config_${OPTION_NAME_LOWER}}"
|
18 | CACHE STRING "npm_config_${OPTION_NAME_LOWER}")
|
19 | endif()
|
20 | endif()
|
21 |
|
22 | if(${OPTION_NAME})
|
23 | string(REPLACE "zmq_" "" OPTION_NAME_LOWER "${OPTION_NAME_LOWER}")
|
24 | string(REPLACE "_" "-" OPTION_NAME_LOWER "${OPTION_NAME_LOWER}")
|
25 | list(APPEND VCPKG_MANIFEST_FEATURES ${OPTION_NAME_LOWER})
|
26 | endif()
|
27 |
|
28 | message(STATUS "${OPTION_NAME}: ${${OPTION_NAME}}")
|
29 | endmacro()
|
30 |
|
31 | option(ZMQ_DRAFT "Build and install draft APIs" OFF)
|
32 | set_option_from_env(ZMQ_DRAFT)
|
33 |
|
34 | option(ZMQ_CURVE "Enable CURVE security" OFF)
|
35 | set_option_from_env(ZMQ_CURVE)
|
36 |
|
37 | option(ZMQ_SODIUM "Using libsodium for CURVE security" OFF)
|
38 | set_option_from_env(ZMQ_SODIUM)
|
39 |
|
40 | option(ZMQ_WEBSOCKETS "Enable WebSocket transport" OFF)
|
41 | set_option_from_env(ZMQ_WEBSOCKETS)
|
42 |
|
43 | option(ZMQ_WEBSOCKETS_SECURE "Enable WebSocket transport with TSL (wss)" OFF)
|
44 | set_option_from_env(ZMQ_WEBSOCKETS_SECURE)
|
45 |
|
46 | option(ZMQ_NO_SYNC_RESOLVE "send/receive on the socket immediately" OFF)
|
47 | set_option_from_env(ZMQ_NO_SYNC_RESOLVE)
|
48 |
|
49 | if(APPLE)
|
50 | option(MACOSX_DEPLOYMENT_TARGET "MacOS deployment target" "10.15")
|
51 | set_option_from_env(MACOSX_DEPLOYMENT_TARGET)
|
52 | set(CMAKE_OSX_DEPLOYMENT_TARGET ${MACOSX_DEPLOYMENT_TARGET})
|
53 | endif()
|
54 |
|
55 | # target system on Windows (for cross-compiling x86) and static linking runtimes
|
56 | if(WIN32)
|
57 | if("$ENV{Platform}" STREQUAL "x86")
|
58 | set(CMAKE_SYSTEM_PROCESSOR "x86")
|
59 | set(VCPKG_TARGET_TRIPLET "x86-windows-static")
|
60 | elseif(NOT "$ENV{PROCESSOR_ARCHITEW6432}" STREQUAL "")
|
61 | set(CMAKE_SYSTEM_PROCESSOR "$ENV{PROCESSOR_ARCHITEW6432}")
|
62 | set(VCPKG_TARGET_TRIPLET "x86-windows-static")
|
63 | else()
|
64 | set(CMAKE_SYSTEM_PROCESSOR "$ENV{PROCESSOR_ARCHITECTURE}")
|
65 | set(VCPKG_TARGET_TRIPLET "x64-windows-static")
|
66 | endif()
|
67 |
|
68 | # Avoid loading of project_optinos/WindowsToolchain
|
69 | set(CMAKE_TOOLCHAIN_FILE ";")
|
70 |
|
71 | # use static runtime library
|
72 | set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
73 | endif()
|
74 |
|
75 | include(FetchContent)
|
76 |
|
77 | if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
|
78 | cmake_policy(SET CMP0135 NEW)
|
79 | endif()
|
80 |
|
81 | set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
|
82 |
|
83 | # Add project_options from https://github.com/aminya/project_options Change the
|
84 | # version in the following URL to update the package (watch the releases of the
|
85 | # repository for future updates)
|
86 | set(PROJECT_OPTIONS_VERSION "v0.36.6")
|
87 | FetchContent_Declare(
|
88 | _project_options
|
89 | URL https://github.com/aminya/project_options/archive/refs/tags/${PROJECT_OPTIONS_VERSION}.zip
|
90 | )
|
91 | FetchContent_MakeAvailable(_project_options)
|
92 | include(${_project_options_SOURCE_DIR}/Index.cmake)
|
93 |
|
94 | # MacOS flags that should be set prior to any project calls
|
95 | if(APPLE)
|
96 | set(CMAKE_SHARED_LINKER_FLAGS
|
97 | "${CMAKE_SHARED_LINKER_FLAGS} -undefined dynamic_lookup")
|
98 | endif()
|
99 |
|
100 | run_vcpkg(VCPKG_URL "https://github.com/microsoft/vcpkg.git" VCPKG_REV
|
101 | "ee2d2a100103e0f3613c60655dcf15be7d5157b8")
|
102 |
|
103 | # Name of the project (will be the name of the plugin)
|
104 | project(addon LANGUAGES C CXX)
|
105 |
|
106 | project_options(ENABLE_CACHE ENABLE_COMPILE_COMMANDS_SYMLINK)
|
107 |
|
108 | file(GLOB_RECURSE SOURCES "./src/*.cc")
|
109 | add_library(addon SHARED ${SOURCES})
|
110 |
|
111 | if(CMAKE_CXX_COMPILER_ID STREQUAL GNU
|
112 | OR CMAKE_CXX_COMPILER_ID STREQUAL Clang
|
113 | OR CMAKE_CXX_COMPILER_ID STREQUAL AppleClang)
|
114 | target_compile_options(project_warnings INTERFACE "-Wno-shadow")
|
115 | endif()
|
116 |
|
117 | target_link_libraries(addon PRIVATE project_options project_warnings)
|
118 |
|
119 | if(ZMQ_DRAFT)
|
120 | target_compile_definitions(addon PRIVATE ZMQ_BUILD_DRAFT_API)
|
121 | endif()
|
122 |
|
123 | if(ZMQ_NO_SYNC_RESOLVE)
|
124 | target_compile_definitions(addon PRIVATE ZMQ_NO_SYNC_RESOLVE)
|
125 | endif()
|
126 |
|
127 | # ZeroMQ
|
128 | find_package(ZeroMQ CONFIG REQUIRED)
|
129 | target_link_system_libraries(addon PRIVATE libzmq libzmq-static)
|
130 |
|
131 | # Node specific
|
132 | target_include_system_directories(addon PRIVATE ${CMAKE_JS_INC})
|
133 | target_link_system_libraries(addon PRIVATE ${CMAKE_JS_LIB})
|
134 |
|
135 | target_compile_definitions(addon PRIVATE V8_COMPRESS_POINTERS)
|
136 | target_compile_definitions(addon PRIVATE V8_31BIT_SMIS_ON_64BIT_ARCH)
|
137 | target_compile_definitions(addon PRIVATE V8_REVERSE_JSARGS)
|
138 | target_compile_definitions(addon PRIVATE BUILDING_NODE_EXTENSION)
|
139 | target_compile_definitions(addon PRIVATE NAPI_CPP_EXCEPTIONS)
|
140 |
|
141 | if(WIN32)
|
142 | target_compile_definitions(addon PRIVATE "NOMINMAX")
|
143 | target_compile_definitions(addon PRIVATE "NOGDI")
|
144 | target_compile_definitions(addon PRIVATE "WIN32_LEAN_AND_MEAN")
|
145 | endif()
|
146 |
|
147 | # Use `.node` for the library without any "lib" prefix
|
148 | set_target_properties(addon PROPERTIES PREFIX "" SUFFIX ".node")
|
149 |
|
150 | # Windows
|
151 | if(WIN32)
|
152 | set_property(TARGET addon PROPERTY LINK_FLAGS "-Xlinker /DELAYLOAD:NODE.EXE")
|
153 | target_link_libraries(addon PRIVATE "ShLwApi.lib" "delayimp.lib")
|
154 | endif()
|