diff options
Diffstat (limited to 'include/init.sh')
-rw-r--r-- | include/init.sh | 265 |
1 files changed, 115 insertions, 150 deletions
diff --git a/include/init.sh b/include/init.sh index 1b8432ce..bc5a62b6 100644 --- a/include/init.sh +++ b/include/init.sh @@ -12,81 +12,126 @@ projectsite="https://libreboot.org/" [ -z "${PATH+x}" ] && \ export PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" -xbmkpath="$PATH" - -err="err_" - -setvars() -{ - _setvars="" - if [ $# -lt 2 ]; then - printf "\$err \"setvars: too few args\\n\"" - return 0 - fi - val="$1" - shift 1 - for var in "$@"; do - _setvars="$var=\"$val\"; $_setvars" - done - printf "%s\n" "${_setvars% }" -} - -err_() -{ - printf "ERROR %s: %s\n" "$0" "$1" 1>&2 - exit 1 -} eval "`setvars "" _nogit board reinstall versiondate aur_notice configdir \ - datadir version xbmkpwd relname xbmkpwd xbmktmp python pyver`" + datadir version xbmkpwd relname xbmkpwd xbtmp python pyver xbloc \ + xbmklock cvxbmk cvchk xbmkpath`" xbmk_init() { - xbmkpwd="`pwd`" || $err "Cannot generate PWD" + xbmkpwd="`pwd`" || err "Cannot generate PWD" + xbloc="$xbmkpwd/tmp" + xbmklock="$xbmkpwd/lock" + export PWD="$xbmkpwd" - if [ $# -gt 0 ] && [ "$1" = "dependencies" ]; then - install_packages "$@" || exit 1 - exit 0 - fi + [ $# -gt 0 ] && [ "$1" = "dependencies" ] && x_ xbmkpkg "$@" && exit 0 - id -u 1>/dev/null 2>/dev/null || $err "suid check failed (id -u)" - [ "$(id -u)" != "0" ] || $err "this command as root is not permitted" + id -u 1>/dev/null 2>/dev/null || err "suid check failed (id -u)" + [ "$(id -u)" != "0" ] || err "this command as root is not permitted" - for init_cmd in set_pyver set_env set_version git_init create_tmpdir \ - lock create_pathdirs child_exec; do + for init_cmd in get_version set_env set_threads git_init child_exec; do xbmk_$init_cmd "$@" || break done } -install_packages() +xbmkpkg() { - [ $# -lt 2 ] && $err "fewer than two arguments" + [ $# -lt 2 ] && err "fewer than two arguments" [ $# -gt 2 ] && reinstall="$3" eval "`setcfg "config/dependencies/$2"`" chkvars pkg_add pkglist - $pkg_add $pkglist || $err "Cannot install packages" + x_ $pkg_add $pkglist [ -n "$aur_notice" ] && \ printf "You need AUR packages: %s\n" "$aur_notice" 1>&2; : } -setcfg() +xbmk_get_version() +{ + [ ! -f ".version" ] || read -r version < ".version" || err + [ ! -f ".versiondate" ] || read -r versiondate < ".versiondate" || err + [ ! -f ".version" ] || chkvars version + [ ! -f ".versiondate" ] || chkvars versiondate + + [ ! -e ".git" ] && [ ! -f ".version" ] && version="unknown" + [ ! -e ".git" ] && [ ! -f ".versiondate" ] && versiondate="1716415872" + + [ -n "$version" ] && relname="$projectname-$version"; : +} + +xbmk_set_env() +{ + is_child="n" + + xbmkpath="$PATH" + + # unify all temporary files/directories in a single TMPDIR + [ -z "${TMPDIR+x}" ] || [ "${TMPDIR%_*}" = "/tmp/xbmk" ] || \ + unset TMPDIR + [ -n "${TMPDIR+x}" ] && export TMPDIR="$TMPDIR" && xbtmp="$TMPDIR" + [ -z "${TMPDIR+x}" ] || is_child="y" # child instance, so return + + if [ "$is_child" = "y" ]; then + [ -z "${XBMK_CACHE+x}" ] && err "XBMK_CACHE unset on child" + [ -z "${XBMK_THREADS+x}" ] && xbmk_set_threads + e "lock" f missing && err "lock file absent on child" + return 1 + fi + + [ -f "$xbmklock" ] && err "'$xbmklock' exists. Is a build running?" + touch "$xbmklock" || err "cannot create '$xbmklock'"; : + + # parent instance of xbmk, so don't return. set up TMPDIR + export TMPDIR="/tmp" + export TMPDIR="$(mktemp -d -t xbmk_XXXXXXXX)" + xbtmp="$TMPDIR" + + export XBMK_CACHE="$xbmkpwd/cache" + [ -L "$XBMK_CACHE" ] && [ "$XBMK_CACHE" = "$xbmkpwd/cache" ] && \ + err "cachedir '$xbmkpwd/cache' is a symlink" + [ ! -e "$XBMK_CACHE" ] || \ + [ -d "$XBMK_CACHE" ] || err "cachedir '$XBMK_CACHE' is a file"; : + + export PATH="$XBMK_CACHE/xbmkpath:$XBMK_CACHE/gnupath:$PATH" + xbmkpath="$PATH" + + # if "y": a coreboot target won't be built if target.cfg says release="n" + # (this is used to exclude certain build targets from releases) + [ -z "${XBMK_RELEASE+x}" ] && export XBMK_RELEASE="n" + [ "$XBMK_RELEASE" = "Y" ] && export XBMK_RELEASE="y" + [ "$XBMK_RELEASE" = "y" ] || export XBMK_RELEASE="n" + + xbmk_set_version + export LOCALVERSION="-$projectname-${version%%-*}" + + remkdir "$xbtmp" "$xbloc" "$XBMK_CACHE/gnupath" "$XBMK_CACHE/xbmkpath" + + xbmk_set_pyver +} + +xbmk_set_threads() { - [ $# -gt 1 ] && printf "e \"%s\" f missing && return %s;\n" "$1" "$2" - [ $# -gt 1 ] || \ - printf "e \"%s\" f not && %s \"Missing config\";\n" "$1" "$err" - printf ". \"%s\" || %s \"Could not read config\";\n" "$1" "$err" + [ -z "${XBMK_THREADS+x}" ] && export XBMK_THREADS=1 + expr "X$XBMK_THREADS" : "X-\{0,1\}[0123456789][0123456789]*$" \ + 1>/dev/null 2>/dev/null || export XBMK_THREADS=1 } -chkvars() +xbmk_set_version() { - for var in "$@"; do - eval "[ -n \"\${$var+x}\" ] || \$err \"$var unset\"" - eval "[ -n \"\$$var\" ] || \$err \"$var unset\"" - done; : + version_="$version" + [ ! -e ".git" ] || version="$(git describe --tags HEAD 2>&1)" || \ + version="git-$(git rev-parse HEAD 2>&1)" || version="$version_" + versiondate_="$versiondate" + [ ! -e ".git" ] || versiondate="$(git show --no-patch --no-notes \ + --pretty='%ct' HEAD)" || versiondate="$versiondate_" + + chkvars version versiondate + update_xbmkver "." + + relname="$projectname-$version" } xbmk_set_pyver() @@ -97,13 +142,18 @@ xbmk_set_pyver() pyver="2" && [ "$python" = "python3" ] && pyver="3" pybin "$python" 1>/dev/null || pyver="" [ -z "$pyver" ] || "`pybin "$python"`" -c "$pyv" 1>/dev/null \ - 2>/dev/null || $err "Cannot detect host Python version." - if [ -n "$pyver" ]; then - pyver="$("$(pybin "$python")" -c "$pyv" | awk '{print $1}')" - pyver="${pyver#(}" - pyver="${pyver%,}" - fi - [ "${pyver%%.*}" = "3" ] || $err "Bad python version (must by 3.x)"; : + 2>/dev/null || err "Cannot detect host Python version." + [ -n "$pyver" ] && \ + pyver="$("$(pybin "$python")" -c "$pyv" | awk '{print $1}')" && \ + pyver="${pyver#(}" && pyver="${pyver%,}" + [ "${pyver%%.*}" = "3" ] || err "Bad python version (must by 3.x)" + + ( + # set up python v3.x in PATH, in case it's not set up correctly. + # see code above that detected the correct python3 command. + x_ cd "$XBMK_CACHE/xbmkpath" + x_ ln -s "`pybin "$python"`" python + ) || err "Can't set up python symlink in $XBMK_CACHE/xbmkpath"; : } # Use direct path, to prevent a hang if Python is using a virtual environment, @@ -120,8 +170,7 @@ pybin() # ideally, don't rely on PATH or hardcoded paths if python venv. # use the *real*, direct executable linked to by the venv symlink if [ $venv -gt 0 ] && [ -L "`command -v "$1" 2>/dev/null`" ]; then - # realpath isn't posix, but available mostly universally - pypath="$(realpath \ + pypath="$(findpath \ "$(command -v "$1" 2>/dev/null)" 2>/dev/null || :)" [ -e "$pypath" ] && [ ! -d "$pypath" ] && \ [ -x "$pypath" ] && printf "%s\n" "$pypath" && return 0; : @@ -132,61 +181,20 @@ pybin() [ -e "$pypath/$1" ] && [ ! -d "$pypath/$1" ] && \ [ -x "$pypath/$1" ] && printf "%s/%s\n" "$pypath" "$1" && \ return 0 - done - [ $venv -gt 0 ] && return 1 + done && return 1 # Defer to normal command -v if not a venv command -v "$1" 2>/dev/null || return 1 } -xbmk_set_env() -{ - # XBMK_CACHE is a directory, for caching downloads and git repon - [ -z "${XBMK_CACHE+x}" ] && export XBMK_CACHE="$xbmkpwd/cache" - [ -z "$XBMK_CACHE" ] && export XBMK_CACHE="$xbmkpwd/cache" - [ -L "$XBMK_CACHE" ] && [ "$XBMK_CACHE" = "$xbmkpwd/cache" ] && \ - $err "cachedir '$xbmkpwd/cache' is a symlink" - [ -L "$XBMK_CACHE" ] && export XBMK_CACHE="$xbmkpwd/cache" - [ -f "$XBMK_CACHE" ] && $err "cachedir '$XBMK_CACHE' is a file"; : - - # if "y": a coreboot target won't be built if target.cfg says release="n" - # (this is used to exclude certain build targets from releases) - [ -z "${XBMK_RELEASE+x}" ] && export XBMK_RELEASE="n" - [ "$XBMK_RELEASE" = "y" ] || export XBMK_RELEASE="n" - - [ -z "${XBMK_THREADS+x}" ] && export XBMK_THREADS=1 - expr "X$XBMK_THREADS" : "X-\{0,1\}[0123456789][0123456789]*$" \ - 1>/dev/null 2>/dev/null || export XBMK_THREADS=1; : -} - -xbmk_set_version() -{ - [ ! -f ".version" ] || read -r version < ".version" || :; : - [ ! -f ".versiondate" ] || read -r versiondate < ".versiondate" || :; : - - [ -e ".git" ] || [ -f ".version" ] || printf "unknown\n" > ".version" \ - || $err "Cannot generate unknown .version file" - [ -e ".git" ] || [ -f ".versiondate" ] || printf "1716415872\n" > \ - ".versiondate" || $err "Can't generate unknown versiondate file"; : - - version_="$version" - [ ! -e ".git" ] || version="$(git describe --tags HEAD 2>&1)" || \ - version="git-$(git rev-parse HEAD 2>&1)" || version="$version_" - versiondate_="$versiondate" - [ ! -e ".git" ] || versiondate="$(git show --no-patch --no-notes \ - --pretty='%ct' HEAD)" || versiondate="$versiondate_" - - chkvars version versiondate - printf "%s\n" "$version" > ".version" || $err "can't save version" - printf "%s\n" "$versiondate" > ".versiondate" || $err "can't save date" - - relname="$projectname-$version" - export LOCALVERSION="-$projectname-${version%%-*}" -} - xbmk_git_init() { - [ -L ".git" ] && return 1 + for gitarg in "--global user.name" "--global user.email"; do + gitcmd="git config $gitarg"; $gitcmd 1>/dev/null 2>/dev/null \ + || err "Run this first: $gitcmd \"your ${gitcmd##*.}\"" + done + + [ -L ".git" ] && err "'$xbmkpwd/.git' is a symlink" [ -e ".git" ] && return 0 eval "`setvars "$(date -Rud @$versiondate)" cdate _nogit`" @@ -195,59 +203,16 @@ xbmk_git_init() x_ git commit -m "$projectname $version" --date "$cdate" \ --author="xbmk <xbmk@example.com>" 1>/dev/null 2>/dev/null x_ git tag -a "$version" -m "$projectname $version" 1>/dev/null \ - 2>/dev/null - - for gitarg in "--global user.name" "--global user.email"; do - gitcmd="git config $gitarg"; $gitcmd || $err \ - "Please run this first: $gitcmd \"your ${gitcmd##*.}\"" - done -} - -xbmk_create_tmpdir() -{ - # unify all temporary files/directories in a single TMPDIR - [ -z "${TMPDIR+x}" ] || [ "${TMPDIR%_*}" = "/tmp/xbmk" ] || \ - unset TMPDIR - [ -n "${TMPDIR+x}" ] && export TMPDIR="$TMPDIR" && xbmktmp="$TMPDIR" - [ -z "${TMPDIR+x}" ] || return 1 # child instance, so return - - # parent instance of xbmk, so don't return. set up TMPDIR - export TMPDIR="/tmp" - export TMPDIR="$(mktemp -d -t xbmk_XXXXXXXX)" - xbmktmp="$TMPDIR" -} - -xbmk_lock() -{ - [ -f "lock" ] && $err "$xbmkpwd/lock exists. Is a build running?" - touch lock || $err "cannot create 'lock' file"; : -} - -xbmk_create_pathdirs() -{ - x_ rm -Rf "$XBMK_CACHE/xbmkpath" "$XBMK_CACHE/gnupath" - x_ mkdir -p "$XBMK_CACHE/gnupath" "$XBMK_CACHE/xbmkpath" - export PATH="$XBMK_CACHE/xbmkpath:$XBMK_CACHE/gnupath:$PATH" - ( - # set up python v3.x in PATH, in case it's not set up correctly. - # see code above that detected the correct python3 command. - cd "$XBMK_CACHE/xbmkpath" || $err "can't cd $XBMK_CACHE/xbmkpath" - x_ ln -s "`pybin "$python"`" python - ) || $err "Can't set up python symlink in $XBMK_CACHE/xbmkpath"; : + 2>/dev/null; : } xbmk_child_exec() { xbmk_rval=0 ( x_ ./mk "$@" ) || xbmk_rval=1 - rm -Rf "$xbmktmp" || xbmk_rval=1 - rm -f lock || xbmk_rval=1 + ( x_ rm -Rf "$xbloc" "$xbtmp" ) || xbmk_rval=1 + ( x_ rm -f "$xbmklock" ) || xbmk_rval=1 exit $xbmk_rval } -x_() -{ - [ $# -lt 1 ] || "$@" || $err "Unhandled error for: $(echo "$@")"; : -} - xbmk_init "$@" |