diff --git a/.github/workflows/linux-daily-check.yml b/.github/workflows/linux-daily-check.yml index 610b789..e5951e4 100644 --- a/.github/workflows/linux-daily-check.yml +++ b/.github/workflows/linux-daily-check.yml @@ -1,4 +1,4 @@ -name: Linux daily check +name: Linux on: schedule: @@ -7,34 +7,58 @@ on: jobs: update: - name: Linux daily check runs-on: ubuntu-latest strategy: matrix: arch: [amd64, arm64] + include: + - arch: arm64 + is_arm: true + docker_container: null + - arch: amd64 + docker_container: ubuntu:devel + container: + image: ${{ matrix.docker_container }} steps: - - name: Update system - run: sudo apt-get update && sudo apt-get --yes upgrade + - uses: actions/checkout@v4 - - name: Install Nodejs 21 repo - run: sudo apt-get install --yes ca-certificates curl gnupg && curl -sL https://deb.nodesource.com/setup_21.x | sudo bash - && sudo apt-get update + - name: Setup ccache + uses: actions/cache@v4 + with: + path: .ccache + save-always: true + key: ${{ github.workflow }}-${{ matrix.arch }} - name: Install building tools - run: sudo apt-get install --yes git python3 python3-pip gcc g++ make ninja-build nodejs sudo - - - name: Clone the repo - run: git clone https://github.com/devraymondsh/libnode-distributable - - - name: Run sccache-cache - uses: mozilla-actions/sccache-action@v0.0.4 + run: | + apt-get install --yes ca-certificates curl gnupg && curl -sL https://deb.nodesource.com/setup_21.x | bash - + apt-get update + apt-get install --yes git nodejs python3 python3-pip gcc g++ make nasm ccache linux-headers-generic - name: Run the script env: - CC: "sccache gcc" - CXX: "sccache g++" ARCH: ${{ matrix.arch }} - SCCACHE_GHA_ENABLED: "true" - run: cd libnode-distributable && node index.js + CC: "${{ matrix.is_arm && 'aarch64-linux-gnu-gcc' || 'gcc' }}" + CXX: "${{ matrix.is_arm && 'aarch64-linux-gnu-g++' || 'g++' }}" + # We don't want these variables to be set for AMD64. + CC_host: "${{ matrix.is_arm && 'gcc' || null }}" + CXX_host: "${{ matrix.is_arm && 'g++' || null }}" + AS: "${{ matrix.is_arm && 'aarch64-linux-gnu-as' || null }}" + LD: "${{ matrix.is_arm && 'aarch64-linux-gnu-ld' || null }}" + RANLIB: "${{ matrix.is_arm && 'aarch64-linux-gnu-ranlib' || null }}" + run: | + export CCACHE_COMPRESS="true" + export CCACHE_BASEDIR="$GITHUB_WORKSPACE" + export CCACHE_DIR="$CCACHE_BASEDIR/.ccache" + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + mkdir -p "$CCACHE_DIR" + + echo "$ARCH" + echo "$CC" + echo "$CC_host" + echo "$CXX_host" + + node index.js - name: Find the shared library - run: find libnode-distributable/node -name libnode.so\* -not -name '*.TOC' -not -name '*.toc' -exec ls {} \; + run: ls node/out/Release diff --git a/.github/workflows/macos-daily-check.yml b/.github/workflows/macos-daily-check.yml index 4519324..d21dc02 100644 --- a/.github/workflows/macos-daily-check.yml +++ b/.github/workflows/macos-daily-check.yml @@ -1,4 +1,4 @@ -name: Macos daily check +name: Macos on: schedule: @@ -7,28 +7,53 @@ on: jobs: update: - name: Macos daily check - runs-on: macos-latest strategy: matrix: arch: [amd64, arm64] + include: + - arch: arm64 + os: macos-14 + is_arm: true + - arch: amd64 + os: macos-13 + runs-on: ${{ matrix.os }} steps: + - uses: actions/checkout@v4 + + - name: Setup ccache + uses: actions/cache@v4 + with: + path: .ccache + save-always: true + key: ${{ github.workflow }}-${{ matrix.arch }} + - name: Install building tools - run: brew install node python ninja nasm git + run: | + sudo chown -R $(whoami) $(brew --prefix)/* - - name: Clone the repo - run: git clone https://github.com/devraymondsh/libnode-distributable + # homebrew fails to update python 3.9.1 to 3.9.1.1 due to unlinking failure + sudo rm -f /usr/local/bin/2to3 || true + # homebrew fails to update python from 3.9 to 3.10 due to another unlinking failure + sudo rm -f /usr/local/bin/idle3 || true + sudo rm -f /usr/local/bin/pydoc3 || true + sudo rm -f /usr/local/bin/python3 || true + sudo rm -f /usr/local/bin/python3-config || true - - name: Run sccache-cache - uses: mozilla-actions/sccache-action@v0.0.4 + brew install git node ninja nasm ccache - name: Run the script env: - CC: "sccache cc" - CXX: "sccache c++" + CC: "gcc" + CXX: "g++" ARCH: ${{ matrix.arch }} - SCCACHE_GHA_ENABLED: "true" - run: cd libnode-distributable && node index.js + run: | + export CCACHE_COMPRESS="true" + export CCACHE_BASEDIR="$GITHUB_WORKSPACE" + export CCACHE_DIR="$CCACHE_BASEDIR/.ccache" + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + mkdir -p "$CCACHE_DIR" + + node index.js - name: Find the shared library - run: find libnode-distributable/node -name libnode.so\* -not -name '*.TOC' -not -name '*.toc' -exec ls {} \; + run: ls node/out/Release diff --git a/.github/workflows/windows-daily-check.yml b/.github/workflows/windows-daily-check.yml index 0db1bde..2d1b3c3 100644 --- a/.github/workflows/windows-daily-check.yml +++ b/.github/workflows/windows-daily-check.yml @@ -1,4 +1,4 @@ -name: Windows daily check +name: Windows on: schedule: @@ -7,37 +7,37 @@ on: jobs: update: - name: Windows daily check + name: Windows runs-on: windows-latest strategy: matrix: arch: [amd64, amd64_arm64] steps: + - uses: actions/checkout@v4 + + # - name: Setup ccache + # uses: actions/cache@v4 + # with: + # key: ${{ github.workflow }}-${{ matrix.arch }} + # path: C:\.ccache + - uses: ilammy/msvc-dev-cmd@v1 with: arch: ${{ matrix.arch }} - uses: MinoruSekine/setup-scoop@v3 with: - buckets: extras update_path: true run_as_admin: true scoop_update: true - name: Install building tools - run: scoop install nodejs python ninja nasm git - - - name: Clone the repo - run: git clone https://github.com/devraymondsh/libnode-distributable - - - name: Run sccache-cache - uses: mozilla-actions/sccache-action@v0.0.4 + run: scoop install git nodejs python ninja nasm - name: Run the script env: ARCH: ${{ matrix.arch }} - SCCACHE_GHA_ENABLED: "true" - run: cd libnode-distributable ; node index.js + run: node index.js - name: Find the shared library - run: dir libnode-distributable\node\out\Release\libnode.dll + run: dir out\Release\libnode.dll diff --git a/.gitignore b/.gitignore index 32b6e49..71f62d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node \ No newline at end of file +node +.ccache \ No newline at end of file diff --git a/index.js b/index.js index 858192f..62a9b79 100644 --- a/index.js +++ b/index.js @@ -3,29 +3,26 @@ import { cpus } from "node:os"; import fs from "node:fs/promises"; import { spawn } from "node:child_process"; -let CC = process.env.CC; -let CXX = process.env.CXX; -let ARCH = process.env.ARCH; -if (!CC) CC = "gcc"; -if (!CXX) CXX = "g++"; -if (!ARCH) ARCH = "amd64"; +let OS = process.env.OS; +const ARCH = process.env.ARCH == "amd64" ? "x64" : "arm64"; const coreCount = cpus().length; const threadCount = coreCount * 2; -const arch = ARCH == "amd64" ? "x64" : "arm64"; -let os; +let current_os; switch (process.platform) { case "darwin": - os = "mac"; + current_os = "mac"; break; case "win32": - os = "win"; + current_os = "win"; break; default: - os = "linux"; + current_os = "linux"; break; } +if (!OS) OS = current_os; + const nodejsGithubRepo = "https://github.com/nodejs/node"; const removeTheVCharacter = (str) => str.replace("v", ""); @@ -57,7 +54,7 @@ const isANewerVersion = (oldVer, newVer) => { const spawnAsync = (program, args, cwd) => new Promise((resolve, reject) => { - console.log([program, ...args].join(" ")); + console.log("Running:", [program, ...args].join(" ")); const child = spawn(program, args, cwd ? { cwd } : {}); @@ -85,16 +82,33 @@ if (!syncFs.existsSync("node")) { `v${latestNodeVersion}`, "--depth=1", ], - undefined + undefined, + {} ); } +let extraArgs = []; if (process.platform == "win32") { - await spawnAsync("vcbuild.bat", [arch, "dll"], "node"); + await spawnAsync( + ".\\vcbuild.bat", + [ + ARCH, + "dll", + // "/p:CLToolExe=cl.exe /p:CLToolPath=C:\\Users\\runneradmin\\.cargo\\bin\\cl.exe", + ], + "node" + ); } else { + if (ARCH === "arm64") { + extraArgs.push("--with-arm-float-abi"); + extraArgs.push("hard"); + extraArgs.push("--with-arm-fpu"); + extraArgs.push("neon"); + } + await spawnAsync( "./configure", - ["--ninja", "--shared", "--dest-cpu", arch, "--dest-os", os], + ["--shared", "--dest-cpu", ARCH, "--dest-os", OS, ...extraArgs], "node" ); await spawnAsync("make", [`-j${threadCount}`], "node");