diff options
-rw-r--r-- | config/coreboot/coreboot413/patches/0001-cbfstool-Make-use-of-spurious-null-termination.patch | 56 | ||||
-rw-r--r-- | config/coreboot/coreboot413/patches/0002-Fix-cbfstool-build-error-on-GCC-15-host-compiler.patch | 33 | ||||
-rw-r--r-- | config/coreboot/coreboot413/target.cfg | 4 | ||||
-rw-r--r-- | config/grub/default/config/payload | 2 | ||||
-rw-r--r-- | config/grub/nvme/config/payload | 2 | ||||
-rw-r--r-- | config/grub/xhci/config/payload | 2 | ||||
-rw-r--r-- | config/submodule/coreboot/coreboot413/module.list | 1 | ||||
-rw-r--r-- | config/submodule/coreboot/coreboot413/vboot/module.cfg | 5 | ||||
-rw-r--r-- | config/submodule/coreboot/coreboot413/vboot/patches/0001-extract_vmlinuz.c-Fix-the-bounds-check-on-vmlinuz_he.patch | 178 | ||||
-rw-r--r-- | config/vendor/hp820g2/pkg.cfg | 2 | ||||
-rw-r--r-- | include/git.sh | 28 | ||||
-rw-r--r-- | include/init.sh | 4 | ||||
-rw-r--r-- | include/inject.sh | 9 | ||||
-rw-r--r-- | include/release.sh | 65 | ||||
-rw-r--r-- | include/tree.sh | 344 | ||||
-rwxr-xr-x | mk | 415 |
16 files changed, 432 insertions, 718 deletions
diff --git a/config/coreboot/coreboot413/patches/0001-cbfstool-Make-use-of-spurious-null-termination.patch b/config/coreboot/coreboot413/patches/0001-cbfstool-Make-use-of-spurious-null-termination.patch deleted file mode 100644 index dfc684e1..00000000 --- a/config/coreboot/coreboot413/patches/0001-cbfstool-Make-use-of-spurious-null-termination.patch +++ /dev/null @@ -1,56 +0,0 @@ -From f22f408956bf02609a96b7d72fb3321da159bfc6 Mon Sep 17 00:00:00 2001 -From: Nico Huber <nico.huber@secunet.com> -Date: Tue, 22 Jun 2021 13:49:44 +0000 -Subject: [PATCH 1/1] cbfstool: Make use of spurious null-termination - -The null-termination of `filetypes` was added after the code was -written, obviously resulting in NULL dereferences. As some more -code has grown around the termination, it's hard to revert the -regression, so let's update the code that still used the array -length. - -This fixes commit 7f5f9331d1 (util/cbfstool: fix buffer over-read) -which actually did fix something, but only one path while it broke -two others. We should be careful with fixes, they can always break -something else. Especially when a dumb tool triggered the patching -it seems likely that fewer people looked into related code. - -Change-Id: If2ece1f5ad62952ed2e57769702e318ba5468f0c -Signed-off-by: Nico Huber <nico.huber@secunet.com> -Reviewed-on: https://review.coreboot.org/c/coreboot/+/55763 -Tested-by: build bot (Jenkins) <no-reply@coreboot.org> -Reviewed-by: Julius Werner <jwerner@chromium.org> ---- - util/cbfstool/common.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c -index e2ed38ffc4..539d0baccf 100644 ---- a/util/cbfstool/common.c -+++ b/util/cbfstool/common.c -@@ -168,10 +168,10 @@ void print_supported_architectures(void) - - void print_supported_filetypes(void) - { -- int i, number = ARRAY_SIZE(filetypes); -+ int i; - -- for (i=0; i<number; i++) { -- printf(" %s%c", filetypes[i].name, (i==(number-1))?'\n':','); -+ for (i=0; filetypes[i].name; i++) { -+ printf(" %s%c", filetypes[i].name, filetypes[i + 1].name ? ',' : '\n'); - if ((i%8) == 7) - printf("\n"); - } -@@ -180,7 +180,7 @@ void print_supported_filetypes(void) - uint64_t intfiletype(const char *name) - { - size_t i; -- for (i = 0; i < (sizeof(filetypes) / sizeof(struct typedesc_t)); i++) -+ for (i = 0; filetypes[i].name; i++) - if (strcmp(filetypes[i].name, name) == 0) - return filetypes[i].type; - return -1; --- -2.39.2 - diff --git a/config/coreboot/coreboot413/patches/0002-Fix-cbfstool-build-error-on-GCC-15-host-compiler.patch b/config/coreboot/coreboot413/patches/0002-Fix-cbfstool-build-error-on-GCC-15-host-compiler.patch deleted file mode 100644 index 9b7b8c5b..00000000 --- a/config/coreboot/coreboot413/patches/0002-Fix-cbfstool-build-error-on-GCC-15-host-compiler.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 06e8d7a9db4efe1dc2b7e5865b801a5518b38fbd Mon Sep 17 00:00:00 2001 -From: Alper Nebi Yasak <alpernebiyasak@gmail.com> -Date: Tue, 29 Apr 2025 17:31:13 +0300 -Subject: [PATCH 1/1] Fix cbfstool build error on GCC 15 host compiler - -GCC 15 now considers the unterminated-string-initialization warning as -part of -Werror by default. Coreboot compiles host utilities with the -system compiler, which results in getting this error in some files. - -Mark a hexadecimal translation table in cbfstool code as "nonstring" to -avoid the warning-turned-error. - -Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> ---- - util/cbfstool/common.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c -index 539d0baccf..f6fe647503 100644 ---- a/util/cbfstool/common.c -+++ b/util/cbfstool/common.c -@@ -188,7 +188,7 @@ uint64_t intfiletype(const char *name) - - char *bintohex(uint8_t *data, size_t len) - { -- static const char translate[16] = "0123456789abcdef"; -+ static const char translate[16] __attribute__((__nonstring__)) = "0123456789abcdef"; - - char *result = malloc(len * 2 + 1); - if (result == NULL) --- -2.39.5 - diff --git a/config/coreboot/coreboot413/target.cfg b/config/coreboot/coreboot413/target.cfg deleted file mode 100644 index a0aae341..00000000 --- a/config/coreboot/coreboot413/target.cfg +++ /dev/null @@ -1,4 +0,0 @@ -# SPDX-License-Identifier: GPL-3.0-or-later - -tree="coreboot413" -rev="5c186c6777c9438ff4681929c9c25c98dee28bef" diff --git a/config/grub/default/config/payload b/config/grub/default/config/payload index 3f134f1d..3d84413e 100644 --- a/config/grub/default/config/payload +++ b/config/grub/default/config/payload @@ -184,7 +184,7 @@ menuentry 'Load Operating System (incl. fully encrypted disks) [o]' --hotkey='o # using * is slow on some machines, but we use it here, # just once. in so doing, we find every lvm volume for vol in (*); do - if regexp ^lvm/ $vol; then + if regexp ^\\(lvm/ $vol; then lvmvol="${lvmvol} ${vol}" try_bootcfg "${vol}" fi diff --git a/config/grub/nvme/config/payload b/config/grub/nvme/config/payload index 22dd8fe1..4f3de36e 100644 --- a/config/grub/nvme/config/payload +++ b/config/grub/nvme/config/payload @@ -196,7 +196,7 @@ menuentry 'Load Operating System (incl. fully encrypted disks) [o]' --hotkey='o # using * is slow on some machines, but we use it here, # just once. in so doing, we find every lvm volume for vol in (*); do - if regexp ^lvm/ $vol; then + if regexp ^\\(lvm/ $vol; then lvmvol="${lvmvol} ${vol}" try_bootcfg "${vol}" fi diff --git a/config/grub/xhci/config/payload b/config/grub/xhci/config/payload index d1f81fd3..9db22fe2 100644 --- a/config/grub/xhci/config/payload +++ b/config/grub/xhci/config/payload @@ -197,7 +197,7 @@ menuentry 'Load Operating System (incl. fully encrypted disks) [o]' --hotkey='o # using * is slow on some machines, but we use it here, # just once. in so doing, we find every lvm volume for vol in (*); do - if regexp ^lvm/ $vol; then + if regexp ^\\(lvm/ $vol; then lvmvol="${lvmvol} ${vol}" try_bootcfg "${vol}" fi diff --git a/config/submodule/coreboot/coreboot413/module.list b/config/submodule/coreboot/coreboot413/module.list deleted file mode 100644 index 08e76de0..00000000 --- a/config/submodule/coreboot/coreboot413/module.list +++ /dev/null @@ -1 +0,0 @@ -3rdparty/vboot diff --git a/config/submodule/coreboot/coreboot413/vboot/module.cfg b/config/submodule/coreboot/coreboot413/vboot/module.cfg deleted file mode 100644 index 79c98870..00000000 --- a/config/submodule/coreboot/coreboot413/vboot/module.cfg +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: GPL-3.0-or-later - -subrepo="https://review.coreboot.org/vboot.git" -subrepo_bkup="https://github.com/coreboot/vboot" -subhash="4c523ed10f25de872ac0513ebd6ca53d3970b9de" diff --git a/config/submodule/coreboot/coreboot413/vboot/patches/0001-extract_vmlinuz.c-Fix-the-bounds-check-on-vmlinuz_he.patch b/config/submodule/coreboot/coreboot413/vboot/patches/0001-extract_vmlinuz.c-Fix-the-bounds-check-on-vmlinuz_he.patch deleted file mode 100644 index 1ac41de6..00000000 --- a/config/submodule/coreboot/coreboot413/vboot/patches/0001-extract_vmlinuz.c-Fix-the-bounds-check-on-vmlinuz_he.patch +++ /dev/null @@ -1,178 +0,0 @@ -From 195f61375aeec9eec16604ec59f6eda2e6058cc1 Mon Sep 17 00:00:00 2001 -From: "Luke T. Shumaker" <lukeshu@lukeshu.com> -Date: Thu, 30 May 2024 14:08:33 -0600 -Subject: [PATCH 1/1] extract_vmlinuz.c: Fix the bounds check on - vmlinuz_header_{offset,size} - -The check on vmlinuz_header_offset and vmlinuz_header_size is obviously -wrong: - - if (!vmlinuz_header_size || - kpart_data + vmlinuz_header_offset + vmlinuz_header_size > - kpart_data) { - return 1; - } - -`kpart_data + some_unsigned_values` can obviously never be `> kpart_data`, -unless something has overflowed! And `vmlinuz_header_offset` hasn't even -been set yet (besides being initialized to zero)! - -GCC will deduce that if the check didn't cause the function to bail, then -vmlinuz_header_size (a uint32_t) must be "negative"; that is: in the range -[2GiB,4GiB). - -On platforms where size_t is 32-bits, this is *especially* broken. -memcpy's size argument must be in the range [0,2GiB). Because GCC has -proved that vmlinuz_header_size is higher than that, it will fail to -compile: - - host/lib/extract_vmlinuz.c:67:9: error: 'memcpy' specified bound between 2147483648 and 4294967295 exceeds maximum object size 2147483647 [-Werror=stringop-overflow=] - -So, fix the check. - -I can now say that what I suspect the original author meant to write would -be the following patch, if `vmlinuz_header_offset` were already set: - - -kpart_data + vmlinuz_header_offset + vmlinuz_header_size > kpart_data - +now + vmlinuz_header_offset + vmlinuz_header_size > kpart_size - -This hypothesis is supported by `now` not getting incremented by -`kblob_size` the way it is for the keyblock and preamble sizes. - -However, we can also see that even this "corrected" bounds check is -insufficient: it does not detect the vmlinuz_header overflowing into -kblob_data. - -OK, so let's describe the fix: - -Have a `*vmlinuz_header` pointer instead of a -`uint64_t vmlinuz_header_offset`, to be more similar to all the other -regions. With this change, the correct check becomes a simple - - vmlinuz_header + vmlinuz_header_size > kblob_data - -While we're at it, make some changes that could have helped avoid this in -the first place: - - - Add comments. - - Calculate the vmlinuz_header offset right away, instead of waiting. - - Go ahead and increment `now` by `kblob_size`, to increase regularity. - -Change-Id: I5c03e49070b6dd2e04459566ef7dd129d27736e4 ---- - host/lib/extract_vmlinuz.c | 72 +++++++++++++++++++++++++++----------- - 1 file changed, 51 insertions(+), 21 deletions(-) - -diff --git a/host/lib/extract_vmlinuz.c b/host/lib/extract_vmlinuz.c -index 4ccfcf33..d2c09443 100644 ---- a/host/lib/extract_vmlinuz.c -+++ b/host/lib/extract_vmlinuz.c -@@ -15,16 +15,44 @@ - - int ExtractVmlinuz(void *kpart_data, size_t kpart_size, - void **vmlinuz_out, size_t *vmlinuz_size) { -+ // We're going to be extracting `vmlinuz_header` and -+ // `kblob_data`, and returning the concatenation of them. -+ // -+ // kpart_data = +-[kpart_size]------------------------------------+ -+ // | | -+ // keyblock = | +-[keyblock->keyblock_size]-------------------+ | -+ // | | struct vb2_keyblock keyblock | | -+ // | | char [] ...data... | | -+ // | +---------------------------------------------+ | -+ // | | -+ // preamble = | +-[preamble->preamble_size]-------------------+ | -+ // | | struct vb2_kernel_preamble preamble | | -+ // | | char [] ...data... | | -+ // | | char [] vmlinuz_header | | -+ // | | char [] ...data... | | -+ // | +---------------------------------------------+ | -+ // | | -+ // kblob_data= | +-[preamble->body_signature.data_size]--------+ | -+ // | | char [] ...data... | | -+ // | +---------------------------------------------+ | -+ // | | -+ // +-------------------------------------------------+ -+ - size_t now = 0; -+ // The 3 sections of kpart_data. -+ struct vb2_keyblock *keyblock = NULL; - struct vb2_kernel_preamble *preamble = NULL; - uint8_t *kblob_data = NULL; - uint32_t kblob_size = 0; -+ // vmlinuz_header -+ uint8_t *vmlinuz_header = NULL; - uint32_t vmlinuz_header_size = 0; -- uint64_t vmlinuz_header_address = 0; -- uint64_t vmlinuz_header_offset = 0; -+ // The concatenated result. - void *vmlinuz = NULL; - -- struct vb2_keyblock *keyblock = (struct vb2_keyblock *)kpart_data; -+ // Isolate the 3 sections of kpart_data. -+ -+ keyblock = (struct vb2_keyblock *)kpart_data; - now += keyblock->keyblock_size; - if (now > kpart_size) - return 1; -@@ -36,37 +64,39 @@ int ExtractVmlinuz(void *kpart_data, size_t kpart_size, - - kblob_data = kpart_data + now; - kblob_size = preamble->body_signature.data_size; -- -- if (!kblob_data || (now + kblob_size) > kpart_size) -+ now += kblob_size; -+ if (now > kpart_size) - return 1; - -+ // Find `vmlinuz_header` within `preamble`. -+ - if (preamble->header_version_minor > 0) { -- vmlinuz_header_address = preamble->vmlinuz_header_address; -+ // calculate the vmlinuz_header offset from -+ // the beginning of the kpart_data. The kblob doesn't -+ // include the body_load_offset, but does include -+ // the keyblock and preamble sections. -+ size_t vmlinuz_header_offset = -+ preamble->vmlinuz_header_address - -+ preamble->body_load_address + -+ keyblock->keyblock_size + -+ preamble->preamble_size; -+ -+ vmlinuz_header = kpart_data + vmlinuz_header_offset; - vmlinuz_header_size = preamble->vmlinuz_header_size; - } - -- if (!vmlinuz_header_size || -- kpart_data + vmlinuz_header_offset + vmlinuz_header_size > -- kpart_data) { -+ if (!vmlinuz_header || -+ !vmlinuz_header_size || -+ vmlinuz_header + vmlinuz_header_size > kblob_data) { - return 1; - } - -- // calculate the vmlinuz_header offset from -- // the beginning of the kpart_data. The kblob doesn't -- // include the body_load_offset, but does include -- // the keyblock and preamble sections. -- vmlinuz_header_offset = vmlinuz_header_address - -- preamble->body_load_address + -- keyblock->keyblock_size + -- preamble->preamble_size; -+ // Concatenate and return. - - vmlinuz = malloc(vmlinuz_header_size + kblob_size); - if (vmlinuz == NULL) - return 1; -- -- memcpy(vmlinuz, kpart_data + vmlinuz_header_offset, -- vmlinuz_header_size); -- -+ memcpy(vmlinuz, vmlinuz_header, vmlinuz_header_size); - memcpy(vmlinuz + vmlinuz_header_size, kblob_data, kblob_size); - - *vmlinuz_out = vmlinuz; --- -2.45.1 - diff --git a/config/vendor/hp820g2/pkg.cfg b/config/vendor/hp820g2/pkg.cfg index 89303ad3..308148c5 100644 --- a/config/vendor/hp820g2/pkg.cfg +++ b/config/vendor/hp820g2/pkg.cfg @@ -7,5 +7,5 @@ MRC_url="https://dl.google.com/dl/edgedl/chromeos/recovery/chromeos_13904.77.0_s MRC_url_bkup="https://web.archive.org/web/20220310155922/https://dl.google.com/dl/edgedl/chromeos/recovery/chromeos_13904.77.0_samus_recovery_stable-channel_mp-v3.bin.zip" MRC_hash="3ff1599c52539f0707a07a8664a84ce51cd3fed1569df4bb7aa6722fc8dec0af1754250333b6ca1a9794d970a4de7b29a5cf2499f5b61e4c3eab64d1314aaea9" MRC_board="samus" -MRC_refcode_cbtree="coreboot413" +MRC_refcode_cbtree="fam15h" MRC_refcode_gbe="131253" diff --git a/include/git.sh b/include/git.sh index 81c75806..9440b1af 100644 --- a/include/git.sh +++ b/include/git.sh @@ -89,30 +89,12 @@ fetch_submodule() tmpclone() { - livepull="n" && [ "$repofail" = "y" ] && \ - printf "Cached clone failed; trying online.\n" 1>&2 && livepull="y" - - repofail="n" - - [ $# -lt 6 ] || rm -Rf "$3" || err "git retry: !rm $3 ($1)" - repodir="$XBMK_CACHE/repo/${1##*/}" && [ $# -gt 5 ] && repodir="$3" - mkdir -p "$XBMK_CACHE/repo" || err "!rmdir $XBMK_CACHE/repo" - - if [ "$livepull" = "y" ] && [ ! -d "$repodir" ]; then - git clone "$1" "$repodir" || git clone $2 "$repodir" || \ - err "!clone $1 $2 $repodir $4 $5" # - elif [ -d "$repodir" ] && [ $# -lt 6 ]; then - git -C "$repodir" pull || sleep 3 || git -C "$repodir" pull \ - || sleep 3 || git -C "$repodir" pull || : - fi - ( - [ $# -gt 5 ] || git clone "$repodir" "$3" || err "!clone $repodir $3" - git -C "$3" reset --hard "$4" || err "!reset $1 $2 $3 $4 $5" + [ -d "$3" ] && return 0 + printf "Creating git clone '%s' from '%s', '%s'\n" "$3" "$1" "$2" + git clone "$1" "$3" || x_ rm -Rf "$3" + [ -d "$3" ] || x_ git clone "$2" "$3" + x_ git -C "$3" reset --hard "$4" fx_ "eval x_ git -C \"$3\" am" find "$5" -type f - ) || repofail="y" - - [ "$repofail" = "y" ] && [ $# -lt 6 ] && tmpclone "$@" retry - [ "$repofail" = "y" ] && err "!clone $1 $2 $3 $4 $5"; : } nuke() diff --git a/include/init.sh b/include/init.sh index a322370b..b9cb81b1 100644 --- a/include/init.sh +++ b/include/init.sh @@ -134,11 +134,13 @@ xbmk_set_env() xbmkcache="`findpath "$XBMK_CACHE"`" || \ err "Can't resolve cachedir: '$XBMK_CACHE'" export XBMK_CACHE="$xbmkcache" - [ -d "$XBMK_CACHE" ] || err "cachedir '$XBMK_CACHE' is a file"; : + [ ! -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 diff --git a/include/inject.sh b/include/inject.sh index c0b4409f..8485d7e8 100644 --- a/include/inject.sh +++ b/include/inject.sh @@ -147,7 +147,9 @@ extract_intel_me() chkvars ME11delta ME11version ME11sku ME11pch [ "$ME11bootguard" = "y" ] && x_ ./mk -f deguard - set +u +e && fx_ find_me x_ find "$xbmkpwd/$appdir" -type f + 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 ( @@ -160,7 +162,7 @@ extract_intel_me() find_me() { - e "$_metmp" f && x_ rm -Rf "$xbmklocal/metmp" && return 1 + [ -f "$_metmp" ] && exit 1 [ -L "$1" ] && return 0 _7ztest="${_7ztest}a" && _r="-r" && [ -n "$mfs" ] && _r="" @@ -169,7 +171,8 @@ find_me() "$mecleaner" $mfs $_r -t -O "$_metmp" "$1" || "$me7updateparser" \ -O "$_metmp" "$1" || extract_archive "$1" "$_7ztest" || return 0 - fx_ find_me x_ find "$_7ztest" -type f || return 1; : + [ -f "$_metmp" ] && exit 1 + ( fx_ find_me x_ find "$_7ztest" -type f ) || exit 1; : } extract_archive() diff --git a/include/release.sh b/include/release.sh new file mode 100644 index 00000000..2f9f2b86 --- /dev/null +++ b/include/release.sh @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# Copyright (c) 2023-2025 Leah Rowe <leah@libreboot.org> + +eval "`setvars "" vdir src_dirname relsrcdir relmode`" + +release() +{ + export XBMK_RELEASE="y" + + vdir="release" + while getopts d:m: option; do + [ -z "$OPTARG" ] && err "empty argument not allowed" + case "$option" in + d) vdir="$OPTARG" ;; + m) relmode="$OPTARG" ;; + *) err "invalid option '-$option'" ;; + esac + done + + vdir="$vdir/$version" + src_dirname="${relname}_src" + relsrcdir="$vdir/$src_dirname" + + [ -e "$vdir" ] && err "already exists: \"$vdir\"" + mkdir -p "$vdir" || err "mkvdir: !mkdir -p \"$vdir\"" + git clone . "$relsrcdir" || err "mkdir: !gitclone \"$relsrcdir\"" + touch "$relsrcdir/lock" || err "can't make lock file in $relsrcdir/" + + build_release + + printf "\n\nDONE! Check release files under %s\n" "$vdir" +} + +build_release() +{ + ( + cd "$relsrcdir" || err "$vdir: !cd \"$relsrcdir\"" + + x_ ./mk -f + rmgit . + x_ mv src/docs docs + ) || err "can't create release files" + + git log --graph --pretty=format:'%Cred%h%Creset %s %Creset' \ + --abbrev-commit > "$relsrcdir/CHANGELOG" || err "!log $relsrcdir" + rm -f "$relsrcdir/lock" || err "can't remove lock file in $relsrcdir" + + ( + cd "${relsrcdir%/*}" || err "$vdir: mktarball \"$relsrcdir\"" + x_ mktarball "${relsrcdir##*/}" "${relsrcdir##*/}.tar.xz" + ) || err "can't create src tarball" + [ "$relmode" = "src" ] && return 0 + + touch "$relsrcdir/lock" || err "can't make lock file in $relsrcdir/" + ( + cd "$relsrcdir" || err "$vdir: 2 !cd \"$relsrcdir\"" + x_ ./mk -d coreboot + mk -b coreboot pico-serprog stm32-vserprog pcsx-redux + + fx_ mkrom_tarball x_ find bin -maxdepth 1 -type d -name "serprog_*" + x_ mv bin ../roms + ) || err "can't build rom images" + + rm -Rf "$relsrcdir" || err "!rm -Rf $relsrcdir" +} diff --git a/include/tree.sh b/include/tree.sh new file mode 100644 index 00000000..4d0c533d --- /dev/null +++ b/include/tree.sh @@ -0,0 +1,344 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# Copyright (c) 2022-2023 Alper Nebi Yasak <alpernebiyasak@gmail.com> +# Copyright (c) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com> +# Copyright (c) 2023-2025 Leah Rowe <leah@libreboot.org> + +eval "`setvars "" xarch srcdir premake gnatdir xlang mode makeargs elfdir cmd \ + project target target_dir targets xtree _f release bootstrapargs mkhelper \ + autoconfargs listfile autogenargs btype rev build_depend gccdir cmakedir \ + defconfig postmake mkhelpercfg dry dest_dir mdir cleanargs gccver gccfull \ + gnatver gnatfull do_make badhash tree`" + +trees() +{ + flags="f:b:m:u:c:x:s:l:n:d:" + + while getopts $flags option; do + [ -n "$_f" ] && err "only one flag is permitted" + _f="$1" + + case "$_f" in + -d) dry=":" ;; + -b) : ;; + -u) mode="oldconfig" ;; + -m) mode="menuconfig" ;; + -c) mode="distclean" ;; + -x) mode="crossgcc-clean" ;; + -f) + do_make="n" + dry=":" ;; + -s) mode="savedefconfig" ;; + -l) mode="olddefconfig" ;; + -n) mode="nconfig" ;; + *) err "invalid option '-$option'" ;; + esac + + if [ -z "${OPTARG+x}" ]; then + shift 1 + break + fi + + project="${OPTARG#src/}" + shift 2 + done + [ -z "$_f" ] && err "missing flag ($flags)" + if [ -z "$project" ]; then + mk $_f $(ls -1 config/git) + return 1 + fi + + [ -f "config/git/$project/pkg.cfg" ] || \ + err "config/git/$project/pkg.cfg missing" + + for d in "elf" "config/data" "config" "src"; do + eval "${d#*/}dir=\"$d/$project\"" + done + dest_dir="$elfdir" + + listfile="$datadir/build.list" + [ -f "$listfile" ] || listfile="" # optional on all projects + + mkhelpercfg="$datadir/mkhelper.cfg" + if e "$mkhelpercfg" f missing; then + mkhelpercfg="$xbmktmp/mkhelper.cfg" + x_ touch "$mkhelpercfg" + fi + + targets="$*" + cmd="build_targets $targets" + singletree "$project" && cmd="build_project" + + remkdir "${tmpgit%/*}" +} + +build_project() +{ + configure_project "$configdir" || return 0 + [ ! -f "$listfile" ] || $dry elfcheck || return 0 + + [ "$mode" = "distclean" ] && mode="clean" + run_make_command || return 0 + + [ -n "$mode" ] || $dry copy_elf; : +} + +build_targets() +{ + [ -d "$configdir" ] || err "directory, $configdir, does not exist" + [ $# -gt 0 ] || targets="$(ls -1 "$configdir")" || err "!o $configdir" + + for x in $targets; do + unset CROSS_COMPILE + export PATH="$xbmkpath" + [ "$x" = "list" ] && x_ ls -1 "config/$project" && \ + listfile="" && break + + target="$x" + printf "'make %s', '%s', '%s'\n" "$mode" "$project" "$target" + x_ handle_defconfig + + [ -n "$mode" ] || x_ $postmake + done; : +} + +handle_defconfig() +{ + target_dir="$configdir/$target" + + [ -f "CHANGELOG" ] || fetch_project "$project" + configure_project "$target_dir" || return 0 + x_ mkdir -p "$elfdir/$target" + + chkvars tree + srcdir="src/$project/$tree" + + if [ "$mode" = "distclean" ] || [ "$mode" = "crossgcc-clean" ]; then + [ -d "$srcdir" ] || return 0 + fi + [ -z "$mode" ] && for _xarch in $xarch; do + $dry check_cross_compiler "$_xarch" + done; : + + for y in "$target_dir/config"/*; do + [ "$_f" = "-d" ] || [ -f "$y" ] || continue + [ "$_f" = "-d" ] || defconfig="$y" + + [ -n "$mode" ] || check_defconfig || continue + handle_makefile + [ -n "$mode" ] || $dry copy_elf + done; : +} + +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" + e "$datadir/mkhelper.cfg" f && eval "`setcfg "$datadir/mkhelper.cfg"`" + + while e "$_tcfg" f || [ "$cmd" != "build_project" ]; do + eval "`setvars "" rev tree`" + eval "`setcfg "$_tcfg"`" + printf "Loading %s config: %s\n" "$project" "$_tcfg" + + [ "$_f" = "-d" ] && build_depend="" # dry run + [ "$cmd" = "build_project" ] && break + [ "$do_make" != "n" ] && break + + [ "${_tcfg%/*/target.cfg}" = "${_tcfg%"/$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 + [ -z "$mode" ] && $dry build_dependencies + + mdir="$xbmkpwd/config/submodule/$project" + [ -n "$tree" ] && mdir="$mdir/$tree" + [ -f "CHANGELOG" ] || check_project_hashes + + if [ "$do_make" = "n" ]; then + [ -f "CHANGELOG" ] || fetch_${cmd#build_} + return 1 + fi + x_ ./mk -f "$project" "$target" +} + +build_dependencies() +{ + for bd in $build_depend; do + bd_p="${bd%%/*}" + bd_t="${bd##*/}" + [ -z "$bd_p" ] && $dry err "$project/$tree: !bd '$bd'" + [ "${bd##*/}" = "$bd" ] && bd_t="" + [ -z "$bd_p" ] || $dry x_ ./mk -b $bd_p $bd_t; : + done; : +} + +check_project_hashes() +{ + old_pjhash="" && x_ mkdir -p "$XBMK_CACHE/hash" + [ ! -f "$XBMK_CACHE/hash/$project$tree" ] || \ + read -r old_pjhash < "$XBMK_CACHE/hash/$project$tree" + + fx_ "x_ sha512sum" find "$datadir" "$configdir/$tree" "$mdir" \ + -type f -not -path "*/.git*/*" | awk '{print $1}' > \ + "$xbmktmp/project.hash" || err "!h $project $tree" + + pjhash="$(sha512sum "$xbmktmp/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" + + [ "$badhash" != "y" ] || x_ rm -Rf "src/$project/$tree" \ + "elf/$project/$tree" "elf/$project/$target"; : +} + +check_cross_compiler() +{ + cbdir="src/coreboot/$tree" + [ "$project" != "coreboot" ] && cbdir="src/coreboot/default" + [ -n "$xtree" ] && cbdir="src/coreboot/$xtree" + + x_ ./mk -f coreboot "${cbdir#src/coreboot/}" + + export PATH="$xbmkpwd/$cbdir/util/crossgcc/xgcc/bin:$PATH" + export CROSS_COMPILE="${xarch% *}-" + [ -n "$xlang" ] && export BUILD_LANGUAGES="$xlang" + + # match gnat-X to gcc + check_gnu_path gcc gnat || x_ check_gnu_path gnat gcc + + xfix="${1%-*}" && [ "$xfix" = "x86_64" ] && xfix="x64" + xgccargs="crossgcc-$xfix UPDATED_SUBMODULES=1 CPUS=$XBMK_THREADS" + make -C "$cbdir" $xgccargs || x_ make -C "$cbdir" $xgccargs + + # we only want to mess with hostcc to build xgcc + remkdir "$XBMK_CACHE/gnupath" +} + +# fix mismatching gcc/gnat versions on debian trixie/sid. as of december 2024, +# trixie/sid had gnat-13 as gnat and gcc-14 as gcc, but has gnat-14 in apt. in +# some cases, gcc 13+14 and gnat-13 are present; or gnat-14 and gcc-14, but +# gnat in PATH never resolves to gnat-14, because gnat-14 was "experimental" +check_gnu_path() +{ + command -v "$1" 1>/dev/null || err "Host '$1' unavailable" + + eval "`setvars "" gccver gccfull gnatver gnatfull gccdir gnatdir`" + x_ gnu_setver "$1" "$1" || err "Command '$1' unavailable." + gnu_setver "$2" "$2" || : + + eval "[ -z \"\$$1ver\" ] && err \"Cannot detect host '$1' version\"" + [ "$gnatfull" = "$gccfull" ] && return 0 + + eval "$1dir=\"$(dirname "$(command -v "$1")")\"" + eval "_gnudir=\"\$$1dir\"; _gnuver=\"\$$1ver\"" + for _bin in "$_gnudir/$2-"*; do + [ "${_bin#"$_gnudir/$2-"}" = "$_gnuver" ] && [ -x "$_bin" ] \ + && _gnuver="${_bin#"$_gnudir/$2-"}" && break; : + done + gnu_setver "$2" "$_gnudir/$2-$_gnuver" || return 1 + [ "$gnatfull" = "$gccfull" ] || return 1 + + ( + remkdir "$XBMK_CACHE/gnupath" && x_ cd "$XBMK_CACHE/gnupath" + for _gnubin in "$_gnudir/$2"*"-$_gnuver"; do + _gnuutil="${_gnubin##*/}" && [ -e "$_gnubin" ] && \ + x_ ln -s "$_gnubin" "${_gnuutil%"-$_gnuver"}" + done + ) || err "Cannot create $2-$_gnuver link in $_gnudir"; : +} + +gnu_setver() +{ + eval "$2 --version 1>/dev/null 2>/dev/null || return 1" + eval "$1ver=\"`"$2" --version 2>/dev/null | head -n1`\"" + eval "$1ver=\"\${$1ver##* }\"" + eval "$1full=\"\$$1ver\"" + eval "$1ver=\"\${$1ver%%.*}\""; : +} + +check_defconfig() +{ + [ -f "$defconfig" ] || $dry err "$project/$target: missing defconfig" + dest_dir="$elfdir/$target/${defconfig#"$target_dir/config/"}" + + $dry elfcheck || return 1 # skip build if a previous one exists + $dry x_ mkdir -p "$dest_dir" +} + +elfcheck() +{ + # TODO: *STILL* very hacky check. do it properly (based on build.list) + ( fx_ "exit 1" find "$dest_dir" -type f ) || return 1; : +} + +handle_makefile() +{ + $dry check_makefile "$srcdir" && 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!" + + _copy=".config" && [ "$mode" = "savedefconfig" ] && _copy="defconfig" + [ "${mode%config}" = "$mode" ] || \ + $dry x_ cp "$srcdir/$_copy" "$defconfig" + + [ -e "$srcdir/.git" ] && [ "$project" = "u-boot" ] && \ + [ "$mode" = "distclean" ] && \ + $dry x_ git -C "$srcdir" $cleanargs clean -fdx; : +} + +run_make_command() +{ + [ -n "$mode" ] || x_ $premake + + $dry check_cmake "$srcdir" && [ -z "$mode" ] && \ + $dry check_autoconf "$srcdir" + $dry check_makefile "$srcdir" || return 1 + + $dry x_ make -C "$srcdir" $mode -j$XBMK_THREADS $makeargs + [ -n "$mode" ] || x_ $mkhelper + + [ "$mode" != "clean" ] || \ + $dry make -C "$srcdir" $cleanargs distclean || :; : +} + +check_cmake() +{ + [ -z "$cmakedir" ] || $dry check_makefile "$1" || cmake -B "$1" \ + "$1/$cmakedir" || $dry x_ check_makefile "$1" + [ -z "$cmakedir" ] || $dry x_ check_makefile "$1"; : +} + +check_autoconf() +{ + ( + cd "$1" || err "!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() +{ + [ -f "$1/Makefile" ] || [ -f "$1/makefile" ] || \ + [ -f "$1/GNUmakefile" ] || return 1; : +} + +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" + x_ make clean -C "$srcdir" $cleanargs +} @@ -2,8 +2,6 @@ # SPDX-License-Identifier: GPL-3.0-or-later # Copyright (c) 2020-2025 Leah Rowe <leah@libreboot.org> # Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com> -# Copyright (c) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com> -# Copyright (c) 2022-2023 Alper Nebi Yasak <alpernebiyasak@gmail.com> set -u -e @@ -13,13 +11,11 @@ if [ "./${0##*/}" != "${0}" ] || [ ! -f "mk" ] || [ -L "mk" ]; then fi . "include/lib.sh" - . "include/init.sh" . "include/inject.sh" . "include/mrc.sh" . "include/rom.sh" - -eval "`setvars "" vdir src_dirname srcdir mode`" +. "include/release.sh" main() { @@ -28,418 +24,17 @@ main() case "$cmd" in version) printf "%s\nWebsite: %s\n" "$relname" "$projectsite" ;; release|download|inject) $cmd "$@" ;; - -*) return 1 ;; + -*) return 0 ;; *) err "bad command" ;; esac set -u -e # some commands disable them. turn them on! + return 1 } -release() -{ - export XBMK_RELEASE="y" - - vdir="release" - while getopts d:m: option; do - [ -z "$OPTARG" ] && err "empty argument not allowed" - case "$option" in - d) vdir="$OPTARG" ;; - m) mode="$OPTARG" ;; - *) err "invalid option '-$option'" ;; - esac - done - - vdir="$vdir/$version" - src_dirname="${relname}_src" - srcdir="$vdir/$src_dirname" - - [ -e "$vdir" ] && err "already exists: \"$vdir\"" - mkdir -p "$vdir" || err "mkvdir: !mkdir -p \"$vdir\"" - git clone . "$srcdir" || err "mkdir: !gitclone \"$srcdir\"" - touch "$srcdir/lock" || err "can't make lock file in $srcdir/" - - build_release - - printf "\n\nDONE! Check release files under %s\n" "$vdir" -} - -build_release() -{ - ( - cd "$srcdir" || err "$vdir: !cd \"$srcdir\"" - - ./mk -f - rmgit . - x_ mv src/docs docs - ) || err "can't create release files" - - git log --graph --pretty=format:'%Cred%h%Creset %s %Creset' \ - --abbrev-commit > "$srcdir/CHANGELOG" || err "!gitlog $srcdir" - rm -f "$srcdir/lock" || err "can't remove lock file in $srcdir" - - ( - cd "${srcdir%/*}" || err "$vdir: mktarball \"$srcdir\"" - mktarball "${srcdir##*/}" "${srcdir##*/}.tar.xz" || err "$vdir: mksrc" - ) || err "can't create src tarball" - [ "$mode" = "src" ] && return 0 - - touch "$srcdir/lock" || err "can't make lock file in $srcdir/" - ( - cd "$srcdir" || err "$vdir: 2 !cd \"$srcdir\"" - x_ ./mk -d coreboot - mk -b coreboot pico-serprog stm32-vserprog pcsx-redux - - fx_ mkrom_tarball x_ find bin -maxdepth 1 -type d -name "serprog_*" - x_ mv bin ../roms - ) || err "can't build rom images" - - rm -Rf "$srcdir" || err "!rm -Rf $srcdir" -} - -main "$@" && exit 0 - -# what follows was formerly script/trees, whose main() is now trees() +main "$@" || exit 0 . "include/git.sh" - -eval "`setvars "" xarch srcdir premake gnatdir xlang mode makeargs elfdir cmd \ - project target target_dir targets xtree _f release bootstrapargs mkhelper \ - autoconfargs listfile autogenargs btype rev build_depend gccdir cmakedir \ - defconfig postmake mkhelpercfg dry dest_dir mdir cleanargs gccver gccfull \ - gnatver gnatfull do_make badhash tree`" - -trees() -{ - flags="f:b:m:u:c:x:s:l:n:d:" - - while getopts $flags option; do - [ -n "$_f" ] && err "only one flag is permitted" - _f="$1" - - case "$_f" in - -d) dry=":" ;; - -b) : ;; - -u) mode="oldconfig" ;; - -m) mode="menuconfig" ;; - -c) mode="distclean" ;; - -x) mode="crossgcc-clean" ;; - -f) - do_make="n" - dry=":" ;; - -s) mode="savedefconfig" ;; - -l) mode="olddefconfig" ;; - -n) mode="nconfig" ;; - *) err "invalid option '-$option'" ;; - esac - - if [ -z "${OPTARG+x}" ]; then - shift 1 - break - fi - - project="${OPTARG#src/}" - shift 2 - done - [ -z "$_f" ] && err "missing flag ($flags)" - if [ -z "$project" ]; then - mk $_f $(ls -1 config/git) - return 1 - fi - - [ -f "config/git/$project/pkg.cfg" ] || \ - err "config/git/$project/pkg.cfg missing" - - for d in "elf" "config/data" "config" "src"; do - eval "${d#*/}dir=\"$d/$project\"" - done - dest_dir="$elfdir" - - listfile="$datadir/build.list" - [ -f "$listfile" ] || listfile="" # optional on all projects - - mkhelpercfg="$datadir/mkhelper.cfg" - if e "$mkhelpercfg" f missing; then - mkhelpercfg="$xbmktmp/mkhelper.cfg" - x_ touch "$mkhelpercfg" - fi - - targets="$*" - cmd="build_targets $targets" - singletree "$project" && cmd="build_project" - - remkdir "${tmpgit%/*}" -} - -build_project() -{ - configure_project "$configdir" || return 0 - [ ! -f "$listfile" ] || $dry elfcheck || return 0 - - [ "$mode" = "distclean" ] && mode="clean" - run_make_command || return 0 - - [ -n "$mode" ] || $dry copy_elf; : -} - -build_targets() -{ - [ -d "$configdir" ] || err "directory, $configdir, does not exist" - [ $# -gt 0 ] || targets="$(ls -1 "$configdir")" || err "!o $configdir" - - for x in $targets; do - unset CROSS_COMPILE - export PATH="$xbmkpath" - [ "$x" = "list" ] && x_ ls -1 "config/$project" && \ - listfile="" && break - - target="$x" - printf "'make %s', '%s', '%s'\n" "$mode" "$project" "$target" - x_ handle_defconfig - - [ -n "$mode" ] || x_ $postmake - done; : -} - -handle_defconfig() -{ - target_dir="$configdir/$target" - - [ -f "CHANGELOG" ] || fetch_project "$project" - configure_project "$target_dir" || return 0 - x_ mkdir -p "$elfdir/$target" - - chkvars tree - srcdir="src/$project/$tree" - - if [ "$mode" = "distclean" ] || [ "$mode" = "crossgcc-clean" ]; then - [ -d "$srcdir" ] || return 0 - fi - [ -z "$mode" ] && for _xarch in $xarch; do - $dry check_cross_compiler "$_xarch" - done; : - - for y in "$target_dir/config"/*; do - [ "$_f" = "-d" ] || [ -f "$y" ] || continue - [ "$_f" = "-d" ] || defconfig="$y" - - [ -n "$mode" ] || check_defconfig || continue - handle_makefile - [ -n "$mode" ] || $dry copy_elf - done; : -} - -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" - e "$datadir/mkhelper.cfg" f && eval "`setcfg "$datadir/mkhelper.cfg"`" - - while e "$_tcfg" f || [ "$cmd" != "build_project" ]; do - eval "`setvars "" rev tree`" - eval "`setcfg "$_tcfg"`" - printf "Loading %s config: %s\n" "$project" "$_tcfg" - - [ "$_f" = "-d" ] && build_depend="" # dry run - [ "$cmd" = "build_project" ] && break - [ "$do_make" != "n" ] && break - - [ "${_tcfg%/*/target.cfg}" = "${_tcfg%"/$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 - [ -z "$mode" ] && $dry build_dependencies - - mdir="$xbmkpwd/config/submodule/$project" - [ -n "$tree" ] && mdir="$mdir/$tree" - [ -f "CHANGELOG" ] || check_project_hashes - - if [ "$do_make" = "n" ]; then - [ -f "CHANGELOG" ] || fetch_${cmd#build_} - return 1 - fi - x_ ./mk -f "$project" "$target" -} - -build_dependencies() -{ - for bd in $build_depend; do - bd_p="${bd%%/*}" - bd_t="${bd##*/}" - [ -z "$bd_p" ] && $dry err "$project/$tree: !bd '$bd'" - [ "${bd##*/}" = "$bd" ] && bd_t="" - [ -z "$bd_p" ] || $dry x_ ./mk -b $bd_p $bd_t; : - done; : -} - -check_project_hashes() -{ - old_pjhash="" && x_ mkdir -p "$XBMK_CACHE/hash" - [ ! -f "$XBMK_CACHE/hash/$project$tree" ] || \ - read -r old_pjhash < "$XBMK_CACHE/hash/$project$tree" - - fx_ "x_ sha512sum" find "$datadir" "$configdir/$tree" "$mdir" \ - -type f -not -path "*/.git*/*" | awk '{print $1}' > \ - "$xbmktmp/project.hash" || err "!h $project $tree" - - pjhash="$(sha512sum "$xbmktmp/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" - - [ "$badhash" != "y" ] || x_ rm -Rf "src/$project/$tree" \ - "elf/$project/$tree" "elf/$project/$target"; : -} - -check_cross_compiler() -{ - cbdir="src/coreboot/$tree" - [ "$project" != "coreboot" ] && cbdir="src/coreboot/default" - [ -n "$xtree" ] && cbdir="src/coreboot/$xtree" - - x_ ./mk -f coreboot "${cbdir#src/coreboot/}" - - export PATH="$xbmkpwd/$cbdir/util/crossgcc/xgcc/bin:$PATH" - export CROSS_COMPILE="${xarch% *}-" - [ -n "$xlang" ] && export BUILD_LANGUAGES="$xlang" - - # match gnat-X to gcc - check_gnu_path gcc gnat || x_ check_gnu_path gnat gcc - - xfix="${1%-*}" && [ "$xfix" = "x86_64" ] && xfix="x64" - xgccargs="crossgcc-$xfix UPDATED_SUBMODULES=1 CPUS=$XBMK_THREADS" - make -C "$cbdir" $xgccargs || x_ make -C "$cbdir" $xgccargs - - # we only want to mess with hostcc to build xgcc - remkdir "$XBMK_CACHE/gnupath" -} - -# fix mismatching gcc/gnat versions on debian trixie/sid. as of december 2024, -# trixie/sid had gnat-13 as gnat and gcc-14 as gcc, but has gnat-14 in apt. in -# some cases, gcc 13+14 and gnat-13 are present; or gnat-14 and gcc-14, but -# gnat in PATH never resolves to gnat-14, because gnat-14 was "experimental" -check_gnu_path() -{ - command -v "$1" 1>/dev/null || err "Host '$1' unavailable" - - eval "`setvars "" gccver gccfull gnatver gnatfull gccdir gnatdir`" - x_ gnu_setver "$1" "$1" || err "Command '$1' unavailable." - gnu_setver "$2" "$2" || : - - eval "[ -z \"\$$1ver\" ] && err \"Cannot detect host '$1' version\"" - [ "$gnatfull" = "$gccfull" ] && return 0 - - eval "$1dir=\"$(dirname "$(command -v "$1")")\"" - eval "_gnudir=\"\$$1dir\"; _gnuver=\"\$$1ver\"" - for _bin in "$_gnudir/$2-"*; do - [ "${_bin#"$_gnudir/$2-"}" = "$_gnuver" ] && [ -x "$_bin" ] \ - && _gnuver="${_bin#"$_gnudir/$2-"}" && break; : - done - gnu_setver "$2" "$_gnudir/$2-$_gnuver" || return 1 - [ "$gnatfull" = "$gccfull" ] || return 1 - - ( - remkdir "$XBMK_CACHE/gnupath" && x_ cd "$XBMK_CACHE/gnupath" - for _gnubin in "$_gnudir/$2"*"-$_gnuver"; do - _gnuutil="${_gnubin##*/}" && [ -e "$_gnubin" ] && \ - x_ ln -s "$_gnubin" "${_gnuutil%"-$_gnuver"}" - done - ) || err "Cannot create $2-$_gnuver link in $_gnudir"; : -} - -gnu_setver() -{ - eval "$2 --version 1>/dev/null 2>/dev/null || return 1" - eval "$1ver=\"`"$2" --version 2>/dev/null | head -n1`\"" - eval "$1ver=\"\${$1ver##* }\"" - eval "$1full=\"\$$1ver\"" - eval "$1ver=\"\${$1ver%%.*}\""; : -} - -check_defconfig() -{ - [ -f "$defconfig" ] || $dry err "$project/$target: missing defconfig" - dest_dir="$elfdir/$target/${defconfig#"$target_dir/config/"}" - - $dry elfcheck || return 1 # skip build if a previous one exists - $dry x_ mkdir -p "$dest_dir" -} - -elfcheck() -{ - # TODO: *STILL* very hacky check. do it properly (based on build.list) - ( fx_ "exit 1" find "$dest_dir" -type f ) || return 1; : -} - -handle_makefile() -{ - $dry check_makefile "$srcdir" && 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!" - - _copy=".config" && [ "$mode" = "savedefconfig" ] && _copy="defconfig" - [ "${mode%config}" = "$mode" ] || \ - $dry x_ cp "$srcdir/$_copy" "$defconfig" - - [ -e "$srcdir/.git" ] && [ "$project" = "u-boot" ] && \ - [ "$mode" = "distclean" ] && \ - $dry x_ git -C "$srcdir" $cleanargs clean -fdx; : -} - -run_make_command() -{ - [ -n "$mode" ] || x_ $premake - - $dry check_cmake "$srcdir" && [ -z "$mode" ] && \ - $dry check_autoconf "$srcdir" - $dry check_makefile "$srcdir" || return 1 - - $dry x_ make -C "$srcdir" $mode -j$XBMK_THREADS $makeargs - [ -n "$mode" ] || x_ $mkhelper - - [ "$mode" != "clean" ] || \ - $dry make -C "$srcdir" $cleanargs distclean || :; : -} - -check_cmake() -{ - [ -z "$cmakedir" ] || $dry check_makefile "$1" || cmake -B "$1" \ - "$1/$cmakedir" || $dry x_ check_makefile "$1" - [ -z "$cmakedir" ] || $dry x_ check_makefile "$1"; : -} - -check_autoconf() -{ - ( - cd "$1" || err "!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() -{ - [ -f "$1/Makefile" ] || [ -f "$1/makefile" ] || \ - [ -f "$1/GNUmakefile" ] || return 1; : -} - -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" - x_ make clean -C "$srcdir" $cleanargs -} +. "include/tree.sh" trees "$@" || exit 0 . "$mkhelpercfg" |