From 133d81a0a3db8411edf7c0ea46ed1d06cc7dbd60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Thu, 3 Oct 2024 14:03:32 +0200 Subject: [PATCH] Move to CMake based build system --- .gitignore | 1 + .gitmodules | 21 ++++++++ CMakeLists.txt | 92 +++++++++++++++++++++++++++++++++ cmake/symbols.ld | 6 +++ cmake/symbols.txt | 1 + lib/index.js | 3 +- src/feature_builder.hpp | 12 +++++ src/vtcomposite.hpp | 4 ++ vendor/geometry-hpp-internal | 1 + vendor/geometry.hpp.cmake | 9 ++++ vendor/gzip-hpp | 1 + vendor/gzip.hpp.cmake | 9 ++++ vendor/node-addon-api | 1 + vendor/node-api-headers | 1 + vendor/protozero | 1 + vendor/protozero.cmake | 9 ++++ vendor/spatial-algorithms | 1 + vendor/spatial-algorithms.cmake | 9 ++++ vendor/vtzero | 1 + vendor/vtzero.cmake | 9 ++++ 20 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 .gitmodules create mode 100644 CMakeLists.txt create mode 100644 cmake/symbols.ld create mode 100644 cmake/symbols.txt create mode 160000 vendor/geometry-hpp-internal create mode 100644 vendor/geometry.hpp.cmake create mode 160000 vendor/gzip-hpp create mode 100644 vendor/gzip.hpp.cmake create mode 160000 vendor/node-addon-api create mode 160000 vendor/node-api-headers create mode 160000 vendor/protozero create mode 100644 vendor/protozero.cmake create mode 160000 vendor/spatial-algorithms create mode 100644 vendor/spatial-algorithms.cmake create mode 160000 vendor/vtzero create mode 100644 vendor/vtzero.cmake diff --git a/.gitignore b/.gitignore index d414e1d4..5abb7a87 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ *tgz build lib/binding +lib/*.node mason_packages node_modules npm-debug.log diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..32b84dcb --- /dev/null +++ b/.gitmodules @@ -0,0 +1,21 @@ +[submodule "vendor/node-api-headers"] + path = vendor/node-api-headers + url = git@github.com:nodejs/node-api-headers.git +[submodule "vendor/node-addon-api"] + path = vendor/node-addon-api + url = git@github.com:nodejs/node-addon-api.git +[submodule "vendor/geometry-hpp-internal"] + path = vendor/geometry-hpp-internal + url = git@github.com:mapbox/geometry-hpp-internal.git +[submodule "vendor/spatial-algorithms"] + path = vendor/spatial-algorithms + url = git@github.com:mapbox/spatial-algorithms.git +[submodule "vendor/protozero"] + path = vendor/protozero + url = git@github.com:mapbox/protozero.git +[submodule "vendor/vtzero"] + path = vendor/vtzero + url = git@github.com:mapbox/vtzero.git +[submodule "vendor/gzip-hpp"] + path = vendor/gzip-hpp + url = git@github.com:mapbox/gzip-hpp.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..2faaf9c8 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,92 @@ +cmake_minimum_required(VERSION 3.10 FATAL_ERROR) +cmake_policy(SET CMP0167 OLD) +project("vtcomposite" LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_VISIBILITY_PRESET hidden) + +add_compile_options(-Wall -Wextra -Werror -pedantic -Wshadow -Wsign-compare -Wfloat-equal -Wconversion -Wunused-parameter) + +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + add_compile_options(-Wno-unsequenced -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-exit-time-destructors) +endif() + +find_package(Boost 1.73 REQUIRED) +add_library(vendor-boost INTERFACE) +target_include_directories(vendor-boost INTERFACE ${Boost_INCLUDE_DIR}) +target_link_libraries(vendor-boost INTERFACE ${Boost_LIBRARIES}) + +include(${PROJECT_SOURCE_DIR}/vendor/geometry.hpp.cmake) +include(${PROJECT_SOURCE_DIR}/vendor/gzip.hpp.cmake) +include(${PROJECT_SOURCE_DIR}/vendor/spatial-algorithms.cmake) +include(${PROJECT_SOURCE_DIR}/vendor/protozero.cmake) +include(${PROJECT_SOURCE_DIR}/vendor/vtzero.cmake) + +find_program(NODEJS_EXECUTABLE NAMES node nodejs) + +if ("${NODEJS_EXECUTABLE}" MATCHES "NOTFOUND") + message(FATAL_ERROR "Could not find Node.js") +endif() + +if(NOT NODE_PLATFORM_ARCH_SLUG) + execute_process( + COMMAND "${NODEJS_EXECUTABLE}" -p "process.platform + '-' + process.arch" + OUTPUT_VARIABLE NODE_PLATFORM_ARCH_SLUG + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +endif() + +add_library(vtcomposite SHARED + src/module.cpp + src/feature_builder.hpp + src/module_utils.hpp + src/vtcomposite.cpp + src/vtcomposite.hpp + src/zxy_math.hpp +) + +target_include_directories( + vtcomposite + PRIVATE + ${PROJECT_SOURCE_DIR}/vendor/node-api-headers/include + ${PROJECT_SOURCE_DIR}/vendor/node-addon-api +) + +target_link_libraries(vtcomposite + PRIVATE vendor-protozero + vendor-vtzero + vendor-geometry.hpp + vendor-gzip.hpp + vendor-spatial-algorithms + vendor-boost) + +set_target_properties( + vtcomposite + PROPERTIES + PREFIX "" + OUTPUT_NAME "vtcomposite-${NODE_PLATFORM_ARCH_SLUG}" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib/$<0:>" + SUFFIX ".node" +) + +target_compile_definitions( + vtcomposite + PRIVATE + NAPI_VERSION=7 + NODE_ADDON_API_DISABLE_DEPRECATED +) + +# Ensures that linked symbols are loaded when the module is loaded +# instead of causing unresolved symbol errors later during runtime. +if(APPLE) + set_target_properties( + vtcomposite + PROPERTIES LINK_FLAGS "-undefined dynamic_lookup -bind_at_load -Xlinker -dead_strip -Xlinker -exported_symbols_list -Xlinker ${CMAKE_CURRENT_SOURCE_DIR}/cmake/symbols.txt" + ) +else() + set_target_properties( + vtcomposite + PROPERTIES LINK_FLAGS "-z now -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/cmake/symbols.ld" + ) +endif() diff --git a/cmake/symbols.ld b/cmake/symbols.ld new file mode 100644 index 00000000..2a26a5d5 --- /dev/null +++ b/cmake/symbols.ld @@ -0,0 +1,6 @@ +VERSION { + global: + _napi_register_module_v1; + local: + *; +}; diff --git a/cmake/symbols.txt b/cmake/symbols.txt new file mode 100644 index 00000000..7dca8c61 --- /dev/null +++ b/cmake/symbols.txt @@ -0,0 +1 @@ +_napi_register_module_v1 diff --git a/lib/index.js b/lib/index.js index 0ca57095..91164f4c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,4 +1,3 @@ "use strict"; -module.exports.composite = require('./binding/vtcomposite.node').composite; -module.exports.localize = require('./binding/vtcomposite.node').localize; +module.exports = require(`./vtcomposite-${process.platform}-${process.arch}.node`); diff --git a/src/feature_builder.hpp b/src/feature_builder.hpp index 7eefb456..ec6211c8 100644 --- a/src/feature_builder.hpp +++ b/src/feature_builder.hpp @@ -1,5 +1,14 @@ #pragma once +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wfloat-equal" +#pragma GCC diagnostic ignored "-Wshadow" +#pragma GCC diagnostic ignored "-Wc++11-narrowing" +#pragma GCC diagnostic ignored "-Wshorten-64-to-32" +#pragma GCC diagnostic ignored "-Wfloat-conversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + // geometry.hpp #include #include @@ -9,6 +18,9 @@ // boost #include #include + +#pragma GCC diagnostic pop + // stl #include //BOOST_GEOMETRY_REGISTER_POINT_2D(mapbox::geometry::point, int, boost::geometry::cs::cartesian, x, y) diff --git a/src/vtcomposite.hpp b/src/vtcomposite.hpp index 48858fab..2ec53fb6 100644 --- a/src/vtcomposite.hpp +++ b/src/vtcomposite.hpp @@ -1,5 +1,9 @@ #pragma once + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" #include +#pragma GCC diagnostic pop namespace vtile { diff --git a/vendor/geometry-hpp-internal b/vendor/geometry-hpp-internal new file mode 160000 index 00000000..a0404b78 --- /dev/null +++ b/vendor/geometry-hpp-internal @@ -0,0 +1 @@ +Subproject commit a0404b787aa2295d020159d3c53cee50f01bf868 diff --git a/vendor/geometry.hpp.cmake b/vendor/geometry.hpp.cmake new file mode 100644 index 00000000..64bb91a8 --- /dev/null +++ b/vendor/geometry.hpp.cmake @@ -0,0 +1,9 @@ +if(TARGET vendor-geometry.hpp) + return() +endif() + +add_library(vendor-geometry.hpp INTERFACE) + +target_include_directories( + vendor-geometry.hpp + INTERFACE ${PROJECT_SOURCE_DIR}/vendor/geometry-hpp-internal/include) diff --git a/vendor/gzip-hpp b/vendor/gzip-hpp new file mode 160000 index 00000000..7546b35a --- /dev/null +++ b/vendor/gzip-hpp @@ -0,0 +1 @@ +Subproject commit 7546b35aba5917154a0e9ae43f804b57d22bb966 diff --git a/vendor/gzip.hpp.cmake b/vendor/gzip.hpp.cmake new file mode 100644 index 00000000..e2d52cb9 --- /dev/null +++ b/vendor/gzip.hpp.cmake @@ -0,0 +1,9 @@ +if(TARGET vendor-gzip.hpp) + return() +endif() + +add_library(vendor-gzip.hpp INTERFACE) + +target_include_directories( + vendor-gzip.hpp + INTERFACE ${PROJECT_SOURCE_DIR}/vendor/gzip-hpp/include) diff --git a/vendor/node-addon-api b/vendor/node-addon-api new file mode 160000 index 00000000..5b1a57d9 --- /dev/null +++ b/vendor/node-addon-api @@ -0,0 +1 @@ +Subproject commit 5b1a57d9e3c8b1c496c63bf31514f7ce4a7c1a8b diff --git a/vendor/node-api-headers b/vendor/node-api-headers new file mode 160000 index 00000000..1294543d --- /dev/null +++ b/vendor/node-api-headers @@ -0,0 +1 @@ +Subproject commit 1294543dc1487389acc9cf2371572f57e1eb797d diff --git a/vendor/protozero b/vendor/protozero new file mode 160000 index 00000000..542fcf7d --- /dev/null +++ b/vendor/protozero @@ -0,0 +1 @@ +Subproject commit 542fcf7dd228672b775eb283d18ccd94c4e682d9 diff --git a/vendor/protozero.cmake b/vendor/protozero.cmake new file mode 100644 index 00000000..406c6d6a --- /dev/null +++ b/vendor/protozero.cmake @@ -0,0 +1,9 @@ +if(TARGET vendor-protozero) + return() +endif() + +add_library(vendor-protozero INTERFACE) + +target_include_directories( + vendor-protozero + INTERFACE ${PROJECT_SOURCE_DIR}/vendor/protozero/include) diff --git a/vendor/spatial-algorithms b/vendor/spatial-algorithms new file mode 160000 index 00000000..1762b674 --- /dev/null +++ b/vendor/spatial-algorithms @@ -0,0 +1 @@ +Subproject commit 1762b674ae6acf1fd3384d228bf6405abf24902e diff --git a/vendor/spatial-algorithms.cmake b/vendor/spatial-algorithms.cmake new file mode 100644 index 00000000..71e6a5d8 --- /dev/null +++ b/vendor/spatial-algorithms.cmake @@ -0,0 +1,9 @@ +if(TARGET vendor-spatial-algorithms) + return() +endif() + +add_library(vendor-spatial-algorithms INTERFACE) + +target_include_directories( + vendor-spatial-algorithms + INTERFACE ${PROJECT_SOURCE_DIR}/vendor/spatial-algorithms/include) diff --git a/vendor/vtzero b/vendor/vtzero new file mode 160000 index 00000000..67f934ee --- /dev/null +++ b/vendor/vtzero @@ -0,0 +1 @@ +Subproject commit 67f934ee9aa44b923b5d0bc2bc87448900051a57 diff --git a/vendor/vtzero.cmake b/vendor/vtzero.cmake new file mode 100644 index 00000000..404fc63c --- /dev/null +++ b/vendor/vtzero.cmake @@ -0,0 +1,9 @@ +if(TARGET vendor-vtzero) + return() +endif() + +add_library(vendor-vtzero INTERFACE) + +target_include_directories( + vendor-vtzero + INTERFACE ${PROJECT_SOURCE_DIR}/vendor/vtzero/include)