Update builder and migrate to ESM #3
@ -1,100 +0,0 @@
|
||||
name: Test
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
linux_test:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node_version: [ 16.x, 18.x, 19.x, 20.x, 21.x ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
name: Setup Node.js
|
||||
with:
|
||||
node-version: ${{ matrix.node_version }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
echo "Host arch: $(uname -m)"
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
sudo apt update
|
||||
packages=(
|
||||
"binutils-multiarch"
|
||||
"build-essential"
|
||||
);
|
||||
# if [[ $(uname -m) == "x86_64" ]]; then
|
||||
# packages+=(
|
||||
# "libc6-arm64-cross"
|
||||
# "gcc-*aarch64-linux-gnu"
|
||||
# "gcc-*aarch64-linux-gnu-base"
|
||||
# "g++-*aarch64-linux-gnu"
|
||||
# )
|
||||
# else
|
||||
# packages+=(
|
||||
# "libc6-amd64-cross"
|
||||
# "g++-*x86-64-linux-gnu"
|
||||
# "gcc-*x86-64-linux-gnu"
|
||||
# )
|
||||
# if [[ $(uname -m) != "aarch64" ]]; then
|
||||
# packages+=(
|
||||
# "libc6-arm64-cross"
|
||||
# "gcc-*aarch64-linux-gnu"
|
||||
# "gcc-*aarch64-linux-gnu-base"
|
||||
# "g++-*aarch64-linux-gnu"
|
||||
# )
|
||||
# fi
|
||||
# fi
|
||||
sudo apt install -y ${packages[@]}
|
||||
npm install --no-save --ignore-scripts
|
||||
|
||||
- name: Build addon
|
||||
run: npm run dev
|
||||
|
||||
- name: Upload prebuilds interface
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
retention-days: 7
|
||||
name: prebuilds_${{ runner.os }}_${{ matrix.node_version }}
|
||||
path: "prebuilds/**"
|
||||
|
||||
- name: Test
|
||||
run: node --require ts-node/register --loader ts-node/esm ./src/index_test.ts
|
||||
|
||||
pack_package:
|
||||
needs: linux_test
|
||||
runs-on: ubuntu-latest
|
||||
name: Pack npm package
|
||||
env:
|
||||
PACKAGE_VERSION: ${{ github.ref }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Code checkout
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
name: Setup node.js
|
||||
with:
|
||||
node-version: 20.x
|
||||
registry-url: https://registry.npmjs.org/
|
||||
|
||||
- name: Download all artefacts
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
path: ./prebuilds
|
||||
|
||||
- run: npm install --no-save --ignore-scripts
|
||||
- run: npm pack
|
||||
|
||||
- name: Upload npm package
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Package_Pack
|
||||
path: "*.tgz"
|
90
.github/workflows/test.yml
vendored
90
.github/workflows/test.yml
vendored
@ -13,10 +13,15 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
node_version: [ 16.x, 18.x, 19.x, 20.x, 21.x ]
|
||||
target_os: [ "windows", "linux", "macos" ]
|
||||
target_arch: [ "x86_64", "aarch64" ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout
|
||||
|
||||
- uses: goto-bus-stop/setup-zig@v2
|
||||
name: "Setup zig"
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
name: Setup Node.js
|
||||
with:
|
||||
@ -26,96 +31,29 @@ jobs:
|
||||
run: |
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
sudo apt update
|
||||
sudo apt install -y binutils-multiarch gcc-*aarch64-linux-gnu gcc-*aarch64-linux-gnu-base g++-*aarch64-linux-gnu libc6-arm64-cross
|
||||
sudo apt install -y "binutils-multiarch" "build-essential"
|
||||
npm install --no-save --ignore-scripts
|
||||
|
||||
- name: Build addon
|
||||
run: npm run prebuildify -- -v
|
||||
|
||||
- name: Test
|
||||
run: sudo -E node --require ts-node/register --loader ts-node/esm ./src/index_test.ts
|
||||
run: npm run dev -- --target_zig=${{ matrix.target_arch }}-${{ matrix.target_os }}
|
||||
env:
|
||||
CC: zig cc -target ${{ matrix.target_arch }}-${{ matrix.target_os }}
|
||||
CXX: "zig c++ -target ${{ matrix.target_arch }}-${{ matrix.target_os }}"
|
||||
AR: "zig ar"
|
||||
RANLIB: "zig ranlib"
|
||||
|
||||
- name: Upload prebuilds interface
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
retention-days: 7
|
||||
name: prebuilds_${{ runner.os }}
|
||||
name: prebuilds_${{ matrix.target_arch }}-${{ matrix.target_os }}_${{ matrix.node_version }}
|
||||
path: "prebuilds/**"
|
||||
|
||||
macos_test:
|
||||
runs-on: macos-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node_version: [ 16.x, 18.x, 19.x, 20.x, 21.x ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
name: Setup Node.js
|
||||
with:
|
||||
node-version: ${{ matrix.node_version }}
|
||||
|
||||
- name: Setup Go environment
|
||||
uses: actions/setup-go@v5.0.0
|
||||
|
||||
- name: Setup wireguard-go
|
||||
run: |
|
||||
cd ..
|
||||
git clone https://git.zx2c4.com/wireguard-go
|
||||
cd wireguard-go
|
||||
echo "WG_INETRFACE=utun15" >> $GITHUB_ENV
|
||||
go build -v -o "wireguard-go"
|
||||
sudo ./wireguard-go utun15
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install --no-save --ignore-scripts
|
||||
|
||||
- name: Build addon
|
||||
run: npm run prebuildify -- -v
|
||||
|
||||
- name: Test
|
||||
run: sudo -E node --require ts-node/register --loader ts-node/esm ./src/index_test.ts
|
||||
|
||||
- name: Upload prebuilds interface
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
retention-days: 7
|
||||
name: prebuilds_${{ runner.os }}
|
||||
path: "prebuilds/**"
|
||||
|
||||
win_test:
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node_version: [ 16.x, 18.x, 19.x, 20.x, 21.x ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
name: Setup Node.js
|
||||
with:
|
||||
node-version: ${{ matrix.node_version }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install --no-save --ignore-scripts
|
||||
|
||||
- name: Build addon
|
||||
run: npm run prebuildify -- -v
|
||||
|
||||
- name: Test
|
||||
run: node --require ts-node/register --loader ts-node/esm ./src/index_test.ts
|
||||
|
||||
- name: Upload prebuilds interface
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
retention-days: 7
|
||||
name: prebuilds_${{ runner.os }}
|
||||
path: "prebuilds/**"
|
||||
|
||||
pack_package:
|
||||
needs: [ linux_test, macos_test, win_test ]
|
||||
needs: linux_test
|
||||
runs-on: ubuntu-latest
|
||||
name: Pack npm package
|
||||
env:
|
||||
|
@ -1,9 +1,8 @@
|
||||
#include <napi.h>
|
||||
#include <wginterface.hh>
|
||||
#include <net/if.h>
|
||||
|
||||
unsigned long maxName() {
|
||||
return IFNAMSIZ;
|
||||
return 16;
|
||||
}
|
||||
|
||||
std::string versionDrive() {
|
||||
|
106
libs/build.mjs
106
libs/build.mjs
@ -8,22 +8,26 @@ import { fileURLToPath } from "node:url";
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url)); // Fix ESM __dirname
|
||||
const nodeGyp = path.resolve(createRequire(import.meta.url).resolve("node-gyp"), "../../bin/node-gyp.js"); // Node gyp script
|
||||
const env = Object.assign({}, process.env);
|
||||
const args = process.argv.slice(2);
|
||||
|
||||
const prebuilds = path.resolve(__dirname, "../prebuilds");
|
||||
const buildDir = path.resolve(__dirname, "../build") /* Build Directory */, buildRelease = path.join(buildDir, "Release"), buildDebug = path.join(buildDir, "Debug");
|
||||
|
||||
/**
|
||||
* @param {string} path
|
||||
* @returns
|
||||
*/
|
||||
async function exist(path) {
|
||||
return fs.open(path).then(e => e.close().then(() => true, () => true), () => false);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} command
|
||||
* @param {string[]} args
|
||||
* @param {Omit<import("child_process").ForkOptions, "stdio">} options
|
||||
*/
|
||||
async function fork(command, args, options) {
|
||||
if (options) options["stdio"] = undefined;
|
||||
console.log("%s", command, ...args);
|
||||
return new Promise((done, reject) => {
|
||||
const child = child_process.fork(command, args, options);
|
||||
child.on("error", reject);
|
||||
@ -76,60 +80,62 @@ async function migrateBuildAddon(platform, arch) {
|
||||
await fs.rm(buildDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
if (process.argv.slice(2).at(0) === "build") {
|
||||
let archs = [];
|
||||
if (process.argv.includes("--clean")) {
|
||||
if (args.at(0) === "build") {
|
||||
const config = {
|
||||
clean: args.includes("--clean"),
|
||||
zigUse: false,
|
||||
/** @type {{ os: NodeJS.Platform, arch: NodeJS.Architecture, extra_env?: Record<string, string> }[]} */
|
||||
targets: [ { os: process.platform, arch: process.arch } ],
|
||||
};
|
||||
|
||||
if (args.some(s => s.startsWith("--zig_target=")||s.startsWith("--target="))) {
|
||||
config.zigUse = true;
|
||||
config.targets = [];
|
||||
const check = /^([a-zA-Z0-9_\-]+)-([a-zA-Z0-9_]+)$/;
|
||||
const ts = args.filter(s => s.startsWith("--zig_target=")||s.startsWith("--target=")).map(s => (s[3] === "z" ? s.slice(13) : s.slice(9)).trim());
|
||||
for (const t of ts) {
|
||||
if (!(check.test(t))) {
|
||||
console.error("Target (%s) is invalid!", t);
|
||||
process.exit(-1);
|
||||
}
|
||||
let [, arch_t, os_t ] = (check.exec(t)||[]);
|
||||
if (os_t === "windows") os_t = "win32";
|
||||
else if (os_t === "macos") os_t = "darwin";
|
||||
|
||||
if (arch_t === "aarch64") arch_t = "arm64";
|
||||
else if (arch_t === "x86_64") arch_t = "x64";
|
||||
|
||||
config.targets.push({
|
||||
os: os_t,
|
||||
arch: arch_t,
|
||||
extra_env: {
|
||||
AR: "zig ar",
|
||||
RANLIB: "zig ranlib",
|
||||
CC: ("zig cc -target ").concat(t),
|
||||
CXX: ("zig c++ -target ").concat(t),
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (args.some(s => s.startsWith("--arch=") && s.slice(7).trim().length > 0)) {
|
||||
config.targets = args.filter(s => s.startsWith("--arch=") && s.slice(7).trim().length > 0).map(s => s.slice(7)).map(arch => ({ os: process.platform, arch }));
|
||||
}
|
||||
|
||||
if (config.clean) {
|
||||
if (await exist(buildDir)) await fs.rm(buildDir, { recursive: true, force: true });
|
||||
if (await exist(prebuilds)) await fs.rm(prebuilds, { recursive: true, force: true });
|
||||
}
|
||||
if (process.argv.includes("--auto")) {
|
||||
if (process.platform === "linux") archs.push("x64", "arm64");
|
||||
else if (process.platform === "win32") archs.push("x64", "arm64");
|
||||
else if (process.platform === "darwin") archs.push("x64", "arm64");
|
||||
else archs.push(process.arch);
|
||||
} else {
|
||||
process.argv.slice(2).filter(f => f.startsWith("--arch=")).map(arch => arch.slice(7));
|
||||
if (archs.length <= 0) archs.push(process.arch);
|
||||
}
|
||||
for (const arch of Array.from(new Set(archs))) {
|
||||
if (process.platform === "linux" && arch !== process.arch) {
|
||||
if (arch === "x64") {
|
||||
// x86_64-linux-gnu-gcc
|
||||
env.CC = "x86_64-linux-gnu-gcc";
|
||||
env.CXX = "x86_64-linux-gnu-g++";
|
||||
} else if (arch === "arm64") {
|
||||
// aarch64-linux-gnu-gcc
|
||||
env.CC = "aarch64-linux-gnu-gcc";
|
||||
env.CXX = "aarch64-linux-gnu-g++";
|
||||
}
|
||||
} else if (process.platform === "win32" && arch !== process.arch) {
|
||||
let skip = true;
|
||||
for (const vsPath of [ "C:\\Program Files (x86)\\Microsoft Visual Studio", "C:\\Program Files\\Microsoft Visual Studio" ]) {
|
||||
if (!(await exist(vsPath))) continue;
|
||||
const year = ((await fs.readdir(vsPath)).filter(s => !(isNaN(Number(s)))).sort((a, b) => (Number(a) < Number(b)) ? -1 : 0).at(-1));
|
||||
if (!year) continue;
|
||||
for (const vsEdition of await fs.readdir(path.join(vsPath, year))) {
|
||||
if (await exist(path.join(vsPath, year, vsEdition, "MSBuild\\Current\\Bin", arch))) {
|
||||
if (skip) skip = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!skip) break;
|
||||
}
|
||||
if (skip) {
|
||||
console.info("Arch not avaible to copiler!");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
for (const { os, arch, extra_env } of config.targets) {
|
||||
console.log("\nBuild to %O/%O, envs: %O", os, arch, extra_env);
|
||||
const args = [ "rebuild" ];
|
||||
if (os !== "android") args.push("-j", "max");
|
||||
args.push(("--arch=").concat(arch));
|
||||
try {
|
||||
console.log("Bulding to %O\n", arch);
|
||||
await fork(nodeGyp, ["rebuild", ...(process.platform !== "android"?["-j", "max"]:[]), ("--arch=").concat(arch)], {env});
|
||||
console.log("Migrating addons!");
|
||||
await migrateBuildAddon(process.platform, arch);
|
||||
await fork(nodeGyp, args, { env: Object.assign({}, env, extra_env) });
|
||||
await migrateBuildAddon(os, arch);
|
||||
} catch (err) {
|
||||
if (process.platform === "win32" && arch !== process.arch) continue;
|
||||
throw err;
|
||||
console.error(err);
|
||||
process.exit(-1);
|
||||
}
|
||||
}
|
||||
} else if (!(await exist(path.join(prebuilds, `${process.platform}_${process.arch}`)) || await exist(buildRelease))) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user