Adapts bindings to node-cmake v2, resolves #3879
This commit is contained in:
parent
98948989d0
commit
603e2ee7de
627
cmake/NodeJS.cmake
Normal file
627
cmake/NodeJS.cmake
Normal file
@ -0,0 +1,627 @@
|
|||||||
|
# Vendored NodeJs.cmake to bootstrap our C++ build without
|
||||||
|
# having the user to install Node modules via `npm install`.
|
||||||
|
#
|
||||||
|
# Update via: ../node_modules/.bin/ncmake update
|
||||||
|
|
||||||
|
|
||||||
|
# Defaults for standard Node.js builds
|
||||||
|
set(NODEJS_DEFAULT_URL https://nodejs.org/download/release)
|
||||||
|
set(NODEJS_DEFAULT_VERSION installed)
|
||||||
|
set(NODEJS_VERSION_FALLBACK latest)
|
||||||
|
set(NODEJS_DEFAULT_NAME node)
|
||||||
|
set(NODEJS_DEFAULT_CHECKSUM SHASUMS256.txt)
|
||||||
|
set(NODEJS_DEFAULT_CHECKTYPE SHA256)
|
||||||
|
|
||||||
|
include(CMakeParseArguments)
|
||||||
|
|
||||||
|
# Find a path by walking upward from a base directory until the path is
|
||||||
|
# found. Sets the variable ${PATH} to False if the path can't
|
||||||
|
# be determined
|
||||||
|
function(find_path_parent NAME BASE PATH)
|
||||||
|
set(ROOT ${BASE})
|
||||||
|
set(${PATH} ${ROOT}/${NAME} PARENT_SCOPE)
|
||||||
|
set(DRIVE "^[A-Za-z]?:?/$")
|
||||||
|
while(NOT ROOT MATCHES ${DRIVE} AND NOT EXISTS ${ROOT}/${NAME})
|
||||||
|
get_filename_component(ROOT ${ROOT} DIRECTORY)
|
||||||
|
set(${PATH} ${ROOT}/${NAME} PARENT_SCOPE)
|
||||||
|
endwhile()
|
||||||
|
if(ROOT MATCHES ${DRIVE})
|
||||||
|
set(${PATH} False PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Shortcut for finding standard node module locations
|
||||||
|
macro(find_nodejs_module NAME BASE PATH)
|
||||||
|
find_path_parent(node_modules/${NAME} ${BASE} ${PATH})
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# Download with a bit of nice output (without spewing progress)
|
||||||
|
function(download_file URL)
|
||||||
|
message(STATUS "Downloading: ${URL}")
|
||||||
|
file(DOWNLOAD
|
||||||
|
${URL}
|
||||||
|
${ARGN}
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Embedded win_delay_load_hook file so that this file can be copied
|
||||||
|
# into projects directly (recommended practice)
|
||||||
|
function(nodejs_generate_delayload_hook OUTPUT)
|
||||||
|
file(WRITE ${OUTPUT} "")
|
||||||
|
file(APPEND ${OUTPUT} "/*\n")
|
||||||
|
file(APPEND ${OUTPUT} " * When this file is linked to a DLL, it sets up a delay-load hook that\n")
|
||||||
|
file(APPEND ${OUTPUT} " * intervenes when the DLL is trying to load 'node.exe' or 'iojs.exe'\n")
|
||||||
|
file(APPEND ${OUTPUT} " * dynamically. Instead of trying to locate the .exe file it'll just return\n")
|
||||||
|
file(APPEND ${OUTPUT} " * a handle to the process image.\n")
|
||||||
|
file(APPEND ${OUTPUT} " *\n")
|
||||||
|
file(APPEND ${OUTPUT} " * This allows compiled addons to work when node.exe or iojs.exe is renamed.\n")
|
||||||
|
file(APPEND ${OUTPUT} " */\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} "#ifdef _MSC_VER\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} "#ifndef DELAYIMP_INSECURE_WRITABLE_HOOKS\n")
|
||||||
|
file(APPEND ${OUTPUT} "#define DELAYIMP_INSECURE_WRITABLE_HOOKS\n")
|
||||||
|
file(APPEND ${OUTPUT} "#endif\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} "#ifndef WIN32_LEAN_AND_MEAN\n")
|
||||||
|
file(APPEND ${OUTPUT} "#define WIN32_LEAN_AND_MEAN\n")
|
||||||
|
file(APPEND ${OUTPUT} "#endif\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} "#include <windows.h>\n")
|
||||||
|
file(APPEND ${OUTPUT} "#include <Shlwapi.h>\n")
|
||||||
|
file(APPEND ${OUTPUT} "#include <delayimp.h>\n")
|
||||||
|
file(APPEND ${OUTPUT} "#include <string.h>\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} "static FARPROC WINAPI load_exe_hook(unsigned int event, DelayLoadInfo* info) {\n")
|
||||||
|
file(APPEND ${OUTPUT} " if (event != dliNotePreLoadLibrary) return NULL;\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} " if (_stricmp(info->szDll, \"iojs.exe\") != 0 &&\n")
|
||||||
|
file(APPEND ${OUTPUT} " _stricmp(info->szDll, \"node.exe\") != 0 &&\n")
|
||||||
|
file(APPEND ${OUTPUT} " _stricmp(info->szDll, \"node.dll\") != 0)\n")
|
||||||
|
file(APPEND ${OUTPUT} " return NULL;\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} " // Get a handle to the current process executable.\n")
|
||||||
|
file(APPEND ${OUTPUT} " HMODULE processModule = GetModuleHandle(NULL);\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} " // Get the path to the executable.\n")
|
||||||
|
file(APPEND ${OUTPUT} " TCHAR processPath[_MAX_PATH];\n")
|
||||||
|
file(APPEND ${OUTPUT} " GetModuleFileName(processModule, processPath, _MAX_PATH);\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} " // Get the name of the current executable.\n")
|
||||||
|
file(APPEND ${OUTPUT} " LPSTR processName = PathFindFileName(processPath);\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} " // If the current process is node or iojs, then just return the proccess \n")
|
||||||
|
file(APPEND ${OUTPUT} " // module.\n")
|
||||||
|
file(APPEND ${OUTPUT} " if (_stricmp(processName, \"node.exe\") == 0 ||\n")
|
||||||
|
file(APPEND ${OUTPUT} " _stricmp(processName, \"iojs.exe\") == 0) {\n")
|
||||||
|
file(APPEND ${OUTPUT} " return (FARPROC) processModule;\n")
|
||||||
|
file(APPEND ${OUTPUT} " }\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} " // If it is another process, attempt to load 'node.dll' from the same \n")
|
||||||
|
file(APPEND ${OUTPUT} " // directory.\n")
|
||||||
|
file(APPEND ${OUTPUT} " PathRemoveFileSpec(processPath);\n")
|
||||||
|
file(APPEND ${OUTPUT} " PathAppend(processPath, \"node.dll\");\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} " HMODULE nodeDllModule = GetModuleHandle(processPath);\n")
|
||||||
|
file(APPEND ${OUTPUT} " if(nodeDllModule != NULL) {\n")
|
||||||
|
file(APPEND ${OUTPUT} " // This application has a node.dll in the same directory as the executable,\n")
|
||||||
|
file(APPEND ${OUTPUT} " // use that.\n")
|
||||||
|
file(APPEND ${OUTPUT} " return (FARPROC) nodeDllModule;\n")
|
||||||
|
file(APPEND ${OUTPUT} " }\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} " // Fallback to the current executable, which must statically link to \n")
|
||||||
|
file(APPEND ${OUTPUT} " // node.lib\n")
|
||||||
|
file(APPEND ${OUTPUT} " return (FARPROC) processModule;\n")
|
||||||
|
file(APPEND ${OUTPUT} "}\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} "PfnDliHook __pfnDliNotifyHook2 = load_exe_hook;\n")
|
||||||
|
file(APPEND ${OUTPUT} "\n")
|
||||||
|
file(APPEND ${OUTPUT} "#endif\n")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Sets up a project to build Node.js native modules
|
||||||
|
# - Downloads required dependencies and unpacks them to the build directory.
|
||||||
|
# Internet access is required the first invocation but not after (
|
||||||
|
# provided the download is successful)
|
||||||
|
# - Sets up several variables for building against the downloaded
|
||||||
|
# dependencies
|
||||||
|
# - Guarded to prevent multiple executions, so a single project hierarchy
|
||||||
|
# will only call this once
|
||||||
|
function(nodejs_init)
|
||||||
|
# Prevents this function from executing more than once
|
||||||
|
if(NODEJS_INIT)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Regex patterns used by the init function for component extraction
|
||||||
|
set(HEADERS_MATCH "^([A-Fa-f0-9]+)[ \t]+([^-]+)-(headers|v?[0-9.]+)-(headers|v?[0-9.]+)([.]tar[.]gz)$")
|
||||||
|
set(LIB32_MATCH "(^[0-9A-Fa-f]+)[\t ]+(win-x86)?(/)?([^/]*)(.lib)$")
|
||||||
|
set(LIB64_MATCH "(^[0-9A-Fa-f]+)[\t ]+(win-)?(x64/)(.*)(.lib)$")
|
||||||
|
|
||||||
|
# Parse function arguments
|
||||||
|
cmake_parse_arguments(nodejs_init
|
||||||
|
"" "URL;NAME;VERSION;CHECKSUM;CHECKTYPE" "" ${ARGN}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Allow the download URL to be overridden by command line argument
|
||||||
|
# NODEJS_URL
|
||||||
|
if(NODEJS_URL)
|
||||||
|
set(URL ${NODEJS_URL})
|
||||||
|
else()
|
||||||
|
# Use the argument if specified, falling back to the default
|
||||||
|
set(URL ${NODEJS_DEFAULT_URL})
|
||||||
|
if(nodejs_init_URL)
|
||||||
|
set(URL ${nodejs_init_URL})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Allow name to be overridden by command line argument NODEJS_NAME
|
||||||
|
if(NODEJS_NAME)
|
||||||
|
set(NAME ${NODEJS_NAME})
|
||||||
|
else()
|
||||||
|
# Use the argument if specified, falling back to the default
|
||||||
|
set(NAME ${NODEJS_DEFAULT_NAME})
|
||||||
|
if(nodejs_init_NAME)
|
||||||
|
set(NAME ${nodejs_init_NAME})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Allow the checksum file to be overridden by command line argument
|
||||||
|
# NODEJS_CHECKSUM
|
||||||
|
if(NODEJS_CHECKSUM)
|
||||||
|
set(CHECKSUM ${NODEJS_CHECKSUM})
|
||||||
|
else()
|
||||||
|
# Use the argument if specified, falling back to the default
|
||||||
|
set(CHECKSUM ${NODEJS_DEFAULT_CHECKSUM})
|
||||||
|
if(nodejs_init_CHECKSUM)
|
||||||
|
set(CHECKSUM ${nodejs_init_CHECKSUM})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Allow the checksum type to be overriden by the command line argument
|
||||||
|
# NODEJS_CHECKTYPE
|
||||||
|
if(NODEJS_CHECKTYPE)
|
||||||
|
set(CHECKTYPE ${NODEJS_CHECKTYPE})
|
||||||
|
else()
|
||||||
|
# Use the argument if specified, falling back to the default
|
||||||
|
set(CHECKTYPE ${NODEJS_DEFAULT_CHECKTYPE})
|
||||||
|
if(nodejs_init_CHECKTYPE)
|
||||||
|
set(CHECKTYPE ${nodejs_init_CHECKTYPE})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Allow the version to be overridden by the command line argument
|
||||||
|
# NODEJS_VERSION
|
||||||
|
if(NODEJS_VERSION)
|
||||||
|
set(VERSION ${NODEJS_VERSION})
|
||||||
|
else()
|
||||||
|
# Use the argument if specified, falling back to the default
|
||||||
|
set(VERSION ${NODEJS_DEFAULT_VERSION})
|
||||||
|
if(nodejs_init_VERSION)
|
||||||
|
set(VERSION ${nodejs_init_VERSION})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# "installed" is a special version that tries to use the currently
|
||||||
|
# installed version (determined by running node)
|
||||||
|
set(NODEJS_INSTALLED False CACHE BOOL "Node.js install status" FORCE)
|
||||||
|
if(VERSION STREQUAL "installed")
|
||||||
|
if(NOT NAME STREQUAL ${NODEJS_DEFAULT_NAME})
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"'Installed' version identifier can only be used with"
|
||||||
|
"the core Node.js library"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
# Fall back to the "latest" version if node isn't installed
|
||||||
|
set(VERSION ${NODEJS_VERSION_FALLBACK})
|
||||||
|
find_program(NODEJS_BINARY NAMES node nodejs)
|
||||||
|
if(NODEJS_BINARY)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${NODEJS_BINARY} --version
|
||||||
|
RESULT_VARIABLE INSTALLED_VERSION_RESULT
|
||||||
|
OUTPUT_VARIABLE INSTALLED_VERSION
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
if(INSTALLED_VERSION_RESULT STREQUAL "0")
|
||||||
|
set(NODEJS_INSTALLED True CACHE BOOL
|
||||||
|
"Node.js install status" FORCE
|
||||||
|
)
|
||||||
|
set(VERSION ${INSTALLED_VERSION})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Create a temporary download directory
|
||||||
|
set(TEMP ${CMAKE_CURRENT_BINARY_DIR}/temp)
|
||||||
|
if(EXISTS ${TEMP})
|
||||||
|
file(REMOVE_RECURSE ${TEMP})
|
||||||
|
endif()
|
||||||
|
file(MAKE_DIRECTORY ${TEMP})
|
||||||
|
|
||||||
|
# Unless the target is special version "latest", the parameters
|
||||||
|
# necessary to construct the root path are known
|
||||||
|
if(NOT VERSION STREQUAL "latest")
|
||||||
|
set(ROOT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}/${VERSION})
|
||||||
|
# Extract checksums from the existing checksum file
|
||||||
|
set(CHECKSUM_TARGET ${ROOT}/CHECKSUM)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# If we're trying to determine the version or we haven't saved the
|
||||||
|
# checksum file for this version, download it from the specified server
|
||||||
|
if(VERSION STREQUAL "latest" OR
|
||||||
|
(DEFINED ROOT AND NOT EXISTS ${ROOT}/CHECKSUM))
|
||||||
|
if(DEFINED ROOT)
|
||||||
|
# Clear away the old checksum in case the new one is different
|
||||||
|
# and/or it fails to download
|
||||||
|
file(REMOVE ${ROOT}/CHECKSUM)
|
||||||
|
endif()
|
||||||
|
file(REMOVE ${TEMP}/CHECKSUM)
|
||||||
|
download_file(
|
||||||
|
${URL}/${VERSION}/${CHECKSUM}
|
||||||
|
${TEMP}/CHECKSUM
|
||||||
|
INACTIVITY_TIMEOUT 10
|
||||||
|
STATUS CHECKSUM_STATUS
|
||||||
|
)
|
||||||
|
list(GET CHECKSUM_STATUS 0 CHECKSUM_STATUS)
|
||||||
|
if(CHECKSUM_STATUS GREATER 0)
|
||||||
|
file(REMOVE ${TEMP}/CHECKSUM)
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"Unable to download checksum file"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
# Extract checksums from the temporary file
|
||||||
|
set(CHECKSUM_TARGET ${TEMP}/CHECKSUM)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Extract the version, name, header archive and archive checksum
|
||||||
|
# from the file. This first extract is what defines / specifies the
|
||||||
|
# actual version number and name.
|
||||||
|
file(STRINGS
|
||||||
|
${CHECKSUM_TARGET} HEADERS_CHECKSUM
|
||||||
|
REGEX ${HEADERS_MATCH}
|
||||||
|
LIMIT_COUNT 1
|
||||||
|
)
|
||||||
|
if(NOT HEADERS_CHECKSUM)
|
||||||
|
file(REMOVE ${TEMP}/CHECKSUM)
|
||||||
|
if(DEFINED ROOT)
|
||||||
|
file(REMOVE ${ROOT}/CHECKSUM)
|
||||||
|
endif()
|
||||||
|
message(FATAL_ERROR "Unable to extract header archive checksum")
|
||||||
|
endif()
|
||||||
|
string(REGEX MATCH ${HEADERS_MATCH} HEADERS_CHECKSUM ${HEADERS_CHECKSUM})
|
||||||
|
set(HEADERS_CHECKSUM ${CMAKE_MATCH_1})
|
||||||
|
set(NAME ${CMAKE_MATCH_2})
|
||||||
|
if(CMAKE_MATCH_3 STREQUAL "headers")
|
||||||
|
set(VERSION ${CMAKE_MATCH_4})
|
||||||
|
else()
|
||||||
|
set(VERSION ${CMAKE_MATCH_3})
|
||||||
|
endif()
|
||||||
|
set(HEADERS_ARCHIVE
|
||||||
|
${CMAKE_MATCH_2}-${CMAKE_MATCH_3}-${CMAKE_MATCH_4}${CMAKE_MATCH_5}
|
||||||
|
)
|
||||||
|
# Make sure that the root directory exists, and that the checksum
|
||||||
|
# file has been moved over from temp
|
||||||
|
if(DEFINED ROOT)
|
||||||
|
set(OLD_ROOT ${ROOT})
|
||||||
|
endif()
|
||||||
|
set(ROOT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}/${VERSION})
|
||||||
|
if(DEFINED OLD_ROOT AND NOT ROOT STREQUAL "${OLD_ROOT}")
|
||||||
|
file(REMOVE ${TEMP}/CHECKSUM)
|
||||||
|
file(REMOVE ${ROOT}/CHECKSUM)
|
||||||
|
message(FATAL_ERROR "Version/Name mismatch")
|
||||||
|
endif()
|
||||||
|
file(MAKE_DIRECTORY ${ROOT})
|
||||||
|
if(EXISTS ${TEMP}/CHECKSUM)
|
||||||
|
file(REMOVE ${ROOT}/CHECKSUM)
|
||||||
|
file(RENAME ${TEMP}/CHECKSUM ${ROOT}/CHECKSUM)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Now that its fully resolved, report the name and version of Node.js being
|
||||||
|
# used
|
||||||
|
message(STATUS "NodeJS: Using ${NAME}, version ${VERSION}")
|
||||||
|
|
||||||
|
# Download the headers for the version being used
|
||||||
|
# Theoretically, these could be found by searching the installed
|
||||||
|
# system, but in practice, this can be error prone. They're provided
|
||||||
|
# on the download servers, so just use the ones there.
|
||||||
|
if(NOT EXISTS ${ROOT}/include)
|
||||||
|
file(REMOVE ${TEMP}/${HEADERS_ARCHIVE})
|
||||||
|
download_file(
|
||||||
|
${URL}/${VERSION}/${HEADERS_ARCHIVE}
|
||||||
|
${TEMP}/${HEADERS_ARCHIVE}
|
||||||
|
INACTIVITY_TIMEOUT 10
|
||||||
|
EXPECTED_HASH ${CHECKTYPE}=${HEADERS_CHECKSUM}
|
||||||
|
STATUS HEADERS_STATUS
|
||||||
|
)
|
||||||
|
list(GET HEADERS_STATUS 0 HEADERS_STATUS)
|
||||||
|
if(HEADER_STATUS GREATER 0)
|
||||||
|
file(REMOVE ${TEMP}/${HEADERS_ARCHIVE})
|
||||||
|
message(FATAL_ERROR "Unable to download Node.js headers")
|
||||||
|
endif()
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E tar xfz ${TEMP}/${HEADERS_ARCHIVE}
|
||||||
|
WORKING_DIRECTORY ${TEMP}
|
||||||
|
)
|
||||||
|
|
||||||
|
# This adapts the header extraction to support a number of different
|
||||||
|
# header archive contents in addition to the one used by the
|
||||||
|
# default Node.js library
|
||||||
|
unset(NODEJS_HEADERS_PATH CACHE)
|
||||||
|
find_path(NODEJS_HEADERS_PATH
|
||||||
|
NAMES src include
|
||||||
|
PATHS
|
||||||
|
${TEMP}/${NAME}-${VERSION}-headers
|
||||||
|
${TEMP}/${NAME}-${VERSION}
|
||||||
|
${TEMP}/${NODEJS_DEFAULT_NAME}-${VERSION}-headers
|
||||||
|
${TEMP}/${NODEJS_DEFAULT_NAME}-${VERSION}
|
||||||
|
${TEMP}/${NODEJS_DEFAULT_NAME}
|
||||||
|
${TEMP}
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
if(NOT NODEJS_HEADERS_PATH)
|
||||||
|
message(FATAL_ERROR "Unable to find extracted headers folder")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Move the headers into a standard location with a standard layout
|
||||||
|
file(REMOVE ${TEMP}/${HEADERS_ARCHIVE})
|
||||||
|
file(REMOVE_RECURSE ${ROOT}/include)
|
||||||
|
if(EXISTS ${NODEJS_HEADERS_PATH}/include/node)
|
||||||
|
file(RENAME ${NODEJS_HEADERS_PATH}/include/node ${ROOT}/include)
|
||||||
|
elseif(EXISTS ${NODEJS_HEADERS_PATH}/src)
|
||||||
|
file(MAKE_DIRECTORY ${ROOT}/include)
|
||||||
|
if(NOT EXISTS ${NODEJS_HEADERS_PATH}/src)
|
||||||
|
file(REMOVE_RECURSE ${ROOT}/include)
|
||||||
|
message(FATAL_ERROR "Unable to find core headers")
|
||||||
|
endif()
|
||||||
|
file(COPY ${NODEJS_HEADERS_PATH}/src/
|
||||||
|
DESTINATION ${ROOT}/include
|
||||||
|
)
|
||||||
|
if(NOT EXISTS ${NODEJS_HEADERS_PATH}/deps/uv/include)
|
||||||
|
file(REMOVE_RECURSE ${ROOT}/include)
|
||||||
|
message(FATAL_ERROR "Unable to find libuv headers")
|
||||||
|
endif()
|
||||||
|
file(COPY ${NODEJS_HEADERS_PATH}/deps/uv/include/
|
||||||
|
DESTINATION ${ROOT}/include
|
||||||
|
)
|
||||||
|
if(NOT EXISTS ${NODEJS_HEADERS_PATH}/deps/v8/include)
|
||||||
|
file(REMOVE_RECURSE ${ROOT}/include)
|
||||||
|
message(FATAL_ERROR "Unable to find v8 headers")
|
||||||
|
endif()
|
||||||
|
file(COPY ${NODEJS_HEADERS_PATH}/deps/v8/include/
|
||||||
|
DESTINATION ${ROOT}/include
|
||||||
|
)
|
||||||
|
if(NOT EXISTS ${NODEJS_HEADERS_PATH}/deps/zlib)
|
||||||
|
file(REMOVE_RECURSE ${ROOT}/include)
|
||||||
|
message(FATAL_ERROR "Unable to find zlib headers")
|
||||||
|
endif()
|
||||||
|
file(COPY ${NODEJS_HEADERS_PATH}/deps/zlib/
|
||||||
|
DESTINATION ${ROOT}/include
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
file(REMOVE_RECURSE ${NODEJS_HEADERS_PATH})
|
||||||
|
unset(NODEJS_HEADERS_PATH CACHE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Only download the libraries on windows, since its the only place
|
||||||
|
# its necessary. Note, this requires rerunning CMake if moving
|
||||||
|
# a module from one platform to another (should happen automatically
|
||||||
|
# with most generators)
|
||||||
|
if(WIN32)
|
||||||
|
# Download the win32 library for linking
|
||||||
|
file(STRINGS
|
||||||
|
${ROOT}/CHECKSUM LIB32_CHECKSUM
|
||||||
|
LIMIT_COUNT 1
|
||||||
|
REGEX ${LIB32_MATCH}
|
||||||
|
)
|
||||||
|
if(NOT LIB32_CHECKSUM)
|
||||||
|
message(FATAL_ERROR "Unable to extract x86 library checksum")
|
||||||
|
endif()
|
||||||
|
string(REGEX MATCH ${LIB32_MATCH} LIB32_CHECKSUM ${LIB32_CHECKSUM})
|
||||||
|
set(LIB32_CHECKSUM ${CMAKE_MATCH_1})
|
||||||
|
set(LIB32_PATH win-x86)
|
||||||
|
set(LIB32_NAME ${CMAKE_MATCH_4}${CMAKE_MATCH_5})
|
||||||
|
set(LIB32_TARGET ${CMAKE_MATCH_2}${CMAKE_MATCH_3}${LIB32_NAME})
|
||||||
|
if(NOT EXISTS ${ROOT}/${LIB32_PATH})
|
||||||
|
file(REMOVE_RECURSE ${TEMP}/${LIB32_PATH})
|
||||||
|
download_file(
|
||||||
|
${URL}/${VERSION}/${LIB32_TARGET}
|
||||||
|
${TEMP}/${LIB32_PATH}/${LIB32_NAME}
|
||||||
|
INACTIVITY_TIMEOUT 10
|
||||||
|
EXPECTED_HASH ${CHECKTYPE}=${LIB32_CHECKSUM}
|
||||||
|
STATUS LIB32_STATUS
|
||||||
|
)
|
||||||
|
list(GET LIB32_STATUS 0 LIB32_STATUS)
|
||||||
|
if(LIB32_STATUS GREATER 0)
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"Unable to download Node.js windows library (32-bit)"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
file(REMOVE_RECURSE ${ROOT}/${LIB32_PATH})
|
||||||
|
file(MAKE_DIRECTORY ${ROOT}/${LIB32_PATH})
|
||||||
|
file(RENAME
|
||||||
|
${TEMP}/${LIB32_PATH}/${LIB32_NAME}
|
||||||
|
${ROOT}/${LIB32_PATH}/${LIB32_NAME}
|
||||||
|
)
|
||||||
|
file(REMOVE_RECURSE ${TEMP}/${LIB32_PATH})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Download the win64 library for linking
|
||||||
|
file(STRINGS
|
||||||
|
${ROOT}/CHECKSUM LIB64_CHECKSUM
|
||||||
|
LIMIT_COUNT 1
|
||||||
|
REGEX ${LIB64_MATCH}
|
||||||
|
)
|
||||||
|
if(NOT LIB64_CHECKSUM)
|
||||||
|
message(FATAL_ERROR "Unable to extract x64 library checksum")
|
||||||
|
endif()
|
||||||
|
string(REGEX MATCH ${LIB64_MATCH} LIB64_CHECKSUM ${LIB64_CHECKSUM})
|
||||||
|
set(LIB64_CHECKSUM ${CMAKE_MATCH_1})
|
||||||
|
set(LIB64_PATH win-x64)
|
||||||
|
set(LIB64_NAME ${CMAKE_MATCH_4}${CMAKE_MATCH_5})
|
||||||
|
set(LIB64_TARGET ${CMAKE_MATCH_2}${CMAKE_MATCH_3}${LIB64_NAME})
|
||||||
|
if(NOT EXISTS ${ROOT}/${LIB64_PATH})
|
||||||
|
file(REMOVE_RECURSE ${TEMP}/${LIB64_PATH})
|
||||||
|
download_file(
|
||||||
|
${URL}/${VERSION}/${LIB64_TARGET}
|
||||||
|
${TEMP}/${LIB64_PATH}/${LIB64_NAME}
|
||||||
|
INACTIVITY_TIMEOUT 10
|
||||||
|
EXPECTED_HASH ${CHECKTYPE}=${LIB64_CHECKSUM}
|
||||||
|
STATUS LIB64_STATUS
|
||||||
|
)
|
||||||
|
list(GET LIB64_STATUS 0 LIB64_STATUS)
|
||||||
|
if(LIB64_STATUS GREATER 0)
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"Unable to download Node.js windows library (64-bit)"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
file(REMOVE_RECURSE ${ROOT}/${LIB64_PATH})
|
||||||
|
file(MAKE_DIRECTORY ${ROOT}/${LIB64_PATH})
|
||||||
|
file(RENAME
|
||||||
|
${TEMP}/${LIB64_PATH}/${LIB64_NAME}
|
||||||
|
${ROOT}/${LIB64_PATH}/${LIB64_NAME}
|
||||||
|
)
|
||||||
|
file(REMOVE_RECURSE ${TEMP}/${LIB64_PATH})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# The downloaded headers should always be set for inclusion
|
||||||
|
list(APPEND INCLUDE_DIRS ${ROOT}/include)
|
||||||
|
|
||||||
|
# Look for the NAN module, and add it to the includes
|
||||||
|
find_nodejs_module(
|
||||||
|
nan
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
NODEJS_NAN_DIR
|
||||||
|
)
|
||||||
|
if(NODEJS_NAN_DIR)
|
||||||
|
list(APPEND INCLUDE_DIRS ${NODEJS_NAN_DIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Under windows, we need a bunch of libraries (due to the way
|
||||||
|
# dynamic linking works)
|
||||||
|
if(WIN32)
|
||||||
|
# Generate and use a delay load hook to allow the node binary
|
||||||
|
# name to be changed while still loading native modules
|
||||||
|
set(DELAY_LOAD_HOOK ${CMAKE_CURRENT_BINARY_DIR}/win_delay_load_hook.c)
|
||||||
|
nodejs_generate_delayload_hook(${DELAY_LOAD_HOOK})
|
||||||
|
set(SOURCES ${DELAY_LOAD_HOOK})
|
||||||
|
|
||||||
|
# Necessary flags to get delayload working correctly
|
||||||
|
list(APPEND LINK_FLAGS
|
||||||
|
"-IGNORE:4199"
|
||||||
|
"-DELAYLOAD:iojs.exe"
|
||||||
|
"-DELAYLOAD:node.exe"
|
||||||
|
"-DELAYLOAD:node.dll"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Core system libraries used by node
|
||||||
|
list(APPEND LIBRARIES
|
||||||
|
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
|
||||||
|
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
|
||||||
|
odbc32.lib Shlwapi.lib DelayImp.lib
|
||||||
|
)
|
||||||
|
|
||||||
|
# Also link to the node stub itself (downloaded above)
|
||||||
|
if(CMAKE_CL_64)
|
||||||
|
list(APPEND LIBRARIES ${ROOT}/${LIB64_PATH}/${LIB64_NAME})
|
||||||
|
else()
|
||||||
|
list(APPEND LIBRARIES ${ROOT}/${LIB32_PATH}/${LIB32_NAME})
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
# Non-windows platforms should use these flags
|
||||||
|
list(APPEND DEFINITIONS _LARGEFILE_SOURCE _FILE_OFFSET_BITS=64)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Special handling for OSX / clang to allow undefined symbols
|
||||||
|
# Define is required by node on OSX
|
||||||
|
if(APPLE)
|
||||||
|
list(APPEND LINK_FLAGS "-undefined dynamic_lookup")
|
||||||
|
list(APPEND DEFINITIONS _DARWIN_USE_64_BIT_INODE=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Export all settings for use as arguments in the rest of the build
|
||||||
|
set(NODEJS_VERSION ${VERSION} PARENT_SCOPE)
|
||||||
|
set(NODEJS_SOURCES ${SOURCES} PARENT_SCOPE)
|
||||||
|
set(NODEJS_INCLUDE_DIRS ${INCLUDE_DIRS} PARENT_SCOPE)
|
||||||
|
set(NODEJS_LIBRARIES ${LIBRARIES} PARENT_SCOPE)
|
||||||
|
set(NODEJS_LINK_FLAGS ${LINK_FLAGS} PARENT_SCOPE)
|
||||||
|
set(NODEJS_DEFINITIONS ${DEFINITIONS} PARENT_SCOPE)
|
||||||
|
|
||||||
|
# Prevents this function from executing more than once
|
||||||
|
set(NODEJS_INIT TRUE PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Helper function for defining a node module
|
||||||
|
# After nodejs_init, all of the settings and dependencies necessary to do
|
||||||
|
# this yourself are defined, but this helps make sure everything is configured
|
||||||
|
# correctly. Feel free to use it as a model to do this by hand (or to
|
||||||
|
# tweak this configuration if you need something custom).
|
||||||
|
function(add_nodejs_module NAME)
|
||||||
|
# Validate name parameter (must be a valid C identifier)
|
||||||
|
string(MAKE_C_IDENTIFIER ${NAME} ${NAME}_SYMBOL_CHECK)
|
||||||
|
if(NOT "${NAME}" STREQUAL "${${NAME}_SYMBOL_CHECK}")
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"Module name must be a valid C identifier. "
|
||||||
|
"Suggested alternative: '${${NAME}_SYMBOL_CHECK}'"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
# Make sure node is initialized (variables set) before defining the module
|
||||||
|
if(NOT NODEJS_INIT)
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"Node.js has not been initialized. "
|
||||||
|
"Call nodejs_init before adding any modules"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
# In order to match node-gyp, we need to build into type specific folders
|
||||||
|
# ncmake takes care of this, but be sure to set CMAKE_BUILD_TYPE yourself
|
||||||
|
# if invoking CMake directly
|
||||||
|
if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"Configuration type must be specified. "
|
||||||
|
"Set CMAKE_BUILD_TYPE or use a different generator"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# A node module is a shared library
|
||||||
|
add_library(${NAME} SHARED ${NODEJS_SOURCES} ${ARGN})
|
||||||
|
# Add compiler defines for the module
|
||||||
|
# Two helpful ones:
|
||||||
|
# MODULE_NAME must match the name of the build library, define that here
|
||||||
|
# ${NAME}_BUILD is for symbol visibility under windows
|
||||||
|
string(TOUPPER "${NAME}_BUILD" ${NAME}_BUILD_DEF)
|
||||||
|
target_compile_definitions(${NAME}
|
||||||
|
PRIVATE MODULE_NAME=${NAME}
|
||||||
|
PRIVATE ${${NAME}_BUILD_DEF}
|
||||||
|
PUBLIC ${NODEJS_DEFINITIONS}
|
||||||
|
)
|
||||||
|
# This properly defines includes for the module
|
||||||
|
target_include_directories(${NAME} PUBLIC ${NODEJS_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
# Add link flags to the module
|
||||||
|
target_link_libraries(${NAME} ${NODEJS_LIBRARIES})
|
||||||
|
|
||||||
|
# Set required properties for the module to build properly
|
||||||
|
# Correct naming, symbol visiblity and C++ standard
|
||||||
|
set_target_properties(${NAME} PROPERTIES
|
||||||
|
OUTPUT_NAME ${NAME}
|
||||||
|
PREFIX ""
|
||||||
|
SUFFIX ".node"
|
||||||
|
MACOSX_RPATH ON
|
||||||
|
C_VISIBILITY_PRESET hidden
|
||||||
|
CXX_VISIBILITY_PRESET hidden
|
||||||
|
POSITION_INDEPENDENT_CODE TRUE
|
||||||
|
CMAKE_CXX_STANDARD_REQUIRED TRUE
|
||||||
|
CXX_STANDARD 11
|
||||||
|
LINK_FLAGS "${NODEJS_LINK_FLAGS}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Make sure we're buiilding in a build specific output directory
|
||||||
|
# Only necessary on single-target generators (Make, Ninja)
|
||||||
|
# Multi-target generators do this automatically
|
||||||
|
# This (luckily) mirrors node-gyp conventions
|
||||||
|
if(NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
|
set_property(TARGET ${NAME} PROPERTY
|
||||||
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BUILD_TYPE}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
@ -1,587 +0,0 @@
|
|||||||
# Copyright (c) 2015, Colin Taylor
|
|
||||||
# Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
# purpose with or without fee is hereby granted, provided that the above
|
|
||||||
# copyright notice and this permission notice appear in all copies.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
||||||
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
||||||
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
||||||
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
||||||
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
||||||
# PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
|
|
||||||
# FindNodeJS.cmake CMake module vendored from the node-cmake project (v1.2).
|
|
||||||
|
|
||||||
# This script uses CMake 3.1+ features
|
|
||||||
if(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 3.1.0)
|
|
||||||
message(FATAL_ERROR "FindNodeJS.cmake uses CMake 3.1+ features")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Force a build type to be set (ignored on config based generators)
|
|
||||||
if(NOT CMAKE_BUILD_TYPE)
|
|
||||||
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Capture module information
|
|
||||||
set(NodeJS_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
|
|
||||||
get_filename_component(NodeJS_MODULE_NAME ${NodeJS_MODULE_PATH} NAME)
|
|
||||||
|
|
||||||
# Allow users to specify the installed location of the Node.js package
|
|
||||||
set(NodeJS_ROOT_DIR "" CACHE PATH
|
|
||||||
"The root directory of the node.js installed package")
|
|
||||||
|
|
||||||
# Allow users to specify that downloaded sources should be used
|
|
||||||
option(NodeJS_DOWNLOAD "Download the required source files" Off)
|
|
||||||
|
|
||||||
# Allow users to force downloading of node packages
|
|
||||||
option(NodeJS_FORCE_DOWNLOAD "Download the source files every time" Off)
|
|
||||||
|
|
||||||
# Allow users to force archive extraction
|
|
||||||
option(NodeJS_FORCE_EXTRACT "Extract the archive every time" Off)
|
|
||||||
|
|
||||||
# Make libc++ the default when compiling with clang
|
|
||||||
option(NodeJS_USE_CLANG_STDLIB "Use libc++ when compiling with clang" On)
|
|
||||||
if(APPLE)
|
|
||||||
set(NodeJS_USE_CLANG_STDLIB On CACHE BOOL "" FORCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
# Allow users to specify that the executable should be downloaded
|
|
||||||
option(NodeJS_DOWNLOAD_EXECUTABLE
|
|
||||||
"Download matching executable if available" Off
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Try to find the node.js executable
|
|
||||||
# The node executable under linux may not be the correct program
|
|
||||||
find_program(NodeJS_EXECUTABLE
|
|
||||||
NAMES node
|
|
||||||
PATHS ${NodeJS_ROOT_DIR}
|
|
||||||
PATH_SUFFIXES nodejs node
|
|
||||||
)
|
|
||||||
set(NodeJS_VALIDATE_EXECUTABLE 1)
|
|
||||||
if(NodeJS_EXECUTABLE)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${NodeJS_EXECUTABLE} --version
|
|
||||||
RESULT_VARIABLE NodeJS_VALIDATE_EXECUTABLE
|
|
||||||
OUTPUT_VARIABLE NodeJS_INSTALLED_VERSION
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${NodeJS_EXECUTABLE} -p "process.platform"
|
|
||||||
OUTPUT_VARIABLE NodeJS_INSTALLED_PLATFORM
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${NodeJS_EXECUTABLE} -p "process.arch"
|
|
||||||
OUTPUT_VARIABLE NodeJS_INSTALLED_ARCH
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# If node isn't the node.js binary, try the nodejs binary
|
|
||||||
if(NOT NodeJS_VALIDATE_EXECUTABLE EQUAL 0)
|
|
||||||
find_program(NodeJS_EXECUTABLE
|
|
||||||
NAMES nodejs
|
|
||||||
PATHS ${NodeJS_ROOT_DIR}
|
|
||||||
PATH_SUFFIXES nodejs node
|
|
||||||
)
|
|
||||||
set(NodeJS_VALIDATE_EXECUTABLE 1)
|
|
||||||
if(NodeJS_EXECUTABLE)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${NodeJS_EXECUTABLE} --version
|
|
||||||
RESULT_VARIABLE NodeJS_VALIDATE_EXECUTABLE
|
|
||||||
OUTPUT_VARIABLE NodeJS_INSTALLED_VERSION
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT NodeJS_VALIDATE_EXECUTABLE EQUAL 0)
|
|
||||||
message(WARNING "Node.js executable could not be found. \
|
|
||||||
Set NodeJS_ROOT_DIR to the installed location of the executable or \
|
|
||||||
install Node.js to its default location.")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Determine if a variant is set in the components
|
|
||||||
list(APPEND NodeJS_OTHER_COMPONENTS
|
|
||||||
X64 IA32 ARM WIN32 LINUX DARWIN
|
|
||||||
)
|
|
||||||
set(NodeJS_COMPONENTS_CONTAINS_VARIANT False)
|
|
||||||
foreach(NodeJS_COMPONENT ${NodeJS_FIND_COMPONENTS})
|
|
||||||
list(FIND NodeJS_OTHER_COMPONENTS ${NodeJS_COMPONENT} NodeJS_OTHER_INDEX)
|
|
||||||
if(NodeJS_OTHER_INDEX EQUAL -1)
|
|
||||||
set(NodeJS_COMPONENTS_CONTAINS_VARIANT True)
|
|
||||||
break()
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# Get the targeted version of Node.js (or one of its derivatives)
|
|
||||||
if(NOT NodeJS_VERSION)
|
|
||||||
if(NodeJS_FIND_VERSION)
|
|
||||||
set(NodeJS_VERSION ${NodeJS_FIND_VERSION})
|
|
||||||
elseif(NodeJS_INSTALLED_VERSION AND NOT NodeJS_COMPONENTS_CONTAINS_VARIANT)
|
|
||||||
string(SUBSTRING ${NodeJS_INSTALLED_VERSION} 1 -1 NodeJS_VERSION)
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Node.js version is not set. Set the VERSION \
|
|
||||||
property of the find_package command to the required version of the \
|
|
||||||
Node.js sources")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Determine the target platform for the compiled module
|
|
||||||
# Uses several mechanisms in order:
|
|
||||||
#
|
|
||||||
# 1. CMake cache (allows overriding on the command line)
|
|
||||||
# 2. Node architecture when binary is available
|
|
||||||
# 3. CMake architecture
|
|
||||||
#
|
|
||||||
set(NodeJS_PLATFORM "" CACHE STRING "Target node.js platform for module")
|
|
||||||
if(NOT NodeJS_PLATFORM)
|
|
||||||
if(NodeJS_EXECUTABLE)
|
|
||||||
set(NodeJS_PLATFORM ${NodeJS_INSTALLED_PLATFORM})
|
|
||||||
elseif(WIN32)
|
|
||||||
set(NodeJS_PLATFORM "win32")
|
|
||||||
elseif(UNIX)
|
|
||||||
if(APPLE)
|
|
||||||
set(NodeJS_PLATFORM "darwin")
|
|
||||||
else()
|
|
||||||
set(NodeJS_PLATFORM "linux")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Node.js platform is not set. Add the platform \
|
|
||||||
to the find_package components section or set NodeJS_PLATFORM in the \
|
|
||||||
cache.")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Convenience variables for the platform type
|
|
||||||
if(NodeJS_PLATFORM STREQUAL "win32")
|
|
||||||
set(NodeJS_PLATFORM_WIN32 True)
|
|
||||||
set(NodeJS_PLATFORM_LINUX False)
|
|
||||||
set(NodeJS_PLATFORM_DARWIN False)
|
|
||||||
elseif(NodeJS_PLATFORM STREQUAL "linux")
|
|
||||||
set(NodeJS_PLATFORM_WIN32 False)
|
|
||||||
set(NodeJS_PLATFORM_LINUX True)
|
|
||||||
set(NodeJS_PLATFORM_DARWIN False)
|
|
||||||
elseif(NodeJS_PLATFORM STREQUAL "darwin")
|
|
||||||
set(NodeJS_PLATFORM_WIN32 False)
|
|
||||||
set(NodeJS_PLATFORM_LINUX False)
|
|
||||||
set(NodeJS_PLATFORM_DARWIN True)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Determine the target architecture for the compiled module
|
|
||||||
# Uses several mechanisms in order:
|
|
||||||
#
|
|
||||||
# 1. CMake cache (allows overriding on the command line)
|
|
||||||
# 2. Node architecture when binary is available
|
|
||||||
# 3. Compiler architecture under MSVC
|
|
||||||
#
|
|
||||||
set(NodeJS_ARCH "" CACHE STRING "Target node.js architecture for module")
|
|
||||||
if(NOT NodeJS_ARCH)
|
|
||||||
if(NodeJS_EXECUTABLE)
|
|
||||||
set(NodeJS_ARCH ${NodeJS_INSTALLED_ARCH})
|
|
||||||
elseif(MSVC)
|
|
||||||
if(CMAKE_CL_64)
|
|
||||||
set(NodeJS_ARCH "x64")
|
|
||||||
else()
|
|
||||||
set(NodeJS_ARCH "ia32")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Node.js architecture is not set. Add the \
|
|
||||||
architecture to the find_package components section or set NodeJS_ARCH \
|
|
||||||
in the cache.")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Convenience variables for the architecture
|
|
||||||
if(NodeJS_ARCH STREQUAL "x64")
|
|
||||||
set(NodeJS_ARCH_X64 True)
|
|
||||||
set(NodeJS_ARCH_IA32 False)
|
|
||||||
set(NodeJS_ARCH_ARM False)
|
|
||||||
elseif(NodeJS_ARCH STREQUAL "ia32")
|
|
||||||
set(NodeJS_ARCH_X64 False)
|
|
||||||
set(NodeJS_ARCH_IA32 True)
|
|
||||||
set(NodeJS_ARCH_ARM False)
|
|
||||||
elseif(NodeJS_ARCH STREQUAL "arm")
|
|
||||||
set(NodeJS_ARCH_X64 False)
|
|
||||||
set(NodeJS_ARCH_IA32 False)
|
|
||||||
set(NodeJS_ARCH_ARM True)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Include helper functions
|
|
||||||
include(util/NodeJSUtil)
|
|
||||||
|
|
||||||
# Default variant name
|
|
||||||
# Used by the installed header comparison below
|
|
||||||
set(NodeJS_DEFAULT_VARIANT_NAME "node.js")
|
|
||||||
|
|
||||||
# Variables for Node.js artifacts across variants
|
|
||||||
# Specify all of these variables for each new variant
|
|
||||||
set(NodeJS_VARIANT_NAME "") # The printable name of the variant
|
|
||||||
set(NodeJS_VARIANT_BASE "") # A file name safe version of the variant
|
|
||||||
set(NodeJS_URL "") # The URL for the artifacts
|
|
||||||
set(NodeJS_SOURCE_PATH "") # The URL path of the source archive
|
|
||||||
set(NodeJS_CHECKSUM_PATH "") # The URL path of the checksum file
|
|
||||||
set(NodeJS_CHECKSUM_TYPE "") # The checksum type (algorithm)
|
|
||||||
set(NodeJS_WIN32_LIBRARY_PATH "") # The URL path of the windows library
|
|
||||||
set(NodeJS_WIN32_BINARY_PATH "") # The URL path of the windows executable
|
|
||||||
set(NodeJS_WIN32_LIBRARY_NAME "") # The name of the windows library
|
|
||||||
set(NodeJS_WIN32_BINARY_NAME "") # The name of the windows executable
|
|
||||||
|
|
||||||
set(NodeJS_DEFAULT_INCLUDE True) # Enable default include behavior
|
|
||||||
set(NodeJS_DEFAULT_LIBS True) # Include the default libraries
|
|
||||||
set(NodeJS_HAS_WIN32_PREFIX True) # Does the variant use library prefixes
|
|
||||||
set(NodeJS_HAS_WIN32_BINARY True) # Does the variant have win32 executables
|
|
||||||
set(NodeJS_HAS_OPENSSL True) # Does the variant include openssl headers
|
|
||||||
set(NodeJS_HEADER_VERSION 0.12.7) # Version after header-only archives start
|
|
||||||
set(NodeJS_SHA256_VERSION 0.7.0) # Version after sha256 checksums start
|
|
||||||
set(NodeJS_PREFIX_VERSION 0.12.7) # Version after windows prefixing starts
|
|
||||||
set(NodeJS_CXX11R_VERSION 0.12.7) # Version after c++11 is required
|
|
||||||
set(NodeJS_SOURCE_INCLUDE True) # Use the include paths from a source archive
|
|
||||||
set(NodeJS_HEADER_INCLUDE False) # Use the include paths from a header archive
|
|
||||||
set(NodeJS_INCLUDE_PATHS "") # Set of header dirs inside the source archive
|
|
||||||
set(NodeJS_LIBRARIES "") # The set of libraries to link with addon
|
|
||||||
set(NodeJS_WIN32_DELAYLOAD "") # Set of executables to delayload on windows
|
|
||||||
|
|
||||||
# NodeJS variants
|
|
||||||
# Selects download target based on configured component
|
|
||||||
# Include NodeJS last to provide default configurations when omitted
|
|
||||||
file(
|
|
||||||
GLOB NodeJS_SUPPORTED_VARIANTS
|
|
||||||
RELATIVE ${CMAKE_CURRENT_LIST_DIR}/variants
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/variants/*
|
|
||||||
)
|
|
||||||
foreach(NodeJS_SUPPORTED_VARIANT ${NodeJS_SUPPORTED_VARIANTS})
|
|
||||||
get_filename_component(NodeJS_SUPPORTED_VARIANT_NAME
|
|
||||||
${NodeJS_SUPPORTED_VARIANT} NAME_WE
|
|
||||||
)
|
|
||||||
if(NOT NodeJS_SUPPORTED_VARIANT_NAME STREQUAL "NodeJS")
|
|
||||||
include(variants/${NodeJS_SUPPORTED_VARIANT_NAME})
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
include(variants/NodeJS)
|
|
||||||
|
|
||||||
# Populate version variables, including version components
|
|
||||||
set(NodeJS_VERSION_STRING "v${NodeJS_VERSION}")
|
|
||||||
|
|
||||||
# Populate the remaining version variables
|
|
||||||
string(REPLACE "." ";" NodeJS_VERSION_PARTS ${NodeJS_VERSION})
|
|
||||||
list(GET NodeJS_VERSION_PARTS 0 NodeJS_VERSION_MAJOR)
|
|
||||||
list(GET NodeJS_VERSION_PARTS 1 NodeJS_VERSION_MINOR)
|
|
||||||
list(GET NodeJS_VERSION_PARTS 2 NodeJS_VERSION_PATCH)
|
|
||||||
|
|
||||||
# If the version we're looking for is the version that is installed,
|
|
||||||
# try finding the required headers. Don't do this under windows (where
|
|
||||||
# headers are not part of the installed content), when the user has
|
|
||||||
# specified that headers should be downloaded or when using a variant other
|
|
||||||
# than the default
|
|
||||||
if((NOT NodeJS_PLATFORM_WIN32) AND (NOT NodeJS_DOWNLOAD) AND
|
|
||||||
NodeJS_VARIANT_NAME STREQUAL NodeJS_DEFAULT_VARIANT_NAME AND
|
|
||||||
NodeJS_INSTALLED_VERSION STREQUAL NodeJS_VERSION_STRING AND
|
|
||||||
NodeJS_INSTALLED_PLATFORM STREQUAL NodeJS_PLATFORM AND
|
|
||||||
NodeJS_INSTALLED_ARCH STREQUAL NodeJS_ARCH)
|
|
||||||
# node.h is really generic and too easy for cmake to find the wrong
|
|
||||||
# file, so use the directory as a guard, and then just tack it on to
|
|
||||||
# the actual path
|
|
||||||
#
|
|
||||||
# Specifically ran into this under OSX, where python contains a node.h
|
|
||||||
# that gets found instead
|
|
||||||
find_path(NodeJS_INCLUDE_PARENT node/node.h)
|
|
||||||
set(NodeJS_INCLUDE_DIRS ${NodeJS_INCLUDE_PARENT}/node)
|
|
||||||
|
|
||||||
# Under all systems that support this, there are no libraries required
|
|
||||||
# for linking (symbols are resolved via the main executable at runtime)
|
|
||||||
set(NodeJS_LIBRARIES "")
|
|
||||||
|
|
||||||
# Otherwise, headers and required libraries must be downloaded to the project
|
|
||||||
# to supplement what is installed
|
|
||||||
else()
|
|
||||||
# Create a folder for downloaded artifacts
|
|
||||||
set(NodeJS_DOWNLOAD_PATH
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/${NodeJS_VARIANT_BASE}
|
|
||||||
)
|
|
||||||
set(NodeJS_DOWNLOAD_PATH ${NodeJS_DOWNLOAD_PATH}-${NodeJS_VERSION_STRING})
|
|
||||||
file(MAKE_DIRECTORY ${NodeJS_DOWNLOAD_PATH})
|
|
||||||
|
|
||||||
# Download the checksum file for validating all other downloads
|
|
||||||
# Conveniently, if this doesn't download correctly, the setup fails
|
|
||||||
# due to checksum failures
|
|
||||||
set(NodeJS_CHECKSUM_FILE ${NodeJS_DOWNLOAD_PATH}/CHECKSUM)
|
|
||||||
nodejs_download(
|
|
||||||
${NodeJS_URL}/${NodeJS_CHECKSUM_PATH}
|
|
||||||
${NodeJS_CHECKSUM_FILE}
|
|
||||||
${NodeJS_FORCE_DOWNLOAD}
|
|
||||||
)
|
|
||||||
file(READ ${NodeJS_CHECKSUM_FILE} NodeJS_CHECKSUM_DATA)
|
|
||||||
|
|
||||||
# Download and extract the main source archive
|
|
||||||
set(NodeJS_SOURCE_FILE ${NodeJS_DOWNLOAD_PATH}/headers.tar.gz)
|
|
||||||
nodejs_checksum(
|
|
||||||
${NodeJS_CHECKSUM_DATA} ${NodeJS_SOURCE_PATH} NodeJS_SOURCE_CHECKSUM
|
|
||||||
)
|
|
||||||
nodejs_download(
|
|
||||||
${NodeJS_URL}/${NodeJS_SOURCE_PATH}
|
|
||||||
${NodeJS_SOURCE_FILE}
|
|
||||||
${NodeJS_SOURCE_CHECKSUM}
|
|
||||||
${NodeJS_CHECKSUM_TYPE}
|
|
||||||
${NodeJS_FORCE_DOWNLOAD}
|
|
||||||
)
|
|
||||||
set(NodeJS_HEADER_PATH ${NodeJS_DOWNLOAD_PATH}/src)
|
|
||||||
nodejs_extract(
|
|
||||||
${NodeJS_SOURCE_FILE}
|
|
||||||
${NodeJS_HEADER_PATH}
|
|
||||||
${NodeJS_FORCE_EXTRACT}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Populate include directories from the extracted source archive
|
|
||||||
foreach(NodeJS_HEADER_BASE ${NodeJS_INCLUDE_PATHS})
|
|
||||||
set(NodeJS_INCLUDE_DIR ${NodeJS_HEADER_PATH}/${NodeJS_HEADER_BASE})
|
|
||||||
if(NOT EXISTS ${NodeJS_INCLUDE_DIR})
|
|
||||||
message(FATAL_ERROR "Include does not exist: ${NodeJS_INCLUDE_DIR}")
|
|
||||||
endif()
|
|
||||||
list(APPEND NodeJS_INCLUDE_DIRS ${NodeJS_INCLUDE_DIR})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# Download required library files when targeting windows
|
|
||||||
if(NodeJS_PLATFORM_WIN32)
|
|
||||||
# Download the windows library
|
|
||||||
set(NodeJS_WIN32_LIBRARY_FILE
|
|
||||||
${NodeJS_DOWNLOAD_PATH}/lib/${NodeJS_ARCH}
|
|
||||||
)
|
|
||||||
set(NodeJS_WIN32_LIBRARY_FILE
|
|
||||||
${NodeJS_WIN32_LIBRARY_FILE}/${NodeJS_WIN32_LIBRARY_NAME}
|
|
||||||
)
|
|
||||||
nodejs_checksum(
|
|
||||||
${NodeJS_CHECKSUM_DATA} ${NodeJS_WIN32_LIBRARY_PATH}
|
|
||||||
NodeJS_WIN32_LIBRARY_CHECKSUM
|
|
||||||
)
|
|
||||||
nodejs_download(
|
|
||||||
${NodeJS_URL}/${NodeJS_WIN32_LIBRARY_PATH}
|
|
||||||
${NodeJS_WIN32_LIBRARY_FILE}
|
|
||||||
${NodeJS_WIN32_LIBRARY_CHECKSUM}
|
|
||||||
${NodeJS_CHECKSUM_TYPE}
|
|
||||||
${NodeJS_FORCE_DOWNLOAD}
|
|
||||||
)
|
|
||||||
list(APPEND NodeJS_LIBRARIES ${NodeJS_WIN32_LIBRARY_FILE})
|
|
||||||
|
|
||||||
# If provided, download the windows executable
|
|
||||||
if(NodeJS_WIN32_BINARY_PATH AND
|
|
||||||
NodeJS_DOWNLOAD_EXECUTABLE)
|
|
||||||
set(NodeJS_WIN32_BINARY_FILE
|
|
||||||
${NodeJS_DOWNLOAD_PATH}/lib/${NodeJS_ARCH}
|
|
||||||
)
|
|
||||||
set(NodeJS_WIN32_BINARY_FILE
|
|
||||||
${NodeJS_WIN32_BINARY_FILE}/${NodeJS_WIN32_BINARY_NAME}
|
|
||||||
)
|
|
||||||
nodejs_checksum(
|
|
||||||
${NodeJS_CHECKSUM_DATA} ${NodeJS_WIN32_BINARY_PATH}
|
|
||||||
NodeJS_WIN32_BINARY_CHECKSUM
|
|
||||||
)
|
|
||||||
nodejs_download(
|
|
||||||
${NodeJS_URL}/${NodeJS_WIN32_BINARY_PATH}
|
|
||||||
${NodeJS_WIN32_BINARY_FILE}
|
|
||||||
${NodeJS_WIN32_BINARY_CHECKSUM}
|
|
||||||
${NodeJS_CHECKSUM_TYPE}
|
|
||||||
${NodeJS_FORCE_DOWNLOAD}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Support windows delay loading
|
|
||||||
if(NodeJS_PLATFORM_WIN32)
|
|
||||||
list(APPEND NodeJS_LINK_FLAGS /IGNORE:4199)
|
|
||||||
set(NodeJS_WIN32_DELAYLOAD_CONDITION "")
|
|
||||||
foreach(NodeJS_WIN32_DELAYLOAD_BINARY ${NodeJS_WIN32_DELAYLOAD})
|
|
||||||
list(APPEND NodeJS_LINK_FLAGS
|
|
||||||
/DELAYLOAD:${NodeJS_WIN32_DELAYLOAD_BINARY}
|
|
||||||
)
|
|
||||||
list(APPEND NodeJS_WIN32_DELAYLOAD_CONDITION
|
|
||||||
"_stricmp(info->szDll, \"${NodeJS_WIN32_DELAYLOAD_BINARY}\") != 0"
|
|
||||||
)
|
|
||||||
endforeach()
|
|
||||||
string(REPLACE ";" " &&\n "
|
|
||||||
NodeJS_WIN32_DELAYLOAD_CONDITION
|
|
||||||
"${NodeJS_WIN32_DELAYLOAD_CONDITION}"
|
|
||||||
)
|
|
||||||
configure_file(
|
|
||||||
${NodeJS_MODULE_PATH}/src/win_delay_load_hook.c
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/win_delay_load_hook.c @ONLY
|
|
||||||
)
|
|
||||||
list(APPEND NodeJS_ADDITIONAL_SOURCES
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/win_delay_load_hook.c
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Allow undefined symbols on OSX
|
|
||||||
if(NodeJS_PLATFORM_DARWIN)
|
|
||||||
list(APPEND NodeJS_LINK_FLAGS "-undefined dynamic_lookup")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Use libc++ when clang is the compiler by default
|
|
||||||
if(NodeJS_USE_CLANG_STDLIB AND CMAKE_CXX_COMPILER_ID MATCHES ".*Clang.*")
|
|
||||||
list(APPEND NodeJS_COMPILE_OPTIONS -stdlib=libc++)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Require c++11 support after a specific point, but only if the user hasn't
|
|
||||||
# specified an override
|
|
||||||
if(NOT NodeJS_CXX_STANDARD)
|
|
||||||
if(NodeJS_VERSION VERSION_GREATER NodeJS_CXX11R_VERSION)
|
|
||||||
set(NodeJS_CXX_STANDARD 11)
|
|
||||||
else()
|
|
||||||
set(NodeJS_CXX_STANDARD 98)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Set required definitions
|
|
||||||
list(APPEND NodeJS_DEFINITIONS BUILDING_NODE_EXTENSION)
|
|
||||||
if(NodeJS_PLATFORM_DARWIN)
|
|
||||||
list(APPEND NodeJS_DEFINITIONS _DARWIN_USE_64_BIT_INODE=1)
|
|
||||||
endif()
|
|
||||||
if(NOT NodeJS_PLATFORM_WIN32)
|
|
||||||
list(APPEND NodeJS_DEFINITIONS
|
|
||||||
_LARGEFILE_SOURCE
|
|
||||||
_FILE_OFFSET_BITS=64
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
function(add_nodejs_module NAME)
|
|
||||||
# Build a shared library for the module
|
|
||||||
add_library(${NAME} SHARED ${ARGN} ${NodeJS_ADDITIONAL_SOURCES})
|
|
||||||
|
|
||||||
# Include required headers
|
|
||||||
# Find and include Nan as well (always available as its a
|
|
||||||
# dependency of this module)
|
|
||||||
nodejs_find_module_fallback(nan ${CMAKE_CURRENT_SOURCE_DIR} NAN_PATH)
|
|
||||||
target_include_directories(${NAME}
|
|
||||||
PUBLIC ${NodeJS_INCLUDE_DIRS}
|
|
||||||
PUBLIC ${NAN_PATH}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Set module properties
|
|
||||||
# This ensures proper naming of the module library across all platforms
|
|
||||||
get_target_property(COMPILE_OPTIONS ${NAME} COMPILE_OPTIONS)
|
|
||||||
if(NOT COMPILE_OPTIONS)
|
|
||||||
set(COMPILE_OPTIONS "")
|
|
||||||
endif()
|
|
||||||
set(COMPILE_OPTIONS ${COMPILE_OPTIONS} ${NodeJS_COMPILE_OPTIONS})
|
|
||||||
get_target_property(LINK_FLAGS ${NAME} LINK_FLAGS)
|
|
||||||
if(NOT LINK_FLAGS)
|
|
||||||
set(LINK_FLAGS "")
|
|
||||||
endif()
|
|
||||||
foreach(NodeJS_LINK_FLAG ${NodeJS_LINK_FLAGS})
|
|
||||||
set(LINK_FLAGS "${LINK_FLAGS} ${NodeJS_LINK_FLAG}")
|
|
||||||
endforeach()
|
|
||||||
set_target_properties(${NAME} PROPERTIES
|
|
||||||
PREFIX ""
|
|
||||||
SUFFIX ".node"
|
|
||||||
MACOSX_RPATH ON
|
|
||||||
POSITION_INDEPENDENT_CODE TRUE
|
|
||||||
COMPILE_OPTIONS "${COMPILE_OPTIONS}"
|
|
||||||
LINK_FLAGS "${LINK_FLAGS}"
|
|
||||||
CXX_STANDARD_REQUIRED TRUE
|
|
||||||
CXX_STANDARD ${NodeJS_CXX_STANDARD}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Output the module in a per build type directory
|
|
||||||
# This makes builds consistent with visual studio and other generators
|
|
||||||
# that build by configuration
|
|
||||||
if(NOT CMAKE_CONFIGURATION_TYPES)
|
|
||||||
set_property(TARGET ${NAME} PROPERTY LIBRARY_OUTPUT_DIRECTORY
|
|
||||||
${CMAKE_BUILD_TYPE}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Set any required complier flags
|
|
||||||
# Mostly used under windows
|
|
||||||
target_compile_definitions(${NAME} PRIVATE ${NodeJS_DEFINITIONS})
|
|
||||||
|
|
||||||
# Link against required NodeJS libraries
|
|
||||||
target_link_libraries(${NAME} ${NodeJS_LIBRARIES})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# Write out the configuration for node scripts
|
|
||||||
configure_file(
|
|
||||||
${NodeJS_MODULE_PATH}/build.json.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/build.json @ONLY
|
|
||||||
)
|
|
||||||
|
|
||||||
# Make sure we haven't violated the version-to-standard mapping
|
|
||||||
if(NodeJS_VERSION VERSION_GREATER NodeJS_CXX11R_VERSION AND
|
|
||||||
NodeJS_CXX_STANDARD EQUAL 98)
|
|
||||||
message(FATAL_ERROR "${NodeJS_VARIANT_NAME} ${NodeJS_VERSION} \
|
|
||||||
requires C++11 or newer to build")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# This is a find_package file, handle the standard invocation
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
set(NodeJS_TARGET "${NodeJS_VARIANT_NAME} ${NodeJS_PLATFORM}/${NodeJS_ARCH}")
|
|
||||||
find_package_handle_standard_args(NodeJS
|
|
||||||
FOUND_VAR NodeJS_FOUND
|
|
||||||
REQUIRED_VARS NodeJS_TARGET NodeJS_INCLUDE_DIRS
|
|
||||||
VERSION_VAR NodeJS_VERSION
|
|
||||||
)
|
|
||||||
|
|
||||||
# Mark variables that users shouldn't modify
|
|
||||||
mark_as_advanced(
|
|
||||||
NodeJS_VALIDATE_EXECUTABLE
|
|
||||||
NodeJS_OTHER_COMPONENTS
|
|
||||||
NodeJS_COMPONENTS_CONTAINS_VARIANT
|
|
||||||
NodeJS_COMPONENT
|
|
||||||
NodeJS_OTHER_INDEX
|
|
||||||
NodeJS_VERSION_STRING
|
|
||||||
NodeJS_VERSION_MAJOR
|
|
||||||
NodeJS_VERSION_MINOR
|
|
||||||
NodeJS_VERSION_PATCH
|
|
||||||
NodeJS_VERSION_TWEAK
|
|
||||||
NodeJS_PLATFORM
|
|
||||||
NodeJS_PLATFORM_WIN32
|
|
||||||
NodeJS_PLATFORM_LINUX
|
|
||||||
NodeJS_PLATFORM_DARWIN
|
|
||||||
NodeJS_ARCH
|
|
||||||
NodeJS_ARCH_X64
|
|
||||||
NodeJS_ARCH_IA32
|
|
||||||
NodeJS_ARCH_ARM
|
|
||||||
NodeJS_DEFAULT_VARIANT_NAME
|
|
||||||
NodeJS_VARIANT_BASE
|
|
||||||
NodeJS_VARIANT_NAME
|
|
||||||
NodeJS_URL
|
|
||||||
NodeJS_SOURCE_PATH
|
|
||||||
NodeJS_CHECKSUM_PATH
|
|
||||||
NodeJS_CHECKSUM_TYPE
|
|
||||||
NodeJS_WIN32_LIBRARY_PATH
|
|
||||||
NodeJS_WIN32_BINARY_PATH
|
|
||||||
NodeJS_WIN32_LIBRARY_NAME
|
|
||||||
NodeJS_WIN32_BINARY_NAME
|
|
||||||
NodeJS_DEFAULT_INCLUDE
|
|
||||||
NodeJS_DEFAULT_LIBS
|
|
||||||
NodeJS_HAS_WIN32_BINARY
|
|
||||||
NodeJS_HEADER_VERSION
|
|
||||||
NodeJS_SHA256_VERISON
|
|
||||||
NodeJS_PREFIX_VERSION
|
|
||||||
NodeJS_SOURCE_INCLUDE
|
|
||||||
NodeJS_HEADER_INCLUDE
|
|
||||||
NodeJS_INCLUDE_PATHS
|
|
||||||
NodeJS_WIN32_DELAYLOAD
|
|
||||||
NodeJS_DOWNLOAD_PATH
|
|
||||||
NodeJS_CHECKSUM_FILE
|
|
||||||
NodeJS_CHECKSUM_DATA
|
|
||||||
NodeJS_SOURCE_FILE
|
|
||||||
NodeJS_SOURCE_CHECKSUM
|
|
||||||
NodeJS_HEADER_PATH
|
|
||||||
NodeJS_HEADER_BASE
|
|
||||||
NodeJS_INCLUDE_DIR
|
|
||||||
NodeJS_WIN32_LIBRARY_FILE
|
|
||||||
NodeJS_WIN32_LIBRARY_CHECKSUM
|
|
||||||
NodeJS_WIN32_BINARY_FILE
|
|
||||||
NodeJS_WIN32_BINARY_CHECKSUM
|
|
||||||
NodeJS_NAN_PATH
|
|
||||||
NodeJS_LINK_FLAGS
|
|
||||||
NodeJS_COMPILE_OPTIONS
|
|
||||||
NodeJS_ADDITIONAL_SOURCES
|
|
||||||
NodeJS_WIN32_DELAYLOAD_CONDITION
|
|
||||||
NodeJS_WIN32_DELAYLOAD_BINARY
|
|
||||||
NodeJS_TARGET
|
|
||||||
)
|
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"build_type": "@CMAKE_BUILD_TYPE@",
|
|
||||||
"generator": "@CMAKE_GENERATOR@",
|
|
||||||
"toolset": "@CMAKE_GENERATOR_TOOLSET@",
|
|
||||||
"platform": "@CMAKE_GENERATOR_PLATFORM@",
|
|
||||||
"variant": "@NodeJS_VARIANT_BASE@",
|
|
||||||
"version": "@NodeJS_VERSION@",
|
|
||||||
"download": "@NodeJS_DOWNLOAD@",
|
|
||||||
"standard": "@NodeJS_CXX_STANDARD@"
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
set(GITHUB_API_TOKEN $ENV{GITHUB_API_TOKEN})
|
|
||||||
|
|
||||||
set(GITHUB_AUTH "")
|
|
||||||
if(GITHUB_API_TOKEN)
|
|
||||||
set(GITHUB_AUTH "?access_token=${GITHUB_API_TOKEN}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(GITHUB_API_URL "https://api.github.com")
|
|
||||||
|
|
||||||
function(github_get_rate_limit VAR)
|
|
||||||
set(RATE_LIMIT_FILE ${CMAKE_CURRENT_BINARY_DIR}/GITHUBRATE)
|
|
||||||
set(RATE_LIMIT_URL ${GITHUB_API_URL}/rate_limit${GITHUB_AUTH})
|
|
||||||
nodejs_download(
|
|
||||||
${RATE_LIMIT_URL}
|
|
||||||
${RATE_LIMIT_FILE}
|
|
||||||
ON
|
|
||||||
)
|
|
||||||
file(READ ${RATE_LIMIT_FILE} RATE_LIMIT_DATA)
|
|
||||||
string(REGEX MATCH "\"remaining\": ([0-9]+),"
|
|
||||||
RATE_LIMIT_MATCH ${RATE_LIMIT_DATA})
|
|
||||||
set(${VAR} ${CMAKE_MATCH_1} PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
GITHUB_AUTH
|
|
||||||
GITHUB_API_TOKEN
|
|
||||||
GITHUB_API_URL
|
|
||||||
)
|
|
@ -1,166 +0,0 @@
|
|||||||
function(nodejs_check_file FILE)
|
|
||||||
set(MESSAGE "File ${FILE} does not exist or is empty")
|
|
||||||
if(ARGC GREATER 1)
|
|
||||||
set(MESSAGE ${ARGV1})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Make sure the file has contents
|
|
||||||
file(READ ${FILE} FILE_CONTENT LIMIT 1 HEX)
|
|
||||||
if(NOT FILE_CONTENT)
|
|
||||||
file(REMOVE ${FILE})
|
|
||||||
message(FATAL_ERROR ${MESSAGE})
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(nodejs_download URL FILE)
|
|
||||||
# Function optionally takes a checksum and a checksum type, and
|
|
||||||
# a force value
|
|
||||||
# Either can be specified without the other, but checksum must come first
|
|
||||||
if(ARGC GREATER 2)
|
|
||||||
set(CHECKSUM ${ARGV2})
|
|
||||||
if(CHECKSUM STREQUAL "On" OR CHECKSUM STREQUAL "ON" OR
|
|
||||||
CHECKSUM STREQUAL "True" OR CHECKSUM STREQUAL "TRUE" OR
|
|
||||||
CHECKSUM STREQUAL "Off" OR CHECKSUM STREQUAL "OFF" OR
|
|
||||||
CHECKSUM STREQUAL "False" OR CHECKSUM STREQUAL "FALSE")
|
|
||||||
set(FORCE ${CHECKSUM})
|
|
||||||
unset(CHECKSUM)
|
|
||||||
elseif(ARGC GREATER 3)
|
|
||||||
set(TYPE ${ARGV3})
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Checksum type must be specified")
|
|
||||||
endif()
|
|
||||||
elseif(ARGC GREATER 4)
|
|
||||||
set(CHECKSUM ${ARGV2})
|
|
||||||
set(TYPE ${ARGV3})
|
|
||||||
set(FORCE ${ARGV4})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# If the file exists, no need to download it again unless its being forced
|
|
||||||
if(NOT FORCE AND EXISTS ${FILE})
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Download the file
|
|
||||||
message(STATUS "Downloading: ${URL}")
|
|
||||||
file(DOWNLOAD
|
|
||||||
${URL}
|
|
||||||
${FILE}
|
|
||||||
SHOW_PROGRESS
|
|
||||||
)
|
|
||||||
|
|
||||||
# Make sure the file has contents
|
|
||||||
nodejs_check_file(${FILE} "Unable to download ${URL}")
|
|
||||||
|
|
||||||
# If a checksum is provided, validate the downloaded file
|
|
||||||
if(CHECKSUM)
|
|
||||||
message(STATUS "Validating: ${FILE}")
|
|
||||||
file(${TYPE} ${FILE} DOWNLOAD_CHECKSUM)
|
|
||||||
message(STATUS "Checksum: ${CHECKSUM}")
|
|
||||||
message(STATUS "Download: ${DOWNLOAD_CHECKSUM}")
|
|
||||||
if(NOT CHECKSUM STREQUAL DOWNLOAD_CHECKSUM)
|
|
||||||
file(REMOVE ${FILE})
|
|
||||||
message(FATAL_ERROR "Validation failure: ${FILE}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(nodejs_checksum DATA FILE VAR)
|
|
||||||
string(REGEX MATCH "([A-Fa-f0-9]+)[\t ]+${FILE}" CHECKSUM_MATCH ${DATA})
|
|
||||||
if(CMAKE_MATCH_1)
|
|
||||||
set(${VAR} ${CMAKE_MATCH_1} PARENT_SCOPE)
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Unable to extract file checksum")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(nodejs_extract FILE DIR)
|
|
||||||
# Function optionally takes a force value
|
|
||||||
if(ARGC GREATER 2)
|
|
||||||
set(FORCE ${ARGV2})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# If the archvie has been extracted, no need to extract again unless it
|
|
||||||
# is being forced
|
|
||||||
if(NOT FORCE AND EXISTS ${DIR})
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Make a temporary directory for extracting the output
|
|
||||||
set(EXTRACT_DIR ${CMAKE_CURRENT_BINARY_DIR}/extract)
|
|
||||||
if(EXISTS ${EXTRACT_DIR})
|
|
||||||
file(REMOVE_RECURSE ${EXTRACT_DIR})
|
|
||||||
endif()
|
|
||||||
file(MAKE_DIRECTORY ${EXTRACT_DIR})
|
|
||||||
|
|
||||||
# Extract the archive
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E tar xfz ${FILE}
|
|
||||||
WORKING_DIRECTORY ${EXTRACT_DIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
# If only one element is extracted, the archive contained a nested
|
|
||||||
# folder; use the inner folder as the extracted folder
|
|
||||||
file(GLOB EXTRACT_CHILDREN ${EXTRACT_DIR}/*)
|
|
||||||
list(LENGTH EXTRACT_CHILDREN NUM_CHILDREN)
|
|
||||||
set(TARGET_DIR ${EXTRACT_DIR})
|
|
||||||
if(NUM_CHILDREN EQUAL 1)
|
|
||||||
list(GET EXTRACT_CHILDREN 0 TARGET_DIR)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Move the folder to the target path
|
|
||||||
if(EXISTS ${DIR})
|
|
||||||
file(REMOVE_RECURSE ${DIR})
|
|
||||||
endif()
|
|
||||||
file(RENAME ${TARGET_DIR} ${DIR})
|
|
||||||
|
|
||||||
# Make sure to clean up the extraction folder when the inner folder
|
|
||||||
# is used
|
|
||||||
file(REMOVE_RECURSE ${EXTRACT_DIR})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(nodejs_find_module NAME BASE PATH)
|
|
||||||
# Find a node module using the same search path that require uses
|
|
||||||
# without needing a node binary
|
|
||||||
set(ROOT ${BASE})
|
|
||||||
set(DRIVE "^[A-Za-z]?:?/$")
|
|
||||||
|
|
||||||
# Walk up the directory tree until at the root
|
|
||||||
while(NOT ROOT MATCHES ${DRIVE} AND NOT
|
|
||||||
EXISTS ${ROOT}/node_modules/${NAME})
|
|
||||||
get_filename_component(ROOT ${ROOT} DIRECTORY)
|
|
||||||
endwhile()
|
|
||||||
|
|
||||||
# Operate like the CMake find_* functions, returning NOTFOUND if the
|
|
||||||
# module can't be found
|
|
||||||
if(ROOT MATCHES ${DRIVE})
|
|
||||||
set(${PATH} ${NAME}-NOTFOUND PARENT_SCOPE)
|
|
||||||
else()
|
|
||||||
set(${PATH} ${ROOT}/node_modules/${NAME} PARENT_SCOPE)
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
macro(nodejs_find_module_fallback NAME BASE PATH)
|
|
||||||
# Look in the provided path first
|
|
||||||
# If the module isn't found, try searching from the module
|
|
||||||
nodejs_find_module(${NAME} ${BASE} ${PATH})
|
|
||||||
if(NOT ${PATH})
|
|
||||||
nodejs_find_module(${NAME} ${NodeJS_MODULE_PATH} ${PATH})
|
|
||||||
endif()
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
function(nodejs_get_version URL VAR)
|
|
||||||
set(NWJS_LATEST_RELEASE_URL
|
|
||||||
"${NWJS_URL_BASE}/latest/${NodeJS_CHECKSUM_PATH}")
|
|
||||||
set(VERSION_FILE ${CMAKE_CURRENT_BINARY_DIR}/VERSION)
|
|
||||||
nodejs_download(
|
|
||||||
${URL}
|
|
||||||
${VERSION_FILE}
|
|
||||||
ON
|
|
||||||
)
|
|
||||||
nodejs_check_file(${VERSION_FILE})
|
|
||||||
file(READ ${VERSION_FILE} VERSION_DATA)
|
|
||||||
string(REGEX MATCH "v([0-9]+\.[0-9]+\.[0-9]+)"
|
|
||||||
VERSION_MATCH ${VERSION_DATA}
|
|
||||||
)
|
|
||||||
set(${VAR} ${CMAKE_MATCH_1} PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
@ -1,81 +0,0 @@
|
|||||||
set(ELECTRON_VARIANT_BASE "electron")
|
|
||||||
set(ELECTRON_WIN32_BINARY_NAME "${ELECTRON_VARIANT_BASE}.exe")
|
|
||||||
list(APPEND NodeJS_WIN32_DELAYLOAD ${ELECTRON_WIN32_BINARY_NAME})
|
|
||||||
|
|
||||||
if(NodeJS_FIND_REQUIRED_ELECTRON OR
|
|
||||||
NodeJS_VARIANT STREQUAL ${ELECTRON_VARIANT_BASE})
|
|
||||||
if(NodeJS_VERSION STREQUAL "latest")
|
|
||||||
include(util/Github)
|
|
||||||
github_get_rate_limit(GITHUB_RATE_LIMIT)
|
|
||||||
|
|
||||||
# Handle determining the latest release
|
|
||||||
# Very complicated, due to electron not following the "latest"
|
|
||||||
# convention of other variants
|
|
||||||
set(ELECTRON_LATEST_RELEASE_FILE ${CMAKE_CURRENT_BINARY_DIR}/ELECTRON)
|
|
||||||
set(ELECTRON_LATEST_RELEASE_URL
|
|
||||||
${GITHUB_API_URL}/repos/atom/electron/releases/latest${GITHUB_AUTH}
|
|
||||||
)
|
|
||||||
if(GITHUB_RATE_LIMIT GREATER 0)
|
|
||||||
nodejs_download(
|
|
||||||
${ELECTRON_LATEST_RELEASE_URL}
|
|
||||||
${ELECTRON_LATEST_RELEASE_FILE}
|
|
||||||
ON
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
nodejs_check_file(
|
|
||||||
${ELECTRON_LATEST_RELEASE_FILE}
|
|
||||||
"Releases file could not be downloaded, likely \
|
|
||||||
because github rate limit was exceeded. Wait until the limit \
|
|
||||||
passes or set GITHUB_API_TOKEN in your environment to a valid \
|
|
||||||
github developer token."
|
|
||||||
)
|
|
||||||
file(READ ${ELECTRON_LATEST_RELEASE_FILE} ELECTRON_LATEST_RELEASE_DATA)
|
|
||||||
string(REGEX MATCH "\"tag_name\"\: \"v([0-9]+\.[0-9]+\.[0-9]+)\""
|
|
||||||
ELECTRON_LATEST_RELEASE_MATCH ${ELECTRON_LATEST_RELEASE_DATA})
|
|
||||||
set(NodeJS_VERSION ${CMAKE_MATCH_1})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(NodeJS_VARIANT_NAME "Electron.js")
|
|
||||||
|
|
||||||
# SHASUMS of any kind is inaccessible prior to 0.16.0
|
|
||||||
if(NodeJS_VERSION VERSION_LESS 0.16.0)
|
|
||||||
message(FATAL_ERROR "Electron is only supported for versions >= 0.16.0")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Electron switched to IOJS after 0.25.0
|
|
||||||
# Probably needs to be bounded on the upper side if/when they switch
|
|
||||||
# back to node mainline due to iojs-node merge
|
|
||||||
set(NodeJS_VARIANT_BASE "node")
|
|
||||||
if(NodeJS_VERSION VERSION_GREATER 0.25.0)
|
|
||||||
set(NodeJS_VARIANT_BASE "iojs")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Url is hard to get, because it will immediately resolve to a CDN
|
|
||||||
# Extracted from the electron website
|
|
||||||
set(NodeJS_URL
|
|
||||||
"https://atom.io/download/atom-shell/v${NodeJS_VERSION}"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Headers become available for IOJS base ONLY!
|
|
||||||
# Variant base switch above handles this
|
|
||||||
set(NodeJS_HEADER_VERSION 0.30.1)
|
|
||||||
|
|
||||||
# Header only archive uses source style paths
|
|
||||||
set(NodeJS_DEFAULT_INCLUDE False)
|
|
||||||
|
|
||||||
# Hard to determine, but versions seem to start at 16, and SHA256 is
|
|
||||||
# available
|
|
||||||
set(NodeJS_SHA256_VERSION 0.15.9)
|
|
||||||
|
|
||||||
# C++11 and Prefixing start after the IOJS switch
|
|
||||||
# Will carry forward after node mainline so no need for upper bound (whew)
|
|
||||||
set(NodeJS_PREFIX_VERSION 0.25.0)
|
|
||||||
set(NodeJS_CXX11R_VERSION 0.25.0)
|
|
||||||
|
|
||||||
# The executable is not provided on the CDN
|
|
||||||
# In theory, I could support a BINARY_URL to get this from github
|
|
||||||
set(NodeJS_HAS_WIN32_BINARY False)
|
|
||||||
|
|
||||||
# OpenSSL isn't included in the headers
|
|
||||||
set(NodeJS_HAS_OPENSSL False)
|
|
||||||
endif()
|
|
@ -1,25 +0,0 @@
|
|||||||
set(IOJS_URL_BASE "https://iojs.org/dist")
|
|
||||||
set(IOJS_VARIANT_BASE "iojs")
|
|
||||||
set(IOJS_WIN32_BINARY_NAME "${IOJS_VARIANT_BASE}.exe")
|
|
||||||
list(APPEND NodeJS_WIN32_DELAYLOAD ${IOJS_WIN32_BINARY_NAME})
|
|
||||||
|
|
||||||
if(NodeJS_FIND_REQUIRED_IOJS OR NodeJS_VARIANT STREQUAL ${IOJS_VARIANT_BASE})
|
|
||||||
if(NodeJS_VERSION STREQUAL "latest")
|
|
||||||
set(IOJS_LATEST_RELEASE_URL
|
|
||||||
"${IOJS_URL_BASE}/latest/SHASUMS256.txt")
|
|
||||||
nodejs_get_version(${IOJS_LATEST_RELEASE_URL} NodeJS_VERSION)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(NodeJS_VARIANT_NAME "io.js")
|
|
||||||
set(NodeJS_VARIANT_BASE ${IOJS_VARIANT_BASE})
|
|
||||||
set(NodeJS_URL "${IOJS_URL_BASE}/v${NodeJS_VERSION}")
|
|
||||||
set(NodeJS_HEADER_VERSION 2.3.1)
|
|
||||||
set(NodeJS_WIN32_BINARY_NAME "${IOJS_WIN32_BINARY_NAME}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
IOJS_URL_BASE
|
|
||||||
IOJS_VARIANT_BASE
|
|
||||||
IOJS_WIN32_BINARY_NAME
|
|
||||||
IOJS_LATEST_RELEASE_URL
|
|
||||||
)
|
|
@ -1,30 +0,0 @@
|
|||||||
set(NWJS_URL_BASE "http://dl.nwjs.io")
|
|
||||||
set(NWJS_VARIANT_BASE "nw")
|
|
||||||
set(NWJS_WIN32_BINARY_NAME "${NWJS_VARIANT_BASE}.exe")
|
|
||||||
list(APPEND NodeJS_WIN32_DELAYLOAD ${NWJS_WIN32_BINARY_NAME})
|
|
||||||
|
|
||||||
if(NodeJS_FIND_REQUIRED_NWJS OR NodeJS_VARIANT STREQUAL ${NWJS_VARIANT_BASE})
|
|
||||||
set(NodeJS_CHECKSUM_PATH "MD5SUMS")
|
|
||||||
set(NodeJS_CHECKSUM_TYPE "MD5")
|
|
||||||
|
|
||||||
if(NodeJS_VERSION STREQUAL "latest")
|
|
||||||
set(NWJS_LATEST_RELEASE_URL
|
|
||||||
"${NWJS_URL_BASE}/latest/${NodeJS_CHECKSUM_PATH}")
|
|
||||||
nodejs_get_version(${NWJS_LATEST_RELEASE_URL} NodeJS_VERSION)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(NodeJS_VARIANT_NAME "nw.js")
|
|
||||||
set(NodeJS_VARIANT_BASE ${NWJS_VARIANT_BASE})
|
|
||||||
set(NodeJS_URL "${NWJS_URL_BASE}/v${NodeJS_VERSION}")
|
|
||||||
set(NodeJS_SOURCE_PATH "nw-headers-v${NodeJS_VERSION}.tar.gz")
|
|
||||||
set(NodeJS_DEFAULT_INCLUDE False)
|
|
||||||
set(NodeJS_HAS_WIN32_PREFIX False)
|
|
||||||
set(NodeJS_HAS_WIN32_BINARY False)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
NWJS_URL_BASE
|
|
||||||
NWJS_VARIANT_BASE
|
|
||||||
NWJS_WIN32_BINARY_NAME
|
|
||||||
NWJS_LATEST_RELEASE_URL
|
|
||||||
)
|
|
@ -1,131 +0,0 @@
|
|||||||
set(NodeJS_URL_BASE http://nodejs.org/dist)
|
|
||||||
set(NodeJS_DEFAULT_VARIANT_BASE "node")
|
|
||||||
set(NodeJS_DEFAULT_WIN32_BINARY_NAME "${NodeJS_DEFAULT_VARIANT_BASE}.exe")
|
|
||||||
list(APPEND NodeJS_WIN32_DELAYLOAD ${NodeJS_DEFAULT_WIN32_BINARY_NAME})
|
|
||||||
|
|
||||||
if(NodeJS_VERSION STREQUAL "latest")
|
|
||||||
set(NodeJS_LATEST_RELEASE_URL
|
|
||||||
"${NodeJS_URL_BASE}/latest/SHASUMS256.txt")
|
|
||||||
nodejs_get_version(${NodeJS_LATEST_RELEASE_URL} NodeJS_VERSION)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT NodeJS_VARIANT_NAME)
|
|
||||||
set(NodeJS_VARIANT_NAME ${NodeJS_DEFAULT_VARIANT_NAME})
|
|
||||||
endif()
|
|
||||||
if(NOT NodeJS_VARIANT_BASE)
|
|
||||||
set(NodeJS_VARIANT_BASE ${NodeJS_DEFAULT_VARIANT_BASE})
|
|
||||||
endif()
|
|
||||||
if(NOT NodeJS_URL)
|
|
||||||
set(NodeJS_URL "${NodeJS_URL_BASE}/v${NodeJS_VERSION}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT NodeJS_SOURCE_PATH)
|
|
||||||
set(NodeJS_SOURCE_PATH "${NodeJS_VARIANT_BASE}-v${NodeJS_VERSION}")
|
|
||||||
# Use the headers archive when its available
|
|
||||||
if(NodeJS_VERSION VERSION_GREATER ${NodeJS_HEADER_VERSION})
|
|
||||||
set(NodeJS_SOURCE_PATH "${NodeJS_SOURCE_PATH}-headers")
|
|
||||||
endif()
|
|
||||||
set(NodeJS_SOURCE_PATH "${NodeJS_SOURCE_PATH}.tar.gz")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NodeJS_DEFAULT_INCLUDE AND
|
|
||||||
NodeJS_VERSION VERSION_GREATER ${NodeJS_HEADER_VERSION})
|
|
||||||
set(NodeJS_SOURCE_INCLUDE False)
|
|
||||||
set(NodeJS_HEADER_INCLUDE True)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NodeJS_SOURCE_INCLUDE)
|
|
||||||
list(APPEND NodeJS_INCLUDE_PATHS
|
|
||||||
src
|
|
||||||
deps/uv/include
|
|
||||||
deps/v8/include
|
|
||||||
deps/zlib
|
|
||||||
)
|
|
||||||
# OpenSSL is an optional header
|
|
||||||
if(NodeJS_HAS_OPENSSL)
|
|
||||||
list(APPEND NodeJS_INCLUDE_PATHS
|
|
||||||
deps/openssl/openssl/include
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if(NodeJS_HEADER_INCLUDE)
|
|
||||||
set(NodeJS_INCLUDE_PATHS include/node)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT NodeJS_CHECKSUM_TYPE)
|
|
||||||
# Use SHA256 when available
|
|
||||||
if(NodeJS_VERSION VERSION_GREATER ${NodeJS_SHA256_VERSION})
|
|
||||||
set(NodeJS_CHECKSUM_TYPE "SHA256")
|
|
||||||
else()
|
|
||||||
set(NodeJS_CHECKSUM_TYPE "SHA1")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT NodeJS_CHECKSUM_PATH)
|
|
||||||
set(NodeJS_CHECKSUM_PATH "SHASUMS")
|
|
||||||
if(NodeJS_CHECKSUM_TYPE STREQUAL "SHA256")
|
|
||||||
set(NodeJS_CHECKSUM_PATH "${NodeJS_CHECKSUM_PATH}256")
|
|
||||||
endif()
|
|
||||||
set(NodeJS_CHECKSUM_PATH "${NodeJS_CHECKSUM_PATH}.txt")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Library and binary are based on variant base
|
|
||||||
if(NOT NodeJS_WIN32_LIBRARY_NAME)
|
|
||||||
set(NodeJS_WIN32_LIBRARY_NAME ${NodeJS_VARIANT_BASE}.lib)
|
|
||||||
endif()
|
|
||||||
if(NOT NodeJS_WIN32_BINARY_NAME)
|
|
||||||
set(NodeJS_WIN32_BINARY_NAME ${NodeJS_VARIANT_BASE}.exe)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT NodeJS_WIN32_LIBRARY_PATH)
|
|
||||||
# The library location is prefixed after a specific version
|
|
||||||
if(NodeJS_HAS_WIN32_PREFIX AND
|
|
||||||
NodeJS_VERSION VERSION_GREATER ${NodeJS_PREFIX_VERSION})
|
|
||||||
set(NodeJS_WIN32_LIBRARY_PATH "win-")
|
|
||||||
if(NodeJS_ARCH_IA32)
|
|
||||||
set(NodeJS_WIN32_LIBRARY_PATH "${NodeJS_WIN32_LIBRARY_PATH}x86/")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
# 64-bit versions are prefixed
|
|
||||||
if(NodeJS_ARCH_X64)
|
|
||||||
set(NodeJS_WIN32_LIBRARY_PATH "${NodeJS_WIN32_LIBRARY_PATH}x64/")
|
|
||||||
endif()
|
|
||||||
set(NodeJS_WIN32_LIBRARY_PATH
|
|
||||||
"${NodeJS_WIN32_LIBRARY_PATH}${NodeJS_WIN32_LIBRARY_NAME}"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NodeJS_HAS_WIN32_BINARY AND NOT NodeJS_WIN32_BINARY_PATH)
|
|
||||||
# The executable location is prefixed after a specific version
|
|
||||||
if(NodeJS_HAS_WIN32_PREFIX AND
|
|
||||||
NodeJS_VERSION VERSION_GREATER ${NodeJS_PREFIX_VERSION})
|
|
||||||
set(NodeJS_WIN32_BINARY_PATH "win-")
|
|
||||||
if(NodeJS_ARCH_IA32)
|
|
||||||
set(NodeJS_WIN32_BINARY_PATH "${NodeJS_WIN32_BINARY_PATH}x86/")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
# 64-bit versions are prefixed
|
|
||||||
if(NodeJS_ARCH_X64)
|
|
||||||
set(NodeJS_WIN32_BINARY_PATH "${NodeJS_WIN32_BINARY_PATH}x64/")
|
|
||||||
endif()
|
|
||||||
set(NodeJS_WIN32_BINARY_PATH
|
|
||||||
"${NodeJS_WIN32_BINARY_PATH}${NodeJS_WIN32_BINARY_NAME}"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Specify windows libraries
|
|
||||||
# XXX: This may need to be version/variant specific in the future
|
|
||||||
if(NodeJS_DEFAULT_LIBS AND NodeJS_PLATFORM_WIN32)
|
|
||||||
list(APPEND NodeJS_LIBRARIES
|
|
||||||
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
|
|
||||||
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
|
|
||||||
odbc32.lib DelayImp.lib
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
NodeJS_URL_BASE
|
|
||||||
NodeJS_DEFAULT_VARIANT_BASE
|
|
||||||
NodeJS_DEFAULT_WIN32_BINARY_NAME
|
|
||||||
NodeJS_LATEST_RELEASE_URL
|
|
||||||
)
|
|
@ -1,2 +1,2 @@
|
|||||||
var OSRM = module.exports = require('./binding/node-osrm.node').OSRM;
|
var OSRM = module.exports = require('./binding/node_osrm.node').OSRM;
|
||||||
OSRM.version = require('../package.json').version;
|
OSRM.version = require('../package.json').version;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
"description": "The Open Source Routing Machine is a high performance routing engine written in C++14 designed to run on OpenStreetMap data.",
|
"description": "The Open Source Routing Machine is a high performance routing engine written in C++14 designed to run on OpenStreetMap data.",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"nan": "^2.1.0",
|
"nan": "^2.1.0",
|
||||||
"node-cmake": "^1.2.1",
|
"node-cmake": "^2.2.1",
|
||||||
"node-pre-gyp": "^0.6.34"
|
"node-pre-gyp": "^0.6.34"
|
||||||
},
|
},
|
||||||
"browserify": {
|
"browserify": {
|
||||||
@ -27,7 +27,7 @@
|
|||||||
"url": "https://github.com/Project-OSRM/osrm-backend.git"
|
"url": "https://github.com/Project-OSRM/osrm-backend.git"
|
||||||
},
|
},
|
||||||
"author": "Project OSRM Team",
|
"author": "Project OSRM Team",
|
||||||
"license": "BSD 2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/Project-OSRM/osrm-backend/issues"
|
"url": "https://github.com/Project-OSRM/osrm-backend/issues"
|
||||||
},
|
},
|
||||||
|
@ -16,7 +16,7 @@ if [[ ${PUBLISH} == 'On' ]]; then
|
|||||||
# enforce that binary has proper ORIGIN flags so that
|
# enforce that binary has proper ORIGIN flags so that
|
||||||
# it can portably find libtbb.so in the same directory
|
# it can portably find libtbb.so in the same directory
|
||||||
if [[ $(uname -s) == 'Linux' ]]; then
|
if [[ $(uname -s) == 'Linux' ]]; then
|
||||||
readelf -d ./lib/binding/node-osrm.node > readelf-output.txt
|
readelf -d ./lib/binding/node_osrm.node > readelf-output.txt
|
||||||
if grep -q 'Flags: ORIGIN' readelf-output.txt; then
|
if grep -q 'Flags: ORIGIN' readelf-output.txt; then
|
||||||
echo "Found ORIGIN flag in readelf output"
|
echo "Found ORIGIN flag in readelf output"
|
||||||
cat readelf-output.txt
|
cat readelf-output.txt
|
||||||
|
@ -2,24 +2,20 @@
|
|||||||
# require CMake 2.8.11 so that we can build e.g. on Trusty by default.
|
# require CMake 2.8.11 so that we can build e.g. on Trusty by default.
|
||||||
cmake_minimum_required(VERSION 3.1)
|
cmake_minimum_required(VERSION 3.1)
|
||||||
|
|
||||||
message(STATUS "Building node-osrm")
|
message(STATUS "Building node_osrm")
|
||||||
|
|
||||||
set(BINDING_DIR "${PROJECT_SOURCE_DIR}/lib/binding")
|
set(BINDING_DIR "${PROJECT_SOURCE_DIR}/lib/binding")
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/nodejs")
|
include(NodeJS)
|
||||||
|
nodejs_init()
|
||||||
|
|
||||||
set(NodeJS_CXX_STANDARD 14 CACHE INTERNAL "Use C++14" FORCE)
|
message(STATUS "Configuring node_osrm bindings for NodeJs ${NODEJS_VERSION}")
|
||||||
set(NodeJS_DOWNLOAD ON CACHE INTERNAL "Download node.js sources" FORCE)
|
|
||||||
set(NodeJS_USE_CLANG_STDLIB OFF CACHE BOOL "Don't use libc++ by default" FORCE)
|
|
||||||
|
|
||||||
# ^ Make sure to set NodeJs options before including and requiring the NodeJs module.
|
add_nodejs_module(node_osrm node_osrm.cpp)
|
||||||
# Otherwise the module will use defaults (which - among many bad choices - means libc++).
|
set_target_properties(node_osrm PROPERTIES CXX_STANDARD 14)
|
||||||
include(FindNodeJS)
|
target_link_libraries(node_osrm osrm)
|
||||||
find_package(NodeJS REQUIRED)
|
|
||||||
add_nodejs_module(node-osrm node_osrm.cpp)
|
|
||||||
target_link_libraries(node-osrm osrm)
|
|
||||||
|
|
||||||
# node-osrm artifacts in ${BINDING_DIR} to depend targets on
|
# node_osrm artifacts in ${BINDING_DIR} to depend targets on
|
||||||
set(ARTIFACTS "")
|
set(ARTIFACTS "")
|
||||||
|
|
||||||
set(OSRM_BINARIES osrm-extract osrm-contract osrm-routed osrm-datastore osrm-components osrm-partition osrm-customize)
|
set(OSRM_BINARIES osrm-extract osrm-contract osrm-routed osrm-datastore osrm-components osrm-partition osrm-customize)
|
||||||
@ -31,7 +27,7 @@ foreach(binary ${OSRM_BINARIES})
|
|||||||
endforeach(binary)
|
endforeach(binary)
|
||||||
|
|
||||||
# For mason-enabled builds we copy over tbb's shared objects for packaging.
|
# For mason-enabled builds we copy over tbb's shared objects for packaging.
|
||||||
# TODO: consider using statically linked tbb library (for node-osrm only!)
|
# TODO: consider using statically linked tbb library (for node_osrm only!)
|
||||||
if (ENABLE_MASON)
|
if (ENABLE_MASON)
|
||||||
foreach(libpath ${MASON_PACKAGE_tbb_LIBRARY_DIRS})
|
foreach(libpath ${MASON_PACKAGE_tbb_LIBRARY_DIRS})
|
||||||
file(GLOB TBBGlob ${libpath}/*.*)
|
file(GLOB TBBGlob ${libpath}/*.*)
|
||||||
@ -46,11 +42,11 @@ if (ENABLE_MASON)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
add_custom_command(OUTPUT ${BINDING_DIR}/node-osrm.node
|
add_custom_command(OUTPUT ${BINDING_DIR}/node_osrm.node
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:node-osrm> ${BINDING_DIR}
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:node_osrm> ${BINDING_DIR}
|
||||||
DEPENDS node-osrm ${BINDING_DIR})
|
DEPENDS node_osrm ${BINDING_DIR})
|
||||||
list(APPEND ARTIFACTS "${BINDING_DIR}/node-osrm.node")
|
list(APPEND ARTIFACTS "${BINDING_DIR}/node_osrm.node")
|
||||||
|
|
||||||
|
|
||||||
message(STATUS "node-osrm artifacts will be copied to: ${BINDING_DIR}")
|
message(STATUS "node_osrm artifacts will be copied to: ${BINDING_DIR}")
|
||||||
add_custom_target(copy_artifacts ALL DEPENDS ${ARTIFACTS})
|
add_custom_target(copy_artifacts ALL DEPENDS ${ARTIFACTS})
|
||||||
|
Loading…
Reference in New Issue
Block a user