diff options
Diffstat (limited to 'mk')
-rwxr-xr-x | mk | 146 |
1 files changed, 62 insertions, 84 deletions
@@ -12,10 +12,12 @@ if [ "./${0##*/}" != "${0}" ] || [ ! -f "mk" ] || [ -L "mk" ]; then exit 1 fi -. "include/init.sh" . "include/lib.sh" + +. "include/init.sh" . "include/inject.sh" . "include/mrc.sh" +. "include/rom.sh" eval "`setvars "" vdir src_dirname srcdir mode`" @@ -27,7 +29,7 @@ main() version) printf "%s\nWebsite: %s\n" "$relname" "$projectsite" ;; release|download|inject) $cmd "$@" ;; -*) return 1 ;; - *) $err "bad command" ;; + *) err "bad command" ;; esac set -u -e # some commands disable them. turn them on! } @@ -38,11 +40,11 @@ release() vdir="release" while getopts d:m: option; do - [ -z "$OPTARG" ] && $err "empty argument not allowed" + [ -z "$OPTARG" ] && err "empty argument not allowed" case "$option" in d) vdir="$OPTARG" ;; m) mode="$OPTARG" ;; - *) $err "invalid option '-$option'" ;; + *) err "invalid option '-$option'" ;; esac done @@ -50,10 +52,10 @@ release() 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/" + [ -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 @@ -63,32 +65,32 @@ release() build_release() { ( - cd "$srcdir" || $err "$vdir: !cd \"$srcdir\"" + cd "$srcdir" || err "$vdir: !cd \"$srcdir\"" ./mk -f - x_ rm -Rf tmp rmgit . x_ mv src/docs docs - ) || $err "can't create release files" + ) || 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" + --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" + 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/" + touch "$srcdir/lock" || err "can't make lock file in $srcdir/" ( - cd "$srcdir" || $err "$vdir: 2 !cd \"$srcdir\"" + cd "$srcdir" || err "$vdir: 2 !cd \"$srcdir\"" + x_ ./mk -d coreboot mk -b coreboot pico-serprog stm32-vserprog pcsx-redux x_ mv bin ../roms - ) || $err "can't build rom images" + ) || err "can't build rom images" - rm -Rf "$srcdir" || $err "!rm -Rf $srcdir" + rm -Rf "$srcdir" || err "!rm -Rf $srcdir" } main "$@" && exit 0 @@ -108,7 +110,7 @@ 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" + [ -n "$_f" ] && err "only one flag is permitted" _f="$1" case "$_f" in @@ -124,7 +126,7 @@ trees() -s) mode="savedefconfig" ;; -l) mode="olddefconfig" ;; -n) mode="nconfig" ;; - *) $err "invalid option '-$option'" ;; + *) err "invalid option '-$option'" ;; esac if [ -z "${OPTARG+x}" ]; then @@ -135,14 +137,14 @@ trees() project="${OPTARG#src/}" shift 2 done - [ -z "$_f" ] && $err "missing flag ($flags)" + [ -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" + err "config/git/$project/pkg.cfg missing" for d in "elf" "config/data" "config" "src"; do eval "${d#*/}dir=\"$d/$project\"" @@ -178,8 +180,8 @@ build_project() build_targets() { - [ -d "$configdir" ] || $err "directory, $configdir, does not exist" - [ $# -gt 0 ] || targets="$(ls -1 "$configdir")" || $err "!o $configdir" + [ -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 @@ -209,7 +211,9 @@ handle_defconfig() if [ "$mode" = "distclean" ] || [ "$mode" = "crossgcc-clean" ]; then [ -d "$srcdir" ] || return 0 fi - [ -z "$mode" ] && $dry check_cross_compiler + [ -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 @@ -263,7 +267,7 @@ build_dependencies() for bd in $build_depend; do bd_p="${bd%%/*}" bd_t="${bd##*/}" - [ -z "$bd_p" ] && $dry $err "$project/$tree: !bd '$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; : @@ -275,27 +279,16 @@ check_project_hashes() [ ! -f "$XBMK_CACHE/hash/$project$tree" ] || \ read -r old_pjhash < "$XBMK_CACHE/hash/$project$tree" - x_ rm -f "$xbmktmp/project.list" "$xbmktmp/project.hash" \ - "$xbmktmp/project.tmp" - x_ touch "$xbmktmp/project.tmp" "$xbmktmp/project.hash" - - for rmchk in "$datadir" "$configdir/$tree" "$mdir"; do - [ ! -d "$rmchk" ] || find "$rmchk" -type f -not -path \ - "*/.git*/*" >> "$xbmktmp/project.tmp" || $err "!fh $rmchk" - done - sort "$xbmktmp/project.tmp" > "$xbmktmp/project.list" || $err "!pj srt" - - while read -r rmchk; do - [ ! -f "$rmchk" ] || x_ sha512sum "$rmchk" | awk \ - '{print $1}' >> "$xbmktmp/project.hash" || $err "!h $rmchk" - done < "$xbmktmp/project.list" + fx_ "x_ sha512sum" "$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" + err "!mk $XBMK_CACHE/hash/$project$tree" [ "$badhash" != "y" ] || x_ rm -Rf "src/$project/$tree" \ "elf/$project/$tree" "elf/$project/$target"; : @@ -303,30 +296,25 @@ check_project_hashes() check_cross_compiler() { - xgccargs="UPDATED_SUBMODULES=1 CPUS=$XBMK_THREADS" - for _xarch in $xarch; do - cbdir="src/coreboot/$tree" - [ "$project" != "coreboot" ] && cbdir="src/coreboot/default" - [ -n "$xtree" ] && cbdir="src/coreboot/$xtree" - - x_ ./mk -f coreboot "${cbdir#src/coreboot/}" + cbdir="src/coreboot/$tree" + [ "$project" != "coreboot" ] && cbdir="src/coreboot/default" + [ -n "$xtree" ] && cbdir="src/coreboot/$xtree" - export PATH="$xbmkpwd/$cbdir/util/crossgcc/xgcc/bin:$PATH" - export CROSS_COMPILE="${xarch% *}-" - [ -n "$xlang" ] && export BUILD_LANGUAGES="$xlang" + x_ ./mk -f coreboot "${cbdir#src/coreboot/}" - xfix="${_xarch%-*}" && [ "$xfix" = "x86_64" ] && xfix="x64" + 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 + # match gnat-X to gcc + check_gnu_path gcc gnat || x_ check_gnu_path gnat gcc - # sometimes buildgcc fails for like no reason. try twice. - make -C "$cbdir" crossgcc-$xfix $xgccargs || \ - x_ make -C "$cbdir" crossgcc-$xfix $xgccargs + 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 - rm -f "$XBMK_CACHE/gnupath/"* || $err "Can't clear gnupath/"; : - done; : + # 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, @@ -335,40 +323,30 @@ check_cross_compiler() # gnat in PATH never resolves to gnat-14, because gnat-14 was "experimental" check_gnu_path() { - [ $# -lt 2 ] && $err "check_gnu_path: Too few arguments" - [ "$1" = "$2" ] && $err "check_gnu_path: Both arguments identical" - for _gnuarg in 1 2; do - eval "[ \"\$$_gnuarg\" = \"gcc\" ] && continue" - eval "[ \"\$$_gnuarg\" = \"gnat\" ] && continue" - $err "check_gnu_path: Invalid argument \"$_gnuarg\"" - done - command -v "$1" 1>/dev/null || $err "Host '$1' unavailable" + command -v "$1" 1>/dev/null || err "Host '$1' unavailable" eval "`setvars "" gccver gccfull gnatver gnatfull gccdir gnatdir`" - gnu_setver "$1" "$1" || $err "Command '$1' unavailable." - gnu_setver "$2" "$2" || : + x_ gnu_setver "$1" "$1" && gnu_setver "$2" "$2" || : - eval "[ -z \"\$$1ver\" ] && $err \"Cannot detect host '$1' version\"" + 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 _gnubin in "$_gnudir/$2-"*; do - [ -f "$_gnubin" ] || continue - [ "${_gnubin#"$_gnudir/$2-"}" = "$_gnuver" ] || continue - _gnuver="${_gnubin#"$_gnudir/$2-"}"; break + 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 ( - rm -f "$XBMK_CACHE/gnupath/"* || $err "Cannot clear gnupath/" - cd "$XBMK_CACHE/gnupath" || $err "Can't cd to gnupath/" + 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"; : + ) || err "Cannot create $2-$_gnuver link in $_gnudir"; : } gnu_setver() @@ -382,7 +360,7 @@ gnu_setver() check_defconfig() { - [ -f "$defconfig" ] || $dry $err "$project/$target: missing 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 @@ -405,7 +383,7 @@ handle_makefile() [ -n "$mode" ] || [ -n "$btype" ] || $dry make -C \ "$srcdir" silentoldconfig || make -C "$srcdir" oldconfig || : - run_make_command || $err "handle_makefile $srcdir: no makefile!" + run_make_command || err "handle_makefile $srcdir: no makefile!" _copy=".config" && [ "$mode" = "savedefconfig" ] && _copy="defconfig" [ "${mode%config}" = "$mode" ] || \ @@ -441,11 +419,11 @@ check_cmake() check_autoconf() { ( - cd "$1" || $err "!cd $1" + 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"; : + ) || err "can't bootstrap project: $1"; : } check_makefile() |