diff options
Diffstat (limited to 'resources/scripts/update/module/coreboot')
-rwxr-xr-x | resources/scripts/update/module/coreboot | 182 |
1 files changed, 182 insertions, 0 deletions
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 $@ |