diff options
Diffstat (limited to 'script/trees')
| -rwxr-xr-x | script/trees | 280 | 
1 files changed, 143 insertions, 137 deletions
| diff --git a/script/trees b/script/trees index 4ab0d406..ce6da422 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=$XBMK_THREADS" -eval `setvars "" xarch cdir defconfig cmakedir xlang mode makeargs elfdir cmd \ -    project target target_dir targets xtree _f target1 bootstrapargs mkhelper \ -    autoconfargs listfile autogenargs btype tree rev tree_depend` +eval `setvars "" xarch srcdir premake cmakedir xlang mode makeargs elfdir cmd \ +    project target target_dir targets xtree _f release bootstrapargs mkhelper \ +    autoconfargs listfile autogenargs btype tree rev tree_depend build_depend \ +    defconfig postmake mkhelpercfg dry dest_dir mdir badhash`  main()  { -	while getopts f:b:m:u:c:x:s:l:n: option; do +	while getopts f:b:m:u:c:x:s:l:n:d: option; do  		[ -n "$_f" ] && $err "only one flag is permitted" -		_f="$1" +		_f="$1" && [ "$_f" = "-d" ] && dry=":"  		case "$1" in +		-d) mode="" ;;  		-b) mode="" ;;  		-u) mode="oldconfig" ;;  		-m) mode="menuconfig" ;; @@ -36,123 +37,98 @@ main()  	done  	[ -z "$_f" ] && $err "missing flag (-m/-u/-b/-c/-x/-f/-s/-l/-n)"  	[ -z "$project" ] && for p in $(ls -1 config/git); do -		./update trees $_f "$p" || $err "!./update trees $_f $p" -		[ "$XBMK_RELEASE" != "y" ] || singletree "$p" || \ -		    x_ rm -Rf "src/$p/$p"; continue -	done && return 0 +		./update trees $_f "$p" || $err "!./update trees $_f $p"; : +	done && return 1  	[ -f "config/git/$project/pkg.cfg" ] || $err "'$project' not defined" -	elfdir="elf/$project" -	datadir="config/data/$project" -	cfgsdir="config/$project" -	listfile="$datadir/build.list" # needed on multi, optional on single +	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 -	remkdir "${tmpgit%/*}" - -	cmd="build_targets" && singletree "$project" && cmd="build_project" -	$cmd $@ +	mkhelpercfg="$datadir/mkhelper.cfg" +	e "$mkhelpercfg" f missing && mkhelpercfg="$TMPDIR/mkhelper.cfg" && \ +	    x_ touch "$mkhelpercfg" -	[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && return 0 +	targets="$@" +	cmd="build_targets $targets" && singletree "$project" && \ +	    cmd="build_project" -	[ -f "$listfile" ] || return 0 -	[ -z "$mode" ] && printf "\n\nOK! Check %s/\n\n" "$elfdir"; return 0 +	remkdir "${tmpgit%/*}"  }  build_project()  { -	load_target_config "$cfgsdir" || return 0 -	[ -f "$listfile" ] || listfile="" # optional on single-tree - -	dest_dir="$elfdir" -	[ ! -f "$listfile" ] || elfcheck || return 0 - -	cdir="src/${project}" -	x_ ./update trees -f "$project" +	configure_project "$configdir" || return 0 +	[ ! -f "$listfile" ] || $dry elfcheck || return 0  	[ "$mode" = "distclean" ] && mode="clean"  	run_make_command || return 0 -	[ -n "$mode" ] || copy_elf; return 0 +	[ -n "$mode" ] || $dry copy_elf; return 0  }  build_targets()  { -	[ "$elfdir" = "elf/coreboot" ] && elfdir="$cbelfdir" - -	[ -d "$cfgsdir" ] || $err "directory, $cfgsdir, does not exist" -	[ -f "$listfile" ] || $err "list file, $listfile, does not exist" - -	# Build for all targets if no argument is given -	[ $# -gt 0 ] && target1="$1" -	[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && shift 1 -	targets="$(ls -1 "$cfgsdir")" || $err "Can't get options for $cfgsdir" -	[ $# -gt 0 ] && targets=$@ +	[ -d "$configdir" ] || $err "directory, $configdir, does not exist" +	[ $# -gt 0 ] || targets="$(ls -1 "$configdir")" || $err "!o $configdir" -	handle_targets -} - -handle_targets() -{  	for x in $targets; do +		[ "$x" = "list" ] && x_ ls -1 "config/$project" && \ +		    listfile="" && break  		target="$x"  		printf "'make %s', '%s', '%s'\n" "$mode" "$project" "$target" -		[ "$project" != "coreboot" ] || [ -n "$mode" ] || \ -		    [ "$target1" = "utils" ] || x_ ./vendor download $target  		x_ handle_defconfig -	done -} - -handle_defconfig() -{ -	handle_src_tree "$target" || return 0 - -	[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && \ -		eval "check_coreboot_utils \"$tree\"; return 0" - -	for y in "$target_dir/config"/*; do -		[ -f "$y" ] || continue -		defconfig="$y" - -		[ -n "$mode" ] || check_defconfig || continue -		handle_makefile -		[ -n "$mode" ] || copy_elf +		[ -n "$mode" ] || [ -z "$postmake" ] || $postmake || \ +		    $err "$project/$target: !postmake: $postmake"; continue  	done; return 0  } -handle_src_tree() +handle_defconfig()  { -	target_dir="$cfgsdir/$target" +	target_dir="$configdir/$target"  	[ -f "CHANGELOG" ] || fetch_project "$project" -	load_target_config "$target_dir" || return 1 +	configure_project "$target_dir" || return 0  	x_ mkdir -p "$elfdir/$target"  	chkvars tree -	cdir="src/$project/$tree" +	srcdir="src/$project/$tree"  	if [ "$mode" = "distclean" ] || [ "$mode" = "crossgcc-clean" ]; then -		[ -d "$cdir" ] || return 1 +		[ -d "$srcdir" ] || return 0  	fi -	x_ ./update trees -f "$project" "$target" +	[ -z "$mode" ] && $dry check_cross_compiler + +	for y in "$target_dir/config"/*; do +		[ "$_f" = "-d" ] || [ -f "$y" ] || continue +		[ "$_f" = "-d" ] || defconfig="$y" -	[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && return 0 -	[ -z "$mode" ] && check_cross_compiler; return 0 +		[ -n "$mode" ] || check_defconfig || continue +		handle_makefile +		[ -n "$mode" ] || $dry copy_elf +	done; return 0  } -load_target_config() +configure_project()  { -	eval `setvars "" xarch xlang bootstrapargs autoconfargs xtree \ -	    tree_depend makeargs btype mkhelper` +	eval `setvars "" xarch xlang build_depend autoconfargs xtree postmake \ +	    tree_depend makeargs btype mkhelper bootstrapargs premake release \ +	    badhash` +  	[ -f "$1/target.cfg" ] || btype="auto"  	[ -f "$datadir/mkhelper.cfg" ] && eval `setcfg "$datadir/mkhelper.cfg"`  	_tcfg="$1/target.cfg" -	while [ -f "$_tcfg" ] || [ "$cmd" = "build_targets" ]; do +	while [ -f "$_tcfg" ] || [ "$cmd" != "build_project" ]; do  		eval `setvars "" rev tree`  		printf "Loading %s config: %s\n" "$project" "$_tcfg"  		eval `setcfg "$_tcfg"` + +		[ "$_f" = "-d" ] && build_depend="" # dry run  		[ "$cmd" = "build_project" ] && break  		[ "$mode" = "fetch" ] || break @@ -160,14 +136,75 @@ load_target_config()  		    && 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" ] && build_dependencies + +	mdir="$PWD/config/submodule/$project" +	[ -n "$tree" ] && mdir="$mdir/$tree" + +	[ -f "CHANGELOG" ] || check_project_hashes + +	[ "$mode" = "fetch" ] || x_ ./update trees -f "$project" $target  	[ "$mode" = "fetch" ] || return 0 +  	[ -f "CHANGELOG" ] && return 1; fetch_${cmd#build_}; return 1  } +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 ./update trees -b $bd_p $bd_t \ +		    || $err "!mk $project/$tree $bd_p/$bd_t"; continue +	done; return 0 +} + +check_project_hashes() +{ +	mkdir -p "$XBMK_CACHE/hash" || $err "!mkdir '$XBMK_CACHE/hash'" + +	old_pjhash="" +	[ ! -f "$XBMK_CACHE/hash/$project$tree" ] || \ +	    read -r old_pjhash < "$XBMK_CACHE/hash/$project$tree" + +	x_ rm -f "$TMPDIR/project.list" "$TMPDIR/project.hash" \ +	    "$TMPDIR/project.tmp"; x_ touch "$TMPDIR/project.tmp" +	x_ touch "$TMPDIR/project.hash" + +	for delcheck in "$datadir" "$configdir/$tree" "$mdir"; do +		[ -d "$delcheck" ] || continue +		find "$delcheck" -type f -not -path "*/.git*/*" \ +		    >> "$TMPDIR/project.tmp" || \ +		    $err "!find $delcheck > project.tmp" +	done +	sort "$TMPDIR/project.tmp" > "$TMPDIR/project.list" || \ +	    $err "!sort project tmp/list" + +	while read -r delcheck; do +		[ -f "$delcheck" ] || continue +		sha512sum "$delcheck" | awk '{print $1}' >> \ +		    "$TMPDIR/project.hash" || $err "!findhash $delcheck" +	done < "$TMPDIR/project.list" + +	pjhash="$(sha512sum "$TMPDIR/project.hash" | awk '{print $1}')" || : +	badhash="y" && [ "$pjhash" = "$old_pjhash" ] && badhash="n" +	[ -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" = "n" ] || rm -Rf "src/$project/$tree" \ +	    "elf/$project/$tree" "elf/$project/$target" || \ +	    $err "!rmproject $project $tree"; : +} +  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" @@ -180,35 +217,19 @@ check_cross_compiler()  		[ -n "$xlang" ] && export BUILD_LANGUAGES="$xlang"  		# 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() -{ -	for util in cbfstool ifdtool; do -		utilelfdir="elf/$util/$1" -		utilsrcdir="src/coreboot/$1/util/$util" - -		utilmode="" && [ -n "$mode" ] && utilmode="clean" -		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" -		[ -z "$mode" ] || x_ rm -Rf "$utilelfdir" +		make -C "$cbdir" crossgcc-${_xarch%-*} $xgccargs || \ +		    make -C "$cbdir" crossgcc-${_xarch%-*} $xgccargs || \ +		    $err "!mkxgcc $project/$xtree '${_xarch%-*}' '$xgccargs'"  	done; return 0  }  check_defconfig()  { -	[ -f "$defconfig" ] || $err "$project/$target: missing defconfig" - +	[ -f "$defconfig" ] || $dry $err "$project/$target: missing defconfig"  	dest_dir="$elfdir/$target/${defconfig#"$target_dir/config/"}" -	elfcheck || return 1 # skip build if a previous one exists -	x_ mkdir -p "$dest_dir" +	$dry elfcheck || return 1 # skip build if a previous one exists +	$dry x_ mkdir -p "$dest_dir"  }  elfcheck() @@ -221,41 +242,41 @@ elfcheck()  handle_makefile()  { -	check_makefile "$cdir" && x_ make clean -C "$cdir" -	x_ cp "$defconfig" "$cdir/.config" -	[ -n "$mode" ] || [ -n "$btype" ] || make -C "$cdir" \ -	    silentoldconfig || make -C "$cdir" oldconfig || : +	$dry check_makefile "$srcdir" && x_ make clean -C "$srcdir" +	[ -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 $cdir: no makefile!" +	run_make_command || $err "handle_makefile $srcdir: no makefile!"  	_copy=".config" && [ "$mode" = "savedefconfig" ] && _copy="defconfig" -	[ "${mode%config}" = "$mode" ] || x_ cp "$cdir/$_copy" "$defconfig" +	[ "${mode%config}" = "$mode" ] || \ +	    $dry x_ cp "$srcdir/$_copy" "$defconfig" -	[ -e "$cdir/.git" ] && [ "$project" = "u-boot" ] && \ -	    [ "$mode" = "distclean" ] && x_ git -C "$cdir" clean -fdx; return 0 +	[ -e "$srcdir/.git" ] && [ "$project" = "u-boot" ] && \ +	    [ "$mode" = "distclean" ] && $dry x_ git -C "$srcdir" clean -fdx; :  }  run_make_command()  { -	check_cmake "$cdir" && [ -z "$mode" ] && check_autoconf "$cdir" -	check_makefile "$cdir" || return 1 +	[ -z "$premake" ] || [ -n "$mode" ] || $premake || $err "!$premake" -	[ "$project" = "coreboot" ] && [ -z "$mode" ] && x_ \ -		printf "%s\n" "${version%%-*}" > "$cdir/.coreboot-version" \ -		    && makeargs="$makeargs $cbmakeargs" +	$dry check_cmake "$srcdir" && [ -z "$mode" ] && $dry check_autoconf \ +	    "$srcdir"; $dry check_makefile "$srcdir" || return 1 -	make -C "$cdir" $mode -j$XBMK_THREADS $makeargs || $err "$cdir mk$mode" +	$dry make -C "$srcdir" $mode -j$XBMK_THREADS $makeargs || $err "!$mode"  	[ -z "$mkhelper" ] || [ -n "$mode" ] || $mkhelper || $err "!$mkhelper" -	[ "$mode" = "clean" ] && make -C "$cdir" distclean || :; return 0 +	[ "$mode" = "clean" ] && $dry make -C "$srcdir" distclean || :; :  }  check_cmake()  { -	[ -z "$cmakedir" ] || check_makefile "$1" || cmake -B "$1" \ -	    "$1/$cmakedir" || check_makefile "$1" || $err "$1: !cmk $cmakedir" -	[ -z "$cmakedir" ] || check_makefile "$1" || \ -		$err "check_cmake $1: can't generate Makefile"; return 0 +	[ -z "$cmakedir" ] || $dry check_makefile "$1" || cmake -B "$1" \ +	    "$1/$cmakedir" || $dry check_makefile "$1" || $err \ +	    "$1: !cmk $cmakedir" +	[ -z "$cmakedir" ] || $dry check_makefile "$1" || \ +	    $err "check_cmake $1: can't generate Makefile"; return 0  }  check_autoconf() @@ -274,28 +295,13 @@ check_makefile()  	    [ -f "$1/GNUmakefile" ] || return 1; return 0  } -mkpayload_grub() -{ -	eval `setvars "" grub_modules grub_install_modules` -	eval `setcfg "$grubdata/module/$tree"` - -	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" \ -	    --install-modules="$grub_install_modules" \ -	    "/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"; return 0 -} -  copy_elf()  {  	[ -f "$listfile" ] && x_ mkdir -p "$dest_dir" && while read -r f; do -		[ -f "$cdir/$f" ] && x_ cp "$cdir/$f" "$dest_dir" -	done < "$listfile"; x_ make clean -C "$cdir" +		[ -f "$srcdir/$f" ] && x_ cp "$srcdir/$f" "$dest_dir" +	done < "$listfile"; x_ make clean -C "$srcdir"  } -main $@ +main $@ || exit 0 +. "$mkhelpercfg" +$cmd | 
