Skip to content

Commit

Permalink
Add cross compilation
Browse files Browse the repository at this point in the history
  • Loading branch information
devraymondsh committed Apr 13, 2024
1 parent e4916a0 commit f9b618a
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 47 deletions.
66 changes: 45 additions & 21 deletions .github/workflows/linux-daily-check.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Linux daily check
name: Linux

on:
schedule:
Expand All @@ -7,34 +7,58 @@ on:

jobs:
update:
name: Linux daily check
name: Linux
runs-on: ubuntu-latest
strategy:
matrix:
arch: [amd64, arm64]
include:
- arch: arm64
is_arm: true
# container:
# image: ubuntu:devel
steps:
- name: Update system
run: sudo apt-get update && sudo apt-get --yes upgrade
# - name: Update system
# run: apt-get update && apt-get install -y sudo

- 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
- uses: pguyot/arm-runner-action@v2
with:
# base_image: raspios_lite_arm64:latest
base_image: https://dietpi.com/downloads/images/testing/DietPi_RPi5-ARMv8-Bookworm.img.xz
image_additional_mb: 10240
commands: |
apt-get update
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 python3 python3-pip gcc g++ make linux-headers-generic build-essential binutils libz-dev linux-libc-dev ninja-build nodejs
git clone https://github.com/devraymondsh/libnode-distributable
ARCH=arm64 cd libnode-distributable && node index.js
- name: Install building tools
run: sudo apt-get install --yes git python3 python3-pip gcc g++ make ninja-build nodejs sudo
# - name: Install Nodejs 21 repo
# run: apt-get install --yes ca-certificates curl gnupg && curl -sL https://deb.nodesource.com/setup_21.x | bash - && apt-get update

- name: Clone the repo
run: git clone https://github.com/devraymondsh/libnode-distributable
# - name: Install building tools
# run: apt-get install --yes git python3 python3-pip gcc g++ make linux-headers-generic build-essential binutils libz-dev linux-libc-dev ninja-build nodejs

- name: Run sccache-cache
uses: mozilla-actions/[email protected]
# - if: ${{ matrix.is_arm }}
# name: Install cross platform building tools
# run: apt-get install --yes crossbuild-essential-arm64 linux-libc-dev-arm64-cross binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

- 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
# - name: Clone the repo
# run: git clone https://github.com/devraymondsh/libnode-distributable

- name: Find the shared library
run: find libnode-distributable/node -name libnode.so\* -not -name '*.TOC' -not -name '*.toc' -exec ls {} \;
# # - if: ${{ ! matrix.is_arm }}
# - name: Run ccache-cache
# uses: hendrikmuhs/[email protected]
# with:
# create-symlink: true
# key: ${{ github.workflow }}-${{ matrix.arch }}

# - name: Run the script
# env:
# CC: "gcc"
# CXX: "g++"
# ARCH: ${{ matrix.arch }}
# run: cd libnode-distributable && node index.js

# - name: Find the shared library
# run: find libnode-distributable/node -name libnode.so\* -not -name '*.TOC' -not -name '*.toc' -exec ls {} \;
26 changes: 17 additions & 9 deletions .github/workflows/macos-daily-check.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Macos daily check
name: Macos

on:
schedule:
Expand All @@ -7,28 +7,36 @@ on:

jobs:
update:
name: Macos daily check
runs-on: macos-latest
name: Macos
strategy:
matrix:
arch: [amd64, arm64]
include:
- arch: arm64
os: macos-14
is_arm: true
- arch: amd64
os: macos-13
runs-on: ${{ matrix.os }}
steps:
- name: Install building tools
run: brew install node python ninja nasm git

- name: Clone the repo
run: git clone https://github.com/devraymondsh/libnode-distributable

- name: Run sccache-cache
uses: mozilla-actions/[email protected]
- name: Run ccache-cache
uses: hendrikmuhs/[email protected]
with:
create-symlink: true
key: ${{ github.workflow }}-${{ matrix.arch }}

