pthbs

Packaging Through Hashed Build Scripts
git clone https://ccx.te2000.cz/git/pthbs
Log | Files | Refs | Submodules | README

pthbs-build (5901B)


      1 #!/bin/sh
      2 if test -n "$pthbs_xtrace"; then
      3 	set -x
      4 	if test -n "$BB_ASH_VERSION"; then PS4="+${0##*/}"':${FUNCNAME}:${LINENO} '; fi
      5 fi
      6 bsh=$(sha256sum $1) || exit $?
      7 bsh=${bsh%% *}
      8 if test -z "$pthbs_workdir"; then
      9     printf '%s\n' >&2 "$0: fatal: pthbs_workdir env var undefined or empty"
     10     exit 100
     11 fi
     12 if test -z "$pthbs_versions"; then
     13     printf '%s\n' >&2 "$0: fatal: pthbs_versions env var undefined or empty"
     14     exit 100
     15 fi
     16 if test -z "$pthbs_pkgdir"; then
     17     printf '%s\n' >&2 "$0: fatal: pthbs_pkgdir env var undefined or empty"
     18     exit 100
     19 fi
     20 if test -z "$pthbs_cache"; then
     21     printf '%s\n' >&2 "$0: fatal: pthbs_cache env var undefined or empty"
     22     exit 100
     23 fi
     24 if test -z "$pthbs_source"; then
     25     printf '%s\n' >&2 "$0: fatal: pthbs_source env var undefined or empty"
     26     exit 100
     27 fi
     28 
     29 mkdir -p "$pthbs_workdir/builddir.$$" || exit $?
     30 workdir=$(realpath "$pthbs_workdir/builddir.$$")
     31 if ! test -d "$workdir"; then
     32 	printf '%s\n' "Error: could not determine workdir"
     33 	exit 1
     34 fi
     35 
     36 script=$(realpath "$1")
     37 if ! test -f "$script"; then
     38 	printf '%s\n' "Error: could not determine script path"
     39 	exit 1
     40 fi
     41 
     42 pthbs_package=${1##*/}
     43 pthbs_package=${pthbs_package%%:*}.$bsh
     44 
     45 printf "BUILDING %s => %s => %s\n" "$1" "$workdir" "$pthbs_package"
     46 
     47 eval "$(
     48     awk '
     49 BEGIN {
     50 	settings["sandbox"] = 1
     51 	settings["set_path"] = 1
     52 	settings["fail_digest"] = 1
     53 	FS=":"
     54 }
     55 function fatal(msg) {
     56 	printf "FATAL: pthbs-build (eval): %s %s:%d: \"%s\"\n", msg, FILENAME, FNR, $0 >"/dev/stderr"
     57 	exit 1
     58 }
     59 /^#@pragma:/ {
     60 	if($2 == "nosandbox") {
     61 		settings["sandbox"] = 0
     62 	} else if($2 == "nopath") {
     63 		settings["set_path"] = 0
     64 	} else if($2 == "nofail_digest") {
     65 		settings["fail_digest"] = 0
     66 	} else {
     67 		fatal("unrecognized @pragma:")
     68 	}
     69 }
     70 /^$/ { nextfile }
     71 END {
     72 	print "setting_sandbox=" (settings["sandbox"]?"true":"false")
     73 	print "setting_set_path=" (settings["set_path"]?"true":"false")
     74 	print "setting_fail_digest=" (settings["fail_digest"]?"true":"false")
     75 	print "setting_ok=true"
     76 }
     77 ' "$1" )"
     78 
     79 if test true != "$setting_ok"; then
     80     printf '%s\n' >&2 "$0: fatal: could not extract information from '$1'"
     81     exit 111
     82 fi
     83 
     84 if test -f "$pthbs_cache/make/package.sha256.${bsh}.env"; then
     85 	envfile="$pthbs_cache/make/package.sha256.${bsh}.env"
     86 	envhash=$(pthbs-getenvhash "$envfile") || exit $?
     87 	export pthbs_build_environment=$pthbs_versions/env.$envhash
     88 	if $setting_set_path; then
     89 		if ! test -x "$pthbs_build_environment/command/pthbs-enter"; then
     90 		  printf >&2 "Error: %s does not exist!" "$pthbs_build_environment/command/pthbs-enter"
     91 		  exit 1
     92 		fi
     93 	fi
     94 fi
     95 
     96 mkdir -p "$workdir"
     97 case $(id -u) in
     98 	(0)
     99 		export pthbs_uid=$(id -u pthbs) || exit $?
    100 		export pthbs_gid=$(id -g pthbs) || exit $?
    101 		export pthbs_install_uid=0 || exit $?
    102 		export pthbs_install_gid=$pthbs_gid || exit $?
    103 		sandbox_mode=rootns
    104 		;;
    105 	(*)
    106 		if which syd-lock 2>/dev/null 1>&2; then
    107 			sandbox_mode=landlock
    108 		else
    109 			sandbox_mode=userns
    110 		fi
    111 		;;
    112 esac
    113 case "$pthbs_sandbox" in
    114 	(*:*)
    115 		sandbox_cmd=${pthbs_sandbox#*:}
    116 		pthbs_sandbox=${pthbs_sandbox%%:*}
    117 		;;
    118 esac
    119 case "$pthbs_sandbox" in
    120 	(syd-lock)
    121 	(landlock)
    122 		sandbox_mode=landlock;;
    123 	(root)
    124 	(rootns)
    125 		sandbox_mode=rootns;;
    126 	(user)
    127 	(userns)
    128 		sandbox_mode=userns;;
    129 	(generic)
    130 		sandbox_mode=generic;;
    131 	('')
    132 		if test -n "$sandbox_cmd"; then
    133 			printf '%s\n' >&2 "$0: fatal: pthbs_sandbox defines command but no mode"
    134 			exit 100
    135 		fi
    136 		;;
    137 	(*)
    138 		printf '%s\n' >&2 "$0: fatal: unrecognized sandbox mode in pthbs_sandbox: '$pthbs_sandbox'"
    139 		exit 100
    140 		;;
    141 esac
    142 
    143 env \
    144     workdir="$workdir" \
    145     script="$script" \
    146     envdir="$pthbs_build_environment" \
    147     sandbox_cmd="$sandbox_cmd" \
    148     awk -v sandbox_mode="$sandbox_mode" -f "$pthbs_source/command/pthbs-setup-gen.awk" >"$workdir/pthbs-setup" "$1" || exit $?
    149 
    150 if test -z "$JOBS"; then
    151 	JOBS=$(nproc)
    152 	if test -z "$JOBS"; then
    153 		JOBS=$(grep -ce '^processor' /proc/cpuinfo)
    154 		if test -z "$JOBS"; then
    155 			JOBS=1
    156 		fi
    157 	fi
    158 fi
    159 
    160 logdir=$pthbs_workdir/logs/$(date '+%Y-%m-%d-%H%M%S')-$pthbs_package
    161 ret=0
    162 fail_reason=
    163 if test -n "$pthbs_xtrace"; then pthbs_xtrace=-x; set -x; fi
    164 trap 'trap - INT' INT
    165 if env -i \
    166    PATH="$PATH" \
    167    JOBS="$JOBS" \
    168    pthbs_script="$script" \
    169    pthbs_destdir="$workdir/destdir" \
    170    pthbs_package="$pthbs_package" \
    171    pthbs_xtrace="$pthbs_xtrace" \
    172    sh $pthbs_xtrace -e "$workdir/pthbs-setup" </dev/null; then
    173 	if test -f "$workdir/destdir/${pthbs_versions%/}/$pthbs_package/.install-links"; then
    174 		trap - INT
    175 		printf "BUILD SUCCESFUL :: %s :: %s\n" "$pthbs_package" "logs/${logdir##*/}"
    176 		if ! pthbs-install "$workdir/destdir" "$pthbs_package"; then
    177 			ret=1
    178 			echo "INSTALL FAILED"
    179 		fi
    180 	else
    181 		fail_reason="no '.install-links' file'"
    182 	fi
    183 else
    184 	ret=$?
    185 	fail_reason="exitcode $ret"
    186 fi
    187 
    188 if test -n "$fail_reason"; then
    189 	trap - INT
    190 	if test -n "$pthbs_fail_log_cmd"; then
    191 		$pthbs_fail_log_cmd "$workdir/build.log"
    192 	elif test exitcode = "${fail_reason%% *}"; then
    193 		printf "Errors found in log:\n"
    194 		grep -C 1 -Eie '(error|fatal)[: ]' "$workdir/build.log"
    195 	fi
    196 	printf "BUILD FAILED: %s :: %s :: %s :: %s\n" "$fail_reason" "$1" "$workdir" "$logdir"
    197 	mkdir -p "$logdir"
    198 	rm -v "$(dirname "$logdir")/last_failed_build"
    199 	ln -v -s -f "$(basename "$logdir")" "$(dirname "$logdir")/last_failed_build"
    200 	find "$workdir" -name config.log -exec pthbs-copy-to-logdir "$logdir" '{}'  \;
    201 	$setting_fail_digest && pthbs-digest-tree >"$logdir/workdir-digest" "$workdir"
    202 fi
    203 
    204 mkdir -p "$logdir"
    205 
    206 if test -e "$workdir/build.log"; then
    207 	mv "$workdir/build.log" "$logdir/log"
    208 	bzip2 "$logdir/log"
    209 fi
    210 
    211 if test -e "$workdir/syd.log"; then
    212 	mv "$workdir/syd.log" "$logdir/syd.log"
    213 	bzip2 "$logdir/syd.log"
    214 fi
    215 
    216 if test -e "$workdir/pthbs-setup"; then
    217 	mv "$workdir/pthbs-setup" "$logdir/"
    218 fi
    219 
    220 if test -n "$pthbs_build_environment"; then
    221 	ln -s "$pthbs_build_environment" "$logdir/env"
    222 fi
    223 
    224 if test -z "$pthbs_skip_cleanup"; then
    225 	chmod -R u+wX "$workdir" || ret=$?
    226 	rm -rf "$workdir" || ret=$?
    227 fi
    228 exit $ret