Skip to content
This repository was archived by the owner on Feb 17, 2023. It is now read-only.
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 56 additions & 32 deletions NodeJS.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -134,9 +134,9 @@ function(nodejs_init)
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)$")
set(HEADERS_MATCH "^([A-Fa-f0-9]+)[ \\t]+(([^-]+)-(.+)-headers\\.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
Expand Down Expand Up @@ -282,28 +282,37 @@ function(nodejs_init)
# from the file. This first extract is what defines / specifies the
# actual version number and name.
file(STRINGS
${CHECKSUM_TARGET} HEADERS_CHECKSUM
${CHECKSUM_TARGET} HEADERS_CHECKSUMS
REGEX ${HEADERS_MATCH}
LIMIT_COUNT 1
)
if(NOT HEADERS_CHECKSUM)

if(NOT HEADERS_CHECKSUMS)
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})

foreach(HEADER ${HEADERS_CHECKSUMS})
message("Found headers archive: ${HEADER}")
string(REGEX MATCH ${HEADERS_MATCH} HEADERS_CHECKSUM ${HEADER})

if (HEADERS_CHECKSUM AND CMAKE_MATCH_3 STREQUAL NAME)
break()
endif()

unset(HEADERS_CHECKSUM)
endforeach()

if (NOT HEADERS_CHECKSUM)
message(FATAL_ERROR "Failed to find matching headers for ${NAME}")
endif()
set(HEADERS_ARCHIVE
${CMAKE_MATCH_2}-${CMAKE_MATCH_3}-${CMAKE_MATCH_4}${CMAKE_MATCH_5}
)

set(HEADERS_CHECKSUM ${CMAKE_MATCH_1})
set(NAME ${CMAKE_MATCH_3})
set(VERSION ${CMAKE_MATCH_4})
set(HEADERS_ARCHIVE ${CMAKE_MATCH_2})
# Make sure that the root directory exists, and that the checksum
# file has been moved over from temp
if(DEFINED ROOT)
Expand All @@ -313,7 +322,7 @@ function(nodejs_init)
if(DEFINED OLD_ROOT AND NOT ROOT STREQUAL "${OLD_ROOT}")
file(REMOVE ${TEMP}/CHECKSUM)
file(REMOVE ${ROOT}/CHECKSUM)
message(FATAL_ERROR "Version/Name mismatch")
message(FATAL_ERROR "Version/Name mismatch - ${ROOT} vs ${OLD_ROOT}")
endif()
file(MAKE_DIRECTORY ${ROOT})
if(EXISTS ${TEMP}/CHECKSUM)
Expand Down Expand Up @@ -343,26 +352,41 @@ function(nodejs_init)
file(REMOVE ${TEMP}/${HEADERS_ARCHIVE})
message(FATAL_ERROR "Unable to download Node.js headers")
endif()
file(MAKE_DIRECTORY ${TEMP}/${VERSION})
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar xfz ${TEMP}/${HEADERS_ARCHIVE}
WORKING_DIRECTORY ${TEMP}
WORKING_DIRECTORY ${TEMP}/${VERSION}
)

# 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

set(NODEJS_HEADERS_SEARCH_PATHS
${TEMP}/${VERSION}/node_headers
${TEMP}/${VERSION}/${NAME}-${VERSION}-headers
${TEMP}/${VERSION}/${NAME}-${VERSION}
${TEMP}/${VERSION}/${NODEJS_DEFAULT_NAME}-${VERSION}-headers
${TEMP}/${VERSION}/${NODEJS_DEFAULT_NAME}-${VERSION}
${TEMP}/${VERSION}/${NODEJS_DEFAULT_NAME}
${TEMP}
)

foreach(HEADER_PATH ${NODEJS_HEADERS_SEARCH_PATHS})
message("Searching path for headers: ${HEADER_PATH}")

find_path(NODEJS_HEADERS_PATH
NAMES src include
PATHS ${HEADER_PATH}
NO_DEFAULT_PATH
)

if (NODEJS_HEADERS_PATH)
break()
endif()
endforeach()

if(NOT NODEJS_HEADERS_PATH)
message(FATAL_ERROR "Unable to find extracted headers folder")
endif()
Expand Down Expand Up @@ -424,8 +448,8 @@ function(nodejs_init)
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})
set(LIB32_NAME ${CMAKE_MATCH_3})
set(LIB32_TARGET ${CMAKE_MATCH_2})
if(NOT EXISTS ${ROOT}/${LIB32_PATH})
file(REMOVE_RECURSE ${TEMP}/${LIB32_PATH})
download_file(
Expand Down Expand Up @@ -462,8 +486,8 @@ function(nodejs_init)
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})
set(LIB64_NAME ${CMAKE_MATCH_3})
set(LIB64_TARGET ${CMAKE_MATCH_2})
if(NOT EXISTS ${ROOT}/${LIB64_PATH})
file(REMOVE_RECURSE ${TEMP}/${LIB64_PATH})
download_file(
Expand Down