From d742196f16e1623592fa90d2e44ce74d6adfc219 Mon Sep 17 00:00:00 2001 From: Fayti1703 Date: Sun, 8 Jan 2023 21:16:15 +0100 Subject: [PATCH 01/17] Optimize 'libexec/build-monolith' on Linux Use `xargs` to build the `ar` command line instead of running `ar` manually to reduce startup costs. Build the symbol table after adding each file instead of continually rebuilding it. --- libexec/build-monolith | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libexec/build-monolith b/libexec/build-monolith index 16c0bac..4e4a903 100755 --- a/libexec/build-monolith +++ b/libexec/build-monolith @@ -33,9 +33,8 @@ case "${platform}" in /usr/bin/ranlib "${LIBV8_MONOLITH}" ;; "Linux") - find . -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" -or -path "./icu*/**/*.o" | sort | uniq | while read -r obj; do - ar -cq "${LIBV8_MONOLITH}" "${obj}" - done + find . -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" -or -path "./icu*/**/*.o" | sort | uniq | xargs ar -cqS "${LIBV8_MONOLITH}" + ranlib "${LIBV8_MONOLITH}" ;; *) echo "Unsupported platform: ${platform}" From db76c057c55521c1cc3cef8700b6a42b3e42239d Mon Sep 17 00:00:00 2001 From: Fayti1703 Date: Mon, 9 Jan 2023 22:15:46 +0100 Subject: [PATCH 02/17] Ignore stubdata object This fixes an issue where functions that require ICU data segfault the process due to an unexpected lack of ICU data. The actual ICU data is provided by the icudt71_dat object. --- libexec/build-monolith | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libexec/build-monolith b/libexec/build-monolith index 4e4a903..97d9f45 100755 --- a/libexec/build-monolith +++ b/libexec/build-monolith @@ -21,19 +21,19 @@ platform=$(uname) rm -f "${LIBV8_MONOLITH}" case "${platform}" in "SunOS") - /usr/xpg4/bin/find . -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" -or -path "./icu*/**/*.o" | sort | uniq | while read -r obj; do + /usr/xpg4/bin/find . '(' '!' -path './icutools/deps/icu-small/source/stubdata/stubdata.o' ')' -and '(' -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" -or -path "./icu*/**/*.o" ')' | sort | uniq | while read -r obj; do ar cqS "${LIBV8_MONOLITH}" "${obj}" done ranlib "${LIBV8_MONOLITH}" ;; "Darwin") - /usr/bin/find . -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" -or -path "./icu*/**/*.o" | sort | uniq | while read -r obj; do + /usr/bin/find . '(' '!' -path './icutools/deps/icu-small/source/stubdata/stubdata.o' ')' -and '(' -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" -or -path "./icu*/**/*.o" ')' | sort | uniq | while read -r obj; do /usr/bin/ar -cqS "${LIBV8_MONOLITH}" "${obj}" done /usr/bin/ranlib "${LIBV8_MONOLITH}" ;; "Linux") - find . -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" -or -path "./icu*/**/*.o" | sort | uniq | xargs ar -cqS "${LIBV8_MONOLITH}" + find . '(' '!' -path './icutools/deps/icu-small/source/stubdata/stubdata.o' ')' -and '(' -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" -or -path "./icu*/**/*.o" ')' | sort | uniq | xargs ar -cqS "${LIBV8_MONOLITH}" ranlib "${LIBV8_MONOLITH}" ;; *) From d8c6b5826f577f5991a10a2af8a5e75ee40314c8 Mon Sep 17 00:00:00 2001 From: Sean Mann Date: Mon, 9 Jan 2023 22:10:10 -0800 Subject: [PATCH 03/17] googletest 'hello test' --- test/gtest/.gitignore | 14 ++++++++++++++ test/gtest/CMakeLists.txt | 28 ++++++++++++++++++++++++++++ test/gtest/hello_test.cc | 9 +++++++++ 3 files changed, 51 insertions(+) create mode 100644 test/gtest/.gitignore create mode 100644 test/gtest/CMakeLists.txt create mode 100644 test/gtest/hello_test.cc diff --git a/test/gtest/.gitignore b/test/gtest/.gitignore new file mode 100644 index 0000000..86201ed --- /dev/null +++ b/test/gtest/.gitignore @@ -0,0 +1,14 @@ +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps +build +lib +bin diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt new file mode 100644 index 0000000..f8d6024 --- /dev/null +++ b/test/gtest/CMakeLists.txt @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 3.14) +project(gtest) + +# GoogleTest requires at least C++14 +set(CMAKE_CXX_STANDARD 14) + +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip +) +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +enable_testing() + +add_executable( + hello_test + hello_test.cc +) +target_link_libraries( + hello_test + GTest::gtest_main +) + +include(GoogleTest) +gtest_discover_tests(hello_test) diff --git a/test/gtest/hello_test.cc b/test/gtest/hello_test.cc new file mode 100644 index 0000000..5a57e13 --- /dev/null +++ b/test/gtest/hello_test.cc @@ -0,0 +1,9 @@ +#include + +// Demonstrate some basic assertions. +TEST(HelloTest, BasicAssertions) { + // Expect two strings not to be equal. + EXPECT_STRNE("hello", "world"); + // Expect equality. + EXPECT_EQ(7 * 6, 42); +} From f17c16022906d05378c884858a55e2d3612f4b84 Mon Sep 17 00:00:00 2001 From: Sean Mann Date: Thu, 12 Jan 2023 21:56:30 -0800 Subject: [PATCH 04/17] get test to reference built libv8 --- test/gtest/CMakeLists.txt | 3 +++ test/gtest/hello_test.cc | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index f8d6024..e7f0740 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -15,6 +15,8 @@ FetchContent_MakeAvailable(googletest) enable_testing() +include_directories(${CMAKE_SOURCE_DIR}/../../vendor/v8/include/) + add_executable( hello_test hello_test.cc @@ -22,6 +24,7 @@ add_executable( target_link_libraries( hello_test GTest::gtest_main + ${CMAKE_SOURCE_DIR}/../../vendor/v8/x86_64-darwin/libv8/obj/libv8_monolith.a ) include(GoogleTest) diff --git a/test/gtest/hello_test.cc b/test/gtest/hello_test.cc index 5a57e13..525baac 100644 --- a/test/gtest/hello_test.cc +++ b/test/gtest/hello_test.cc @@ -1,7 +1,12 @@ #include +#include +#include + // Demonstrate some basic assertions. TEST(HelloTest, BasicAssertions) { + std::shared_ptr platform = v8::platform::NewDefaultPlatform(); + // Expect two strings not to be equal. EXPECT_STRNE("hello", "world"); // Expect equality. From fdd9edfc806b4b8c1bb20440a08e6b3143abdd1c Mon Sep 17 00:00:00 2001 From: Sean Mann Date: Thu, 12 Jan 2023 22:35:33 -0800 Subject: [PATCH 05/17] actually use v8 in the test --- test/gtest/CMakeLists.txt | 8 +++--- test/gtest/Framework.h | 53 +++++++++++++++++++++++++++++++++++++++ test/gtest/c_v8_tests.cc | 18 +++++++++++++ test/gtest/hello_test.cc | 14 ----------- 4 files changed, 75 insertions(+), 18 deletions(-) create mode 100644 test/gtest/Framework.h create mode 100644 test/gtest/c_v8_tests.cc delete mode 100644 test/gtest/hello_test.cc diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index e7f0740..58f9876 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -18,14 +18,14 @@ enable_testing() include_directories(${CMAKE_SOURCE_DIR}/../../vendor/v8/include/) add_executable( - hello_test - hello_test.cc + c_v8_tests + c_v8_tests.cc ) target_link_libraries( - hello_test + c_v8_tests GTest::gtest_main ${CMAKE_SOURCE_DIR}/../../vendor/v8/x86_64-darwin/libv8/obj/libv8_monolith.a ) include(GoogleTest) -gtest_discover_tests(hello_test) +gtest_discover_tests(c_v8_tests) diff --git a/test/gtest/Framework.h b/test/gtest/Framework.h new file mode 100644 index 0000000..ed54c59 --- /dev/null +++ b/test/gtest/Framework.h @@ -0,0 +1,53 @@ +#pragma once + +#include +#include +#include + +struct Framework { + typedef std::function basic_main; + typedef std::function iso_main; + typedef std::function&)> ctx_main; + + inline static void run(basic_main main) { + std::shared_ptr platform = v8::platform::NewDefaultPlatform(); + v8::V8::InitializePlatform(platform.get()); + v8::V8::Initialize(); + main(); + + v8::V8::Dispose(); + v8::V8::ShutdownPlatform(); + } + + inline static void runWithIsolateRaw(iso_main main) { + Framework::run([main]() -> void { + v8::Isolate::CreateParams p; + p.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); + v8::Isolate* iso = v8::Isolate::New(p); + + main(iso); + + iso->Dispose(); + delete p.array_buffer_allocator; + }); + } + + inline static void runWithIsolate(iso_main main) { + Framework::runWithIsolateRaw([main](v8::Isolate* iso) -> void { + v8::Locker lock { iso }; + v8::Isolate::Scope iScope { iso }; + v8::HandleScope hScope { iso }; + + main(iso); + }); + } + + inline static void runWithContext(ctx_main main) { + Framework::runWithIsolate([main](v8::Isolate* iso) -> void { + v8::Local ctx = v8::Context::New(iso); + v8::Context::Scope cScope { ctx }; + + main(ctx); + }); + } +}; \ No newline at end of file diff --git a/test/gtest/c_v8_tests.cc b/test/gtest/c_v8_tests.cc new file mode 100644 index 0000000..28d4345 --- /dev/null +++ b/test/gtest/c_v8_tests.cc @@ -0,0 +1,18 @@ +#include + +#include +#include + +#include "Framework.h" + +// Demonstrate some basic assertions. +TEST(FRLocaleTest, LocaleTests) { + Framework::runWithContext([](v8::Local& ctx) -> void { + v8::Local script = v8::Script::Compile(ctx, v8::String::NewFromUtf8Literal(ctx->GetIsolate(), "new Date('April 28 2021').toLocaleDateString('fr-FR');")).ToLocalChecked(); + v8::Local result = script->Run(ctx).ToLocalChecked(); + v8::Local resultStr = result->ToString(ctx).ToLocalChecked(); + v8::String::Utf8Value resultUTF8(ctx->GetIsolate(), resultStr); + + EXPECT_STREQ(*resultUTF8, "28/04/2021"); + }); +} diff --git a/test/gtest/hello_test.cc b/test/gtest/hello_test.cc deleted file mode 100644 index 525baac..0000000 --- a/test/gtest/hello_test.cc +++ /dev/null @@ -1,14 +0,0 @@ -#include - -#include -#include - -// Demonstrate some basic assertions. -TEST(HelloTest, BasicAssertions) { - std::shared_ptr platform = v8::platform::NewDefaultPlatform(); - - // Expect two strings not to be equal. - EXPECT_STRNE("hello", "world"); - // Expect equality. - EXPECT_EQ(7 * 6, 42); -} From 261889cdac3f85ebbe3b94f6f44e1d0dc5428d71 Mon Sep 17 00:00:00 2001 From: seanmakesgames Date: Fri, 13 Jan 2023 16:44:18 +0000 Subject: [PATCH 06/17] Add initial multi-platform support for test. Linking on Linux currently errors with `undefined reference to `'dlsym'` --- test/gtest/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index 58f9876..97143a9 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -24,8 +24,13 @@ add_executable( target_link_libraries( c_v8_tests GTest::gtest_main - ${CMAKE_SOURCE_DIR}/../../vendor/v8/x86_64-darwin/libv8/obj/libv8_monolith.a ) +if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + target_link_libraries(c_v8_tests ${CMAKE_SOURCE_DIR}/../../vendor/v8/x86_64-darwin/libv8/obj/libv8_monolith.a) +else() + target_link_libraries(c_v8_tests ${CMAKE_SOURCE_DIR}/../../vendor/v8/x86_64-linux/libv8/obj/libv8_monolith.a) +endif() + include(GoogleTest) gtest_discover_tests(c_v8_tests) From bf1dff5ea06d9d7d6067ec7fdb6fa1d5ef89b419 Mon Sep 17 00:00:00 2001 From: seanmakesgames Date: Sun, 15 Jan 2023 15:49:29 +0000 Subject: [PATCH 07/17] Add ctest to makefile --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 08aa933..3779cdb 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,9 @@ gem: pkg/libv8-node-$(VERSION)-$(CPU)-$(OS).gem test: test/$(CPU)-$(OS) +ctest: vendor/v8 + cd test/gtest && cmake -S . -B build && cd build && cmake --build . && ctest + src/node-v$(NODE_VERSION).tar.gz: ./libexec/download-node $(NODE_VERSION) From d8d15675d7f0bc3372a6af91efd29232bfe5e603 Mon Sep 17 00:00:00 2001 From: seanmakesgames Date: Sun, 15 Jan 2023 17:08:36 +0000 Subject: [PATCH 08/17] fix building test on linux on some build setups (including our codespace) --- test/gtest/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index 97143a9..b0d7e21 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -32,5 +32,8 @@ else() target_link_libraries(c_v8_tests ${CMAKE_SOURCE_DIR}/../../vendor/v8/x86_64-linux/libv8/obj/libv8_monolith.a) endif() +# This has to be after the v8 monolith for some build setups. +target_link_libraries(c_v8_tests dl) + include(GoogleTest) gtest_discover_tests(c_v8_tests) From f803993f8bef2c95401c0bc7e99c4e63f45acfbf Mon Sep 17 00:00:00 2001 From: seanmakesgames Date: Sun, 15 Jan 2023 16:37:12 +0000 Subject: [PATCH 09/17] integrate test into actions --- .github/workflows/build.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1c521a2..32308db 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -118,6 +118,13 @@ jobs: - name: Inject V8 run: | ./libexec/inject-libv8 ${{ steps.set-metadata.outputs.NODE_VERSION }} + - name: Test V8 in C++ + run: | + cd test/gtest + cmake -S . -B build + cd build + cmake --build . + ./c_v8_tests - name: Build binary gem run: | bundle exec rake binary @@ -245,6 +252,9 @@ jobs: - name: Inject V8 run: | docker exec -w "${PWD}" ${{ steps.container.outputs.id }} ./libexec/inject-libv8 ${{ steps.set-metadata.outputs.NODE_VERSION }} + - name: Test V8 in C++ + run: | + docker exec -w "${PWD}" ${{ steps.container.outputs.id }} bash -c "cd test/gtest && cmake -S . -B build && cd build && cmake --build . && ctest" - name: Build binary gem run: | docker exec -w "${PWD}" ${{ steps.container.outputs.id }} bundle exec rake binary[${{ steps.platform.outputs.ruby_target_platform }}] From 024888357a7f8a0b683e6e26e73b50adfed447b6 Mon Sep 17 00:00:00 2001 From: Fayti1703 Date: Mon, 16 Jan 2023 00:38:46 +0100 Subject: [PATCH 10/17] CI: Install CMake in docker container --- .github/workflows/build.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 32308db..5bfb8a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -210,11 +210,15 @@ jobs: echo "::set-output name=id::$(cat container_id)" - name: Install Alpine system dependencies if: ${{ matrix.libc == 'musl' }} - run: docker exec -w "${PWD}" ${{ steps.container.outputs.id }} apk add --no-cache build-base linux-headers bash python3 git curl tar + run: docker exec -w "${PWD}" ${{ steps.container.outputs.id }} apk add --no-cache build-base linux-headers bash python3 git curl tar cmake + - name: Install Debian system dependencies + if: ${{ matrix.libc == 'gnu' }} + run: | + docker exec -w "${PWD}" ${{ steps.container.outputs.id }} apt-get update + docker exec -w "${PWD}" ${{ steps.container.outputs.id }} apt-get install -y cmake - name: Install Debian cross-compiler if: ${{ matrix.libc == 'gnu' && matrix.platform != 'amd64' }} run: | - docker exec -w "${PWD}" ${{ steps.container.outputs.id }} apt-get update docker exec -w "${PWD}" ${{ steps.container.outputs.id }} apt-get install -y binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu - name: Checkout uses: actions/checkout@v2 From 02f6af37706da3e6def8341c8ce554d127bbf3fc Mon Sep 17 00:00:00 2001 From: seanmakesgames Date: Mon, 16 Jan 2023 18:00:26 +0000 Subject: [PATCH 11/17] attempt to move forward docker image to newer version and one that supports the newer cmake. --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5bfb8a2..40bc697 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -198,10 +198,10 @@ jobs: run: | case ${{ matrix.libc }} in gnu) - echo 'ruby:2.4' + echo 'ruby:2.6' ;; musl) - echo 'ruby:2.4-alpine' + echo 'ruby:2.6-alpine' ;; esac | tee container_image echo "::set-output name=image::$(cat container_image)" From fd333f51680428a62f4e018c2bb082032def795e Mon Sep 17 00:00:00 2001 From: Fayti1703 Date: Mon, 16 Jan 2023 23:45:38 +0100 Subject: [PATCH 12/17] Auto-detect vendor dir in GTest CMake Configuration --- test/gtest/CMakeLists.txt | 20 ++++++++++++++++---- test/gtest/check_glibc.c | 10 ++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 test/gtest/check_glibc.c diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index b0d7e21..915947c 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -26,12 +26,24 @@ target_link_libraries( GTest::gtest_main ) -if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - target_link_libraries(c_v8_tests ${CMAKE_SOURCE_DIR}/../../vendor/v8/x86_64-darwin/libv8/obj/libv8_monolith.a) -else() - target_link_libraries(c_v8_tests ${CMAKE_SOURCE_DIR}/../../vendor/v8/x86_64-linux/libv8/obj/libv8_monolith.a) +string(TOLOWER ${CMAKE_SYSTEM_NAME} system_name) +string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} system_arch) + +set(vendor_arch "${system_arch}-${system_name}") + +if(${system_name} STREQUAL "linux") + try_compile(is_glibc ${CMAKE_BINARY_DIR}/check_glibc ${CMAKE_SOURCE_DIR}/check_glibc.c) + if(NOT is_glibc) + # assume non-glibc is musl-libc + string(APPEND vendor_arch "-musl") + endif() endif() +message(STATUS "Detected vendor architecture directory: ${vendor_arch}") + +# TODO?: Detect and support ruby-arch builds? +target_link_libraries(c_v8_tests ${CMAKE_SOURCE_DIR}/../../vendor/v8/${vendor_arch}/libv8/obj/libv8_monolith.a) + # This has to be after the v8 monolith for some build setups. target_link_libraries(c_v8_tests dl) diff --git a/test/gtest/check_glibc.c b/test/gtest/check_glibc.c new file mode 100644 index 0000000..38e7e4b --- /dev/null +++ b/test/gtest/check_glibc.c @@ -0,0 +1,10 @@ +#warning "This is not a source file -- it exists purely to allow CMake to distinguish between glibc and musl-libc. If you see this message, you are likely doing something incorrectly." + +#include + +#ifndef __GLIBC__ +#error "__GLIBC__ is undef -- not glibc!" +#endif + +int main() { } + From d016d237ce9db4bfc1e31f080e7f6b9b73ee13bb Mon Sep 17 00:00:00 2001 From: Fayti1703 Date: Wed, 18 Jan 2023 00:23:40 +0100 Subject: [PATCH 13/17] Use pathed archives on Linux Alpine Linux's `ar` program doesn't support having objects with the same name in the archive twice, so we have to use the GNU extension for including paths. This commit *should* honestly be split into multiple separate commits, but unfortunately pretty much all of these changes have to be applied as a unit or a build step fails. --- libexec/build-monolith | 4 ++-- libexec/inject-libv8 | 31 +++++++++++++++++++++++++++++-- libexec/platform | 21 +++++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/libexec/build-monolith b/libexec/build-monolith index 97d9f45..600697d 100755 --- a/libexec/build-monolith +++ b/libexec/build-monolith @@ -33,8 +33,8 @@ case "${platform}" in /usr/bin/ranlib "${LIBV8_MONOLITH}" ;; "Linux") - find . '(' '!' -path './icutools/deps/icu-small/source/stubdata/stubdata.o' ')' -and '(' -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" -or -path "./icu*/**/*.o" ')' | sort | uniq | xargs ar -cqS "${LIBV8_MONOLITH}" - ranlib "${LIBV8_MONOLITH}" + find . '(' '!' -path './icutools/deps/icu-small/source/stubdata/stubdata.o' ')' -and '(' -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" -or -path "./icu*/**/*.o" ')' | sort | uniq | xargs ar -cqSP "${LIBV8_MONOLITH}" + ar -sP "${LIBV8_MONOLITH}" ;; *) echo "Unsupported platform: ${platform}" diff --git a/libexec/inject-libv8 b/libexec/inject-libv8 index 353d4ed..2142e1e 100755 --- a/libexec/inject-libv8 +++ b/libexec/inject-libv8 @@ -39,8 +39,35 @@ for lib in libv8_monolith.a; do mkdir -p "${dir}" rm -f "${dir}/${lib}" - echo "${BASEDIR}/out/${BUILDTYPE}/${lib} -> ${dir}/${lib}" - "${STRIP}" -S -x -o "${dir}/${lib}" "${lib}" + if [ "$STRIP_NEEDS_EXTRACT" = "y" ]; then + # manual extract/strip objects/build archive sequence + # because `strip` can't deal with these + # (presumably due to that folder issue mentioned below) + ( + tmpdir="$(mktemp -d)" + trap 'rm -r "$tmpdir"' EXIT + mkdir "$tmpdir/stage" + cd "$tmpdir/stage" + + # create folders named in `ar` archive (`ar -x` fails to create these) + "$AR" "$ARLISTFLAGS" "$BASEDIR/out/$BUILDTYPE/$lib" | while read -r path; do + dirname "$path" + done | uniq | xargs mkdir -p + "$AR" "$AREXTRACTFLAGS" "$BASEDIR/out/${BUILDTYPE}/$lib" + + # strip all objects + "$FIND" -type f -exec "$STRIP" -Sx {} + + + # rebuild the archive + "$FIND" -type f -exec "$AR" "$ARCOLLECTFLAGS" "../$lib" {} + + $ARBUILDSYMBOLS "../$lib" + mv "../$lib" "$dir/$lib" + ) + echo "${BASEDIR}/out/${BUILDTYPE}/${lib} -> ${dir}/${lib}" + else + echo "${BASEDIR}/out/${BUILDTYPE}/${lib} -> ${dir}/${lib}" + "${STRIP}" -S -x -o "${dir}/${lib}" "${lib}" + fi done mkdir -p "${top}/ext/libv8-node" diff --git a/libexec/platform b/libexec/platform index 582ec8b..91343aa 100755 --- a/libexec/platform +++ b/libexec/platform @@ -15,6 +15,14 @@ elif command -v cc >/dev/null 2>&1; then fi STRIP="${STRIP:-strip}" +AR="${AR:-ar}" +AREXTRACTFLAGS="${AREXTRACTFLAGS:--x}" +ARLISTFLAGS="${ARLISTFLAGS:--t}" +ARCOLLECTFLAGS="${ARCOLLECTFLAGS:-cqS}" +# this is the command to build the symbol table in an ar archive. +ARBUILDSYMBOLS="${ARBUILDSYMBOLS:-ranlib}" +FIND="${FIND:-find}" +STRIP_NEEDS_EXTRACT="${STRIP_NEEDS_EXTRACT:-n}" triple=$(${CC} -dumpmachine) host_platform="${triple}" @@ -63,6 +71,11 @@ case "${host_platform}" in CXX="${CXX:-/opt/local/gcc7/bin/g++}" STRIP="gstrip" ;; + *linux*) + STRIP_NEEDS_EXTRACT="y" + ARCOLLECTFLAGS="-cqSP" + ARBUILDSYMBOLS="${AR} -sP" + ;; esac if [ "${host_platform}" != "${target_platform}" ]; then @@ -146,6 +159,14 @@ export CC='${CC}' export CXX='${CXX}' host_platform='${host_platform}' target_platform='${target_platform}' +STRIP='$STRIP' +AR='$AR' +AREXTRACTFLAGS='$AREXTRACTFLAGS' +ARLISTFLAGS='$ARLISTFLAGS' +ARCOLLECTFLAGS='$ARCOLLECTFLAGS' +ARBUILDSYMBOLS='$ARBUILDSYMBOLS' +FIND='$FIND' +STRIP_NEEDS_EXTRACT='$STRIP_NEEDS_EXTRACT' EOF if [ -n "${CC_host:-}" ]; then cat < Date: Wed, 18 Jan 2023 17:01:49 +0100 Subject: [PATCH 14/17] Fix aarch64 cross-compile by dropping -msign-return-address on host --- libexec/build-libv8 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libexec/build-libv8 b/libexec/build-libv8 index 07bb500..c3303b9 100755 --- a/libexec/build-libv8 +++ b/libexec/build-libv8 @@ -38,5 +38,13 @@ ${CXX} -v make BUILDTYPE="${BUILDTYPE}" config.gypi make BUILDTYPE="${BUILDTYPE}" "out/Makefile" +# workaround for node specifying `-msign-return-address=all` in ALL `CFLAGS` for aarch64 builds +# (if the host isn't also aarch64, this flag causes a compiler error) + +# shellcheck disable=SC2154 # these variables are defined by `eval`ing the output of the platform script above +if [ "$host_platform" != "$target_platform" ] && [ "${target_platform%%-*}" = "aarch64" ]; then + find . -iname "*.host.mk" -exec sed -i '/-msign-return-address/d' {} ';' +fi + export PATH="${PWD}/out/tools/bin:${PATH}" make -j"${NJOBS}" -C out BUILDTYPE="${BUILDTYPE}" V=0 From 29c7341eddad454baa31f3a68f6807110f1054e1 Mon Sep 17 00:00:00 2001 From: seanmakesgames Date: Wed, 18 Jan 2023 17:27:42 +0000 Subject: [PATCH 15/17] skip arm64 c test on mac and lin --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 40bc697..6c123de 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -119,6 +119,7 @@ jobs: run: | ./libexec/inject-libv8 ${{ steps.set-metadata.outputs.NODE_VERSION }} - name: Test V8 in C++ + if: matrix.platform != 'arm64' run: | cd test/gtest cmake -S . -B build @@ -257,6 +258,7 @@ jobs: run: | docker exec -w "${PWD}" ${{ steps.container.outputs.id }} ./libexec/inject-libv8 ${{ steps.set-metadata.outputs.NODE_VERSION }} - name: Test V8 in C++ + if: matrix.platform != 'arm64' run: | docker exec -w "${PWD}" ${{ steps.container.outputs.id }} bash -c "cd test/gtest && cmake -S . -B build && cd build && cmake --build . && ctest" - name: Build binary gem From 9a61bacb15561abb3751af00b57175f45e3fa11d Mon Sep 17 00:00:00 2001 From: seanmakesgames Date: Thu, 19 Jan 2023 05:58:14 +0000 Subject: [PATCH 16/17] 2.6 is EOL -- remove and bump --- .github/workflows/build.yml | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6c123de..f24a3d9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ jobs: rubocop: name: Lint (Rubocop) runs-on: ubuntu-20.04 - container: ruby:2.6 + container: ruby:2.7 steps: - name: Checkout uses: actions/checkout@v2 @@ -30,7 +30,7 @@ jobs: outputs: GEM_VERSION: ${{ steps.set-metadata.outputs.GEM_VERSION }} runs-on: ubuntu-20.04 - container: ruby:2.6 + container: ruby:2.7 steps: - name: Checkout uses: actions/checkout@v2 @@ -199,10 +199,10 @@ jobs: run: | case ${{ matrix.libc }} in gnu) - echo 'ruby:2.6' + echo 'ruby:2.7' ;; musl) - echo 'ruby:2.6-alpine' + echo 'ruby:2.7-alpine' ;; esac | tee container_image echo "::set-output name=image::$(cat container_image)" @@ -282,12 +282,6 @@ jobs: - amd64 # other platforms would need emulation, which is way too slow container: - - image: ruby:2.6 - version: '2.6' - libc: gnu - - image: ruby:2.6-alpine - version: '2.6' - libc: musl - image: ruby:2.7 version: '2.7' libc: gnu @@ -380,7 +374,6 @@ jobs: fail-fast: false matrix: version: - - '2.6' - '2.7' - '3.0' - '3.1' @@ -394,9 +387,6 @@ jobs: - gnu - musl include: - - version: '2.6' - platform: 'arm64' - libc: 'gnu' - version: '2.7' platform: 'arm64' libc: 'gnu' From 97560d6854ac32d350e18fb7fb01c56dc7874ba5 Mon Sep 17 00:00:00 2001 From: Fayti1703 Date: Sun, 22 Jan 2023 15:16:12 +0100 Subject: [PATCH 17/17] Force ruby platform when testing ruby gem --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f24a3d9..61532cb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -322,6 +322,7 @@ jobs: run: gem install --verbose pkg/libv8-node-${{ needs.build-ruby.outputs.GEM_VERSION }}.gem - name: Test with mini_racer run: | + export BUNDLE_FORCE_RUBY_PLATFORM=y git clone https://github.com/rubyjs/mini_racer.git test/mini_racer --depth 1 cd test/mini_racer git fetch origin v0.6.3