- name: Run the script
env:
CC: "sccache cc"
CXX: "sccache c++"
CC: "cc"
CXX: "c++"
ARCH: ${{ matrix.arch }}
SCCACHE_GHA_ENABLED: "true"
run: cd libnode-distributable && 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: find libnode-distributable/node -name libnode.dylib\* -not -name '*.TOC' -not -name '*.toc' -exec ls {} \;
13 changes: 7 additions & 6 deletions .github/workflows/windows-daily-check.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Windows daily check
name: Windows

on:
schedule:
Expand All @@ -7,7 +7,7 @@ on:

jobs:
update:
name: Windows daily check
name: Windows
runs-on: windows-latest
strategy:
matrix:
Expand All @@ -19,7 +19,6 @@ jobs:

- uses: MinoruSekine/setup-scoop@v3
with:
buckets: extras
update_path: true
run_as_admin: true
scoop_update: true
Expand All @@ -30,13 +29,15 @@ jobs:
- name: Clone the repo
run: git clone https://github.com/devraymondsh/libnode-distributable

- name: Run sccache-cache
uses: mozilla-actions/[email protected]
- name: Run ccache-cache
uses: hendrikmuhs/[email protected]
with:
# create-symlink: true
key: ${{ github.workflow }}-${{ matrix.arch }}

- name: Run the script
env:
ARCH: ${{ matrix.arch }}
SCCACHE_GHA_ENABLED: "true"
run: cd libnode-distributable ; node index.js

- name: Find the shared library
Expand Down
60 changes: 49 additions & 11 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,12 @@ 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 ARCH = process.env.ARCH;
// const arch = ARCH == "amd64" ? "x64" : "arm64";
const arch = "arm64";

const coreCount = cpus().length;
const threadCount = coreCount * 2;
const arch = ARCH == "amd64" ? "x64" : "arm64";
let os;
switch (process.platform) {
case "darwin":
Expand Down Expand Up @@ -57,7 +53,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 } : {});

Expand Down Expand Up @@ -85,16 +81,58 @@ 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");

// if (process.platform === "linux") {
// extraArgs.push("--cross-compiling");

// // process.env.ARCH = "aarch64";
// process.env.GYP_CROSSCOMPILE = "1";
// process.env.CROSS_COMPILE = "aarch64-linux-gnu-";

// process.env.AR_host = "ar";
// process.env.CC_host = "ccache gcc";
// process.env.CXX_host = "ccache g++";
// process.env.LD = "aarch64-linux-gnu-ld";
// process.env.AR = "aarch64-linux-gnu-ar";
// process.env.AS = "aarch64-linux-gnu-as";
// process.env.NM = "aarch64-linux-gnu-nm";
// process.env.STRIP = "aarch64-linux-gnu-strip";
// process.env.RANLIB = "aarch64-linux-gnu-ranlib";
// process.env.CC = "ccache aarch64-linux-gnu-gcc";
// process.env.CXX = "ccache aarch64-linux-gnu-g++";
// process.env.OBJDUMP = "aarch64-linux-gnu-objdump";

// // process.env.CFLAGS = "-march=armv8 -mfpu=neon -mfloat-abi=hard";
// // process.env.CFLAGS = "-march=arm64";
// // process.env.CXXFLAGS = process.env.CFLAGS;
// }
}

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");
Expand Down
27 changes: 27 additions & 0 deletions qemu-wrapper.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// From https://wiki.gentoo.org/wiki/Embedded_Handbook/General/Compiling_with_qemu_user_chroot
/*
* pass arguments to qemu binary
* QEMU_CPU environment variable can be unset
*/

#include <string.h>
#include <unistd.h>

#define XSTR(cpu) STR(cpu)
#define STR(cpu) #cpu

int main(int argc, char **argv, char **envp) {
int this_len = strlen(argv[0]);
char staticpath[this_len];
char *newargv[argc + 3];

newargv[0] = argv[0];
newargv[1] = "-cpu";
newargv[2] = XSTR(QEMU_CPU);

memcpy(&newargv[3], &argv[1], sizeof(*argv) * (argc -1));
newargv[argc + 2] = NULL;
memcpy(staticpath, argv[0], this_len - 1);
staticpath[this_len - 1] = 0;
return execve(staticpath, newargv, envp);
}

0 comments on commit f9b618a

Please sign in to comment.