diff options
Diffstat (limited to 'script/trees')
-rwxr-xr-x | script/trees | 99 |
1 files changed, 52 insertions, 47 deletions
diff --git a/script/trees b/script/trees index 13f6d652..6865a018 100755 --- a/script/trees +++ b/script/trees @@ -9,17 +9,18 @@ set -u -e . "include/lib.sh" . "include/git.sh" -cbmakeargs="UPDATED_SUBMODULES=1 CPUS=$threads" -eval "$(setvars "" xarch cdir config config_name xlang mode makeargs \ - listfile project target target_dir targets tree _f target1 bootstrapargs \ - autoconfargs cmakedir elfdir autogenargs xtree)" +cbmakeargs="UPDATED_SUBMODULES=1 CPUS=$XBMK_THREADS" +eval `setvars "" xarch cdir config cmakedir xlang mode makeargs elfdir xtree \ + project target target_dir targets tree _f target1 bootstrapargs mkhelper \ + autoconfargs config_name listfile autogenargs btype` main() { while getopts f:b:m:u:c:x:s:l:n: option; do + [ -n "$_f" ] && $err "only one flag is permitted" _f="$1" case "$1" in - -b) : ;; + -b) mode="" ;; -u) mode="oldconfig" ;; -m) mode="menuconfig" ;; -c) mode="distclean" ;; @@ -28,14 +29,15 @@ main() -s) mode="savedefconfig" ;; -l) mode="olddefconfig" ;; -n) mode="nconfig" ;; - *) badcmd "invalid option '-$option'" ;; + *) $err "invalid option '-$option'" ;; esac - shift; project="${OPTARG#src/}"; shift + [ -n "${OPTARG+x}" ] || $err "OPTARG not set" + project="${OPTARG#src/}"; shift 2 done [ -z "$_f" ] && $err "missing flag (-m/-u/-b/-c/-x/-f/-s/-l/-n)" [ -z "$project" ] && $err "project name not specified" - [ -f "config/git/$project" ] || $err "project '$project' not defined" + [ -f "config/git/$project/pkg.cfg" ] || $err "'$project' not defined" elfdir="elf/$project" datadir="config/data/$project" @@ -44,31 +46,30 @@ main() remkdir "${tmpgit%/*}" - _cmd="build_projects" - singletree "$project" || _cmd="build_targets" + _cmd="build_targets" && singletree "$project" && _cmd="build_project" $_cmd $@ [ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && return 0 [ -f "$listfile" ] || return 0 - [ -z "$mode" ] && printf "\n\nDone! Check %s/\n\n" "$elfdir"; return 0 + [ -z "$mode" ] && printf "\n\nOK! Check %s/\n\n" "$elfdir"; return 0 } -build_projects() +build_project() { - [ $# -gt 0 ] && x_ ./update trees $_f $@ - - [ "$mode" = "fetch" ] && [ ! -f "CHANGELOG" ] && \ - eval "fetch_project_repo; return 0;" + if [ "$mode" = "fetch" ]; then + [ -f "CHANGELOG" ] && return 0 + fetch_project_repo; return 0 + fi - load_project_config "$cfgsdir" + load_project_config "$cfgsdir" 0 || return 0 [ -f "$listfile" ] || listfile="" # optional on single-tree dest_dir="$elfdir" [ ! -f "$listfile" ] || elfcheck || return 0 cdir="src/${project}" - [ -d "$cdir" ] || x_ ./update trees -f "$project" + x_ ./update trees -f "$project" [ "$mode" = "distclean" ] && mode="clean" run_make_command || return 0 @@ -124,10 +125,12 @@ handle_defconfig() handle_src_tree() { target_dir="$cfgsdir/$target" - [ "$mode" = "fetch" ] && [ ! -f "CHANGELOG" ] && \ - eval "fetch_project_trees; return 1;" + if [ "$mode" = "fetch" ]; then + [ -f "CHANGELOG" ] && return 1 + fetch_project_trees; return 1 + fi - load_project_config "$target_dir" + load_project_config "$target_dir" || return 1 x_ mkdir -p "$elfdir/$target" chkvars tree @@ -148,11 +151,17 @@ handle_src_tree() load_project_config() { - eval "$(setvars "" xarch xlang tree bootstrapargs autoconfargs xtree \ - tree_depend makeargs)" + eval `setvars "" xarch xlang tree bootstrapargs autoconfargs xtree \ + tree_depend makeargs btype mkhelper` + [ -f "$1/target.cfg" ] || btype="auto" + + # target.cfg optional on single-tree so return if missing. + # target.cfg mandatory on multi-tree so err if missing. + _setcfgarg="" && [ $# -gt 1 ] && _setcfgarg="$2" + eval `setcfg "$1/target.cfg" $_setcfgarg` - [ -f "$1/target.cfg" ] || return 0 - . "$1/target.cfg" || $err "loadp $1: can't load target.cfg"; return 0 + [ -z "$btype" ] || [ "${mode%config}" = "$mode" ] || \ + return 1; return 0 } check_cross_compiler() @@ -168,9 +177,11 @@ check_cross_compiler() export CROSS_COMPILE="${xarch% *}-" [ -n "$xlang" ] && export BUILD_LANGUAGES="$xlang" - [ -d "$cbdir/util/crossgcc/xgcc/$_xarch/" ] && continue - x_ make -C "$cbdir" crossgcc-${_xarch%-*} $cbmakeargs - done + # sometimes buildgcc fails for like no reason. try twice. + make -C "$cbdir" crossgcc-${_xarch%-*} $cbmakeargs || \ + make -C "$cbdir" crossgcc-${_xarch%-*} $cbmakeargs || \ + $err "!mkxgcc $project/$xtree '${_xarch%-*}' '$cbmakeargs'" + done; return 0 } check_coreboot_utils() @@ -181,7 +192,7 @@ check_coreboot_utils() utilmode="" [ -z "$mode" ] || utilmode="clean" - x_ make -C "$utilsrcdir" $utilmode -j$threads $cbmakeargs + x_ make -C "$utilsrcdir" $utilmode -j$XBMK_THREADS $cbmakeargs [ -z "$mode" ] && [ ! -f "$utilelfdir/$util" ] && \ x_ mkdir -p "$utilelfdir" && \ x_ cp "$utilsrcdir/$util" "elf/$util/$1" @@ -203,18 +214,15 @@ elfcheck() { # TODO: very hacky check. do it properly (based on build.list) for elftest in "$dest_dir"/*; do - [ -e "$elftest" ] || continue - e "$elftest" f && return 1 - done + [ -e "$elftest" ] && e "$elftest" f && return 1 + done; return 0 } handle_makefile() { - [ "$project" = "grub" ] && [ "${mode%config}" != "$mode" ] && return 0 - check_makefile "$cdir" && x_ make clean -C "$cdir" x_ cp "$config" "$cdir/.config" - [ -n "$mode" ] || [ "$project" = "grub" ] || make -C "$cdir" \ + [ -n "$mode" ] || [ -n "$btype" ] || make -C "$cdir" \ silentoldconfig || make -C "$cdir" oldconfig || : run_make_command || $err "handle_makefile $cdir: no makefile!" @@ -229,17 +237,17 @@ handle_makefile() run_make_command() { - check_cmake "$cdir" - [ -z "$mode" ] && check_autoconf "$cdir" + check_cmake "$cdir" && [ -z "$mode" ] && check_autoconf "$cdir" check_makefile "$cdir" || return 1 [ "$project" = "coreboot" ] && [ -z "$mode" ] && x_ \ printf "%s\n" "${version%%-*}" > "$cdir/.coreboot-version" \ && makeargs="$makeargs $cbmakeargs" - make -C "$cdir" $mode -j$threads $makeargs || $err "!mk $cdir $mode" + make -C "$cdir" $mode -j$XBMK_THREADS $makeargs || $err "$cdir mk$mode" - [ "$project" = "grub" ] && [ -z "$mode" ] && mkpayload_grub + [ -z "$mkhelper" ] || [ -n "$mode" ] || $mkhelper || \ + $err "$cdir: helper command failed: $mkhelper" # eg mkpayload_grub [ "$mode" != "clean" ] && return 0 make -C "$cdir" distclean 2>/dev/null || : @@ -271,15 +279,12 @@ check_makefile() mkpayload_grub() { - [ -f "$grubdata/module/$tree" ] || $err "$tree: grub modules missing" - x_ rm -f "$cdir/grub.elf" - - eval "$(setvars "" grub_modules grub_install_modules)" - - . "$grubdata/module/$tree" || $err "$tree: !source grub modules" - + eval `setvars "" grub_modules grub_install_modules` + eval `setcfg "$grubdata/module/$tree"` chkvars "grub_install_modules" "grub_modules" + x_ rm -f "$cdir/grub.elf" + "${cdir}/grub-mkstandalone" --grub-mkimage="${cdir}/grub-mkimage" \ -O i386-coreboot -o "${cdir}/grub.elf" -d "${cdir}/grub-core/" \ --fonts= --themes= --locales= --modules="$grub_modules" \ @@ -287,7 +292,7 @@ mkpayload_grub() "/boot/grub/grub_default.cfg=${cdir}/.config" \ "/boot/grub/grub.cfg=$grubdata/memdisk.cfg" \ "/background.png=$grubdata/background/background1280x800.png" || \ - $err "$tree: cannot build grub.elf" + $err "$tree: cannot build grub.elf"; return 0 } copy_elf() |