Skip to content

v1.0.12

v1.0.12 #25

name: Build Node.js Shared Library
on:
release:
types: [created]
pull_request:
types: [opened, synchronize, reopened]
paths:
- '.github/workflows/build_node_shared.yml'
jobs:
build:
timeout-minutes: 720 # 12 hours (QEMU ARM64 builds are slow)
strategy:
matrix:
include:
# Linux x64 builds
- os: ubuntu-latest
platform: linux
arch: x64
compiler: gcc
container: ghcr.io/ten-framework/ten_building_ubuntu2204
lib_name: libnode.so.127
nproc_cmd: nproc
- os: ubuntu-latest
platform: linux
arch: x64
compiler: clang
container: ghcr.io/ten-framework/ten_building_ubuntu2204
lib_name: libnode.so.127
nproc_cmd: nproc
# Linux ARM64 builds (using QEMU)
- os: ubuntu-latest
platform: linux
arch: arm64
compiler: gcc
container: ""
lib_name: libnode.so.127
nproc_cmd: nproc
- os: ubuntu-latest
platform: linux
arch: arm64
compiler: clang
container: ""
lib_name: libnode.so.127
nproc_cmd: nproc
# macOS x64 builds
# Note: macOS should use Clang (Apple's official toolchain), GCC has compatibility issues
- os: macos-13
platform: mac
arch: x64
compiler: clang
container: ""
lib_name: libnode.127.dylib
nproc_cmd: sysctl -n hw.ncpu
# macOS ARM64 builds
# Note: Apple Silicon only supports Clang
- os: macos-14
platform: mac
arch: arm64
compiler: clang
container: ""
lib_name: libnode.127.dylib
nproc_cmd: sysctl -n hw.ncpu
runs-on: ${{ matrix.os }}
container: ${{ matrix.container != '' && matrix.container || null }}
steps:
- name: Checkout Node.js
uses: actions/checkout@v4
with:
repository: nodejs/node
ref: v22.12.0
- name: Create out directory (Linux ARM64)
if: matrix.platform == 'linux' && matrix.arch == 'arm64'
run: |
# Due to the use of QEMU, running as root inside the Docker container
# is required. However, outside the container, the user is not root.
# This causes issues when trying to handle the contents of the out/
# folder from outside the container. To resolve this, the out/ folder
# is first created by a regular non-root user to prevent it from being
# created during the build stage, thus avoiding permission issues with
# the out/ folder being created by the root user.
mkdir -p out/Release
- name: Set up QEMU (Linux ARM64)
if: matrix.platform == 'linux' && matrix.arch == 'arm64'
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- name: Setup Python (macOS)
if: matrix.platform == 'mac'
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Configure and Build (Linux ARM64 with QEMU)
if: matrix.platform == 'linux' && matrix.arch == 'arm64'
timeout-minutes: 720 # 12 hours for QEMU emulation
run: |
docker run --rm --platform linux/arm64 \
-v $(pwd):${{ github.workspace }} -w ${{ github.workspace }} \
ghcr.io/ten-framework/ten_building_ubuntu2204 \
bash -c "
if [ '${{ matrix.compiler }}' = 'gcc' ]; then
export CC=gcc
export CXX=g++
else
export CC=clang
export CXX=clang++
fi && \
./configure --shared --without-npm --without-corepack && \
make -j2
"
- name: Configure and Build (Linux x64 and macOS)
if: matrix.platform != 'linux' || matrix.arch != 'arm64'
run: |
if [ "${{ matrix.compiler }}" = "gcc" ]; then
export CC=gcc
export CXX=g++
else
export CC=clang
export CXX=clang++
fi
./configure --shared
make -j$(${{ matrix.nproc_cmd }})
- name: Fix permissions for build outputs (Linux ARM64)
if: matrix.platform == 'linux' && matrix.arch == 'arm64'
run: |
sudo chown -R "$(id -u)":"$(id -g)" out/Release
- name: Package assets
if: startsWith(github.ref, 'refs/tags/')
run: |
cd out/Release
# Package shared libraries into zip archive
zip node-shared-${{ matrix.platform }}-${{ matrix.arch }}-${{ matrix.compiler }}.zip ${{ matrix.lib_name }}
- name: Publish to release assets
uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/')
with:
files: |
out/Release/node-shared-${{ matrix.platform }}-${{ matrix.arch }}-${{ matrix.compiler }}.zip