UNPKG

5.14 kBPlain TextView Raw
1cmake_minimum_required(VERSION 3.16)
2
3macro(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}}")
29endmacro()
30
31option(ZMQ_DRAFT "Build and install draft APIs" OFF)
32set_option_from_env(ZMQ_DRAFT)
33
34option(ZMQ_CURVE "Enable CURVE security" OFF)
35set_option_from_env(ZMQ_CURVE)
36
37option(ZMQ_SODIUM "Using libsodium for CURVE security" OFF)
38set_option_from_env(ZMQ_SODIUM)
39
40option(ZMQ_WEBSOCKETS "Enable WebSocket transport" OFF)
41set_option_from_env(ZMQ_WEBSOCKETS)
42
43option(ZMQ_WEBSOCKETS_SECURE "Enable WebSocket transport with TSL (wss)" OFF)
44set_option_from_env(ZMQ_WEBSOCKETS_SECURE)
45
46option(ZMQ_NO_SYNC_RESOLVE "send/receive on the socket immediately" OFF)
47set_option_from_env(ZMQ_NO_SYNC_RESOLVE)
48
49if(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})
53endif()
54
55# target system on Windows (for cross-compiling x86) and static linking runtimes
56if(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>")
73endif()
74
75include(FetchContent)
76
77if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
78 cmake_policy(SET CMP0135 NEW)
79endif()
80
81set(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)
86set(PROJECT_OPTIONS_VERSION "v0.36.6")
87FetchContent_Declare(
88 _project_options
89 URL https://github.com/aminya/project_options/archive/refs/tags/${PROJECT_OPTIONS_VERSION}.zip
90)
91FetchContent_MakeAvailable(_project_options)
92include(${_project_options_SOURCE_DIR}/Index.cmake)
93
94# MacOS flags that should be set prior to any project calls
95if(APPLE)
96 set(CMAKE_SHARED_LINKER_FLAGS
97 "${CMAKE_SHARED_LINKER_FLAGS} -undefined dynamic_lookup")
98endif()
99
100run_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)
104project(addon LANGUAGES C CXX)
105
106project_options(ENABLE_CACHE ENABLE_COMPILE_COMMANDS_SYMLINK)
107
108file(GLOB_RECURSE SOURCES "./src/*.cc")
109add_library(addon SHARED ${SOURCES})
110
111if(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")
115endif()
116
117target_link_libraries(addon PRIVATE project_options project_warnings)
118
119if(ZMQ_DRAFT)
120 target_compile_definitions(addon PRIVATE ZMQ_BUILD_DRAFT_API)
121endif()
122
123if(ZMQ_NO_SYNC_RESOLVE)
124 target_compile_definitions(addon PRIVATE ZMQ_NO_SYNC_RESOLVE)
125endif()
126
127# ZeroMQ
128find_package(ZeroMQ CONFIG REQUIRED)
129target_link_system_libraries(addon PRIVATE libzmq libzmq-static)
130
131# Node specific
132target_include_system_directories(addon PRIVATE ${CMAKE_JS_INC})
133target_link_system_libraries(addon PRIVATE ${CMAKE_JS_LIB})
134
135target_compile_definitions(addon PRIVATE V8_COMPRESS_POINTERS)
136target_compile_definitions(addon PRIVATE V8_31BIT_SMIS_ON_64BIT_ARCH)
137target_compile_definitions(addon PRIVATE V8_REVERSE_JSARGS)
138target_compile_definitions(addon PRIVATE BUILDING_NODE_EXTENSION)
139target_compile_definitions(addon PRIVATE NAPI_CPP_EXCEPTIONS)
140
141if(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")
145endif()
146
147# Use `.node` for the library without any "lib" prefix
148set_target_properties(addon PROPERTIES PREFIX "" SUFFIX ".node")
149
150# Windows
151if(WIN32)
152 set_property(TARGET addon PROPERTY LINK_FLAGS "-Xlinker /DELAYLOAD:NODE.EXE")
153 target_link_libraries(addon PRIVATE "ShLwApi.lib" "delayimp.lib")
154endif()