diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/get.sh | 80 | ||||
-rw-r--r-- | include/init.sh | 197 | ||||
-rw-r--r-- | include/inject.sh | 36 | ||||
-rw-r--r-- | include/lib.sh | 32 | ||||
-rw-r--r-- | include/mrc.sh | 25 | ||||
-rw-r--r-- | include/release.sh | 40 | ||||
-rw-r--r-- | include/rom.sh | 88 | ||||
-rw-r--r-- | include/tree.sh | 55 | ||||
-rw-r--r-- | include/vendor.sh | 180 |
9 files changed, 360 insertions, 373 deletions
diff --git a/include/get.sh b/include/get.sh index 74adb6be..4b31c7c9 100644 --- a/include/get.sh +++ b/include/get.sh @@ -5,17 +5,13 @@ eval "`setvars "" loc url bkup_url subcurl subhash subgit subgit_bkup \ depend subcurl_bkup repofail`" -tmpgit="$xbmklocal/gitclone" +tmpgit="$xbloc/gitclone" tmpgitcache="$XBMK_CACHE/tmpgit" fetch_targets() { - e "src/$project/$tree" d && return 0 - - printf "Creating %s tree %s\n" "$project" "$tree" - git_prep "$url" "$bkup_url" "$xbmkpwd/$configdir/$tree/patches" \ - "src/$project/$tree" with_submodules - ( fx_ nuke find "$xbmkpwd/config" -type f -name "nuke.list" ) || exit 1 + [ -d "src/$project/$tree" ] || git_prep "$url" "$bkup_url" \ + "$xbmkpwd/$configdir/$tree/patches" "src/$project/$tree" submod; : } fetch_project() @@ -23,22 +19,17 @@ fetch_project() eval "`setvars "" xtree`" eval "`setcfg "config/git/$project/pkg.cfg"`" - chkvars url - - [ -n "$xtree" ] && x_ ./mk -f coreboot "$xtree" + chkvars url bkup_url && [ -n "$xtree" ] && x_ ./mk -f coreboot "$xtree" [ -z "$depend" ] || for d in $depend ; do - printf "'%s' needs '%s'; grabbing '%s'\n" "$project" "$d" "$d" x_ ./mk -f $d done clone_project - ( fx_ nuke find "$xbmkpwd/config" -type f -name "nuke.list" ) || exit 1 } clone_project() { loc="$XBMK_CACHE/clone/$project" && singletree "$project" && \ loc="src/$project" - printf "Downloading project '%s' to '%s'\n" "$project" "$loc" e "$loc" d missing && remkdir "${tmpgit%/*}" && git_prep \ "$url" "$bkup_url" "$xbmkpwd/config/$project/patches" "$loc"; : @@ -46,11 +37,13 @@ clone_project() git_prep() { + printf "Creating code directory, src/%s/%s\n" "$project" "$tree" + _patchdir="$3" _loc="$4" # $1 and $2 are gitrepo and gitrepo_backup chkvars rev - xbmkget git "$1" "$2" "$tmpgit" "$rev" "$_patchdir" + xbget git "$1" "$2" "$tmpgit" "$rev" "$_patchdir" if singletree "$project" || [ $# -gt 4 ]; then dx_ fetch_submodule "$mdir/module.list" fi @@ -75,18 +68,24 @@ fetch_submodule() chkvars "sub${st}" "sub${st}_bkup" "subhash" [ "$st" = "git" ] && x_ rm -Rf "$tmpgit/$1" - eval xbmkget "$st" "\$sub$st" "\$sub${st}_bkup" "$tmpgit/$1" \ + eval xbget "$st" "\$sub$st" "\$sub${st}_bkup" "$tmpgit/$1" \ "$subhash" "$mdir/${1##*/}/patches" } -xbmkget() +xbget() { [ "$1" = "curl" ] || [ "$1" = "copy" ] || [ "$1" = "git" ] || \ - err "Bad dlop (arg 1): xbmkget $*" + err "Bad dlop (arg 1): xbget $*" + + echk="f" && [ "$1" = "git" ] && echk="d" for url in "$2" "$3"; do - [ -n "$url" ] && try_file "$url" "$@" && return 0 - done && err "$1 $2 $3 $4: not downloaded"; : + [ -n "$url" ] || err "empty URL given in: xbget $*" + try_file "$url" "$@" || continue + eval "[ -$echk \"$4\" ] || continue" + return 0 # successful download/copy + done + err "$1 $2 $3 $4: not downloaded"; : } try_file() @@ -100,19 +99,21 @@ try_file() echk="d" && [ "$2" != "git" ] && echk="f" && \ bad_checksum "$6" "$cached" 2>/dev/null && x_ rm -f "$cached" - e "$cached" $echk || try_$2 "$cached" "$@" || return 1 - if e "$5" $echk && [ "$2" != "git" ]; then - bad_checksum "$6" "$5" 2>/dev/null && x_ cp "$cached" "$5" - fi - e "$cached" $echk missing && return 1 + evalchk="[ -$echk \"$cached\" ] || " && [ "$2" = "git" ] && evalchk="" + eval "${evalchk}try_$2 \"\$cached\" \"\$@\" || return 1" + [ "$2" != "git" ] && [ -f "$5" ] && \ + bad_checksum "$6" "$5" 2>/dev/null && x_ cp "$cached" "$5" + eval "[ -$echk \"$cached\" ] || return 1" if [ "$2" = "git" ]; then - tmpclone "$cached" "$5" "$6" "$7" || return 1 + [ -d "$5" ] || tmpclone "$cached" "$5" "$6" "$7" || err; : else bad_checksum "$6" "$cached" && x_ rm -f "$cached" && return 1 [ "$cached" != "$5" ] && x_ cp "$cached" "$5" bad_checksum "$6" "$5" && x_ rm -f "$5" && return 1; : fi + + eval "[ -$echk \"$5\" ] || return 1" } try_curl() @@ -124,8 +125,7 @@ try_curl() try_copy() { - [ -L "$2" ] && printf "symlink %s (trycp %s)\n" "$2" "$*" && return 1 - [ ! -f "$2" ] && printf "%s missing (trycp %s)\n" "$2" "$*" && return 1 + e "$2" f missing && return 1; : ( x_ cp "$2" "$1" ) || return 1; : } @@ -135,35 +135,27 @@ try_git() x_ rm -Rf "$tmpgitcache" [ -d "$gitdest" ] || ( x_ git clone "$2" "$tmpgitcache" ) || return 1 - [ -d "$gitdest" ] || x_ mkdir -p "${gitdest##*/}" + [ -d "$gitdest" ] || x_ mkdir -p "${gitdest%/*}" [ -d "$gitdest" ] || x_ mv "$tmpgitcache" "$gitdest" - ( x_ git -C "$gitdest" remote add main "$4" 2>/dev/null ) || : - ( x_ git -C "$gitdest" remote add backup "$5" 2>/dev/null ) || : - ( x_ git -C "$gitdest" fetch --all ) || : + ( x_ git -C "$gitdest" remote remove main ) || : + ( x_ git -C "$gitdest" remote remove backup ) || : + x_ git -C "$gitdest" remote add main "$4" + x_ git -C "$gitdest" remote add backup "$5" ( x_ git -C "$gitdest" pull --all ) || :; : } bad_checksum() { - [ ! -f "$2" ] || [ "$(sha512sum "$2" | awk '{print $1}')" != "$1" ] \ - || return 1 - printf "Bad checksum for file: %s\n" "$2" 1>&2 - x_ rm -f "$2" + e "$2" f missing && return 0 + csum="$(x_ sha512sum "$2" | awk '{print $1}')" || err "!sha512 '$2' $1" + [ "$csum" = "$1" ] && return 1; x_ rm -f "$2" + printf "BAD SHA512 %s, '%s'; need '%s'\n" "$csum" "$2" "$1" 1>&2 } tmpclone() { - [ -d "$2" ] && return 0 - printf "Creating git clone '%s' from '%s'\n" "$2" "$1" ( x_ git clone "$1" "$2" ) || return 1 ( x_ git -C "$2" reset --hard "$3" ) || return 1 ( fx_ "eval x_ git -C \"$2\" am" find "$4" -type f ) || return 1; : } - -nuke() -{ - rdir="${1#"$xbmkpwd/config/"}" && [ -d "$xbmkpwd/src/${rdir%/*}" ] && \ - x_ cd "$xbmkpwd/src/${rdir%/*}" && \ - dx_ "eval [ -L \"\$fx\" ] || x_ rm -Rf" "$1"; : -} diff --git a/include/init.sh b/include/init.sh index 2dd9e88f..bc5a62b6 100644 --- a/include/init.sh +++ b/include/init.sh @@ -12,16 +12,15 @@ projectsite="https://libreboot.org/" [ -z "${PATH+x}" ] && \ export PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" -xbmkpath="$PATH" eval "`setvars "" _nogit board reinstall versiondate aur_notice configdir \ - datadir version xbmkpwd relname xbmkpwd xbmktmp python pyver xbmklocal \ - xbmklock cvxbmk cvchk`" + datadir version xbmkpwd relname xbmkpwd xbtmp python pyver xbloc \ + xbmklock cvxbmk cvchk xbmkpath`" xbmk_init() { xbmkpwd="`pwd`" || err "Cannot generate PWD" - xbmklocal="$xbmkpwd/tmp" + xbloc="$xbmkpwd/tmp" xbmklock="$xbmkpwd/lock" export PWD="$xbmkpwd" @@ -31,8 +30,7 @@ xbmk_init() 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_version set_env 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 } @@ -51,6 +49,91 @@ xbmkpkg() printf "You need AUR packages: %s\n" "$aur_notice" 1>&2; : } +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() +{ + [ -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() +{ + 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() { pyv="import sys; print(sys.version_info[:])" @@ -63,7 +146,14 @@ xbmk_set_pyver() [ -n "$pyver" ] && \ pyver="$("$(pybin "$python")" -c "$pyv" | awk '{print $1}')" && \ pyver="${pyver#(}" && pyver="${pyver%,}" - [ "${pyver%%.*}" = "3" ] || err "Bad python version (must by 3.x)"; : + [ "${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, @@ -97,57 +187,6 @@ pybin() command -v "$1" 2>/dev/null || return 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" -} - -xbmk_set_env() -{ - export LOCALVERSION="-$projectname-${version%%-*}" - - # 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" - xbmkcache="`findpath "$XBMK_CACHE"`" || \ - err "Can't resolve cachedir: '$XBMK_CACHE'" - export XBMK_CACHE="$xbmkcache" - [ ! -e "$XBMK_CACHE" ] || \ - [ -d "$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="y" - [ "$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_git_init() { for gitarg in "--global user.name" "--global user.email"; do @@ -155,7 +194,7 @@ xbmk_git_init() || err "Run this first: $gitcmd \"your ${gitcmd##*.}\"" done - [ -L ".git" ] && return 1 + [ -L ".git" ] && err "'$xbmkpwd/.git' is a symlink" [ -e ".git" ] && return 0 eval "`setvars "$(date -Rud @$versiondate)" cdate _nogit`" @@ -167,49 +206,11 @@ xbmk_git_init() 2>/dev/null; : } -xbmk_create_tmpdir() -{ - x_ mkdir -p "$xbmklocal" - - # 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" - - # /tmp might be a tmpfs, so for large files we use ./tmp, - # not to be confused with xbmktmp (xbmktmp points to /tmp) - remkdir "$xbmktmp" "$xbmklocal" -} - -xbmk_lock() -{ - [ -f "$xbmklock" ] && err "'$xbmklock' exists. Is a build running?" - touch "$xbmklock" || err "cannot create '$xbmklock'"; : -} - -xbmk_create_pathdirs() -{ - remkdir "$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. - x_ cd "$XBMK_CACHE/xbmkpath" - x_ ln -s "`pybin "$python"`" python - ) || err "Can't set up python symlink in $XBMK_CACHE/xbmkpath"; : -} - xbmk_child_exec() { xbmk_rval=0 ( x_ ./mk "$@" ) || xbmk_rval=1 - ( x_ rm -Rf "$xbmklocal" "$xbmktmp" ) || xbmk_rval=1 + ( x_ rm -Rf "$xbloc" "$xbtmp" ) || xbmk_rval=1 ( x_ rm -f "$xbmklock" ) || xbmk_rval=1 exit $xbmk_rval } diff --git a/include/inject.sh b/include/inject.sh index d4d20568..9354b439 100644 --- a/include/inject.sh +++ b/include/inject.sh @@ -6,7 +6,7 @@ cbcfgsdir="config/coreboot" tmpromdel="$XBMK_CACHE/DO_NOT_FLASH" nvm="util/nvmutil/nvm" -ifdtool="elf/ifdtool/default/ifdtool" +ifdtool="elf/coreboot/default/ifdtool" cv="CONFIG_GBE_BIN_PATH" [ -n "$cvxbmk" ] && cv="$cv $cvxbmk" @@ -21,7 +21,7 @@ inject() set +u +e [ $# -lt 1 ] && err "No options specified" - eval "`setvars "" nukemode new_mac xchanged`" + eval "`setvars "" nuke new_mac xchanged`" archive="$1"; new_mac="xx:xx:xx:xx:xx:xx" @@ -29,7 +29,7 @@ inject() [ $# -gt 1 ] && case "$2" in nuke) new_mac="" - nukemode="nuke" ;; + nuke="nuke" ;; setmac) [ $# -gt 2 ] && new_mac="$3" && \ [ -z "$new_mac" ] && err "Empty MAC address specified" ;; @@ -38,7 +38,7 @@ inject() esac [ "$new_mac" = "keep" ] && new_mac="" - check_release + x_ e "$archive" f && check_release check_target && patch_release [ "$xchanged" = "y" ] && remktar @@ -52,20 +52,14 @@ inject() check_release() { [ -L "$archive" ] && err "'$archive' is a symlink" - e "$archive" f missing && err "'$archive' missing" archivename="`basename "$archive"`" || err "Can't get '$archive' name" - [ -z "$archivename" ] && err "Can't determine archive name" case "$archivename" in - *_src.tar.xz) - err "'$archive' is a src archive, silly!" ;; - grub_*|seagrub_*|custom_*|seauboot_*|seabios_withgrub_*) - err "'$archive' is a ROM image (it must be a tarball)" ;; + *_src.tar.xz) err "'$archive' is a src archive, silly!" ;; *.tar.xz) _stripped_prefix="${archivename#*_}" board="${_stripped_prefix%.tar.xz}" ;; - *) - err "'$archive': could not detect board type" + *) err "'$archive': could not detect board type" ;; esac; : } @@ -77,13 +71,13 @@ check_target() eval "`setcfg "$boarddir/target.cfg"`" chkvars tree && x_ ./mk -d coreboot "$tree" - ifdtool="elf/ifdtool/$tree/ifdtool" + ifdtool="elf/coreboot/$tree/ifdtool" [ -n "$IFD_platform" ] && ifdprefix="-p $IFD_platform"; : } patch_release() { - [ "$nukemode" = "nuke" ] || x_ ./mk download "$board" + [ "$nuke" = "nuke" ] || x_ ./mk download "$board" has_hashes="n" tmpromdir="$tmpromdel/bin/$board" @@ -103,36 +97,36 @@ patch_release() readkconfig() { - x_ rm -f "$xbmktmp/cbcfg" + x_ rm -f "$xbtmp/cbcfg" fx_ scankconfig x_ find "$boarddir/config" -type f - eval "`setcfg "$xbmktmp/cbcfg" 1`" + eval "`setcfg "$xbtmp/cbcfg" 1`" setvfile "$@" || return 1; : } scankconfig() { for cbc in $cv; do - grep "$cbc" "$1" 1>>"$xbmktmp/cbcfg" 2>/dev/null || : + grep "$cbc" "$1" 1>>"$xbtmp/cbcfg" 2>/dev/null || : done } modify_mac() { - x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbmklocal/gbe" + x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbloc/gbe" [ -n "$new_mac" ] && [ "$new_mac" != "restore" ] && \ x_ make -C util/nvmutil clean && x_ make -C util/nvmutil && \ - x_ "$nvm" "$xbmklocal/gbe" setmac "$new_mac" + x_ "$nvm" "$xbloc/gbe" setmac "$new_mac" fx_ newmac x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" printf "\nThe following GbE NVM data will be written:\n" - x_ "$nvm" "$xbmklocal/gbe" dump | grep -v "bytes read from file" || : + x_ "$nvm" "$xbloc/gbe" dump | grep -v "bytes read from file" || : } newmac() { e "$1" f && xchanged="y" && x_ \ - "$ifdtool" $ifdprefix -i GbE:"$xbmklocal/gbe" "$1" -O "$1"; : + "$ifdtool" $ifdprefix -i GbE:"$xbloc/gbe" "$1" -O "$1"; : } remktar() diff --git a/include/lib.sh b/include/lib.sh index 75de7512..b40772fa 100644 --- a/include/lib.sh +++ b/include/lib.sh @@ -4,8 +4,8 @@ # Copyright (c) 2020-2025 Leah Rowe <leah@libreboot.org> # Copyright (c) 2025 Alper Nebi Yasak <alpernebiyasak@gmail.com> -cbfstool="elf/cbfstool/default/cbfstool" -rmodtool="elf/cbfstool/default/rmodtool" +cbfstool="elf/coreboot/default/cbfstool" +rmodtool="elf/coreboot/default/rmodtool" remkdir() { @@ -15,13 +15,17 @@ remkdir() mkrom_tarball() { - printf "%s\n" "$version" > "$1/.version" || err "$1 !version" - printf "%s\n" "$versiondate" > "$1/.versiondate" || err "$1 !vdate" - + update_xbmkver "$1" mktarball "$1" "${1%/*}/${relname}_${1##*/}.tar.xz" x_ rm -Rf "$1" } +update_xbmkver() +{ + printf "%s\n" "$version" > "$1/.version" || err "$1 !version"; : + printf "%s\n" "$versiondate" > "$1/.versiondate" || err "$1 !vdate"; : +} + mktarball() { printf "Creating tar archive '%s' from directory '%s'\n" "$2" "$1" @@ -49,10 +53,10 @@ setvars() fi val="$1" shift 1 - for var in "$@"; do - _setvars="$var=\"$val\"; $_setvars" + while [ $# -gt 0 ]; do + printf "%s=\"%s\"\n" "$1" "$val" + shift 1 done - printf "%s\n" "${_setvars% }" } setcfg() @@ -65,9 +69,9 @@ setcfg() chkvars() { - for var in "$@"; do - eval "[ -n \"\${$var+x}\" ] || err \"$var unset\"" - eval "[ -n \"\$$var\" ] || err \"$var unset\"" + while [ $# -gt 0 ]; do + eval "[ -n \"\${$1+x}\" ] || err \"$1 unset\"" + eval "[ -n \"\$$1\" ] || err \"$1 unset\"; shift 1; :" done; : } @@ -102,9 +106,9 @@ fx_() dx_() { - [ -f "$2" ] && while read -r fx; do - $1 "$fx" || return 1 - done < "$2"; : + [ ! -f "$2" ] || while read -r fx; do + $1 "$fx" || return 1; : + done < "$2" || err "dx_ $*: cannot read '$2'"; : } x_() diff --git a/include/mrc.sh b/include/mrc.sh index 70c3bd3c..775831f8 100644 --- a/include/mrc.sh +++ b/include/mrc.sh @@ -6,27 +6,15 @@ eval "`setvars "" MRC_url MRC_url_bkup MRC_hash MRC_board SHELLBALL`" -extract_mrc() -{ - extract_shellball - x_ "$cbfstool" "$appdir/"bios.bin extract -n mrc.bin \ - -f "$_dest" -r RO_SECTION - - [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && extract_refcode extra; : -} - extract_refcode() { - _refdest="${CONFIG_REFCODE_BLOB_FILE##*../}" - e "$_refdest" f && return 0 - - [ $# -lt 1 ] && extract_shellball + extract_mrc # cbfstool after coreboot 4.13 changed the stage file attribute scheme, # and refcode is extracted from an image using the old scheme. we use # cbfstool from coreboot 4.11_branch, the tree used by ASUS KGPE-D16 chkvars cbfstoolref - x_ mkdir -p "${_refdest%/*}" + x_ mkdir -p "${_pre_dest%/*}" x_ "$cbfstoolref" "$appdir/bios.bin" extract \ -m x86 -n fallback/refcode -f "$appdir/ref" -r RO_SECTION @@ -35,10 +23,10 @@ extract_refcode() [ -z "$MRC_refcode_gbe" ] || x_ dd if="config/ifd/hp820g2/1.bin" \ of="$appdir/ref" bs=1 seek=$MRC_refcode_gbe count=1 conv=notrunc; : - x_ mv "$appdir/ref" "$_refdest" + x_ mv "$appdir/ref" "$_pre_dest" } -extract_shellball() +extract_mrc() { chkvars "MRC_board" "CONFIG_MRC_FILE" SHELLBALL="chromeos-firmwareupdate-$MRC_board" @@ -47,7 +35,10 @@ extract_shellball() x_ cd "$appdir" extract_partition "${MRC_url##*/}" extract_archive "$SHELLBALL" . - ) || err "mrc download/extract failure"; : + ) || err "mrc download/extract failure" + + x_ "$cbfstool" "$appdir/"bios.bin extract -n mrc.bin \ + -f "${_pre_dest%/*}/mrc.bin" -r RO_SECTION } extract_partition() diff --git a/include/release.sh b/include/release.sh index f0799f17..c13be2c3 100644 --- a/include/release.sh +++ b/include/release.sh @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # Copyright (c) 2023-2025 Leah Rowe <leah@libreboot.org> -eval "`setvars "" reldir reldest vdir relsrcdir relmode`" +eval "`setvars "" reldir reldest vdir rsrc relmode`" release() { @@ -19,19 +19,19 @@ release() done reldest="$reldir/$version" - [ -e "$reldest" ] && \ - err "already exists: \"$reldest\"" + [ -e "$reldest" ] && err "already exists: \"$reldest\"" - vdir="$XBMK_CACHE/relpwd/${xbmktmp##*/}/$version" - relsrcdir="$vdir/${relname}_src" + vdir="$XBMK_CACHE/relpwd/${xbtmp##*/}/$version" + rsrc="$vdir/${relname}_src" remkdir "$vdir" - x_ git clone . "$relsrcdir" + x_ git clone . "$rsrc" + update_xbmkver "$rsrc" prep_release src prep_release tarball - prep_release bin - x_ rm -Rf "$relsrcdir" + [ "$relmode" = "src" ] || prep_release bin + x_ rm -Rf "$rsrc" x_ mkdir -p "$reldir" x_ mv "$vdir" "$reldir" @@ -42,9 +42,9 @@ release() prep_release() { - x_ touch "$relsrcdir/lock" + x_ touch "$rsrc/lock" ( - [ "$1" = "tarball" ] || x_ cd "$relsrcdir" + [ "$1" = "tarball" ] || x_ cd "$rsrc" prep_release_$1 ) || err "can't prep release $1" } @@ -54,24 +54,30 @@ prep_release_src() x_ ./mk -f fx_ "x_ rm -Rf" x_ find . -name ".git" fx_ "x_ rm -Rf" x_ find . -name ".gitmodules" - x_ mv src/docs docs + ( fx_ nuke x_ find config -type f -name "nuke.list" ) || err; : +} + +nuke() +{ + r="$rsrc/src/${1#config/}" + [ -d "${r%/*}" ] && x_ cd "${r%/*}" && \ + dx_ "eval [ -L \"\$fx\" ] || x_ rm -Rf" "$rsrc/$1"; : } prep_release_tarball() { git log --graph --pretty=format:'%Cred%h%Creset %s %Creset' \ - --abbrev-commit > "$relsrcdir/CHANGELOG" || err "!log $relsrcdir" - x_ rm -f "$relsrcdir/lock" - x_ rm -Rf "$relsrcdir/cache" "$relsrcdir/tmp" + --abbrev-commit > "$rsrc/CHANGELOG" || err "!log $rsrc" + x_ rm -f "$rsrc/lock" + x_ rm -Rf "$rsrc/cache" "$rsrc/tmp" ( - x_ cd "${relsrcdir%/*}" - x_ mktarball "${relsrcdir##*/}" "${relsrcdir##*/}.tar.xz" + x_ cd "${rsrc%/*}" + x_ mktarball "${rsrc##*/}" "${rsrc##*/}.tar.xz" ) || err "can't create src tarball"; : } prep_release_bin() { - [ "$relmode" = "src" ] && return 0 x_ ./mk -d coreboot fx_ "x_ ./mk -b" printf \ "coreboot\npico-serprog\nstm32-vserprog\npcsx-redux\n" diff --git a/include/rom.sh b/include/rom.sh index 65900a01..972f264e 100644 --- a/include/rom.sh +++ b/include/rom.sh @@ -20,6 +20,8 @@ buildser() copyps1bios() { + [ "$dry" = ":" ] && return 0; : + remkdir "bin/playstation" x_ cp src/pcsx-redux/src/mips/openbios/openbios.bin bin/playstation @@ -41,72 +43,55 @@ mkpayload_grub() "/boot/grub/grub.cfg=$grubdata/memdisk.cfg"; : } -mkvendorfiles() +corebootpremake() { - [ -z "$mode" ] && $dry cook_coreboot_config + [ -n "$mode" ] || [ ! -f "$srcdir/.config" ] || $dry printf \ + "CONFIG_CCACHE=y\n" >> "$srcdir/.config" || err "$srcdir: !cook"; : fx_ check_coreboot_util printf "cbfstool\nifdtool\n" - printf "%s\n" "${version%%-*}" > "$srcdir/.coreboot-version" || \ - err "!mk $srcdir .coreboot-version" + printf "%s\n" "${version%%-*}" > "$srcdir/.coreboot-version" || err [ -z "$mode" ] && [ "$target" != "$tree" ] && \ x_ ./mk download "$target"; : } -cook_coreboot_config() -{ - [ -f "$srcdir/.config" ] || return 0 - printf "CONFIG_CCACHE=y\n" >> "$srcdir/.config" || \ - err "$srcdir/.config: Could not enable ccache" - make -C "$srcdir" oldconfig || err "Could not cook $srcdir/.config"; : -} - check_coreboot_util() { - [ "$badhash" = "y" ] && x_ rm -f "elf/$1/$tree/$1" - e "elf/$1/$tree/$1" f && return 0 + [ "$badhash" = "y" ] && x_ rm -f "elf/coreboot/$tree/$1" + e "elf/coreboot/$tree/$1" f && return 0 - utilelfdir="elf/$1/$tree" + utilelfdir="elf/coreboot/$tree" utilsrcdir="src/coreboot/$tree/util/$1" utilmode="" && [ -n "$mode" ] && utilmode="clean" x_ make -C "$utilsrcdir" $utilmode -j$XBMK_THREADS $makeargs [ -n "$mode" ] && x_ rm -Rf "$utilelfdir" && return 0 - [ -z "$mode" ] || return 0 - [ -f "$utilelfdir/$1" ] && return 0 - - x_ mkdir -p "$utilelfdir" - x_ cp "$utilsrcdir/$1" "$utilelfdir" - [ "$1" = "cbfstool" ] || return 0 - x_ cp "$utilsrcdir/rmodtool" "$utilelfdir" + [ ! -f "$utilelfdir/$1" ] && x_ mkdir -p "$utilelfdir" && \ + x_ cp "$utilsrcdir/$1" "$utilelfdir" && [ "$1" = "cbfstool" ] && \ + x_ cp "$utilsrcdir/rmodtool" "$utilelfdir"; : } mkcorebootbin() { [ "$target" = "$tree" ] && return 0 - tmprom="$xbmktmp/coreboot.rom" + tmprom="$xbtmp/coreboot.rom" $dry x_ cp "$srcdir/build/coreboot.rom" "$tmprom" initmode="${defconfig##*/}" displaymode="${initmode##*_}" [ "$displaymode" = "$initmode" ] && displaymode="" # "normal" config initmode="${initmode%%_*}" - cbfstool="elf/cbfstool/$tree/cbfstool" + cbfstool="elf/coreboot/$tree/cbfstool" - [ "$payload_uboot_i386" = "y" ] && \ - [ "$payload_uboot_amd64" = "y" ] && \ - err "'$target' enables 32- and 64-bit x86 U-Boot" + [ -z "$payload_uboot" ] || [ "$payload_uboot" = "amd64" ] || \ + [ "$payload_uboot" = "i386" ] || [ "$payload_uboot" = "arm64" ] \ + || err "'$target' defines bad u-boot type '$payload_uboot'" - if [ "$payload_uboot_i386" = "y" ] || \ - [ "$payload_uboot_amd64" = "y" ]; then - printf "'%s' has x86 U-Boot; assuming SeaBIOS=y\n" \ - "$target" 1>&2 + [ -z "$payload_uboot" ] || [ "$payload_uboot" = "arm64" ] || \ payload_seabios="y" - fi [ -n "$uboot_config" ] || uboot_config="default" - [ "$payload_uboot" = "y" ] || payload_seabios="y" [ "$payload_grub" = "y" ] && payload_seabios="y" - [ "$payload_seabios" = "y" ] && [ "$payload_uboot" = "y" ] && \ + [ "$payload_seabios" = "y" ] && [ "$payload_uboot" = "arm64" ] && \ $dry err "$target: U-Boot(arm64) and SeaBIOS/GRUB both enabled." [ -z "$grub_scan_disk" ] && grub_scan_disk="nvme ahci ata" @@ -124,7 +109,8 @@ mkcorebootbin() if $dry grep "CONFIG_PAYLOAD_NONE=y" "$defconfig"; then [ "$payload_seabios" = "y" ] && pname="seabios" && \ $dry add_seabios - [ "$payload_uboot" = "y" ] && pname="uboot" && $dry add_uboot + [ "$payload_uboot" = "arm64" ] && pname="uboot" && \ + $dry add_uboot; : else pname="custom" $dry cprom @@ -133,10 +119,8 @@ mkcorebootbin() add_seabios() { - if [ "$payload_uboot_i386" = "y" ] || \ - [ "$payload_uboot_amd64" = "y" ]; then - $dry add_uboot - fi + [ -z "$payload_uboot" ] || [ "$payload_uboot" = "arm64" ] || \ + $dry add_uboot _seabioself="elf/seabios/default/$initmode/bios.bin.elf" _seaname="fallback/payload" && [ "$payload_grubsea" = "y" ] && \ @@ -157,7 +141,7 @@ add_seabios() [ "$payload_grub" = "y" ] && add_grub [ "$payload_grubsea" != "y" ] && cprom - [ "$payload_uboot_amd64" = "y" ] && [ "$displaymode" != "txtmode" ] && \ + [ "$payload_uboot" = "amd64" ] && [ "$displaymode" != "txtmode" ] && \ [ "$initmode" != "normal" ] && [ "$payload_grubsea" != "y" ] && \ pname="seauboot" && cprom "seauboot" [ "$payload_grub" = "y" ] && pname="seagrub" && mkseagrub; : @@ -169,8 +153,8 @@ add_grub() _grubname="fallback/payload" cbfs "$tmprom" "$grubelf" "$_grubname" printf "set grub_scan_disk=\"%s\"\n" "$grub_scan_disk" \ - > "$xbmktmp/tmpcfg" || err "$target: !insert scandisk" - cbfs "$tmprom" "$xbmktmp/tmpcfg" scan.cfg raw + > "$xbtmp/tmpcfg" || err "$target: !insert scandisk" + cbfs "$tmprom" "$xbtmp/tmpcfg" scan.cfg raw [ "$initmode" != "normal" ] && [ "$displaymode" != "txtmode" ] && \ cbfs "$tmprom" "$grubdata/background/background1280x800.png" \ "background.png" raw; : @@ -204,14 +188,13 @@ add_uboot() ubpath="fallback/payload" ubtarget="$target" # override for x86/x86_64 targets: - if [ "$payload_uboot_i386" = "y" ] || \ - [ "$payload_uboot_amd64" = "y" ]; then + if [ -n "$payload_uboot" ] && [ "$payload_uboot" != "arm64" ]; then ubcbfsargs="-l 0x1110000 -e 0x1110000" # 64-bit and 32-bit # on 64-bit, 0x1120000 is the SPL, and stub before that ubpath="img/u-boot" # 64-bit ubtarget="amd64coreboot" - [ "$payload_uboot_i386" = "y" ] && ubpath="u-boot" # 32-bit - [ "$payload_uboot_i386" = "y" ] && ubtarget="i386coreboot"; : + [ "$payload_uboot" = "i386" ] && ubpath="u-boot" # 32-bit + [ "$payload_uboot" = "i386" ] && ubtarget="i386coreboot"; : fi ubdir="elf/u-boot/$ubtarget/$uboot_config" @@ -220,8 +203,8 @@ add_uboot() ubootelf="$ubdir/u-boot.elf" && [ ! -f "$ubootelf" ] && \ ubootelf="$ubdir/u-boot" # override for x86/x86_64 targets: - [ "$payload_uboot_i386" = "y" ] && ubootelf="$ubdir/u-boot-dtb.bin" - [ "$payload_uboot_amd64" = "y" ] && \ + [ "$payload_uboot" = "i386" ] && ubootelf="$ubdir/u-boot-dtb.bin" + [ "$payload_uboot" = "amd64" ] && \ ubootelf="$ubdir/u-boot-x86-with-spl.bin" # EFI-compatible cbfs "$tmprom" "$ubootelf" "$ubpath" $ubcbfsargs @@ -265,10 +248,7 @@ cbfs() mkcoreboottar() { - [ "$target" = "$tree" ] && return 0 - [ "$XBMK_RELEASE" = "y" ] || return 0 - [ "$release" != "n" ] || return 0 - - $dry mkrom_tarball "bin/$target" - $dry x_ ./mk inject "bin/${relname}_${target}.tar.xz" nuke; : + [ "$target" != "$tree" ] && [ "$XBMK_RELEASE" = "y" ] && \ + [ "$release" != "n" ] && $dry mkrom_tarball "bin/$target" && \ + $dry x_ ./mk inject "bin/${relname}_${target}.tar.xz" nuke; : } diff --git a/include/tree.sh b/include/tree.sh index 25d4732c..7bfddf67 100644 --- a/include/tree.sh +++ b/include/tree.sh @@ -45,8 +45,7 @@ trees() [ -z "$_f" ] && err "missing flag ($flags)" [ -z "$project" ] && fx_ "x_ ./mk $_f" x_ ls -1 config/git && return 1 - [ -f "config/git/$project/pkg.cfg" ] || \ - err "config/git/$project/pkg.cfg missing" + e "config/git/$project/pkg.cfg" f missing && err "$project: no pkg.cfg" for d in "elf" "config/data" "config" "src"; do eval "${d#*/}dir=\"$d/$project\"" @@ -58,7 +57,7 @@ trees() mkhelpercfg="$datadir/mkhelper.cfg" if e "$mkhelpercfg" f missing; then - mkhelpercfg="$xbmktmp/mkhelper.cfg" + mkhelpercfg="$xbtmp/mkhelper.cfg" x_ touch "$mkhelpercfg" fi @@ -75,9 +74,7 @@ build_project() [ ! -f "$listfile" ] || $dry elfcheck || return 0 [ "$mode" = "distclean" ] && mode="clean" - run_make_command || return 0 - - [ -n "$mode" ] || $dry copy_elf; : + run_make_command && [ -z "$mode" ] && $dry copy_elf; : } build_targets() @@ -89,13 +86,9 @@ build_targets() unset CROSS_COMPILE export PATH="$xbmkpath" [ "$x" = "list" ] && x_ ls -1 "config/$project" && \ - listfile="" && break - - target="$x" + listfile="" && break; target="$x" printf "'make %s', '%s', '%s'\n" "$mode" "$project" "$target" - x_ handle_defconfig - - [ -n "$mode" ] || x_ $postmake + x_ handle_defconfig && [ -z "$mode" ] && x_ $postmake; : done; : } @@ -120,8 +113,7 @@ handle_defconfig() [ "$_f" = "-d" ] || defconfig="$y" [ -n "$mode" ] || check_defconfig || continue - handle_makefile - [ -n "$mode" ] || $dry copy_elf + handle_makefile && [ -z "$mode" ] && $dry copy_elf; : done; : } @@ -130,8 +122,7 @@ configure_project() eval "`setvars "" cleanargs build_depend autoconfargs xtree postmake \ makeargs btype mkhelper bootstrapargs premake release xlang xarch \ badhash`" - _tcfg="$1/target.cfg" - [ -f "$_tcfg" ] || btype="auto" + _tcfg="$1/target.cfg" && [ ! -f "$_tcfg" ] && btype="auto" e "$datadir/mkhelper.cfg" f && eval "`setcfg "$datadir/mkhelper.cfg"`" while e "$_tcfg" f || [ "$cmd" != "build_project" ]; do @@ -144,8 +135,7 @@ configure_project() [ "$do_make" != "n" ] && break [ "${_tcfg%/*/target.cfg}" = "${_tcfg%"/$tree/target.cfg"}" ] \ - && break - _tcfg="${_tcfg%/*/target.cfg}/$tree/target.cfg" + && break; _tcfg="${_tcfg%/*/target.cfg}/$tree/target.cfg" done [ "$XBMK_RELEASE" = "y" ] && [ "$release" = "n" ] && return 1 [ -z "$btype" ] || [ "${mode%config}" = "$mode" ] || return 1 @@ -181,14 +171,13 @@ check_project_hashes() fx_ "x_ sha512sum" find "$datadir" "$configdir/$tree" "$mdir" \ -type f -not -path "*/.git*/*" | awk '{print $1}' > \ - "$xbmktmp/project.hash" || err "!h $project $tree" + "$xbtmp/project.hash" || err "!h $project $tree" - pjhash="$(sha512sum "$xbmktmp/project.hash" | awk '{print $1}')" || : + pjhash="$(sha512sum "$xbtmp/project.hash" | awk '{print $1}')" || : [ "$pjhash" != "$old_pjhash" ] && badhash="y" [ -f "$XBMK_CACHE/hash/$project$tree" ] || badhash="y" - printf "%s\n" "$pjhash" > "$XBMK_CACHE/hash/$project$tree" || \ - err "!mk $XBMK_CACHE/hash/$project$tree" + printf "%s\n" "$pjhash" > "$XBMK_CACHE/hash/$project$tree" || err [ "$badhash" != "y" ] || x_ rm -Rf "src/$project/$tree" \ "elf/$project/$tree" "elf/$project/$target"; : @@ -275,11 +264,10 @@ elfcheck() handle_makefile() { - $dry check_makefile "$srcdir" && x_ make -C "$srcdir" $cleanargs clean + $dry check_makefile "$srcdir" && \ + $dry x_ make -C "$srcdir" $cleanargs clean [ -f "$defconfig" ] && x_ cp "$defconfig" "$srcdir/.config" - [ -n "$mode" ] || [ -n "$btype" ] || $dry make -C \ - "$srcdir" silentoldconfig || make -C "$srcdir" oldconfig || : run_make_command || err "handle_makefile $srcdir: no makefile!" @@ -296,15 +284,17 @@ run_make_command() { [ -n "$mode" ] || x_ $premake - $dry check_cmake "$srcdir" && [ -z "$mode" ] && \ - $dry check_autoconf "$srcdir" + $dry check_cmake "$srcdir" + [ -n "$mode" ] || ( $dry check_autoconf "$srcdir" ) || err $dry check_makefile "$srcdir" || return 1 $dry x_ make -C "$srcdir" $mode -j$XBMK_THREADS $makeargs [ -n "$mode" ] || x_ $mkhelper + check_makefile "$srcdir" || return 0 [ "$mode" != "clean" ] || \ - $dry make -C "$srcdir" $cleanargs distclean || :; : + $dry make -C "$srcdir" $cleanargs distclean || \ + $dry x_ make -C "$srcdir" $cleanargs clean; : } check_cmake() @@ -316,12 +306,10 @@ check_cmake() check_autoconf() { - ( x_ cd "$1" [ -f "bootstrap" ] && x_ ./bootstrap $bootstrapargs [ -f "autogen.sh" ] && x_ ./autogen.sh $autogenargs [ -f "configure" ] && x_ ./configure $autoconfargs; : - ) || err "can't bootstrap project: $1"; : } check_makefile() @@ -332,8 +320,9 @@ check_makefile() copy_elf() { - [ -f "$listfile" ] && x_ mkdir -p "$dest_dir" && while read -r f; do - [ -f "$srcdir/$f" ] && x_ cp "$srcdir/$f" "$dest_dir" - done < "$listfile" + [ -f "$listfile" ] && x_ mkdir -p "$dest_dir" + [ ! -f "$listfile" ] || while read -r f; do + [ -f "$srcdir/$f" ] && x_ cp "$srcdir/$f" "$dest_dir"; : + done < "$listfile" || err "copy_elf $*: cannot read '$listfile'"; : x_ make clean -C "$srcdir" $cleanargs } diff --git a/include/vendor.sh b/include/vendor.sh index 823ba74f..f7dce827 100644 --- a/include/vendor.sh +++ b/include/vendor.sh @@ -21,26 +21,26 @@ appdir="$vendir/app" vfix="DO_NOT_FLASH_YET._FIRST,_INJECT_FILES_VIA_INSTRUCTIONS_ON_LIBREBOOT.ORG_" # lbmk-specific extension to the "cv" variable (not suitable for cbmk) -cvchk="CONFIG_INCLUDE_SMSC_SCH5545_EC_FW CONFIG_HAVE_MRC CONFIG_HAVE_ME_BIN \ - CONFIG_KBC1126_FIRMWARE CONFIG_LENOVO_TBFW_BIN CONFIG_VGA_BIOS_FILE \ - CONFIG_FSP_M_FILE CONFIG_FSP_S_FILE" +cvchk="CONFIG_SMSC_SCH5545_EC_FW_FILE CONFIG_MRC_FILE CONFIG_ME_BIN_PATH \ + CONFIG_LENOVO_TBFW_BIN CONFIG_VGA_BIOS_FILE CONFIG_FSP_M_FILE \ + CONFIG_FSP_S_FILE CONFIG_KBC1126_FW1 CONFIG_KBC1126_FW2" # lbmk-specific extensions to the "cv" variable (not suitable for cbmk) -cvxbmk="CONFIG_ME_BIN_PATH CONFIG_SMSC_SCH5545_EC_FW_FILE CONFIG_KBC1126_FW1 \ - CONFIG_KBC1126_FW2 CONFIG_KBC1126_FW1_OFFSET CONFIG_KBC1126_FW2_OFFSET \ +cvxbmk="CONFIG_FSP_FULL_FD CONFIG_IFD_BIN_PATH CONFIG_FSP_M_CBFS \ + CONFIG_KBC1126_FW1_OFFSET CONFIG_KBC1126_FW2_OFFSET CONFIG_FSP_USE_REPO \ CONFIG_VGA_BIOS_ID CONFIG_BOARD_DELL_E6400 CONFIG_FSP_S_CBFS \ - CONFIG_HAVE_REFCODE_BLOB CONFIG_REFCODE_BLOB_FILE CONFIG_FSP_FD_PATH \ - CONFIG_IFD_BIN_PATH CONFIG_MRC_FILE CONFIG_FSP_M_CBFS \ - CONFIG_FSP_USE_REPO CONFIG_FSP_FULL_FD" + CONFIG_HAVE_REFCODE_BLOB CONFIG_REFCODE_BLOB_FILE CONFIG_FSP_FD_PATH" # lbmk-specific extensions; mostly used for downloading vendor files eval "`setvars "" has_hashes EC_hash DL_hash DL_url_bkup MRC_refcode_gbe vcfg \ E6400_VGA_DL_hash E6400_VGA_DL_url E6400_VGA_DL_url_bkup E6400_VGA_offset \ E6400_VGA_romname SCH5545EC_DL_url_bkup SCH5545EC_DL_hash _dest mecleaner \ kbc1126_ec_dump MRC_refcode_cbtree _dl SCH5545EC_DL_url EC_url rom DL_url \ - nukemode cbfstoolref FSPFD_hash _7ztest ME11bootguard ME11delta xromsize \ + nuke cbfstoolref FSPFD_hash _7ztest ME11bootguard ME11delta xromsize \ ME11version ME11sku ME11pch _me _metmp mfs TBFW_url_bkup TBFW_url cbdir \ - TBFW_hash TBFW_size hashfile EC_url_bkup`" + TBFW_hash TBFW_size hashfile EC_url_bkup FSPM_bin_hash FSPS_bin_hash \ + EC_FW1_hash EC_FW2_hash ME_bin_hash MRC_bin_hash REF_bin_hash _dl_bin \ + SCH5545EC_bin_hash TBFW_bin_hash E6400_VGA_bin_hash _pre_dest`" download() { @@ -51,25 +51,28 @@ download() getfiles() { - [ -z "$CONFIG_HAVE_ME_BIN" ] || fetch intel_me "$DL_url" \ - "$DL_url_bkup" "$DL_hash" "$CONFIG_ME_BIN_PATH" - [ -z "$CONFIG_INCLUDE_SMSC_SCH5545_EC_FW" ] || fetch sch5545ec \ - "$SCH5545EC_DL_url" "$SCH5545EC_DL_url_bkup" "$SCH5545EC_DL_hash" \ - "$CONFIG_SMSC_SCH5545_EC_FW_FILE" - [ -z "$CONFIG_KBC1126_FIRMWARE" ] || fetch kbc1126ec "$EC_url" \ - "$EC_url_bkup" "$EC_hash" "$CONFIG_KBC1126_FW1" - [ -z "$CONFIG_VGA_BIOS_FILE" ] || fetch e6400vga "$E6400_VGA_DL_url" \ - "$E6400_VGA_DL_url_bkup" "$E6400_VGA_DL_hash" "$CONFIG_VGA_BIOS_FILE" - [ -z "$CONFIG_HAVE_MRC" ] || fetch "mrc" "$MRC_url" "$MRC_url_bkup" \ - "$MRC_hash" "$CONFIG_MRC_FILE" - [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && fetch "refcode" "$MRC_url" \ - "$MRC_url_bkup" "$MRC_hash" "$CONFIG_REFCODE_BLOB_FILE" - [ -z "$CONFIG_LENOVO_TBFW_BIN" ] || fetch "tbfw" "$TBFW_url" \ - "$TBFW_url_bkup" "$TBFW_hash" "$CONFIG_LENOVO_TBFW_BIN" - [ -z "$CONFIG_FSP_M_FILE" ] || fetch "fsp" "$CONFIG_FSP_FD_PATH" \ - "$CONFIG_FSP_FD_PATH" "$FSPFD_hash" "$CONFIG_FSP_M_FILE" copy - [ -z "$CONFIG_FSP_S_FILE" ] || fetch "fsp" "$CONFIG_FSP_FD_PATH" \ - "$CONFIG_FSP_FD_PATH" "$FSPFD_hash" "$CONFIG_FSP_S_FILE" copy; : + fetch intel_me "$DL_url" "$DL_url_bkup" "$DL_hash" \ + "$CONFIG_ME_BIN_PATH" curl "$ME_bin_hash" + fetch sch5545ec "$SCH5545EC_DL_url" "$SCH5545EC_DL_url_bkup" \ + "$SCH5545EC_DL_hash" "$CONFIG_SMSC_SCH5545_EC_FW_FILE" curl \ + "$SCH5545EC_bin_hash" + fetch kbc1126ec "$EC_url" "$EC_url_bkup" "$EC_hash" \ + "$CONFIG_KBC1126_FW1" curl "$EC_FW1_hash" + fetch kbc1126ec "$EC_url" "$EC_url_bkup" "$EC_hash" \ + "$CONFIG_KBC1126_FW2" curl "$EC_FW2_hash" + fetch e6400vga "$E6400_VGA_DL_url" "$E6400_VGA_DL_url_bkup" \ + "$E6400_VGA_DL_hash" "$CONFIG_VGA_BIOS_FILE" curl \ + "$E6400_VGA_bin_hash" + fetch mrc "$MRC_url" "$MRC_url_bkup" "$MRC_hash" "$CONFIG_MRC_FILE" \ + curl "$MRC_bin_hash" + fetch refcode "$MRC_url" "$MRC_url_bkup" "$MRC_hash" \ + "$CONFIG_REFCODE_BLOB_FILE" curl "$REF_bin_hash" + fetch tbfw "$TBFW_url" "$TBFW_url_bkup" "$TBFW_hash" \ + "$CONFIG_LENOVO_TBFW_BIN" curl "$TBFW_bin_hash" + fetch fsp "$CONFIG_FSP_FD_PATH" "$CONFIG_FSP_FD_PATH" "$FSPFD_hash" \ + "$CONFIG_FSP_M_FILE" copy "$FSPM_bin_hash" + fetch fsp "$CONFIG_FSP_FD_PATH" "$CONFIG_FSP_FD_PATH" "$FSPFD_hash" \ + "$CONFIG_FSP_S_FILE" copy "$FSPS_bin_hash"; : } fetch() @@ -78,41 +81,68 @@ fetch() dl="$2" dl_bkup="$3" dlsum="$4" - _dest="${5##*../}" + _dest="${5##*../}" && [ -z "$_dest" ] && return 0 + _pre_dest="$XBMK_CACHE/tmpdl/check" || err "!fetch, mktemp, $*" + dlop="$6" + binsum="$7" [ "$5" = "/dev/null" ] && return 0 - _dl="$XBMK_CACHE/file/$dlsum" + _dl="$XBMK_CACHE/file/$dlsum" # internet file to extract from e.g. .exe + _dl_bin="$XBMK_CACHE/file/$binsum" # extracted file e.g. me.bin + + # an extracted vendor file will be placed in pre_dest first, for + # verifying its checksum. if it matches, it is later moved to _dest + remkdir "${_pre_dest%/*}" "$appdir" + # HACK: if grabbing fsp from coreboot, fix the path for lbmk [ "$dl_type" = "fsp" ] && for _cdl in dl dl_bkup; do eval "$_cdl=\"\${$_cdl##*../}\"; _cdp=\"\$$_cdl\"" [ -f "$_cdp" ] || _cdp="$cbdir/$_cdp" - [ -f "$_cdp" ] && eval "$_cdl=\"$_cdp\"" + [ -f "$_cdp" ] && eval "$_cdl=\"$_cdp\""; : done; : - dlop="curl" && [ $# -gt 5 ] && dlop="$6" - xbmkget "$dlop" "$dl" "$dl_bkup" "$_dl" "$dlsum" - + # download the file (from the internet) to extract from + xbget "$dlop" "$dl" "$dl_bkup" "$_dl" "$dlsum" x_ rm -Rf "${_dl}_extracted" - e "$_dest" f && return 0 + + # skip extraction if a cached extracted file exists + ( xbget copy "$_dl_bin" "$_dl_bin" "$_dest" "$binsum" 2>/dev/null ) || : + [ -f "$_dest" ] && return 0 x_ mkdir -p "${_dest%/*}" - remkdir "$appdir" [ "$dl_type" = "fsp" ] || extract_archive "$_dl" "$appdir" || \ [ "$dl_type" = "e6400vga" ] || err "$_dest $dl_type: !extract" x_ extract_$dl_type "$_dl" "$appdir" set -u -e - e "$_dest" f missing && err "!extract_$dl_type"; : + + # some functions don't output directly to the given file, _pre_dest. + # instead, they put multiple files there, but we need the one matching + # the given hashsum. So, search for a matching file via bruteforce: + ( fx_ "eval mkdst \"$binsum\"" x_ find "${_pre_dest%/*}" -type f ) || : + + bad_checksum "$binsum" "$_dest" || [ ! -f "$_dest" ] || return 0 + [ -z "$binsum" ] && printf "'%s': checksum undefined\n" "$_dest" 1>&2 + [ -L "$_dest" ] && printf "WARNING: '%s' is a link!\n" "$_dest" 1>&2 + [ -L "$_dest" ] || x_ rm -f "$_dest" + err "Could not safely extract '$_dest', for board '$board'" +} + +mkdst() +{ + bad_checksum "$1" "$2" && x_ rm -f "$2" && return 0 + x_ mv "$2" "$_dl_bin" + x_ cp "$_dl_bin" "$_dest" + exit 1 } extract_intel_me() { e "$mecleaner" f not && err "$cbdir: me_cleaner missing" - _7ztest="$xbmklocal/metmp/a" - _me="$xbmkpwd/$_dest" - _metmp="$xbmklocal/me.bin" - x_ rm -f "$_metmp" "$xbmklocal/a" + _7ztest="$xbloc/metmp/a" + _metmp="$xbloc/me.bin" + x_ rm -f "$_metmp" "$xbloc/a" mfs="" && [ "$ME11bootguard" = "y" ] && mfs="--whitelist MFS" && \ chkvars ME11delta ME11version ME11sku ME11pch @@ -121,14 +151,14 @@ extract_intel_me() set +u +e x_ rm -Rf "$xbmkpwd/metmp" ( fx_ find_me x_ find "$xbmkpwd/$appdir" -type f ) || : - [ "$ME11bootguard" != "y" ] && x_ mv "$_metmp" "$_me" && return 0 + [ "$ME11bootguard" != "y" ] && x_ mv "$_metmp" "$_pre_dest" && return 0 ( x_ cd src/deguard/ x_ ./finalimage.py --delta "data/delta/$ME11delta" --version \ "$ME11version" --pch "$ME11pch" --sku "$ME11sku" \ - --fake-fpfs data/fpfs/zero --input "$_metmp" --output "$_me" - ) || err "Error running deguard for $_me"; : + --fake-fpfs data/fpfs/zero --input "$_metmp" --output "$_pre_dest" + ) || err "Error running deguard for $_dest"; : } find_me() @@ -138,7 +168,7 @@ find_me() _7ztest="${_7ztest}a" && _r="-r" && [ -n "$mfs" ] && _r="" - "$mecleaner" $mfs $_r -t -O "$xbmklocal/a" -M "$_metmp" "$1" || \ + "$mecleaner" $mfs $_r -t -O "$xbloc/a" -M "$_metmp" "$1" || \ "$mecleaner" $mfs $_r -t -O "$_metmp" "$1" || "$me7updateparser" \ -O "$_metmp" "$1" || extract_archive "$1" "$_7ztest" || return 0 @@ -165,7 +195,7 @@ extract_kbc1126ec() ) || err "$board: can't extract kbc1126 ec firmware" x_ e "$appdir/ec.bin.fw1" f && x_ e "$appdir/ec.bin.fw2" f - x_ cp "$appdir/"ec.bin.fw* "${_dest%/*}/" + x_ cp "$appdir/"ec.bin.fw* "${_pre_dest%/*}/" } extract_e6400vga() @@ -178,7 +208,7 @@ extract_e6400vga() x_ e "bios.bin" f "$e6400_unpack" bios.bin || printf "TODO: fix dell extract util\n" ) || err "can't extract e6400 vga rom" - x_ cp "$appdir/$E6400_VGA_romname" "$_dest" + x_ cp "$appdir/$E6400_VGA_romname" "$_pre_dest" } extract_sch5545ec() @@ -191,26 +221,27 @@ extract_sch5545ec() _sch5545ec_fw="$_sch5545ec_fw/0 Raw section/body.bin" # <-- this! x_ "$uefiextract" "$_bios" - x_ cp "$_sch5545ec_fw" "$_dest" + x_ cp "$_sch5545ec_fw" "$_pre_dest" } # Lenovo ThunderBolt firmware updates: # https://pcsupport.lenovo.com/us/en/products/laptops-and-netbooks/thinkpad-t-series-laptops/thinkpad-t480-type-20l5-20l6/20l5/solutions/ht508988 extract_tbfw() { - chkvars TBFW_size; fx_ copytb x_ find "$appdir" -type f -name "TBT.bin" + chkvars TBFW_size + fx_ copytb x_ find "$appdir" -type f -name "TBT.bin" } copytb() { [ -f "$1" ] && [ ! -L "$1" ] && x_ dd if=/dev/null of="$1" bs=1 \ - seek=$TBFW_size && x_ mv "$1" "$_dest" && return 1; : + seek=$TBFW_size && x_ mv "$1" "$_pre_dest" && return 1; : } extract_fsp() { x_ python "$cbdir/3rdparty/fsp/Tools/SplitFspBin.py" split -f "$1" \ - -o "${_dest%/*}" -n "Fsp.fd" + -o "${_pre_dest%/*}" -n "Fsp.fd" } setvfile() @@ -234,14 +265,14 @@ bootstrap() cbdir="src/coreboot/$tree" mecleaner="$xbmkpwd/$cbdir/util/me_cleaner/me_cleaner.py" kbc1126_ec_dump="$xbmkpwd/$cbdir/util/kbc1126/kbc1126_ec_dump" - cbfstool="elf/cbfstool/$tree/cbfstool" - rmodtool="elf/cbfstool/$tree/rmodtool" + cbfstool="elf/coreboot/$tree/cbfstool" + rmodtool="elf/coreboot/$tree/rmodtool" x_ ./mk -f coreboot "${cbdir##*/}" fx_ "x_ ./mk -b" printf "uefitool\nbiosutilities\nbios_extract\n" [ -d "${kbc1126_ec_dump%/*}" ] && x_ make -C "$cbdir/util/kbc1126" [ -n "$MRC_refcode_cbtree" ] && \ - cbfstoolref="elf/cbfstool/$MRC_refcode_cbtree/cbfstool" && \ + cbfstoolref="elf/coreboot/$MRC_refcode_cbtree/cbfstool" && \ x_ ./mk -d coreboot "$MRC_refcode_cbtree"; : } @@ -250,13 +281,13 @@ prep() _xrom="$1" _xromname="${1##*/}" _xromnew="${_xrom%/*}/${_xromname#"$vfix"}" - [ "$nukemode" = "nuke" ] && _xromnew="${_xrom%/*}/$vfix${_xrom##*/}" + [ "$nuke" = "nuke" ] && _xromnew="${_xrom%/*}/$vfix${_xrom##*/}" e "$_xrom" f missing && return 0 [ -z "${_xromname#"$vfix"}" ] && err "$_xromname / $vfix: name match" # Remove the prefix and 1-byte pad - if [ "$nukemode" != "nuke" ] && \ + if [ "$nuke" != "nuke" ] && \ [ "${_xromname#"$vfix"}" != "$_xromname" ]; then xromsize="$(expr $(stat -c '%s' "$_xrom") - 1)" || err "!int" [ $xromsize -lt 524288 ] && err "too small, $xromsize: $_xrom" @@ -267,32 +298,30 @@ prep() _xrom="$_xromnew" fi - [ "$nukemode" = "nuke" ] && mksha512sum "$_xrom" "vendorhashes" + [ "$nuke" != "nuke" ] || ( mksha512 "$_xrom" "vendorhashes" ) || err add_vfiles "$_xrom" || return 1 # if break return, can still change MAC - [ "$nukemode" != "nuke" ] && return 0 + [ "$nuke" != "nuke" ] && return 0 # Rename the file, prefixing a warning saying not to flash cat "$_xrom" config/data/coreboot/0 > "$_xromnew" || err "!pad $_xrom" x_ rm -f "$_xrom" } -mksha512sum() +mksha512() { - ( [ "${1%/*}" != "$1" ] && x_ cd "${1%/*}" sha512sum ./"${1##*/}" >> "$2" || err "!sha512sum \"$1\" > \"$2\"" - ) || err "failed to create tarball checksum" } add_vfiles() { rom="$1" - if [ "$has_hashes" != "y" ] && [ "$nukemode" != "nuke" ]; then + if [ "$has_hashes" != "y" ] && [ "$nuke" != "nuke" ]; then printf "'%s' has no hash file. Skipping.\n" "$archive" 1>&2 return 1 - elif [ "$has_hashes" = "y" ] && [ "$nukemode" = "nuke" ]; then + elif [ "$has_hashes" = "y" ] && [ "$nuke" = "nuke" ]; then printf "'%s' has a hash file. Skipping nuke.\n" "$archive" 1>&2 return 1 fi @@ -302,9 +331,10 @@ add_vfiles() [ "$CONFIG_HAVE_MRC" = "y" ] && vfile "mrc.bin" "$CONFIG_MRC_FILE" \ "mrc" "0xfffa0000" [ "$CONFIG_HAVE_ME_BIN" = "y" ] && vfile IFD "$CONFIG_ME_BIN_PATH" me - [ "$CONFIG_KBC1126_FIRMWARE" = "y" ] && vfile ecfw1.bin \ - "$CONFIG_KBC1126_FW1" raw "$CONFIG_KBC1126_FW1_OFFSET" && vfile \ - ecfw2.bin "$CONFIG_KBC1126_FW2" raw "$CONFIG_KBC1126_FW2_OFFSET" + [ -n "$CONFIG_KBC1126_FW1" ] && vfile ecfw1.bin \ + "$CONFIG_KBC1126_FW1" raw "$CONFIG_KBC1126_FW1_OFFSET" + [ -n "$CONFIG_KBC1126_FW2" ] && vfile ecfw2.bin \ + "$CONFIG_KBC1126_FW2" raw "$CONFIG_KBC1126_FW2_OFFSET" [ -n "$CONFIG_VGA_BIOS_FILE" ] && [ -n "$CONFIG_VGA_BIOS_ID" ] && \ vfile "pci$CONFIG_VGA_BIOS_ID.rom" "$CONFIG_VGA_BIOS_FILE" optionrom [ "$CONFIG_INCLUDE_SMSC_SCH5545_EC_FW" = "y" ] && \ @@ -337,19 +367,19 @@ vfile() err "vfile $*, $rom: offset given but empty (undefined)" fi - [ "$nukemode" = "nuke" ] || x_ e "$_dest" f + [ "$nuke" = "nuke" ] || x_ e "$_dest" f if [ "$cbfsname" = "IFD" ]; then - [ "$nukemode" = "nuke" ] || x_ "$ifdtool" $ifdprefix -i \ + [ "$nuke" = "nuke" ] || x_ "$ifdtool" $ifdprefix -i \ $_t:$_dest "$rom" -O "$rom" - [ "$nukemode" != "nuke" ] || x_ "$ifdtool" $ifdprefix --nuke \ + [ "$nuke" != "nuke" ] || x_ "$ifdtool" $ifdprefix --nuke \ $_t "$rom" -O "$rom" - elif [ "$nukemode" = "nuke" ]; then + elif [ "$nuke" = "nuke" ]; then x_ "$cbfstool" "$rom" remove -n "$cbfsname" elif [ "$_t" = "stage" ]; then # the only stage we handle is refcode - x_ rm -f "$xbmklocal/refcode" - x_ "$rmodtool" -i "$_dest" -o "$xbmklocal/refcode" - x_ "$cbfstool" "$rom" add-stage -f "$xbmklocal/refcode" \ + x_ rm -f "$xbloc/refcode" + x_ "$rmodtool" -i "$_dest" -o "$xbloc/refcode" + x_ "$cbfstool" "$rom" add-stage -f "$xbloc/refcode" \ -n "$cbfsname" -t stage else x_ "$cbfstool" "$rom" add -f "$_dest" -n "$cbfsname" \ @@ -361,7 +391,7 @@ vfile() check_vendor_hashes() { x_ cd "$tmpromdir" - [ "$has_hashes" = "n" ] || [ "$nukemode" = "nuke" ] || sha512sum \ + [ "$has_hashes" = "n" ] || [ "$nuke" = "nuke" ] || sha512sum \ --status -c "$hashfile" || x_ sha1sum --status -c "$hashfile" x_ rm -f "$hashfile" } |