JS-Ify Dependency Installation
This commit is contained in:
parent
b767b9d4ec
commit
b055980103
@ -28,7 +28,7 @@ jobs:
|
|||||||
submodules: true
|
submodules: true
|
||||||
# Dependencies
|
# Dependencies
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: ./scripts/install-dependencies.sh build ${{ matrix.arch }}
|
run: ./scripts/install-dependencies.mjs build ${{ matrix.arch }}
|
||||||
# Build
|
# Build
|
||||||
- name: Build
|
- name: Build
|
||||||
run: ./scripts/build.mjs appimage ${{ matrix.arch }}
|
run: ./scripts/build.mjs appimage ${{ matrix.arch }}
|
||||||
@ -61,7 +61,7 @@ jobs:
|
|||||||
submodules: false
|
submodules: false
|
||||||
# Dependencies
|
# Dependencies
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: ./scripts/install-dependencies.sh test ${{ matrix.arch }}
|
run: ./scripts/install-dependencies.mjs test ${{ matrix.arch }}
|
||||||
# Download Artifact
|
# Download Artifact
|
||||||
- name: Download Artifact
|
- name: Download Artifact
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
@ -84,7 +84,7 @@ jobs:
|
|||||||
submodules: false
|
submodules: false
|
||||||
# Dependencies
|
# Dependencies
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: ./scripts/install-dependencies.sh example_mods amd64
|
run: ./scripts/install-dependencies.mjs sdk amd64
|
||||||
# SDK
|
# SDK
|
||||||
- name: Download SDK
|
- name: Download SDK
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
|
2
dependencies/LIEF/src
vendored
2
dependencies/LIEF/src
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 441bb4620bc7242a822b7cb4419c965d76119f6b
|
Subproject commit d4900dab6a9eea864fb14ed1ff7ea5b9f8678e04
|
@ -1,17 +1,9 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
import * as path from 'node:path';
|
import * as path from 'node:path';
|
||||||
import * as url from 'node:url';
|
|
||||||
import * as fs from 'node:fs';
|
import * as fs from 'node:fs';
|
||||||
import { info, err, run } from './lib/util.mjs';
|
import { info, err, run, createDir, getScriptsDir } from './lib/util.mjs';
|
||||||
import { parseOptions, Enum, Architectures } from './lib/options.mjs';
|
import { parseOptions, Enum, Architectures } from './lib/options.mjs';
|
||||||
|
|
||||||
// Enums
|
|
||||||
const PackageTypes = new Enum([
|
|
||||||
'None',
|
|
||||||
'AppImage',
|
|
||||||
'Flatpak'
|
|
||||||
]);
|
|
||||||
|
|
||||||
// CMake Options
|
// CMake Options
|
||||||
const cmakeArgPrefix = '-D';
|
const cmakeArgPrefix = '-D';
|
||||||
const cmakeArgSeparator = '=';
|
const cmakeArgSeparator = '=';
|
||||||
@ -41,6 +33,11 @@ function parseCMakeOption(arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Options
|
// Options
|
||||||
|
const PackageTypes = new Enum([
|
||||||
|
'None',
|
||||||
|
'AppImage',
|
||||||
|
'Flatpak'
|
||||||
|
]);
|
||||||
const options = parseOptions([
|
const options = parseOptions([
|
||||||
['packageType', PackageTypes],
|
['packageType', PackageTypes],
|
||||||
['architecture', Architectures]
|
['architecture', Architectures]
|
||||||
@ -59,8 +56,7 @@ if (options.packageType === PackageTypes.AppImage && options.install) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Folders
|
// Folders
|
||||||
const __filename = url.fileURLToPath(import.meta.url);
|
const __dirname = getScriptsDir();
|
||||||
const __dirname = path.dirname(__filename);
|
|
||||||
const root = path.join(__dirname, '..');
|
const root = path.join(__dirname, '..');
|
||||||
let build = path.join(root, 'build');
|
let build = path.join(root, 'build');
|
||||||
let out = path.join(root, 'out');
|
let out = path.join(root, 'out');
|
||||||
@ -97,12 +93,6 @@ if (options.architecture !== Architectures.Host) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Make Build Directory
|
// Make Build Directory
|
||||||
function createDir(dir, clean) {
|
|
||||||
if (clean) {
|
|
||||||
fs.rmSync(dir, {recursive: true, force: true});
|
|
||||||
}
|
|
||||||
fs.mkdirSync(dir, {recursive: true});
|
|
||||||
}
|
|
||||||
createDir(build, options.clean);
|
createDir(build, options.clean);
|
||||||
if (!options.install) {
|
if (!options.install) {
|
||||||
createDir(out, !useOutRoot);
|
createDir(out, !useOutRoot);
|
||||||
|
@ -1,3 +1,2 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
exec sed -i '0,/AI\x02/{s|AI\x02|\x00\x00\x00|}' "$1"
|
exec sed -i '0,/AI\x02/{s|AI\x02|\x00\x00\x00|}' "$1"
|
150
scripts/install-dependencies.mjs
Executable file
150
scripts/install-dependencies.mjs
Executable file
@ -0,0 +1,150 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
import * as path from 'node:path';
|
||||||
|
import * as fs from 'node:fs';
|
||||||
|
import { err, run, makeExecutable, getDebianVersion, getScriptsDir, info } from './lib/util.mjs';
|
||||||
|
import { parseOptions, Enum, Architectures } from './lib/options.mjs';
|
||||||
|
|
||||||
|
// Check System
|
||||||
|
if (process.getuid() !== 0) {
|
||||||
|
err("Must Run As Root!");
|
||||||
|
}
|
||||||
|
if (!fs.existsSync('/etc/debian_version')) {
|
||||||
|
err('Non-Debian OS Detected');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Options
|
||||||
|
const Modes = new Enum([
|
||||||
|
'Build',
|
||||||
|
'Test',
|
||||||
|
'SDK'
|
||||||
|
]);
|
||||||
|
const options = parseOptions([
|
||||||
|
['mode', Modes],
|
||||||
|
['architecture', Architectures]
|
||||||
|
], [], null);
|
||||||
|
|
||||||
|
// Setup Backports If Needed
|
||||||
|
const debianVersion = getDebianVersion();
|
||||||
|
info('OS Version: ' + debianVersion);
|
||||||
|
let backportsSuffix = '';
|
||||||
|
if (debianVersion === 'bullseye') {
|
||||||
|
const repo = debianVersion + '-backports';
|
||||||
|
const source = `deb http://deb.debian.org/debian ${repo} main\n`;
|
||||||
|
fs.writeFileSync(`/etc/apt/sources.list.d/${repo}.list`, source);
|
||||||
|
backportsSuffix = '/' + repo;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update APT
|
||||||
|
let archSuffix = '';
|
||||||
|
if (options.architecture !== Architectures.Host) {
|
||||||
|
const arch = options.architecture.name;
|
||||||
|
run(['dpkg', '--add-architecture', arch]);
|
||||||
|
archSuffix = ':' + arch;
|
||||||
|
}
|
||||||
|
run(['apt-get', 'update']);
|
||||||
|
run(['apt-get', 'dist-upgrade', '-y']);
|
||||||
|
|
||||||
|
// Install Packages
|
||||||
|
const packages = [];
|
||||||
|
function addPackageForBuild(...arr) {
|
||||||
|
// The machine the package is built on.
|
||||||
|
packages.push(...arr);
|
||||||
|
}
|
||||||
|
function addPackageForHost(...arr) {
|
||||||
|
// The machine the package is built for.
|
||||||
|
for (const name of arr) {
|
||||||
|
packages.push(name + archSuffix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build Dependencies
|
||||||
|
const handlers = new Map();
|
||||||
|
handlers.set(Modes.Build, function () {
|
||||||
|
// Build Dependencies
|
||||||
|
addPackageForBuild(
|
||||||
|
'git',
|
||||||
|
'cmake' + backportsSuffix,
|
||||||
|
'ninja-build'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Compiler
|
||||||
|
if (options.architecture === Architectures.Host) {
|
||||||
|
addPackageForBuild('gcc', 'g++');
|
||||||
|
} else {
|
||||||
|
addPackageForBuild('crossbuild-essential-' + options.architecture.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main Dependencies
|
||||||
|
addPackageForHost('libopenal-dev');
|
||||||
|
|
||||||
|
// GLFW Dependencies
|
||||||
|
addPackageForBuild('libwayland-bin');
|
||||||
|
addPackageForHost(
|
||||||
|
'libwayland-dev',
|
||||||
|
'libxkbcommon-dev',
|
||||||
|
'libx11-dev',
|
||||||
|
'libxcursor-dev',
|
||||||
|
'libxi-dev',
|
||||||
|
'libxinerama-dev',
|
||||||
|
'libxrandr-dev',
|
||||||
|
'libxext-dev'
|
||||||
|
);
|
||||||
|
|
||||||
|
// QEMU Dependencies
|
||||||
|
addPackageForBuild(
|
||||||
|
'python3',
|
||||||
|
'python3-venv',
|
||||||
|
`python3-tomli` + backportsSuffix
|
||||||
|
);
|
||||||
|
addPackageForHost('libglib2.0-dev');
|
||||||
|
|
||||||
|
// AppImage Dependencies
|
||||||
|
addPackageForBuild(
|
||||||
|
'appstream',
|
||||||
|
'zsync'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Download AppImageTool
|
||||||
|
function getAppImageArch() {
|
||||||
|
switch (process.arch) {
|
||||||
|
case 'x64': return 'x86_64';
|
||||||
|
case 'arm64': return 'aarch64';
|
||||||
|
case 'arm': return 'armhf';
|
||||||
|
default: err('Unsupported Build Architecture');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let appimagetool = '/opt/appimagetool';
|
||||||
|
run(['wget', '-O', appimagetool, `https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-${getAppImageArch()}.AppImage`]);
|
||||||
|
makeExecutable(appimagetool);
|
||||||
|
run([getScriptsDir() + '/fix-appimage-for-docker.sh', appimagetool]);
|
||||||
|
const script = `#!/bin/sh\nexec ${appimagetool} --appimage-extract-and-run "$@"\n`;
|
||||||
|
appimagetool = '/usr/local/bin/' + path.basename(appimagetool);
|
||||||
|
fs.writeFileSync(appimagetool, script);
|
||||||
|
makeExecutable(appimagetool);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Testing Dependencies
|
||||||
|
handlers.set(Modes.Test, function () {
|
||||||
|
addPackageForHost(
|
||||||
|
'libc6',
|
||||||
|
'libstdc++6',
|
||||||
|
'libopenal1',
|
||||||
|
'libglib2.0-0'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// SDK Usage Dependencies
|
||||||
|
handlers.set(Modes.SDK, function () {
|
||||||
|
addPackageForBuild(
|
||||||
|
'cmake' + backportsSuffix,
|
||||||
|
'ninja-build',
|
||||||
|
'g++-arm-linux-gnueabihf',
|
||||||
|
'gcc-arm-linux-gnueabihf'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Run
|
||||||
|
handlers.get(options.mode)();
|
||||||
|
|
||||||
|
// Install Packages
|
||||||
|
run(['apt-get', 'install', '--no-install-recommends', '-y', ...packages]);
|
@ -1,109 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Don't Use Sudo When Running As Root
|
|
||||||
if [ "$(id -u)" -eq 0 ]; then
|
|
||||||
sudo() {
|
|
||||||
"$@"
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Setup Backports
|
|
||||||
CODENAME="$(. /etc/os-release && echo "${VERSION_CODENAME}")"
|
|
||||||
BACKPORTS=''
|
|
||||||
if [ "${CODENAME}" = 'bullseye' ]; then
|
|
||||||
BACKPORTS="${CODENAME}-backports"
|
|
||||||
echo "deb http://deb.debian.org/debian ${BACKPORTS} main" | sudo tee "/etc/apt/sources.list.d/${BACKPORTS}.list" > /dev/null
|
|
||||||
BACKPORTS="/${BACKPORTS}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Variables
|
|
||||||
MODE="$1"
|
|
||||||
ARCH="$(echo "$2" | tr '[:upper:]' '[:lower:]')"
|
|
||||||
|
|
||||||
# Add ARM Repository
|
|
||||||
sudo dpkg --add-architecture "${ARCH}"
|
|
||||||
|
|
||||||
# Update APT
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get dist-upgrade -y
|
|
||||||
|
|
||||||
# Run APT
|
|
||||||
install_pkg() {
|
|
||||||
sudo apt-get install --no-install-recommends -y "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Build Dependencies
|
|
||||||
run_build() {
|
|
||||||
install_pkg \
|
|
||||||
`# Build System` \
|
|
||||||
git \
|
|
||||||
"cmake${BACKPORTS}" \
|
|
||||||
ninja-build \
|
|
||||||
python3 \
|
|
||||||
python3-venv \
|
|
||||||
"python3-tomli${BACKPORTS}" \
|
|
||||||
`# Host Dependencies Needed For Compile` \
|
|
||||||
libwayland-bin \
|
|
||||||
`# Compiler` \
|
|
||||||
"crossbuild-essential-$1" \
|
|
||||||
`# Main Dependencies` \
|
|
||||||
"libopenal-dev:$1" \
|
|
||||||
`# GLFW Dependencies` \
|
|
||||||
"libwayland-dev:$1" \
|
|
||||||
"libxkbcommon-dev:$1" \
|
|
||||||
"libx11-dev:$1" \
|
|
||||||
"libxcursor-dev:$1" \
|
|
||||||
"libxi-dev:$1" \
|
|
||||||
"libxinerama-dev:$1" \
|
|
||||||
"libxrandr-dev:$1" \
|
|
||||||
"libxext-dev:$1" \
|
|
||||||
`# QEMU Dependencies` \
|
|
||||||
"libglib2.0-dev:$1" \
|
|
||||||
`# AppImage` \
|
|
||||||
appstream \
|
|
||||||
zsync
|
|
||||||
|
|
||||||
# Install appimagetool
|
|
||||||
sudo rm -rf /opt/squashfs-root /opt/appimagetool /usr/local/bin/appimagetool
|
|
||||||
case "$(dpkg --print-architecture)" in
|
|
||||||
'armhf') APPIMAGE_ARCH='armhf';;
|
|
||||||
'arm64') APPIMAGE_ARCH='aarch64';;
|
|
||||||
'amd64') APPIMAGE_ARCH='x86_64';;
|
|
||||||
esac
|
|
||||||
sudo mkdir -p /opt
|
|
||||||
sudo wget -O /opt/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-${APPIMAGE_ARCH}.AppImage"
|
|
||||||
sudo chmod +x /opt/appimagetool
|
|
||||||
# Workaround AppImage Issues With Docker
|
|
||||||
sudo ./scripts/fix-appimage-for-docker.sh /opt/appimagetool
|
|
||||||
# Extract
|
|
||||||
cd /opt
|
|
||||||
sudo ./appimagetool --appimage-extract > /dev/null
|
|
||||||
sudo rm -f ./appimagetool
|
|
||||||
# Link
|
|
||||||
sudo mv ./squashfs-root ./appimagetool
|
|
||||||
printf '#!/bin/sh\nexec /opt/appimagetool/AppRun "$@"\n' | sudo tee /usr/local/bin/appimagetool > /dev/null
|
|
||||||
sudo chmod +x /usr/local/bin/appimagetool
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test Dependencies
|
|
||||||
run_test() {
|
|
||||||
install_pkg \
|
|
||||||
"libc6:$1" \
|
|
||||||
"libstdc++6:$1" \
|
|
||||||
"libopenal1:$1" \
|
|
||||||
"libglib2.0-0:$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Example Mods Dependencies
|
|
||||||
run_example_mods() {
|
|
||||||
install_pkg \
|
|
||||||
cmake \
|
|
||||||
ninja-build \
|
|
||||||
g++-arm-linux-gnueabihf \
|
|
||||||
gcc-arm-linux-gnueabihf
|
|
||||||
}
|
|
||||||
|
|
||||||
# Install Packages
|
|
||||||
"run_${MODE}" "${ARCH}"
|
|
@ -36,7 +36,7 @@ function formatFlag(name) {
|
|||||||
return '--' + name;
|
return '--' + name;
|
||||||
}
|
}
|
||||||
function formatOptionalArg(arg) {
|
function formatOptionalArg(arg) {
|
||||||
return '[' + arg + '] ';;
|
return '[' + arg + '] ';
|
||||||
}
|
}
|
||||||
export function parseOptions(positionalArgs, flags, customHandler) {
|
export function parseOptions(positionalArgs, flags, customHandler) {
|
||||||
// Usage Text
|
// Usage Text
|
||||||
@ -52,7 +52,9 @@ export function parseOptions(positionalArgs, flags, customHandler) {
|
|||||||
for (const flag of flags) {
|
for (const flag of flags) {
|
||||||
usage += formatOptionalArg(formatFlag(flag));
|
usage += formatOptionalArg(formatFlag(flag));
|
||||||
}
|
}
|
||||||
|
if (customHandler) {
|
||||||
usage += formatOptionalArg(customHandler(null));
|
usage += formatOptionalArg(customHandler(null));
|
||||||
|
}
|
||||||
usage = usage.trim();
|
usage = usage.trim();
|
||||||
|
|
||||||
// Copy Arguments
|
// Copy Arguments
|
||||||
@ -81,7 +83,7 @@ export function parseOptions(positionalArgs, flags, customHandler) {
|
|||||||
|
|
||||||
// Unknown Arguments
|
// Unknown Arguments
|
||||||
for (const arg of args) {
|
for (const arg of args) {
|
||||||
if (!customHandler(arg)) {
|
if (!customHandler || !customHandler(arg)) {
|
||||||
fail(usage);
|
fail(usage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
import * as child_process from 'node:child_process';
|
import * as child_process from 'node:child_process';
|
||||||
|
import * as fs from 'node:fs';
|
||||||
|
import * as path from 'node:path';
|
||||||
|
import * as url from 'node:url';
|
||||||
|
|
||||||
// Logging
|
// Logging
|
||||||
const EXIT_FAILURE = 1;
|
const EXIT_FAILURE = 1;
|
||||||
@ -22,3 +25,36 @@ export function run(command) {
|
|||||||
err(e);
|
err(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create Directory
|
||||||
|
export function createDir(dir, clean) {
|
||||||
|
if (clean) {
|
||||||
|
fs.rmSync(dir, {recursive: true, force: true});
|
||||||
|
}
|
||||||
|
fs.mkdirSync(dir, {recursive: true});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get System Information
|
||||||
|
export function getDebianVersion() {
|
||||||
|
const info = fs.readFileSync('/etc/os-release', 'utf8');
|
||||||
|
const lines = info.split('\n');
|
||||||
|
const prefix = 'VERSION_CODENAME=';
|
||||||
|
for (const line of lines) {
|
||||||
|
if (line.startsWith(prefix)) {
|
||||||
|
return line.substring(prefix.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 'unknown';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make File Executable
|
||||||
|
export function makeExecutable(path) {
|
||||||
|
fs.chmodSync(path, 0o755);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Scripts Directory
|
||||||
|
export function getScriptsDir() {
|
||||||
|
const __filename = url.fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = path.dirname(__filename);
|
||||||
|
return path.join(__dirname, '..');
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user