diff options
Diffstat (limited to 'resources/scripts/update/module')
-rwxr-xr-x | resources/scripts/update/module/u-boot | 178 |
1 files changed, 165 insertions, 13 deletions
diff --git a/resources/scripts/update/module/u-boot b/resources/scripts/update/module/u-boot index 161608c9..5fc80868 100755 --- a/resources/scripts/update/module/u-boot +++ b/resources/scripts/update/module/u-boot @@ -1,10 +1,10 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash # helper script: download u-boot # +# Copyright (C) 2014, 2015, 2016, 2020, 2021 Leah Rowe <info@minifree.org> # Copyright (C) 2021 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> # Copyright (C) 2022 Alper Nebi Yasak <alpernebiyasak@gmail.com> -# Copyright (C) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.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 @@ -23,7 +23,19 @@ [ "x${DEBUG+set}" = 'xset' ] && set -v set -u -e -[ -f build_error ] && rm -f build_error +# set this when you want to modify each u-boot tree +# for example, you want to test custom patches +# NODELETE= ./download u-boot +deletegit="true" +deleteblobs="true" +if [ "x${NODELETE+set}" = 'xset' ]; then + [ "x${NODELETE:-all}" = "xgit" ] && deletegit="false" + [ "x${NODELETE:-all}" = "xall" ] && deleteblobs="false" && deletegit="false" +fi + +# Error handling is extreme in this script. +# This script handles the internet, and Git. Both are inherently unreliable. +[[ -f build_error ]] && rm -f build_error list_supported_boards() { for board in resources/u-boot/*; do @@ -56,7 +68,7 @@ downloadfor() { fi # This is to override $ubrevision and $ubtree - . "resources/u-boot/${board}/board.cfg" || touch build_error + 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}" @@ -113,12 +125,12 @@ downloadfor() { if [ ! -d "${uboot_dir}" ]; then printf "Download u-boot from upstream:\n" - git clone https://source.denx.de/u-boot/u-boot.git \ + git clone --depth=1 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 \ + git clone --depth=1 https://github.com/u-boot/u-boot.git \ "${uboot_dir}" || \ rm -Rf coreboot fi @@ -130,7 +142,7 @@ downloadfor() { fi fi - git -C "${uboot_dir}" fetch origin "${ubrevision}" || touch build_error + git -C "${uboot_dir}" fetch --depth=1 origin "${ubrevision}" || touch build_error if [ -f build_error ]; then printf \ "ERROR: %s: Problem with git-fetch. Network issue?\n" \ @@ -155,7 +167,7 @@ downloadfor() { return 1 fi - git -C "${ubtree}" submodule update --init || touch build_error + git -C "${ubtree}" submodule update --init --depth=1 || touch build_error if [ -f build_error ]; then printf "ERROR: %s: Unable to update submodules for tree '%s'\n" \ "${ubtree}" @@ -182,7 +194,7 @@ downloadfor() { # 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 + "resources/u-boot/${board}/extra.sh" || touch build_error if [ -f build_error ]; then return 1 fi @@ -203,6 +215,56 @@ strip_comments() sed '/^$/d' } +generate_deblob_script() +{ + blob_list_file="$1" + output="$2" + + # Add sheebang and copyright headers from this file + awk '{ + if ($0 !~ /^#/ && NF > 0) { + stop=1; + } + if (stop !=1) { + printf("%s\n", $0); + } + }' $0 >> ${output} + + # Add rm -rf before directories and rm -f before files + awk \ + '{ + }{ + if (NF == 0) { + printf("\n"); + } else { + if ($0 !~ /#/ && $NF ~ /\/$/) { + printf("rm -rf %s\n", $0); + } else if ($0 !~ /#/) { + printf("rm -f %s\n", $0); + } else { + # We have comments, try to see if they are + # still valid paths before the comments + comments_found=0 + last_field=0 + for(i=1; i<=NF; i++) { + if($i ~ /#/) { + comments_found=1; + } else if(comments_found != 1) { + last_field=i; + } + } + if (last_field == 0) { + printf("%s\n", $0); + } else if ($last_field ~ /\/$/) { + printf("rm -rf %s\n", $0); + } else { + printf("rm -f %s\n", $0); + } + } + } + }' "${blob_list_file}" >> "${output}" +} + usage() { progname="./download u-boot" @@ -210,10 +272,22 @@ usage() printf "Usage:\n" printf "\t%s # %s\n" \ "${progname}" \ - "Download u-boot for all boards" + "Download and deblob u-boot for all boards" printf "\t%s [board] # %s\n" \ "${progname}" \ - "Download u-boot for the given board" + "Download and deblob u-boot for the given board" + printf "\t%s --blobs-list # %s\n" \ + "${progname}" \ + "Print the path of the generic blobs.list file" + printf "\t%s --blobs-list [board] # %s\n" \ + "${progname}" \ + "Print the path of the blobs.list file for the given board" + printf "\t%s --gen-deblob-script # %s\n" \ + "${progname}" \ + "Print the path of a generated generic deblob script" + printf "\t%s --gen-deblob-script [board] # %s\n" \ + "${progname}" \ + "Print the path of a generated deblob script for the given board" printf "\t%s --list-boards # %s\n" \ "${progname}" \ "List supported boards" @@ -233,19 +307,93 @@ download_uboot_board() rm -f "build_error" printf "\n\n" + + if [ "${deleteblobs}" = "true" ]; then + if [ "${deletegit}" = "true" ]; then + rm -rf "${ubtree}"/.git* "${ubtree}"/*/.git* + fi + blobslist="$(print_blobs_list_path "${board}")" + for blob_path in $(strip_comments "${blobslist}"); do + if echo "${blob_path}" | \ + grep '/$' 2>&1 >/dev/null ; then + printf "Deleting blob directory: '%s/%s'\n" \ + "${ubtree}" "${blob_path}" + rm -rf "${ubtree}/${blob_path}" + else + printf "Deleting blob file: '%s/%s'\n" \ + "${ubtree}" "${blob_path}" + rm -f "${ubtree}/${blob_path}" + fi + done + fi +} + +print_blobs_list_path() +{ + board="$1" + + if [ -f "resources/u-boot/${board}/blobs.list" ]; then + printf "resources/u-boot/${board}/blobs.list\n" + else + printf "resources/u-boot/default/blobs.list\n" + fi +} + +print_deblob_script_path() +{ + board="$1" + path="$(mktemp)" + + generate_deblob_script "$(print_blobs_list_path ${board})" "${path}" + printf "%s\n" ${path} } if [ $# -eq 0 ] ; then for board in $(list_supported_boards); do download_uboot_board "${board}" done + + if [ "${deletegit}" = "true" ]; then + rm -rf u-boot/u-boot/ u-boot/.git* + fi + exit 0 -elif [ $# -eq 1 ] && [ "$1" = "--help" ] ; then +elif [ $# -eq 1 -a "$1" == "--help" ] ; then usage exit 0 -elif [ $# -eq 1 ] && [ "$1" = "--list-boards" ] ; then +elif [ $# -eq 1 -a "$1" == "--list-boards" ] ; then list_supported_boards exit 0 +elif [ $# -eq 1 -a "$1" == "--blobs-list" ] ; then + print_blobs_list_path "default" + exit 0 +elif [ $# -eq 2 -a "$1" == "--blobs-list" ] ; then + found=0 + for board in $(list_supported_boards) ; do + if [ "${board}" = "$2" ] ; then + print_blobs_list_path "$2" + exit 0 + fi + done + + printf "Error: Board '${2}' is not supported\n" + + exit 1 +elif [ $# -eq 1 -a "$1" == "--gen-deblob-script" ] ; then + print_deblob_script_path "default" + exit 0 +elif [ $# -eq 2 -a "$1" == "--gen-deblob-script" ] ; then + found=0 + for board in $(list_supported_boards) ; do + if [ "$board" = "$2" ] ; then + print_deblob_script_path "$2" + exit 0 + fi + done + + printf "Error: Board '${2}' is not supported\n" + + exit 1 elif [ $# -eq 1 ] ; then for board in $(list_supported_boards) ; do if [ "$board" = "$1" ] ; then @@ -254,6 +402,10 @@ elif [ $# -eq 1 ] ; then fi done + if [ "${deletegit}" = "true" ]; then + rm -rf u-boot/u-boot/ u-boot/.git* + fi + printf "Error: Board '${1}' is not supported\n" exit 1 |