blob: ee701aef472a5ad9db571eac03589c98d0a3241a [file] [log] [blame]
# Copyright 2021 The Dawn Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set(DAWN_NODE_GEN_DIR "${DAWN_BUILD_GEN_DIR}/node")
set(IDLGEN_TOOL_DIR "${PROJECT_SOURCE_DIR}/tools/src/cmd/idlgen")
# idlgen() is a function that uses the tools/src/cmd/idlgen/main.go tool to
# generate code from an IDL file and template.
# idlgen() accepts the following named arguments:
# TEMPLATE <path> - (required) the path to the root .tmpl file. If the
# template imports other templates, then these should be
# added to the DEPENDS argument list.
# OUTPUT <path> - (required) the output file path.
# IDLS <paths> - (at least one required) the list of input WebIDL files.
# DEPENDS <paths> - an optional list of additional file dependencies used.
function(idlgen)
cmake_parse_arguments(IDLGEN
"" # options
"TEMPLATE;OUTPUT" # one_value_keywords
"IDLS;DEPENDS" # multi_value_keywords
${ARGN})
if(NOT IDLGEN_TEMPLATE)
message(FATAL_ERROR "idlgen() missing TEMPLATE argument")
endif()
if(NOT IDLGEN_OUTPUT)
message(FATAL_ERROR "idlgen() missing OUTPUT argument")
endif()
if(NOT IDLGEN_IDLS)
message(FATAL_ERROR "idlgen() missing IDLS argument(s)")
endif()
add_custom_command(
COMMAND ${GO_EXECUTABLE} "run" "${IDLGEN_TOOL_DIR}/main.go"
"--template" "${IDLGEN_TEMPLATE}"
"--output" "${IDLGEN_OUTPUT}"
${IDLGEN_IDLS}
DEPENDS "${IDLGEN_TOOL_DIR}/main.go"
${IDLGEN_TEMPLATE}
${IDLGEN_DEPENDS}
${IDLGEN_IDLS}
OUTPUT ${IDLGEN_OUTPUT}
WORKING_DIRECTORY ${IDLGEN_TOOL_DIR}
COMMENT "Generating ${IDLGEN_OUTPUT}"
)
endfunction()
add_subdirectory(binding)
add_subdirectory(interop)
add_library(dawn_node SHARED
"Module.cpp"
)
common_compile_options(dawn_node)
set_target_properties(dawn_node PROPERTIES
PREFIX ""
OUTPUT_NAME "dawn"
SUFFIX ".node"
ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}"
RUNTIME_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
libtint)
target_include_directories(dawn_node PRIVATE
"${PROJECT_SOURCE_DIR}"
"${DAWN_THIRD_PARTY_DIR}"
"${NODE_API_HEADERS_DIR}/include"
"${DAWN_NODE_GEN_DIR}"
)
# 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.
# As the name suggests, node_api_headers contains just the *headers* of Napi,
# 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)
set(NODE_API_BINARY_FILE "node.exe" CACHE STRING
"The name of the file in which to find the Node-API symbols."
)
# Generate the NapiSymbols.def file from the Napi symbol list
set(NAPI_SYMBOLS_DEF "${DAWN_NODE_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_API_BINARY_FILE}\nEXPORTS\n")
file(GENERATE OUTPUT "${NAPI_SYMBOLS_DEF}" CONTENT "${NAPI_SYMBOLS}")
# Generate the NapiSymbols.lib from the NapiSymbols.def file
set(NAPI_SYMBOLS_LIB "${DAWN_NODE_GEN_DIR}/NapiSymbols.lib")
# Resolve path to lib.exe
get_filename_component(LINKER_BIN_DIR "${CMAKE_LINKER}" DIRECTORY)
if (EXISTS "${LINKER_BIN_DIR}/lib.exe")
set(LIB_EXE "${LINKER_BIN_DIR}/lib.exe")
elseif (EXISTS "${LINKER_BIN_DIR}/lld-link.exe")
set(LIB_EXE "${LINKER_BIN_DIR}/lld-link.exe")
else()
message(FATAL_ERROR "unable to find lib.exe or lld-link.exe")
endif()
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 "${DAWN_NODE_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()