kit_freebsd.sh (4378B)
1 #!/usr/bin/env bash 2 # scripts/kit_freebsd.sh — cross-compile the kit binary for FreeBSD. 3 # 4 # Builds kit for a FreeBSD target arch using the sysroot from 5 # scripts/freebsd_sysroot.sh and the host clang/lld cross-compilation 6 # toolchain. Outputs to build/kit-freebsd-<arch>/kit. 7 # 8 # usage: 9 # scripts/kit_freebsd.sh [arch] build (default arch: aarch64) 10 # scripts/kit_freebsd.sh run [arch] build then run in the FreeBSD VM 11 # scripts/kit_freebsd.sh scp [arch] scp the binary to the running VM 12 # 13 # arches: aarch64|arm64|aa64 amd64|x64 riscv64|rv64 14 # 15 # env: 16 # KIT_FREEBSD_RELEASE (default: 15.0-RELEASE) 17 # LLVM_AR path to llvm-ar (default: llvm-ar) 18 # JOBS make -j value (default: nproc) 19 20 set -eu 21 22 ROOT="$(cd "$(dirname "$0")/.." && pwd)" 23 RELEASE_TAG="${KIT_FREEBSD_RELEASE:-15.0-RELEASE}" 24 LLVM_AR="${LLVM_AR:-llvm-ar}" 25 JOBS="${JOBS:-$(sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 4)}" 26 27 die() { printf 'kit_freebsd: %s\n' "$*" >&2; exit 1; } 28 29 canon_arch() { 30 case "${1:-}" in 31 aarch64|arm64|aa64) echo aarch64 ;; 32 amd64|x64|x86_64) echo x86_64 ;; 33 riscv64|rv64) echo riscv64 ;; 34 *) die "unknown arch '${1:-}' (want aarch64|amd64|riscv64)" ;; 35 esac 36 } 37 38 # FreeBSD triple — clang accepts aarch64-unknown-freebsd15.0 etc. 39 clang_triple() { 40 local ver="${RELEASE_TAG%%-*}" major="${RELEASE_TAG%%.0*}" 41 major="${major%%-*}" 42 case "$(canon_arch "$1")" in 43 aarch64) echo "aarch64-unknown-freebsd${major}" ;; 44 x86_64) echo "x86_64-unknown-freebsd${major}" ;; 45 riscv64) echo "riscv64-unknown-freebsd${major}" ;; 46 esac 47 } 48 49 # mk/env.mk HOST_UNAME and HOST_ARCH_RAW overrides 50 make_host_uname() { echo FreeBSD; } 51 make_host_arch_raw() { 52 case "$(canon_arch "$1")" in 53 aarch64) echo aarch64 ;; 54 x86_64) echo amd64 ;; 55 riscv64) echo riscv64 ;; 56 esac 57 } 58 59 cmd="${1:-aarch64}" 60 case "$cmd" in 61 run|scp) arch="${2:-aarch64}"; do_run="$cmd" ;; 62 *) arch="$cmd"; do_run="" ;; 63 esac 64 arch="$(canon_arch "$arch")" 65 triple="$(clang_triple "$arch")" 66 sysroot="$("$ROOT/scripts/freebsd_sysroot.sh" path "$arch" 2>/dev/null)" 67 [ -f "$sysroot/usr/lib/libc.a" ] || { 68 printf 'sysroot missing; running: scripts/freebsd_sysroot.sh %s\n' "$arch" >&2 69 "$ROOT/scripts/freebsd_sysroot.sh" "$arch" 70 sysroot="$("$ROOT/scripts/freebsd_sysroot.sh" path "$arch" 2>/dev/null)" 71 } 72 build_dir="$ROOT/build/kit-freebsd-$arch" 73 74 printf 'cross-compile kit for %s (%s) -> %s/kit\n' "$arch" "$triple" "$build_dir" >&2 75 76 # GNU make splits CC on whitespace before parsing, so a CC with spaces can't 77 # be passed on the command line directly. Write a small wrapper script and 78 # pass that as CC instead. 79 mkdir -p "$build_dir" 80 cc_wrapper="$build_dir/cross_cc" 81 cat > "$cc_wrapper" << 'WRAPPER_EOF' 82 #!/usr/bin/env bash 83 # Cross-compile wrapper: --target and --sysroot always; -fuse-ld=lld only 84 # when linking (i.e. when -c / -E / -S / --precompile is NOT in the args). 85 WRAPPER_TRIPLE="__TRIPLE__" 86 WRAPPER_SYSROOT="__SYSROOT__" 87 linking=1 88 for a in "$@"; do 89 case "$a" in -c|-E|-S|--precompile) linking=0; break ;; esac 90 done 91 extra="" 92 [ "$linking" -eq 1 ] && extra="-fuse-ld=lld" 93 # shellcheck disable=SC2086 94 exec clang --target="$WRAPPER_TRIPLE" --sysroot="$WRAPPER_SYSROOT" $extra "$@" 95 WRAPPER_EOF 96 # Substitute the placeholders (no spaces in sysroot/triple so sed is safe) 97 sed -i "s|__TRIPLE__|$triple|g; s|__SYSROOT__|$sysroot|g" "$cc_wrapper" 98 chmod +x "$cc_wrapper" 99 100 host_uname="$(make_host_uname)" 101 host_arch_raw="$(make_host_arch_raw "$arch")" 102 103 make -C "$ROOT" bin -j"$JOBS" \ 104 CC="$cc_wrapper" \ 105 AR="$LLVM_AR" \ 106 HOST_UNAME="$host_uname" \ 107 HOST_ARCH_RAW="$host_arch_raw" \ 108 BUILD_DIR="$build_dir" \ 109 RELEASE=1 110 111 out="$build_dir/kit" 112 printf 'built: %s\n' "$out" >&2 113 file "$out" >&2 114 115 if [ -z "$do_run" ]; then 116 exit 0 117 fi 118 119 # VM arch tag for freebsd_vm.sh 120 vm_arch() { 121 case "$(canon_arch "$1")" in 122 aarch64) echo aarch64 ;; 123 x86_64) echo amd64 ;; 124 riscv64) echo riscv64 ;; 125 esac 126 } 127 vm_tag="$(vm_arch "$arch")" 128 129 case "$do_run" in 130 scp) 131 printf 'copying to VM...\n' >&2 132 "$ROOT/scripts/freebsd_vm.sh" scp "$vm_tag" "$out" /home/kit/kit 133 printf 'done\n' >&2 134 ;; 135 run) 136 printf 'copying and running in VM...\n' >&2 137 "$ROOT/scripts/freebsd_vm.sh" scp "$vm_tag" "$out" /home/kit/kit 138 "$ROOT/scripts/freebsd_vm.sh" ssh "$vm_tag" '/home/kit/kit version 2>&1 || true' 139 ;; 140 esac