#!/usr/bin/env sh # helper script: download coreboot # # Copyright (C) 2014,2015,2016,2020,2021,2023 Leah Rowe # # Copyright (C) 2022 Alper Nebi Yasak # Copyright (C) 2022 Ferass El Hafidi # # 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 . # # TODO: purge this entire file. it's terrible. re-write it more cleanly. [ "x${DEBUG+set}" = 'xset' ] && set -v set -u -e _board="" cbtree="" cbrevision="" main() { if [ $# -eq 1 ] && [ "$1" = "--help" ] ; then usage exit 0 elif [ $# -eq 1 ] && [ "$1" = "--list-boards" ] ; then list_supported_boards exit 0 fi [ -f build_error ] && rm -f build_error fetch_coreboot_trees $@ rm -f "build_error" printf "\n\n" exit 0 } fetch_coreboot_trees() { rm -f resources/coreboot/*/seen printf "Downloading coreboot and (if available) applying patches\n" boards="" if [ $# -gt 0 ]; then boards=$@ else for board in resources/coreboot/*; do [ ! -d "${board}" ] && continue boards="${boards} ${board}" done fi for board in ${boards}; do rm -f resources/coreboot/*/seen download_coreboot_for_board "${board}" [ -f build_error ] && break done rm -f resources/coreboot/*/seen } download_coreboot_for_board() { _board="${1}" cbtree="undefined" cbrevision="undefined" fetch_coreboot_config "${_board}"; rm -f resources/coreboot/*/seen [ -f build_error ] && return 1 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 [ ! -d coreboot ] && \ mkdir "coreboot/" [ ! -d coreboot ] && \ printf "ERROR: download/coreboot: directory not created\n" && \ return 1 cd "coreboot/" [ ! -d coreboot/.git ] && [ -d coreboot ] && \ rm -Rf coreboot/ if [ ! -d coreboot ]; then printf "Download coreboot from upstream:\n" git clone https://review.coreboot.org/coreboot \ || rm -Rf coreboot if [ ! -d coreboot ]; then printf "WARNING: Upstream failed. Trying backup:\n" git clone https://github.com/coreboot/coreboot.git \ || rm -Rf coreboot fi if [ ! -d coreboot ]; then printf "ERROR: download/coreboot:" printf " Problem with git-clone. Network issue?\n" cd ../ return 1 fi else ( cd coreboot/; git pull || touch ../build_error ) if [ -f ../build_error ]; then printf "ERROR: download/coreboot:" printf " Problem with git-pull. Network issue?\n" cd ../ return 1 fi fi cp -R coreboot "${cbtree}" || touch ../build_error if [ -d ../build_error ]; then printf "ERROR: download/coreboot: Unable to copy directory." printf " Check file system permissions or free space.\n" rm -Rf "${cbtree}/" cd ../ return 1 fi cd ${cbtree}/ git reset --hard ${cbrevision} || touch ../../build_error if [ -f ../../build_error ]; then printf "ERROR: download/coreboot: Unable to reset to commit" printf " ID/tag '%s' for board '%s' on tree '%s'\n" \ ${cbrevision} ${1} ${cbtree} cd ../../ return 1 fi git submodule update --init --checkout || touch ../../build_error if [ -f ../../build_error ]; then printf "ERROR: download/coreboot:" printf " Unable to update submodules for tree '%s'\n" \ ${cbtree} cd ../../ return 1 fi for patch in ../../resources/coreboot/${cbtree}/patches/*.patch; do [ ! -f "${patch}" ] && continue git am "${patch}" || touch ../../build_error if [ -f ../../build_error ]; then printf "ERROR: download/coreboot: Unable to apply" printf " patch '%s' for board '%s' on tree '%s'" \ ${patch} ${1} ${cbtree} git am --abort cd ../../ return 1 fi done # extra.sh can be used for anything # but should *only* be a last resort if [ -f "../../resources/coreboot/${_board}/extra.sh" ]; then "../../resources/coreboot/${_board}/extra.sh" \ || touch ../../build_error if [ -f ../../build_error ]; then cd ../../; return 1 fi return 0 else cd ../../ return 0 fi } fetch_coreboot_config() { while true; do cbrevision="undefined" cbtree="undefined" check_config_for_board "${_board}" || return 1 # This is to override $cbrevision and $cbtree . "resources/coreboot/${_board}/board.cfg" \ || touch ../build_error if [ -f build_error ]; then printf "ERROR: download/coreboot:" printf " problem sourcing %s/board.cfg\n" ${_board} return 1 elif [ "${_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 return 0 } check_config_for_board() { if [ ! -f "resources/coreboot/${1}/board.cfg" ]; then printf "ERROR: download/coreboot: board.cfg does not" printf " exist for '%s'\n" ${1} return 1 elif [ -f "resources/coreboot/${1}/seen" ]; then printf "ERROR: download/coreboot: logical loop:" printf " '%s' board.cfg refers to another tree," ${1} printf " which ultimately refers back to '%s'." ${1} return 1 fi touch "resources/coreboot/${1}/seen" return 0 } usage() { progname="./download coreboot" printf "Usage:\n" printf "\t%s\t\t\t# Clone coreboot for all boards\n" "${progname}" printf "\t%s [board [board] ...] # Clone coreboot for given boards\n" \ ${progname} printf "\t%s --list-boards\t# Prints this help\n" ${progname} printf "\t%s --help\t\t# List supported boards\n" ${progname} printf "\t%s --help\t\t# Prints this help\n" ${progname} } list_supported_boards() { for _board in resources/coreboot/*; do echo ${_board} | sed 's#resources/coreboot/##' done } main $@