musllvm

musl and LLVM cross-toolchain build system
git clone https://git.daat.foo/repos/musllvm.git
Log | Files | Refs | README | LICENSE

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