dawn_node: Fix Windows build
Generate exported node symbols via a generated .lib file, and link against this, so the linker knows these are declared by node.exe. Bug: dawn:1123 Change-Id: Id8c9c5de6bf5e6b925f26e2a1dbb85dd1e40668c Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/65565 Commit-Queue: Ben Clayton <bclayton@google.com> Reviewed-by: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
parent
94769acc2d
commit
75911ca2b5
|
@ -55,27 +55,19 @@ function(idlgen)
|
||||||
)
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Generate the NapiSymbols.h file from the ${NODE_API_HEADERS_DIR}/symbols.js symbol list
|
|
||||||
set(NAPI_SYMBOLS_H "${GEN_DIR}/NapiSymbols.h")
|
|
||||||
file(READ "${NODE_API_HEADERS_DIR}/symbols.js" NAPI_SYMBOLS_JS_CONTENT)
|
|
||||||
string(REGEX MATCHALL "napi_[a-z0-9_]*" NAPI_SYMBOLS "${NAPI_SYMBOLS_JS_CONTENT}")
|
|
||||||
list(TRANSFORM NAPI_SYMBOLS PREPEND "NAPI_SYMBOL(")
|
|
||||||
list(TRANSFORM NAPI_SYMBOLS APPEND ")\n")
|
|
||||||
string(REPLACE ";" "" NAPI_SYMBOLS "${NAPI_SYMBOLS}")
|
|
||||||
file(GENERATE OUTPUT "${NAPI_SYMBOLS_H}" CONTENT "${NAPI_SYMBOLS}")
|
|
||||||
|
|
||||||
add_subdirectory(binding)
|
add_subdirectory(binding)
|
||||||
add_subdirectory(interop)
|
add_subdirectory(interop)
|
||||||
|
|
||||||
add_library(dawn_node SHARED
|
add_library(dawn_node SHARED
|
||||||
"Module.cpp"
|
"Module.cpp"
|
||||||
"NapiSymbols.cpp"
|
|
||||||
)
|
)
|
||||||
set_target_properties(dawn_node PROPERTIES
|
set_target_properties(dawn_node PROPERTIES
|
||||||
PREFIX ""
|
PREFIX ""
|
||||||
OUTPUT_NAME "dawn"
|
OUTPUT_NAME "dawn"
|
||||||
SUFFIX ".node"
|
SUFFIX ".node"
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}"
|
||||||
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}"
|
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}"
|
||||||
|
CXX_STANDARD 17
|
||||||
)
|
)
|
||||||
target_link_libraries(dawn_node dawn_node_binding dawn_node_interop dawn_native dawncpp dawn_proc)
|
target_link_libraries(dawn_node dawn_node_binding dawn_node_interop dawn_native dawncpp dawn_proc)
|
||||||
target_include_directories(dawn_node PRIVATE
|
target_include_directories(dawn_node PRIVATE
|
||||||
|
@ -85,8 +77,48 @@ target_include_directories(dawn_node PRIVATE
|
||||||
"${GEN_DIR}"
|
"${GEN_DIR}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# dawn_node targets require C++17
|
# To reduce the build dependencies for compiling the dawn.node targets, we do
|
||||||
set_property(
|
# not use cmake-js for building, but instead just depend on node_api_headers.
|
||||||
TARGET dawn_node
|
# As the name suggests, node_api_headers contains just the *headers* of Napi,
|
||||||
PROPERTY CXX_STANDARD 17
|
# and does not provide a library to link against.
|
||||||
)
|
# Fortunately node_api_headers provides a list of Napi symbols exported by Node,
|
||||||
|
# which we can use to either produce weak-symbol stubs (unix) or generate a .lib
|
||||||
|
# (Windows).
|
||||||
|
|
||||||
|
# Parse the Napi symbols from ${NODE_API_HEADERS_DIR}/symbols.js
|
||||||
|
file(READ "${NODE_API_HEADERS_DIR}/symbols.js" NAPI_SYMBOLS_JS_CONTENT)
|
||||||
|
string(REGEX MATCHALL "napi_[a-z0-9_]*" NAPI_SYMBOLS "${NAPI_SYMBOLS_JS_CONTENT}")
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
# Generate the NapiSymbols.def file from the Napi symbol list
|
||||||
|
set(NAPI_SYMBOLS_DEF "${GEN_DIR}/NapiSymbols.def")
|
||||||
|
list(TRANSFORM NAPI_SYMBOLS PREPEND " ")
|
||||||
|
list(TRANSFORM NAPI_SYMBOLS APPEND "\n")
|
||||||
|
string(REPLACE ";" "" NAPI_SYMBOLS "${NAPI_SYMBOLS}")
|
||||||
|
string(PREPEND NAPI_SYMBOLS "LIBRARY node.exe\nEXPORTS\n")
|
||||||
|
file(GENERATE OUTPUT "${NAPI_SYMBOLS_DEF}" CONTENT "${NAPI_SYMBOLS}")
|
||||||
|
# Generate the NapiSymbols.lib from the NapiSymbols.def file
|
||||||
|
set(NAPI_SYMBOLS_LIB "${GEN_DIR}/NapiSymbols.lib")
|
||||||
|
# Resolve path to lib.exe
|
||||||
|
get_filename_component(VS_BIN_DIR "${CMAKE_LINKER}" DIRECTORY)
|
||||||
|
set(LIB_EXE "${VS_BIN_DIR}/lib.exe")
|
||||||
|
add_custom_command(
|
||||||
|
COMMAND "${LIB_EXE}"
|
||||||
|
"/DEF:${NAPI_SYMBOLS_DEF}"
|
||||||
|
"/OUT:${NAPI_SYMBOLS_LIB}"
|
||||||
|
DEPENDS "${NAPI_SYMBOLS_DEF}"
|
||||||
|
OUTPUT "${NAPI_SYMBOLS_LIB}"
|
||||||
|
COMMENT "Generating ${NAPI_SYMBOLS_LIB}"
|
||||||
|
)
|
||||||
|
add_custom_target(napi-symbols DEPENDS "${NAPI_SYMBOLS_LIB}")
|
||||||
|
add_dependencies(dawn_node napi-symbols)
|
||||||
|
target_link_libraries(dawn_node "${NAPI_SYMBOLS_LIB}")
|
||||||
|
else()
|
||||||
|
# Generate the NapiSymbols.h file from the Napi symbol list
|
||||||
|
set(NAPI_SYMBOLS_H "${GEN_DIR}/NapiSymbols.h")
|
||||||
|
list(TRANSFORM NAPI_SYMBOLS PREPEND "NAPI_SYMBOL(")
|
||||||
|
list(TRANSFORM NAPI_SYMBOLS APPEND ")\n")
|
||||||
|
string(REPLACE ";" "" NAPI_SYMBOLS "${NAPI_SYMBOLS}")
|
||||||
|
file(GENERATE OUTPUT "${NAPI_SYMBOLS_H}" CONTENT "${NAPI_SYMBOLS}")
|
||||||
|
target_sources(dawn_node PRIVATE "NapiSymbols.cpp")
|
||||||
|
endif()
|
||||||
|
|
|
@ -16,10 +16,14 @@
|
||||||
|
|
||||||
// To reduce the build dependencies for compiling the dawn.node targets, we do
|
// To reduce the build dependencies for compiling the dawn.node targets, we do
|
||||||
// not use cmake-js for building, but instead just depend on node_api_headers.
|
// not use cmake-js for building, but instead just depend on node_api_headers.
|
||||||
// As the name suggests, node_api_headers contains just the *headers* of the
|
// As the name suggests, node_api_headers contains just the *headers* of Napi,
|
||||||
// Napi, and does not provide a library to link against. Fortunately
|
// and does not provide a library to link against.
|
||||||
// node_api_headers provides a list of symbols exported by Node, which we can
|
// Fortunately node_api_headers provides a list of Napi symbols exported by Node,
|
||||||
// stub here to keep the linker happy.
|
// which we can use to produce weak-symbol stubs.
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# error "NapiSymbols.cpp is not used on Windows"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define NAPI_SYMBOL(NAME) \
|
#define NAPI_SYMBOL(NAME) \
|
||||||
__attribute__((weak)) void NAME() { \
|
__attribute__((weak)) void NAME() { \
|
||||||
|
|
Loading…
Reference in New Issue