# 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) and # 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). 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; 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" compPin="$compCommit:$buildtoolsCommit" hostTools="bfs_shell package" 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" 'bfs_shell' 'package') 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() { [ -x "$compDir/bin/bfs_shell" ] && [ -x "$compDir/bin/package" ] && [ -x "$compDir/libexec/bfs_shell" ] && [ -x "$compDir/libexec/package" ] && [ -d "$compDir/attributes" ] } # Make a small BFS volume, write a file onto it and read it back; package # starts. (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 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)" rm -rf "$tmp" [[ "$readBack" == *JoeyLib* && "$usage" == *"Usage: package"* ]] } compEnv() { envVar HAIKU_TOOLS "$compDir/bin" }