diff --git a/cmake/NodeJS.cmake b/cmake/NodeJS.cmake new file mode 100644 index 000000000..a76808a35 --- /dev/null +++ b/cmake/NodeJS.cmake @@ -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 \n") + file(APPEND ${OUTPUT} "#include \n") + file(APPEND ${OUTPUT} "#include \n") + file(APPEND ${OUTPUT} "#include \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() diff --git a/cmake/nodejs/FindNodeJS.cmake b/cmake/nodejs/FindNodeJS.cmake deleted file mode 100644 index 6f502d074..000000000 --- a/cmake/nodejs/FindNodeJS.cmake +++ /dev/null @@ -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 -) diff --git a/cmake/nodejs/build.json.in b/cmake/nodejs/build.json.in deleted file mode 100644 index d006ad161..000000000 --- a/cmake/nodejs/build.json.in +++ /dev/null @@ -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@" -} \ No newline at end of file diff --git a/cmake/nodejs/util/Github.cmake b/cmake/nodejs/util/Github.cmake deleted file mode 100644 index 8c2e2e910..000000000 --- a/cmake/nodejs/util/Github.cmake +++ /dev/null @@ -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 -) \ No newline at end of file diff --git a/cmake/nodejs/util/NodeJSUtil.cmake b/cmake/nodejs/util/NodeJSUtil.cmake deleted file mode 100644 index f1276be7e..000000000 --- a/cmake/nodejs/util/NodeJSUtil.cmake +++ /dev/null @@ -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() \ No newline at end of file diff --git a/cmake/nodejs/variants/Electron.cmake b/cmake/nodejs/variants/Electron.cmake deleted file mode 100644 index 0087727e3..000000000 --- a/cmake/nodejs/variants/Electron.cmake +++ /dev/null @@ -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() \ No newline at end of file diff --git a/cmake/nodejs/variants/IOJS.cmake b/cmake/nodejs/variants/IOJS.cmake deleted file mode 100644 index 7293e6c3a..000000000 --- a/cmake/nodejs/variants/IOJS.cmake +++ /dev/null @@ -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 -) \ No newline at end of file diff --git a/cmake/nodejs/variants/NWJS.cmake b/cmake/nodejs/variants/NWJS.cmake deleted file mode 100644 index 4ee7ac87f..000000000 --- a/cmake/nodejs/variants/NWJS.cmake +++ /dev/null @@ -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 -) \ No newline at end of file diff --git a/cmake/nodejs/variants/NodeJS.cmake b/cmake/nodejs/variants/NodeJS.cmake deleted file mode 100644 index c11827846..000000000 --- a/cmake/nodejs/variants/NodeJS.cmake +++ /dev/null @@ -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 -) \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 6b62312d9..20aa78feb 100644 --- a/lib/index.js +++ b/lib/index.js @@ -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; diff --git a/package.json b/package.json index 33dbe7450..0325d729d 100644 --- a/package.json +++ b/package.json @@ -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.", "dependencies": { "nan": "^2.1.0", - "node-cmake": "^1.2.1", + "node-cmake": "^2.2.1", "node-pre-gyp": "^0.6.34" }, "browserify": { @@ -27,7 +27,7 @@ "url": "https://github.com/Project-OSRM/osrm-backend.git" }, "author": "Project OSRM Team", - "license": "BSD 2-Clause", + "license": "BSD-2-Clause", "bugs": { "url": "https://github.com/Project-OSRM/osrm-backend/issues" }, diff --git a/scripts/travis/publish.sh b/scripts/travis/publish.sh index 5352bd97c..21812db1b 100755 --- a/scripts/travis/publish.sh +++ b/scripts/travis/publish.sh @@ -16,7 +16,7 @@ if [[ ${PUBLISH} == 'On' ]]; then # enforce that binary has proper ORIGIN flags so that # it can portably find libtbb.so in the same directory 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 echo "Found ORIGIN flag in readelf output" cat readelf-output.txt diff --git a/src/nodejs/CMakeLists.txt b/src/nodejs/CMakeLists.txt index 0ee094b28..e8e7698b3 100644 --- a/src/nodejs/CMakeLists.txt +++ b/src/nodejs/CMakeLists.txt @@ -2,24 +2,20 @@ # require CMake 2.8.11 so that we can build e.g. on Trusty by default. cmake_minimum_required(VERSION 3.1) -message(STATUS "Building node-osrm") +message(STATUS "Building node_osrm") 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) -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) +message(STATUS "Configuring node_osrm bindings for NodeJs ${NODEJS_VERSION}") -# ^ Make sure to set NodeJs options before including and requiring the NodeJs module. -# Otherwise the module will use defaults (which - among many bad choices - means libc++). -include(FindNodeJS) -find_package(NodeJS REQUIRED) -add_nodejs_module(node-osrm node_osrm.cpp) -target_link_libraries(node-osrm osrm) +add_nodejs_module(node_osrm node_osrm.cpp) +set_target_properties(node_osrm PROPERTIES CXX_STANDARD 14) +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(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) # 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) foreach(libpath ${MASON_PACKAGE_tbb_LIBRARY_DIRS}) file(GLOB TBBGlob ${libpath}/*.*) @@ -46,11 +42,11 @@ if (ENABLE_MASON) endif() -add_custom_command(OUTPUT ${BINDING_DIR}/node-osrm.node - COMMAND ${CMAKE_COMMAND} -E copy $ ${BINDING_DIR} - DEPENDS node-osrm ${BINDING_DIR}) -list(APPEND ARTIFACTS "${BINDING_DIR}/node-osrm.node") +add_custom_command(OUTPUT ${BINDING_DIR}/node_osrm.node + COMMAND ${CMAKE_COMMAND} -E copy $ ${BINDING_DIR} + DEPENDS node_osrm ${BINDING_DIR}) +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})