summaryrefslogtreecommitdiff
path: root/script/trees
diff options
context:
space:
mode:
Diffstat (limited to 'script/trees')
-rwxr-xr-xscript/trees99
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()