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