Skip to content

prebuilt-binaries-cross #6

prebuilt-binaries-cross

prebuilt-binaries-cross #6

name: prebuilt-binaries-cross
on:
workflow_dispatch:
inputs:
version:
description: New version
required: false
type: string
publish:
description: Publish
required: false
default: false
type: boolean
push:
tags:
- "*"
permissions:
contents: write
actions: read
env:
PREBUILT_DIR: prebuilt-artifacts
jobs:
metadata:
name: Resolve Version
runs-on: ubuntu-latest
outputs:
version: ${{ steps.versions.outputs.version }}
tag: ${{ steps.versions.outputs.tag }}
should_publish: ${{ steps.versions.outputs.should_publish }}
steps:
- uses: actions/checkout@v4
- id: versions
env:
EVENT_NAME: ${{ github.event_name }}
INPUT_VERSION: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.version || '' }}
PUBLISH_INPUT: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.publish || 'true' }}
RELEASE_TAG: ${{ github.event_name == 'release' && github.event.release.tag_name || '' }}
run: |
set -ex
VERSION="${INPUT_VERSION}"
TAG=""
if [ -z "$VERSION" ]; then
if [ "$EVENT_NAME" = "release" ]; then
TAG="$RELEASE_TAG"
if [ -z "$TAG" ]; then
TAG="$GITHUB_REF_NAME"
fi
TAG="${TAG#refs/tags/}"
if [[ "$TAG" != v* ]]; then
TAG="v${TAG}"
fi
VERSION="${TAG#v}"
else
VERSION=$(node -p "require('./package.json').version")
TAG="v${VERSION}"
fi
else
if [[ "$VERSION" == v* ]]; then
TAG="$VERSION"
VERSION="${VERSION#v}"
else
TAG="v${VERSION}"
fi
fi
if [ -z "$VERSION" ]; then
echo "Unable to determine version" >&2
exit 1
fi
SHOULD_PUBLISH="false"
if [ "$EVENT_NAME" = "release" ]; then
SHOULD_PUBLISH="true"
else
case "${PUBLISH_INPUT,,}" in
true|1|yes)
SHOULD_PUBLISH="true"
;;
esac
fi
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
echo "should_publish=${SHOULD_PUBLISH}" >> "$GITHUB_OUTPUT"
linux-cross:
name: Linux cross (${{ matrix.slug }})
needs: metadata
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
include:
- slug: x64
npm_arch: x64
deb_arch: amd64
gnu_triplet: x86_64-linux-gnu
cc: gcc
cxx: g++
ar: ar
ranlib: ranlib
toolchain_packages: ""
- slug: arm64
npm_arch: arm64
deb_arch: arm64
gnu_triplet: aarch64-linux-gnu
cc: aarch64-linux-gnu-gcc
cxx: aarch64-linux-gnu-g++
ar: aarch64-linux-gnu-ar
ranlib: aarch64-linux-gnu-ranlib
toolchain_packages: crossbuild-essential-arm64
- slug: armhf
npm_arch: arm
deb_arch: armhf
gnu_triplet: arm-linux-gnueabihf
cc: arm-linux-gnueabihf-gcc
cxx: arm-linux-gnueabihf-g++
ar: arm-linux-gnueabihf-ar
ranlib: arm-linux-gnueabihf-ranlib
toolchain_packages: crossbuild-essential-armhf
- slug: riscv64
npm_arch: riscv64
deb_arch: riscv64
gnu_triplet: riscv64-linux-gnu
cc: riscv64-linux-gnu-gcc
cxx: riscv64-linux-gnu-g++
ar: riscv64-linux-gnu-ar
ranlib: riscv64-linux-gnu-ranlib
toolchain_packages: "gcc-riscv64-linux-gnu g++-riscv64-linux-gnu"
- slug: loong64
npm_arch: loong64
deb_arch: loongarch64
gnu_triplet: loongarch64-linux-gnu
cc: loongarch64-linux-gnu-gcc
cxx: loongarch64-linux-gnu-g++
ar: loongarch64-linux-gnu-ar
ranlib: loongarch64-linux-gnu-ranlib
toolchain_packages: "gcc-loongarch64-linux-gnu g++-loongarch64-linux-gnu"
- slug: ppc64le
npm_arch: ppc64
deb_arch: ppc64el
gnu_triplet: powerpc64le-linux-gnu
cc: powerpc64le-linux-gnu-gcc
cxx: powerpc64le-linux-gnu-g++
ar: powerpc64le-linux-gnu-ar
ranlib: powerpc64le-linux-gnu-ranlib
toolchain_packages: crossbuild-essential-ppc64el
- slug: s390x
npm_arch: s390x
deb_arch: s390x
gnu_triplet: s390x-linux-gnu
cc: s390x-linux-gnu-gcc
cxx: s390x-linux-gnu-g++
ar: s390x-linux-gnu-ar
ranlib: s390x-linux-gnu-ranlib
toolchain_packages: crossbuild-essential-s390x
env:
TARGET_PLATFORM: linux
PACKAGE_VERSION: ${{ needs.metadata.outputs.version }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- name: Install cross toolchains and headers
run: |
set -ex
if [ "${{ matrix.deb_arch }}" != "amd64" ]; then
dpkg --add-architecture ${{ matrix.deb_arch }}
fi
sudo apt-get update -y
PKGS="build-essential python3 pkg-config ninja-build libx11-dev:${{ matrix.deb_arch }} libxkbfile-dev:${{ matrix.deb_arch }} libkrb5-dev:${{ matrix.deb_arch }}"
if [ -n "${{ matrix.toolchain_packages }}" ]; then
PKGS="$PKGS ${{ matrix.toolchain_packages }}"
fi
DEBIAN_FRONTEND=noninteractive sudo apt-get install -y --no-install-recommends $PKGS
- name: Install npm dependencies
run: npm install --no-fund --no-audit --ignore-scripts
- name: Build native module (cross)
env:
npm_config_build_from_source: true
npm_config_arch: ${{ matrix.npm_arch }}
npm_config_target_arch: ${{ matrix.npm_arch }}
CC: ${{ matrix.cc }}
CXX: ${{ matrix.cxx }}
AR: ${{ matrix.ar }}
RANLIB: ${{ matrix.ranlib }}
run: |
set -ex
TRIPLET="${{ matrix.gnu_triplet }}"
export PKG_CONFIG_PATH="/usr/lib/${TRIPLET}/pkgconfig:/usr/lib/${TRIPLET}/lib/pkgconfig:/usr/share/pkgconfig:${PKG_CONFIG_PATH:-}"
export PKG_CONFIG_LIBDIR="/usr/lib/${TRIPLET}/pkgconfig:/usr/lib/${TRIPLET}/lib/pkgconfig:/usr/share/pkgconfig"
npx node-gyp rebuild --arch=${{ matrix.npm_arch }}
- name: Package artifact
run: |
set -ex
mkdir -p "${PREBUILT_DIR}/${TARGET_PLATFORM}-${{ matrix.slug }}"
cp build/Release/keymapping.node "${PREBUILT_DIR}/${TARGET_PLATFORM}-${{ matrix.slug }}/keymapping.node"
tar -czf "${PREBUILT_DIR}/native-keymap-${PACKAGE_VERSION}-${TARGET_PLATFORM}-${{ matrix.slug }}.tar.gz" -C "${PREBUILT_DIR}/${TARGET_PLATFORM}-${{ matrix.slug }}" keymapping.node
(cd "${PREBUILT_DIR}" && sha256sum "native-keymap-${PACKAGE_VERSION}-${TARGET_PLATFORM}-${{ matrix.slug }}.tar.gz" > "native-keymap-${PACKAGE_VERSION}-${TARGET_PLATFORM}-${{ matrix.slug }}.tar.gz.sha256")
- uses: actions/upload-artifact@v4
with:
name: native-keymap-${{ env.TARGET_PLATFORM }}-${{ matrix.slug }}
path: |
${{ env.PREBUILT_DIR }}/native-keymap-${{ env.PACKAGE_VERSION }}-${{ env.TARGET_PLATFORM }}-${{ matrix.slug }}.tar.gz
${{ env.PREBUILT_DIR }}/native-keymap-${{ env.PACKAGE_VERSION }}-${{ env.TARGET_PLATFORM }}-${{ matrix.slug }}.tar.gz.sha256
macos-cross:
name: macOS cross (${{ matrix.label }})
needs: metadata
runs-on: macos-14
strategy:
fail-fast: false
matrix:
include:
- label: x64
npm_arch: x64
clang_arch: x86_64
deployment_target: "10.13"
- label: arm64
npm_arch: arm64
clang_arch: arm64
deployment_target: "11.0"
env:
TARGET_PLATFORM: darwin
PACKAGE_VERSION: ${{ needs.metadata.outputs.version }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- name: Install npm dependencies
run: npm install --no-fund --no-audit --ignore-scripts
- name: Build native module (cross)
env:
npm_config_build_from_source: true
npm_config_arch: ${{ matrix.npm_arch }}
npm_config_target_arch: ${{ matrix.npm_arch }}
CFLAGS: "-arch ${{ matrix.clang_arch }} -mmacosx-version-min=${{ matrix.deployment_target }}"
CXXFLAGS: "-arch ${{ matrix.clang_arch }} -mmacosx-version-min=${{ matrix.deployment_target }}"
LDFLAGS: "-arch ${{ matrix.clang_arch }} -mmacosx-version-min=${{ matrix.deployment_target }}"
run: |
set -ex
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
npx node-gyp rebuild --arch=${{ matrix.npm_arch }}
- name: Package artifact
run: |
set -ex
mkdir -p "${PREBUILT_DIR}/${TARGET_PLATFORM}-${{ matrix.label }}"
cp build/Release/keymapping.node "${PREBUILT_DIR}/${TARGET_PLATFORM}-${{ matrix.label }}/keymapping.node"
tar -czf "${PREBUILT_DIR}/native-keymap-${PACKAGE_VERSION}-${TARGET_PLATFORM}-${{ matrix.label }}.tar.gz" -C "${PREBUILT_DIR}/${TARGET_PLATFORM}-${{ matrix.label }}" keymapping.node
(cd "${PREBUILT_DIR}" && shasum -a 256 "native-keymap-${PACKAGE_VERSION}-${TARGET_PLATFORM}-${{ matrix.label }}.tar.gz" > "native-keymap-${PACKAGE_VERSION}-${TARGET_PLATFORM}-${{ matrix.label }}.tar.gz.sha256")
- uses: actions/upload-artifact@v4
with:
name: native-keymap-${{ env.TARGET_PLATFORM }}-${{ matrix.label }}
path: |
${{ env.PREBUILT_DIR }}/native-keymap-${{ env.PACKAGE_VERSION }}-${{ env.TARGET_PLATFORM }}-${{ matrix.label }}.tar.gz
${{ env.PREBUILT_DIR }}/native-keymap-${{ env.PACKAGE_VERSION }}-${{ env.TARGET_PLATFORM }}-${{ matrix.label }}.tar.gz.sha256
windows-cross:
name: Windows cross (${{ matrix.arch }})
needs: metadata
runs-on: windows-2022
strategy:
fail-fast: false
matrix:
include:
- arch: x64
vs_arch: x64
- arch: arm64
vs_arch: amd64_arm64
env:
TARGET_PLATFORM: win32
PACKAGE_VERSION: ${{ needs.metadata.outputs.version }}
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- name: Install npm dependencies
run: npm install --no-fund --no-audit --ignore-scripts
- name: Setup MSVC toolchain
uses: ilammy/msvc-dev-cmd@v1
with:
arch: ${{ matrix.vs_arch }}
- name: Build native module (cross)
env:
npm_config_build_from_source: true
npm_config_arch: ${{ matrix.arch }}
npm_config_target_arch: ${{ matrix.arch }}
run: npx node-gyp rebuild --arch=${{ matrix.arch }}
- name: Package artifact
run: |
set -ex
mkdir -p "${PREBUILT_DIR}/${TARGET_PLATFORM}-${{ matrix.arch }}"
cp build/Release/keymapping.node "${PREBUILT_DIR}/${TARGET_PLATFORM}-${{ matrix.arch }}/keymapping.node"
tar -czf "${PREBUILT_DIR}/native-keymap-${PACKAGE_VERSION}-${TARGET_PLATFORM}-${{ matrix.arch }}.tar.gz" -C "${PREBUILT_DIR}/${TARGET_PLATFORM}-${{ matrix.arch }}" keymapping.node
- name: Generate checksums
shell: pwsh
run: |
$target = "${env:PREBUILT_DIR}\native-keymap-${env:PACKAGE_VERSION}-${env:TARGET_PLATFORM}-${{ matrix.arch }}.tar.gz"
$hash = (Get-FileHash -Path $target -Algorithm SHA256).Hash
Set-Content -Path "$target.sha256" -Value "$hash $(Split-Path -Leaf $target)"
- uses: actions/upload-artifact@v4
with:
name: native-keymap-${{ env.TARGET_PLATFORM }}-${{ matrix.arch }}
path: |
${{ env.PREBUILT_DIR }}/native-keymap-${{ env.PACKAGE_VERSION }}-${{ env.TARGET_PLATFORM }}-${{ matrix.arch }}.tar.gz
${{ env.PREBUILT_DIR }}/native-keymap-${{ env.PACKAGE_VERSION }}-${{ env.TARGET_PLATFORM }}-${{ matrix.arch }}.tar.gz.sha256
publish:
name: Publish Release
needs:
- metadata
- linux-cross
- macos-cross
- windows-cross
if: needs.metadata.outputs.should_publish == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js for npm publish
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
registry-url: https://registry.npmjs.org
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: collected-artifacts
- name: Flatten artifact structure
run: |
set -ex
mkdir -p release
find collected-artifacts -type f -name '*.tar.gz*' -exec cp {} release/ \;
- name: Publish package to npm
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
if [ -n "$NODE_AUTH_TOKEN" ]; then
npm publish --access public
else
echo "NPM token not present, skipping publish"
fi
- name: Publish release assets
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.metadata.outputs.tag }}
name: native-keymap ${{ needs.metadata.outputs.tag }}
files: release/*
draft: false
prerelease: false