-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
111 lines (90 loc) · 3.67 KB
/
CMakeLists.txt
File metadata and controls
111 lines (90 loc) · 3.67 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
cmake_minimum_required(VERSION 3.15 FATAL_ERROR)
project(ctypes)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
add_definitions(-DNAPI_VERSION=9)
add_definitions(-DNAPI_CPP_EXCEPTIONS)
# ============================================================================
# Determina architettura
# ============================================================================
if(WIN32)
if(CMAKE_VS_PLATFORM_NAME)
if(CMAKE_VS_PLATFORM_NAME STREQUAL "ARM64")
set(FFI_ARCH "arm64")
elseif(CMAKE_VS_PLATFORM_NAME STREQUAL "x64")
set(FFI_ARCH "amd64")
elseif(CMAKE_VS_PLATFORM_NAME STREQUAL "Win32")
set(FFI_ARCH "win32")
endif()
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64|aarch64")
set(FFI_ARCH "arm64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64|x86_64")
set(FFI_ARCH "amd64")
else()
set(FFI_ARCH "win32")
endif()
else()
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
set(FFI_ARCH "aarch64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64")
set(FFI_ARCH "x86_64")
else()
set(FFI_ARCH "x86")
endif()
endif()
message(STATUS "Target architecture: ${FFI_ARCH}")
# ============================================================================
# Build libffi from source (static)
# ============================================================================
message(STATUS "Building libffi from source...")
add_subdirectory(${CMAKE_SOURCE_DIR}/third-party/libffi_cmake)
# ============================================================================
# node-ctypes module
# ============================================================================
# node-addon-api
execute_process(
COMMAND node -p "require('node-addon-api').include"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE NODE_ADDON_API_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
file(GLOB_RECURSE SOURCE_FILES "src/*.cc" "src/*.h")
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC})
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
if(NODE_ADDON_API_DIR)
string(REGEX REPLACE "[\r\n\"]" "" NODE_ADDON_API_DIR "${NODE_ADDON_API_DIR}")
target_include_directories(${PROJECT_NAME} PRIVATE ${NODE_ADDON_API_DIR})
endif()
# Include directories
if(CMAKE_JS_INC)
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_JS_INC})
endif()
# third-party
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/third-party)
# libffi (includes exported via target_include_directories PUBLIC)
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/src)
# Link
if(CMAKE_JS_LIB)
target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_JS_LIB})
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE ffi_static)
target_compile_definitions(${PROJECT_NAME} PRIVATE FFI_STATIC_BUILD)
if(MSVC)
target_compile_options(${PROJECT_NAME} PRIVATE /utf-8)
target_compile_options(${PROJECT_NAME} PRIVATE /bigobj)
if(CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET)
execute_process(COMMAND ${CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS})
endif()
endif()
# ============================================================================
# Info
# ============================================================================
message(STATUS "")
message(STATUS "=== node-ctypes ===")
message(STATUS " Platform: ${CMAKE_SYSTEM_NAME}")
message(STATUS " Architecture: ${FFI_ARCH}")
message(STATUS " libffi: static (from source)")
message(STATUS "===================")