kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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