config.sh (4197B)
1 #!/bin/sh 2 3 die() 4 { 5 printf 'musllvm: %s\n' "$*" >&2 6 exit 1 7 } 8 9 need() 10 { 11 command -v "$1" >/dev/null 2>&1 || die "required program not found: $1" 12 } 13 14 absolute_path() 15 { 16 case "$1" in 17 /*) printf '%s\n' "$1" ;; 18 *) printf '%s/%s\n' "$PROOT" "$1" ;; 19 esac 20 } 21 22 validate_directory() 23 { 24 case "$1" in 25 *[!a-zA-Z0-9_./-]*) die "build paths must use letters, digits, slashes, dots, underscores or hyphens: $1" ;; 26 esac 27 case "$1" in 28 /|/usr|/usr/local|/bin|/lib|/lib64|/etc|/home|/tmp|"$PROOT") 29 die "choose a dedicated directory, not $1" ;; 30 */../*|*/..|*/./*|*/.|*/) 31 die "directory must have no dot components or trailing slash: $1" ;; 32 esac 33 } 34 35 source_info() 36 { 37 source_line=$(awk -v component="$1" '$1 == component { print; count++ } END { if (count != 1) exit 1 }' "$SOURCES_FILE") || 38 die "expected one $1 entry in $SOURCES_FILE" 39 read -r component archive digest url extra <<EOF 40 $source_line 41 EOF 42 case "$archive" in 43 *[!a-zA-Z0-9._-]*|'') die "invalid archive name: $archive" ;; 44 esac 45 case "$digest" in 46 *[!a-f0-9]*|'') die "invalid SHA-256 for $archive" ;; 47 esac 48 [ "${#digest}" -eq 64 ] && [ -z "$extra" ] || die "invalid source entry for $component" 49 case "$url" in 50 https://*) ;; 51 *) die "source URL must use HTTPS: $url" ;; 52 esac 53 source_name=${archive%.tar.*} 54 } 55 56 archive_ok() 57 { 58 [ -f "$SOURCES_DIR/$archive" ] || return 1 59 actual_digest=$(sha256sum "$SOURCES_DIR/$archive") || return 1 60 [ "${actual_digest%% *}" = "$digest" ] 61 } 62 63 extract_source() 64 { 65 source_info "$1" 66 archive_ok || die "missing or corrupt $archive; run make pull" 67 source_path="$PROOT/build/src/$source_name" 68 if [ -f "$source_path/.musllvm-source" ]; then 69 [ "$(cat "$source_path/.musllvm-source")" = "$digest" ] || die "source digest changed: $source_path" 70 return 71 fi 72 [ ! -e "$source_path" ] || die "incomplete source directory: $source_path" 73 mkdir -p "$PROOT/build/src" 74 source_lock="$source_path.lock" 75 ( 76 mkdir "$source_lock" 2>/dev/null || die "source is being extracted: $source_name" 77 trap 'rm -rf "$source_lock"' 0 78 trap 'exit 1' HUP INT TERM 79 source_tmp="$source_lock/tree" 80 mkdir "$source_tmp" 81 printf 'Extracting %s\n' "$archive" 82 tar -xf "$SOURCES_DIR/$archive" --strip-components=1 -C "$source_tmp" || die "could not extract $archive" 83 printf '%s\n' "$digest" > "$source_tmp/.musllvm-source" 84 mv "$source_tmp" "$source_path" 85 ) 86 } 87 88 PROOT=$(CDPATH= cd "$(dirname "$0")/.." && pwd -P) 89 ARCH=${ARCH:-x86_64} 90 TARGET=${TARGET:-$ARCH-linux-musl} 91 case "$ARCH" in 92 x86_64) KERNEL_ARCH=x86; ELF_MACHINE='Advanced Micro Devices X86-64' ;; 93 aarch64) KERNEL_ARCH=arm64; ELF_MACHINE='AArch64' ;; 94 *) die "unsupported ARCH=$ARCH; choose x86_64 or aarch64" ;; 95 esac 96 case "$TARGET" in 97 "$ARCH-linux-musl"|"$ARCH-unknown-linux-musl") ;; 98 *) die "TARGET=$TARGET does not match ARCH=$ARCH and the musl ABI" ;; 99 esac 100 LLVM_MODE=${LLVM_MODE:-system} 101 case "$LLVM_MODE" in 102 system|source) ;; 103 *) die "LLVM_MODE must be system or source" ;; 104 esac 105 JOBS=${JOBS:-2} 106 LINK_JOBS=${LINK_JOBS:-1} 107 for jobs in "$JOBS" "$LINK_JOBS"; do 108 case "$jobs" in 109 *[!0-9]*|'') die "JOBS and LINK_JOBS must be positive integers" ;; 110 esac 111 [ "$jobs" -gt 0 ] 2>/dev/null || die "JOBS and LINK_JOBS must be positive integers" 112 done 113 PREFIX=$(absolute_path "${PREFIX:-build/$TARGET}") 114 BUILD_DIR=$(absolute_path "${BUILD_DIR:-build/work/$TARGET}") 115 SOURCES_DIR=$(absolute_path "${SOURCES_DIR:-sources}") 116 SOURCES_FILE=$(absolute_path "${SOURCES_FILE:-sources.list}") 117 validate_directory "$PREFIX" 118 validate_directory "$BUILD_DIR" 119 validate_directory "$SOURCES_DIR" 120 case "$PROOT" in 121 *[!a-zA-Z0-9_./-]*) die "move the checkout to a path without whitespace or shell metacharacters" ;; 122 esac 123 case "$PREFIX/" in 124 "$BUILD_DIR/"*) die "PREFIX must be separate from BUILD_DIR" ;; 125 esac 126 case "$BUILD_DIR/" in 127 "$PREFIX/"*) die "BUILD_DIR must be separate from PREFIX" ;; 128 esac 129 SYSROOT="$PREFIX/sysroot" 130 HOST_CC=${HOST_CC:-clang} 131 HOST_CXX=${HOST_CXX:-clang++} 132 TARGET_CFLAGS=${TARGET_CFLAGS:--O2} 133 HOST_CFLAGS=${HOST_CFLAGS:-} 134 HOST_CXXFLAGS=${HOST_CXXFLAGS:-} 135 HOST_LDFLAGS=${HOST_LDFLAGS:-} 136 RUNNER=${RUNNER:-} 137 export PROOT ARCH TARGET PREFIX BUILD_DIR SOURCES_DIR SOURCES_FILE LLVM_MODE JOBS LINK_JOBS 138 export HOST_CC HOST_CXX TARGET_CFLAGS HOST_CFLAGS HOST_CXXFLAGS HOST_LDFLAGS RUNNER