diff options
| author | Leah Rowe <leah@libreboot.org> | 2023-05-27 11:44:54 +0100 | 
|---|---|---|
| committer | Leah Rowe <leah@libreboot.org> | 2023-05-27 11:44:54 +0100 | 
| commit | ff954c5b73c4010f9984e0c543779f3692767c0c (patch) | |
| tree | 06ea78331b0ffd849c5334f33514de4c311b9f36 /resources/scripts/update | |
| parent | 092600d163e771d31da07d88a03fe669aa4708f1 (diff) | |
unify download/build scripts
move resources/scripts/download/ to:
resources/scripts/update/module/
This: ./download coreboot
Is now: ./update module coreboot
However, running "./download coreboot"
still works, via backwards compatibility.
Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'resources/scripts/update')
| -rwxr-xr-x | resources/scripts/update/module/bios_extract | 22 | ||||
| -rwxr-xr-x | resources/scripts/update/module/coreboot | 182 | ||||
| -rwxr-xr-x | resources/scripts/update/module/flashrom | 24 | ||||
| -rwxr-xr-x | resources/scripts/update/module/grub | 32 | ||||
| -rwxr-xr-x | resources/scripts/update/module/me_cleaner | 25 | ||||
| -rwxr-xr-x | resources/scripts/update/module/memtest86plus | 32 | ||||
| -rwxr-xr-x | resources/scripts/update/module/mrc | 188 | ||||
| -rwxr-xr-x | resources/scripts/update/module/seabios | 29 | ||||
| -rwxr-xr-x | resources/scripts/update/module/u-boot | 261 | 
9 files changed, 795 insertions, 0 deletions
diff --git a/resources/scripts/update/module/bios_extract b/resources/scripts/update/module/bios_extract new file mode 100755 index 00000000..1688aabe --- /dev/null +++ b/resources/scripts/update/module/bios_extract @@ -0,0 +1,22 @@ +#!/usr/bin/env sh +# +#   Copyright (C) 2023 Leah Rowe <info@minifree.org> +# +#    This program is free software: you can redistribute it and/or modify +#    it under the terms of the GNU General Public License as published by +#    the Free Software Foundation, either version 3 of the License, or +#    (at your option) any later version. +# +#    This program is distributed in the hope that it will be useful, +#    but WITHOUT ANY WARRANTY; without even the implied warranty of +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#    GNU General Public License for more details. +# +#    You should have received a copy of the GNU General Public License +#    along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +./gitclone bios_extract diff --git a/resources/scripts/update/module/coreboot b/resources/scripts/update/module/coreboot new file mode 100755 index 00000000..75b61a6f --- /dev/null +++ b/resources/scripts/update/module/coreboot @@ -0,0 +1,182 @@ +#!/usr/bin/env bash + +#  helper script: download coreboot +# +#	Copyright (C) 2014-2016,2020,2021,2023 Leah Rowe <info@minifree.org> +#	Copyright (C) 2022 Alper Nebi Yasak <alpernebiyasak@gmail.com> +# +#	This program is free software: you can redistribute it and/or modify +#	it under the terms of the GNU General Public License as published by +#	the Free Software Foundation, either version 3 of the License, or +#	(at your option) any later version. +# +#	This program is distributed in the hope that it will be useful, +#	but WITHOUT ANY WARRANTY; without even the implied warranty of +#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#	GNU General Public License for more details. +# +#	You should have received a copy of the GNU General Public License +#	along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +_board="" +cbtree="" +cbrevision="" + +cbcfgsdir="resources/coreboot" + +main() +{ +	rm -f ${cbcfgsdir}/*/seen + +	printf "Downloading coreboot and (if available) applying patches\n" + +	boards="" +	if [ $# -gt 0 ]; then +		boards=$@ +	else +		for board in "${cbcfgsdir}/"*; do +			[ ! -d "${board}" ] && continue +			boards="${boards} ${board##*/}" +		done +	fi +	for board in ${boards}; do +		rm -f "${cbcfgsdir}"/*/seen +		download_coreboot_for_board "${board}" +	done + +	rm -f ${cbcfgsdir}/*/seen +} + +download_coreboot_for_board() +{ +	_board="${1}" +	cbtree="undefined" +	cbrevision="undefined" + +	fetch_coreboot_config "${_board}" || exit 1 + +	rm -f "${cbcfgsdir}"/*/seen + +	if [ -d "coreboot/${cbtree}" ]; then +		printf "REMARK: download/coreboot %s: exists. Skipping.\n" \ +				${cbtree} +		[ "${cbtree}" != "${1}" ] && \ +			printf "(for board: '%s}')\n" ${1} +		return 0 +	fi + +	gitclone_coreboot_from_upstream || exit 1 + +	prepare_new_coreboot_tree "${1}" "${cbtree}" "${cbrevision}" \ +			|| exit 1 +} + +fetch_coreboot_config() +{ +	_board=${1} + +	while true; do +		cbrevision="undefined" +		cbtree="undefined" + +		check_config_for_board "${_board}" || return 1 + +		# This is to override $cbrevision and $cbtree +		source "${cbcfgsdir}/${_board}/board.cfg" || exit 1 + +		if [ "${_board}" != "${cbtree}" ]; then +			_board="${cbtree}" +			continue +		elif [ "${cbtree}" = "undefined" ]; then +			printf "ERROR: download/coreboot:" +			printf " tree name undefined for '%s\n'" \ +					${_board} +			return 1 +		elif [ "${cbrevision}" = "undefined" ]; then +			printf "ERROR: download/coreboot:" +			printf " commit ID undefined for '%s'\n" \ +					${_board} +			return 1 +		else +			break +		fi +	done +} + +check_config_for_board() +{ +	_board=${1} + +	if [ ! -f "${cbcfgsdir}/${_board}/board.cfg" ]; then +		printf "ERROR: download/coreboot: board.cfg does not" +		printf " exist for '%s'\n" ${_board} +		return 1 +	elif [ -f "${cbcfgsdir}/${_board}/seen" ]; then +		printf "ERROR: download/coreboot: logical loop:" +		printf " '%s' board.cfg refers to another tree," ${_board} +		printf " which ultimately refers back to '%s'." ${_board} +		return 1 +	fi +	touch "${cbcfgsdir}/${_board}/seen" +} + +gitclone_coreboot_from_upstream() +{ +	[ ! -d coreboot ] && \ +		mkdir -p coreboot +	[ ! -d coreboot ] && \ +		return 1 +	[ -d coreboot/coreboot ] && \ +		return 0 +	./gitclone coreboot || \ +		return 1 +} + +prepare_new_coreboot_tree() +{ +	target=${1} +	cbtree=${2} +	cbrevision=${3} + +	printf "Preparing coreboot tree: %s\n" ${cbtree} +	[ "${cbtree}" != "${target}" ] && \ +		printf "(for board: %s)\n" "${target}" + +	cp -R coreboot/coreboot "coreboot/${cbtree}" || exit 1 +	( +	cd "coreboot/${cbtree}" \ +		|| err "cannot cd to coreboot/${cbtree}" +	git reset --hard ${cbrevision} \ +		|| err "cannot reset coreboot revision for tree, ${cbtree}" +	git submodule update --init --checkout \ +		|| err "cannot update coreboot submodules for tree, ${cbtree}" + +	for patch in ../../"${cbcfgsdir}"/"${cbtree}"/patches/*.patch; do +		[ ! -f "${patch}" ] && \ +			continue +		if ! git am "${patch}"; then +			git am --abort +			err "cannot patch ${cbtree}" +		fi +	done + +	# extra.sh can be used for anything +	# but should *only* be a last resort +	if [ -f "../../${cbcfgsdir}/${cbtree}/extra.sh" ]; then +		"../../${cbcfgsdir}/${cbtree}/extra.sh" || \ +			err "${cbtree} extra.sh" +	fi +	) +} + +err() +{ +	printf "ERROR: %s: %s\n" $0 $1 1>&2 +	exit 1 +} + +main $@ diff --git a/resources/scripts/update/module/flashrom b/resources/scripts/update/module/flashrom new file mode 100755 index 00000000..6aa3cab4 --- /dev/null +++ b/resources/scripts/update/module/flashrom @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +#  helper script: downloads flashrom and patches it +# +#	Copyright (C) 2014, 2015, 2020, 2021 Leah Rowe <info@minifree.org> +# +#    This program is free software: you can redistribute it and/or modify +#    it under the terms of the GNU General Public License as published by +#    the Free Software Foundation, either version 3 of the License, or +#    (at your option) any later version. +# +#    This program is distributed in the hope that it will be useful, +#    but WITHOUT ANY WARRANTY; without even the implied warranty of +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#    GNU General Public License for more details. +# +#    You should have received a copy of the GNU General Public License +#    along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +./gitclone flashrom diff --git a/resources/scripts/update/module/grub b/resources/scripts/update/module/grub new file mode 100755 index 00000000..0620a775 --- /dev/null +++ b/resources/scripts/update/module/grub @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +#  helper script: Downloads GRUB and patches it. +# +#	Copyright (C) 2014,2015,2016,2020,2021,2023 Leah Rowe +#							<info@minifree.org> +# +#    This program is free software: you can redistribute it and/or modify +#    it under the terms of the GNU General Public License as published by +#    the Free Software Foundation, either version 3 of the License, or +#    (at your option) any later version. +# +#    This program is distributed in the hope that it will be useful, +#    but WITHOUT ANY WARRANTY; without even the implied warranty of +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#    GNU General Public License for more details. +# +#    You should have received a copy of the GNU General Public License +#    along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +./gitclone grub +./gitclone gnulib || rm -Rf grub/ +if [ ! -d grub ]; then +	printf "%s: Could not download grub and gnulib\n" ${0} +	exit 1 +else +	exit 0 +fi diff --git a/resources/scripts/update/module/me_cleaner b/resources/scripts/update/module/me_cleaner new file mode 100755 index 00000000..7dd52be7 --- /dev/null +++ b/resources/scripts/update/module/me_cleaner @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# +#   Copyright (C) 2020 Leah Rowe <info@minifree.org> +# +#    This program is free software: you can redistribute it and/or modify +#    it under the terms of the GNU General Public License as published by +#    the Free Software Foundation, either version 3 of the License, or +#    (at your option) any later version. +# +#    This program is distributed in the hope that it will be useful, +#    but WITHOUT ANY WARRANTY; without even the implied warranty of +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#    GNU General Public License for more details. +# +#    You should have received a copy of the GNU General Public License +#    along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +# This script assumes that the working directory is the +# root of retroboot_src or retroboot git. + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +./gitclone me_cleaner diff --git a/resources/scripts/update/module/memtest86plus b/resources/scripts/update/module/memtest86plus new file mode 100755 index 00000000..bceadbd9 --- /dev/null +++ b/resources/scripts/update/module/memtest86plus @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +#  helper script: Downloads MemTest86+ and patches it +# +#	Copyright (C) 2014, 2015, 2020, 2021 Leah Rowe <info@minifree.org> +#	Copyright (C) 2015 Joseph Michael Thompson <jmt@josepht.me> +#	Copyright (C) 2015 Klemens Nanni <contact@autoboot.org> +# +#    This program is free software: you can redistribute it and/or modify +#    it under the terms of the GNU General Public License as published by +#    the Free Software Foundation, either version 3 of the License, or +#    (at your option) any later version. +# +#    This program is distributed in the hope that it will be useful, +#    but WITHOUT ANY WARRANTY; without even the implied warranty of +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#    GNU General Public License for more details. +# +#    You should have received a copy of the GNU General Public License +#    along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +# Get the last version of MemTest86+ used, apply patches, build it. + +# Remove the old version that may exist +# ------------------------------------------------------------------------------ + +printf "Downloading MemTest86+\n" +./gitclone memtest86plus  diff --git a/resources/scripts/update/module/mrc b/resources/scripts/update/module/mrc new file mode 100755 index 00000000..ed0b38f3 --- /dev/null +++ b/resources/scripts/update/module/mrc @@ -0,0 +1,188 @@ +#!/usr/bin/env sh + +# Download Intel MRC images +# +#    This program is free software: you can redistribute it and/or modify +#    it under the terms of the GNU General Public License as published by +#    the Free Software Foundation, version 2 of the License. +# +#    This program is distributed in the hope that it will be useful, +#    but WITHOUT ANY WARRANTY; without even the implied warranty of +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#    GNU General Public License for more details. +# +#    You should have received a copy of the GNU General Public License +#    along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e +export PATH="${PATH}:/sbin" + +# This file is forked from util/chromeos/crosfirmware.sh in coreboot cfc26ce278 +# Changes to it in *this version* are copyright 2021 and 2023 Leah Rowe, under +# the same license as above. + +# use updated manifest from wayback machine, when updating mrc.bin, +# and update the other variables below accordingly. current manifest used: +# https://web.archive.org/web/20210211071412/https://dl.google.com/dl/edgedl/chromeos/recovery/recovery.conf + +# the wayback machine is used so that we get the same manifest. google +# does not seem to version the manifest, but archives are available + +# variables taken from that manifest: + +_board="peppy" +_file="chromeos_12239.92.0_peppy_recovery_stable-channel_mp-v3.bin" +_url="https://dl.google.com/dl/edgedl/chromeos/recovery/chromeos_12239.92.0_peppy_recovery_stable-channel_mp-v3.bin.zip" +_url2="https://web.archive.org/web/20200516070928/https://dl.google.com/dl/edgedl/chromeos/recovery/chromeos_12239.92.0_peppy_recovery_stable-channel_mp-v3.bin.zip" +_sha1sum="cd5917cbe7f821ad769bf0fd87046898f9e175c8" +_mrc_complete_hash="d18de1e3d52c0815b82ea406ca07897c56c65696" +_mrc_complete="mrc/haswell/mrc.bin" + +cbdir="coreboot/default" +cbfstool="${cbdir}/util/cbfstool/cbfstool" + +sname="" + +main() +{ +	sname=${0} +	printf "Downloading Intel MRC blobs\n" + +	check_existing && exit 0 +	build_dependencies || fail "could not build dependencies" +	fetch_mrc || fail "could not fetch mrc.bin" +} + +check_existing() +{ +	if [ ! -f ${_mrc_complete} ]; then +		return 1 +	fi +	printf 'found existing mrc.bin, checking its hash\n' +	if [ "$(sha1sum ${_mrc_complete} | awk '{print $1}')" \ +			= "${_mrc_complete_hash}" ]; then +		printf 'checksums matched, skipping downloading\n' +		return 0 +	else +		printf 'hashes did not match, starting over\n' +		return 1 +	fi +} + +build_dependencies() +{ +	if [ ! -d "${cbdir}/" ]; then +	    ./download coreboot default || return 1 +	fi +	if [ ! -f "${cbfstool}" ]; then +	    ./build module cbutils default || return 1 +	fi +	return 0 +} + +fetch_mrc() +{ +	mkdir -p mrc/haswell/ || return 1 + +	( +	cd mrc/haswell/ + +	download_image ${_url} ${_file} ${_sha1sum} +	if [ ! -f ${_file} ]; then +		download_image ${_url2} ${_file} ${_sha1sum} +	fi +	if [ ! -f $_file ]; then +		fail "%{_file} not downloaded / verification failed." +	fi + +	extract_partition ROOT-A ${_file} root-a.ext2 +	extract_shellball root-a.ext2 chromeos-firmwareupdate-${_board} + +	extract_coreboot chromeos-firmwareupdate-${_board} + +	../../${cbfstool} coreboot-*.bin extract -f mrc.bin \ +			-n mrc.bin -r RO_SECTION \ +					|| fail "Could not fetch mrc.bin" +	rm -f "chromeos-firmwareupdate-${_board}" coreboot-*.bin \ +			"${_file}" "root-a.ext2" + +	printf "\n\nmrc.bin saved to ${_mrc_complete}\n\n" +	) + +	return 0 +} + +download_image() +{ +	url=${1} +	_file=${2} +	_sha1sum=${3} + +	echo "Downloading recovery image" +	curl "$url" > "$_file.zip" +	if [ "$(sha1sum ${_file}.zip | awk '{print $1}')" = "${_sha1sum}" ] +	then +		unzip -q "${_file}.zip" +		rm "${_file}.zip" +		echo "Checksum verification passed for recovery image." +		return 0 +	else +		rm "${_file}.zip" +		echo "Bad checksum. Recovery image deleted." +		return 1 +	fi +} + +extract_partition() +{ +	NAME=${1} +	FILE=${2} +	ROOTFS=${3} +	_bs=1024 + +	echo "Extracting ROOT-A partition" +	ROOTP=$( printf "unit\nB\nprint\nquit\n" | \ +		 parted ${FILE} 2>/dev/null | grep ${NAME} ) + +	START=$(( $( echo ${ROOTP} | cut -f2 -d\ | tr -d "B" ) )) +	SIZE=$(( $( echo ${ROOTP} | cut -f4 -d\ | tr -d "B" ) )) + +	dd if=${FILE} of=${ROOTFS} bs=${_bs} skip=$(( ${START} / ${_bs} )) \ +		count=$(( ${SIZE} / ${_bs} ))  > /dev/null +} + +extract_shellball() +{ +	ROOTFS=${1} +	SHELLBALL=${2} + +	echo "Extracting chromeos-firmwareupdate" +	printf "cd /usr/sbin\ndump chromeos-firmwareupdate ${SHELLBALL}\nquit" \ +		| debugfs ${ROOTFS} > /dev/null 2>&1 +} + +extract_coreboot() +{ +	_shellball=${1} +	_unpacked=$( mktemp -d ) + +	echo "Extracting coreboot image" +	sh ${_shellball} --unpack ${_unpacked} > /dev/null + +	_version=$( cat ${_unpacked}/VERSION | grep BIOS\ version: | \ +			cut -f2 -d: | tr -d \  ) + +	cp ${_unpacked}/bios.bin coreboot-${_version}.bin +	rm -r "${_unpacked}" +} + +fail() +{ +	printf "%s: ERROR: %s\n" +			${sname} ${1} +	exit 1 +} + +main $@ diff --git a/resources/scripts/update/module/seabios b/resources/scripts/update/module/seabios new file mode 100755 index 00000000..fd72de65 --- /dev/null +++ b/resources/scripts/update/module/seabios @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# +#   Copyright (C) 2015, 2016, 2021 Leah Rowe <info@minifree.org> +# +#	This program is free software: you can redistribute it and/or modify +#	it under the terms of the GNU General Public License as published by +#	the Free Software Foundation, either version 3 of the License, or +#	(at your option) any later version. +# +#	This program is distributed in the hope that it will be useful, +#	but WITHOUT ANY WARRANTY; without even the implied warranty of +#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#	GNU General Public License for more details. +# +#	You should have received a copy of the GNU General Public License +#	along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +# Get SeaBIOS, revert to commit last used and apply patches. + +# Remove the old version that may still exist +# ------------------------------------------------------------------------------ + +printf "Downloading SeaBIOS\n" + +./gitclone seabios diff --git a/resources/scripts/update/module/u-boot b/resources/scripts/update/module/u-boot new file mode 100755 index 00000000..1af513a4 --- /dev/null +++ b/resources/scripts/update/module/u-boot @@ -0,0 +1,261 @@ +#!/usr/bin/env bash + +#  helper script: download u-boot +# +#	Copyright (C) 2021 Denis 'GNUtoo' Carikli  <GNUtoo@cyberdimension.org> +#	Copyright (C) 2022 Alper Nebi Yasak <alpernebiyasak@gmail.com> +# +#	This program is free software: you can redistribute it and/or modify +#	it under the terms of the GNU General Public License as published by +#	the Free Software Foundation, either version 3 of the License, or +#	(at your option) any later version. +# +#	This program is distributed in the hope that it will be useful, +#	but WITHOUT ANY WARRANTY; without even the implied warranty of +#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#	GNU General Public License for more details. +# +#	You should have received a copy of the GNU General Public License +#	along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +[[ -f build_error ]] && rm -f build_error + +list_supported_boards() { +	for board in resources/u-boot/*; do +		if [ -d ${board} ]; then +			echo "${board#resources/u-boot/}" +		fi +	done +} + +downloadfor() { +	board="${1}" + +	# The loop will always exit, but this while loop is crafted +	# such that a tree referencing a tree that references another tree is possible +	# (and so on) +	while true; do +		ubrevision="undefined" +		ubtree="undefined" + +		if [ ! -f "resources/u-boot/${board}/board.cfg" ]; then +			printf "ERROR: %s: board.cfg does not exist for '%s'\n" \ +				"download/u-boot" "${board}" +			return 1 +		fi + +		if [ -f "resources/u-boot/${board}/seen" ]; then +			printf "ERROR: %s: logical loop; '%s' board.cfg refers to another tree, which ultimately refers back to '%s'.\n" \ +				"download/u-boot" "${board}" "${board}" +			return 1 +		fi + +		# This is to override $ubrevision and $ubtree +		source "resources/u-boot/${board}/board.cfg" || touch build_error +		if [ -f build_error ]; then +			printf "ERROR: %s: problem sourcing %s/board.cfg\n" \ +				"download/u-boot" "${board}" +			return 1 +		fi +		touch "resources/u-boot/${board}/seen" + +		if [ "${board}" != "${ubtree}" ]; then +			board="${ubtree}" +		else +			if [ "${ubtree}" = "undefined" ]; then +				printf "ERROR: %s: tree name undefined for '%s\n'" \ +					"download/u-boot" "${board}" +				return 1 +			fi + +			if [ "${ubrevision}" = "undefined" ]; then +				printf "ERROR: %s: commit ID undefined for '%s'\n" \ +					"download/u-boot" "${board}" +				return 1 +			fi +			break +		fi +	done + +	rm -f resources/u-boot/*/seen + +	ubtree="u-boot/${ubtree}" +	if [ -d "${ubtree}" ]; then +	    printf \ +		"REMARK: '%s' directory already exists. Skipping setup.\n" \ +		"${ubtree}" +		if [ "${ubtree}" != "u-boot/${board}" ]; then +			printf "(for board: '${board}')\n" +		fi +		return 0 +	fi + +	if [ ! -d "u-boot" ]; then +		mkdir -p "u-boot" +	fi + +	if [ ! -d "u-boot" ]; then +		printf \ +			"ERROR: '%s' directory not created. Check file system permissions\n" \ +			"u-boot" +		return 1 +	fi + +	uboot_dir="u-boot/u-boot" +	if [ ! -d "${uboot_dir}/.git" ] && [ -d "${uboot_dir}" ]; then +		rm -Rf "${uboot_dir}" +	fi + +	if [ ! -d "${uboot_dir}" ]; then +		printf "Download u-boot from upstream:\n" +		git clone https://source.denx.de/u-boot/u-boot.git \ +		    "${uboot_dir}" || \ +		    rm -Rf "${uboot_dir}" +		if [ ! -d "${uboot_dir}" ]; then +			printf "WARNING: Upstream failed. Trying backup github repository:\n" +			git clone https://github.com/u-boot/u-boot.git \ +				"${uboot_dir}" || \ +				rm -Rf coreboot +		fi +		if [ ! -d "${uboot_dir}" ]; then +		    printf \ +			"ERROR: %s: Problem with git-clone. Network issue?\n" \ +			"download/u-boot" +			return 1 +		fi +	fi + +	git -C "${uboot_dir}" fetch origin "${ubrevision}" || touch build_error +	if [ -f build_error ]; then +	    printf \ +		"ERROR: %s: Problem with git-fetch. Network issue?\n" \ +		"download/u-boot" +		return 1 +	fi + +	cp -R "${uboot_dir}" "${ubtree}" || touch build_error +	if [ -f build_error ]; then +		printf "ERROR: %s: Unable to copy directory. Check file system permissions or free space.\n" \ +			"download/u-boot" +		rm -Rf "${ubtree}/" +		return 1 +	fi + +	git -C "${ubtree}" reset --hard ${ubrevision} || \ +	    touch build_error +	if [ -f build_error ]; then +	    printf \ +		"ERROR: %s: Unable to reset to commit ID/tag '%s' for board '%s' on tree '%s'\n" \ +		"download/u-boot" "${ubrevision}" "${board}" "${ubtree}" +		return 1 +	fi + +	git -C "${ubtree}" submodule update --init || touch build_error +	if [ -f build_error ]; then +		printf "ERROR: %s: Unable to update submodules for tree '%s'\n" \ +			"${ubtree}" +		return 1 +	fi + +	for patch in resources/u-boot/${board}/patches/*.patch; do +		if [ ! -f "${patch}" ]; then +			continue +		fi + +		git -C "${ubtree}" am "$(pwd)/${patch}" || touch build_error +		if [ -f build_error ]; then +			printf "ERROR: %s: Unable to apply patch '%s' for board '%s' on tree '%s'" \ +				"download/u-boot" "${patch}" "${board}" "${ubtree}" +			git -C "${ubtree}" am --abort +			return 1 +		fi +	done + +	# extra.sh could be used to patch submodules, if you wanted to +	# It's impossible to predict what submodules will be available, and +	# it's rare that you'd want to patch them, so this is handled by +	# extra.sh on a per-board basis +	# In fact, extra.sh can be used for anything you want. +	if [ -f "resources/u-boot/${board}/extra.sh" ]; then +		( cd "${ubtree}" && "../../resources/u-boot/${board}/extra.sh"; ) || touch build_error +		if [ -f build_error ]; then +			return 1 +		fi +		return 0 +	else +		return 0 +	fi +} + +strip_comments() +{ +	file="$1" +	# Remove comments +	sed 's/#.*//' "${file}" | \ +	    # Remove lines composed of whitespaces only +	    sed '/^\W\+$/d' | \ +		# Remove empty lines +		sed '/^$/d' +} + +usage() +{ +	progname="./download u-boot" + +	printf "Usage:\n" +	printf "\t%s                                # %s\n" \ +	       "${progname}" \ +	       "Download u-boot for all boards" +	printf "\t%s [board]                        # %s\n" \ +	       "${progname}" \ +	       "Download u-boot for the given board" +	printf "\t%s --list-boards                  # %s\n" \ +	       "${progname}" \ +	       "List supported boards" +	printf "\t%s --help                         # %s\n" \ +	       "${progname}" \ +	       "Prints this help" +} + +download_uboot_board() +{ +	board="${1}" +	ubtree="u-boot/${board}" + +	printf "Downloading u-boot " +	printf "and (if exist in build system) applying patches\n" +	downloadfor "${board}" + +	rm -f "build_error" +	printf "\n\n" +} + +if [ $# -eq 0 ] ; then +	for board in $(list_supported_boards); do +		download_uboot_board "${board}" +	done +	exit 0 +elif [ $# -eq 1 -a "$1" == "--help" ] ; then +	usage +	exit 0 +elif [ $# -eq 1 -a "$1" == "--list-boards" ] ; then +	list_supported_boards +	exit 0 +elif [ $# -eq 1 ] ; then +	for board in $(list_supported_boards) ; do +		if [ "$board" = "$1" ] ; then +			download_uboot_board "$1" +			exit 0 +		fi +	done + +	printf "Error: Board '${1}' is not supported\n" + +	exit 1 +fi + +exit 0  | 
