96 lines
4.4 KiB
Bash
96 lines
4.4 KiB
Bash
# shellcheck shell=bash
|
|
# Part of JoeyLib, Copyright (c) 2026 Scott Duensing, under the MIT License.
|
|
# See LICENSE.md for license information.
|
|
# SPDX-License-Identifier: MIT
|
|
#
|
|
# Haiku's own build-host tools, built from the R1/beta6 source: package
|
|
# (unpacks .hpkg packages: the Haiku sysroots are made from them), bfs_shell
|
|
# (reads and writes Be File System volumes: the Haiku VM images get their
|
|
# job runner through it, and the gates hand programs to the VM and take
|
|
# results back on a BFS disk), and xres (adds resources to a Haiku or BeOS
|
|
# executable: make/be.mk gives every program its icons with it). jam, which
|
|
# builds them, comes from Haiku's buildtools at the same release. Installed
|
|
# into toolchains/opt/haikuTools; bin/ holds wrappers that find the tools'
|
|
# libraries.
|
|
|
|
compDescription="haiku: Haiku R1/beta6 host tools (package, bfs_shell, xres; also read BeOS volumes)"
|
|
compGroups="toolchain:haiku toolchain:haiku32 toolchain:beos emulator:haiku emulator:haiku32 emulator:beos"
|
|
compRequires="host"
|
|
compHostDeps="build-tools git python3 zlib-dev zstd-dev bison flex"
|
|
compUrl="https://github.com/haiku/haiku.git"
|
|
compCommit="f6d86031a107e16f4fff6814e9aea20a39450842"
|
|
buildtoolsUrl="https://github.com/haiku/buildtools.git"
|
|
buildtoolsCommit="bfa561e3708c0e2d0155fb403b988ba515c9b16d"
|
|
hostTools="bfs_shell package xres"
|
|
compPin="$compCommit:$buildtoolsCommit:$hostTools"
|
|
|
|
|
|
compInstall() {
|
|
local src
|
|
local objects
|
|
local tool
|
|
src="$(freshBuildDir "$compId")"
|
|
gitFetchCommit "$compUrl" "$compCommit" "$src/haiku"
|
|
# Only jam is wanted from buildtools (the rest is the compilers'
|
|
# sources, gigabytes of them).
|
|
mkdir -p "$src/buildtools"
|
|
git -C "$src/buildtools" init -q
|
|
git -C "$src/buildtools" remote add origin "$buildtoolsUrl"
|
|
git -C "$src/buildtools" fetch -q --depth=1 --filter=blob:none origin "$buildtoolsCommit" || die "could not fetch $buildtoolsCommit from $buildtoolsUrl"
|
|
git -C "$src/buildtools" sparse-checkout set jam
|
|
git -C "$src/buildtools" checkout -q -f --detach FETCH_HEAD
|
|
make -C "$src/buildtools/jam" -j"$JOEY_JOBS"
|
|
mkdir -p "$src/haiku/generated"
|
|
(cd "$src/haiku/generated" && ../configure --host-only)
|
|
# The tools keep the attributes of the host's files (which have none
|
|
# here) in a folder named when they are built: theirs, not the build
|
|
# tree's, which goes.
|
|
(cd "$src/haiku/generated" && PATH="$src/buildtools/jam/bin.linuxx86:$PATH" jam -q -j"$JOEY_JOBS" -sHAIKU_BUILD_ATTRIBUTES_DIR="$compDir/attributes" '<build>bfs_shell' '<build>package' '<build>xres')
|
|
objects="$src/haiku/generated/objects/linux"
|
|
rm -rf "$compDir"
|
|
mkdir -p "$compDir/bin" "$compDir/libexec" "$compDir/lib" "$compDir/attributes"
|
|
cp "$objects"/lib/*.so "$compDir/lib/"
|
|
for tool in $hostTools; do
|
|
cp "$(find "$objects" -type f -name "$tool" -perm -u+x -print -quit)" "$compDir/libexec/$tool"
|
|
printf '#!/bin/sh\n# Haiku build-host tool: its libraries are in ../lib.\ndir="$(cd "$(dirname "$0")/.." && pwd)"\nLD_LIBRARY_PATH="$dir/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" exec "$dir/libexec/%s" "$@"\n' "$tool" > "$compDir/bin/$tool"
|
|
chmod +x "$compDir/bin/$tool"
|
|
done
|
|
dropBuildDir "$compId"
|
|
}
|
|
|
|
|
|
compInstalled() {
|
|
local tool
|
|
for tool in $hostTools; do
|
|
[ -x "$compDir/bin/$tool" ] && [ -x "$compDir/libexec/$tool" ] || return 1
|
|
done
|
|
[ -d "$compDir/attributes" ]
|
|
}
|
|
|
|
|
|
# Make a small BFS volume, write a file onto it and read it back; package
|
|
# and xres start. (Outputs are captured, not piped into grep: under pipefail
|
|
# a tool's own exit status, or SIGPIPE from an early grep, would fail the
|
|
# check.)
|
|
compVerify() {
|
|
local tmp
|
|
local readBack
|
|
local usage
|
|
local xresUsage
|
|
tmp="$(mktemp -d)"
|
|
printf 'JoeyLib\n' > "$tmp/in.txt"
|
|
truncate -s 8M "$tmp/v.img"
|
|
"$compDir/bin/bfs_shell" --initialize "$tmp/v.img" Check > /dev/null 2>&1 || true
|
|
# After a copy, quit reports the volume busy; sync has written it.
|
|
printf 'cp :%s /myfs/in.txt\nsync\nquit\n' "$tmp/in.txt" | "$compDir/bin/bfs_shell" "$tmp/v.img" > /dev/null 2>&1 || true
|
|
readBack="$(printf 'cat /myfs/in.txt\nquit\n' | "$compDir/bin/bfs_shell" "$tmp/v.img" 2>&1 || true)"
|
|
usage="$("$compDir/bin/package" 2>&1 || true)"
|
|
xresUsage="$("$compDir/bin/xres" -h 2>&1 || true)"
|
|
rm -rf "$tmp"
|
|
[[ "$readBack" == *JoeyLib* && "$usage" == *"Usage: package"* && "$xresUsage" == *"Valid commands are"* ]]
|
|
}
|
|
|
|
|
|
compEnv() {
|
|
envVar HAIKU_TOOLS "$compDir/bin"
|
|
}
|