summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2023-10-07 06:55:10 +0100
committerLeah Rowe <leah@libreboot.org>2023-10-07 10:26:11 +0100
commit1e89264ce326997f95391e00f1fa71319f1bb226 (patch)
treef1a577604f4ff74fe7f122b1f511e93499adac27
parenta413c01a3ef90f7befc5805b233b67b9352ee727 (diff)
update/project/*: merge to update/project/trees
Just one script. Just one! Well, two, but the 2nd one already existed: logic in update/project/trees and update/project/repo was merged into include/git.sh and update/project/build was renamed to update/project/trees; an -f option was added, which calls the functions under git.sh so git clones are now handled by the main build script (for handling makefiles and defconfigs) but the logic there is a stub, where git.sh does all the actual heavy lifting this cuts the file count down by two, and reduces sloccount a reasonable amount because much of the logic already exists in the build script, when it comes to handling targets. git.sh was adjusted to integrate with this, rather than act standalone Signed-off-by: Leah Rowe <leah@libreboot.org>
-rwxr-xr-xinclude/git.sh128
-rwxr-xr-xinclude/option.sh2
-rwxr-xr-xscript/build/fw/coreboot10
-rwxr-xr-xscript/build/fw/grub2
-rwxr-xr-xscript/build/fw/serprog4
-rwxr-xr-xscript/update/project/build282
-rwxr-xr-xscript/update/project/repo77
-rwxr-xr-xscript/update/project/trees298
-rwxr-xr-xscript/update/release/roms4
-rwxr-xr-xscript/update/release/src17
-rwxr-xr-xscript/update/vendor/download8
-rwxr-xr-xscript/update/vendor/inject4
12 files changed, 383 insertions, 453 deletions
diff --git a/include/git.sh b/include/git.sh
index 2bf3b761..7f926c28 100755
--- a/include/git.sh
+++ b/include/git.sh
@@ -1,15 +1,123 @@
# SPDX-License-Identifier: GPL-3.0-or-later
-# SPDX-FileCopyrightText: 2023 Leah Rowe <leah@libreboot.org>
+# SPDX-FileCopyrightText: 2020,2021,2023 Leah Rowe <leah@libreboot.org>
+# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com>
+
+# This file is only used by update/project/trees
+
+eval "$(setvars "" _target rev _xm)"
+eval "$(setvars "" loc url bkup_url depend)"
+tmp_git_dir="${PWD}/tmp/gitclone"
+
+fetch_project_trees()
+{
+ _target="${target}"
+ [ -d "src/${project}/${project}" ] || fetch_from_upstream
+ fetch_config
+ [ -z "${rev}" ] && err "fetch_project_trees $target: undefined rev"
+ [ -d "src/${project}/${tree}" ] && \
+ printf "download/%s %s (%s): exists\n" \
+ "${project}" "${tree}" "${_target}" 1>&2 && \
+ return 1
+ prepare_new_tree
+}
+
+fetch_from_upstream()
+{
+ [ -d "src/${project}/${project}" ] && return 0
+
+ x_ mkdir -p "src/${project}"
+ x_ fetch_project_repo "${project}"
+}
+
+fetch_config()
+{
+ x_ rm -f "${cfgsdir}/"*/seen
+ while true; do
+ eval "$(setvars "" rev tree)"
+ _xm="fetch_config ${project}/${_target}"
+ load_target_config "${_target}"
+ [ "${_target}" != "${tree}" ] && _target="${tree}" && continue
+ break
+ done
+}
+
+load_target_config()
+{
+ [ -f "${cfgsdir}/${1}/target.cfg" ] || \
+ err "${_xm} check: target.cfg does not exist"
+ [ -f "${cfgsdir}/${1}/seen" ] && \
+ err "${_xm} check: infinite loop in tree definitions"
+
+ . "${cfgsdir}/${1}/target.cfg" || \
+ err "load_target_config ${cfgsdir}/${1}: cannot load config"
+
+ x_ touch "${cfgsdir}/${1}/seen"
+}
+
+prepare_new_tree()
+{
+ printf "Creating %s tree %s (%s)\n" "${project}" "${tree}" "${_target}"
+
+ x_ cp -R "src/${project}/${project}" "src/${project}/${tree}"
+ x_ git_reset_rev "src/${project}/${tree}" "${rev}"
+ (
+ x_ cd "src/${project}/${tree}"
+ git submodule update --init --checkout || \
+ err "prepare_new_tree ${project}/${tree}: can't update git modules"
+ )
+ git_am_patches "${PWD}/src/${project}/${tree}" \
+ "${PWD}/${cfgsdir}/${tree}/patches"
+}
+
+fetch_project_repo()
+{
+ scan_config "${project}" "config/git" "err"
+ verify_config
+
+ clone_project
+ [ "${depend}" = "" ] || for d in ${depend} ; do
+ x_ ./update project trees -f ${d}
+ done
+ x_ rm -Rf "${tmp_git_dir}"
+}
+
+verify_config()
+{
+ [ -z "${rev+x}" ] && err 'verify_config: rev not set'
+ [ -z "${loc+x}" ] && err 'verify_config: loc not set'
+ [ -z "${url+x}" ] && err 'verify_config: url not set'
+ return 0
+}
+
+clone_project()
+{
+ x_ rm -Rf "${tmp_git_dir}"
+ x_ mkdir -p "${tmp_git_dir%/*}"
+
+ loc="${loc#src/}"
+ loc="src/${loc}"
+
+ git clone ${url} "${tmp_git_dir}" || \
+ git clone ${bkup_url} "${tmp_git_dir}" || \
+ err "clone_project: could not download ${project}"
+ git_reset_rev "${tmp_git_dir}" "${rev}" || \
+ err "clone_project ${loc}/: cannot reset <- ${rev}"
+ git_am_patches "${tmp_git_dir}" "${PWD}/config/${project}/patches" || \
+ err "clone_project ${loc}/: cannot apply patches"
+
+ x_ rm -Rf "${loc}"
+ [ "${loc}" = "${loc%/*}" ] || x_ mkdir -p ${loc%/*}
+ x_ mv "${tmp_git_dir}" "${loc}"
+}
git_reset_rev()
{
sdir="${1}"
_rev="${2}"
- _fail="${3}"
(
- cd "${sdir}" || "${_fail}" "cannot cd to ${sdir}"
+ x_ cd "${sdir}"
git reset --hard ${_rev} || \
- "${_fail}" "cannot git reset ${sdir} <- ${rev}"
+ err "cannot git reset ${sdir} <- ${rev}"
)
}
@@ -17,23 +125,21 @@ git_am_patches()
{
sdir="${1}" # assumed to be absolute path
patchdir="${2}" # ditto
- _fail="${3}"
(
- cd "${sdir}" || \
- "${_fail}" "apply_patches: !cd \"${sdir}\""
+ x_ cd "${sdir}"
for patch in "${patchdir}/"*; do
[ -L "${patch}" ] && continue
[ -f "${patch}" ] || continue
if ! git am "${patch}"; then
- git am --abort || "${_fail}" "${sdir}: !git am --abort"
- "${_fail}" "!git am ${patch} -> ${sdir}"
+ git am --abort || err "${sdir}: !git am --abort"
+ err "!git am ${patch} -> ${sdir}"
fi
done
)
for patches in "${patchdir}/"*; do
[ -L "${patches}" ] && continue
[ ! -d "${patches}" ] || \
- git_am_patches "${sdir}" "${patches}" "${_fail}" || \
- "${_fail}" "apply_patches: !${sdir}/ ${patches}/"
+ git_am_patches "${sdir}" "${patches}" err || \
+ err "apply_patches: !${sdir}/ ${patches}/"
done
}
diff --git a/include/option.sh b/include/option.sh
index bc5bb42a..262107fd 100755
--- a/include/option.sh
+++ b/include/option.sh
@@ -40,7 +40,7 @@ EOF
handle_coreboot_utils()
{
for util in cbfstool ifdtool; do
- x_ ./update project build ${_f} "src/coreboot/${1}/util/${util}"
+ x_ ./update project trees ${_f} "src/coreboot/${1}/util/${util}"
[ -z "${mode}" ] && [ ! -f "cbutils/${1}/${util}" ] && \
x_ mkdir -p "cbutils/${1}" && \
x_ cp "src/coreboot/${1}/util/${util}/${util}" \
diff --git a/script/build/fw/coreboot b/script/build/fw/coreboot
index 7c89bb35..7479caae 100755
--- a/script/build/fw/coreboot
+++ b/script/build/fw/coreboot
@@ -125,13 +125,13 @@ prepare_target()
cbfstool="cbutils/${tree}/cbfstool"
cbrom="${cbdir}/build/coreboot.rom"
- x_ ./update project build -b coreboot utils ${tree}
+ x_ ./update project trees -b coreboot utils ${tree}
build_dependency_seabios
memtest_bin="memtest86plus/build${arch#*_}/memtest.bin"
[ "${payload_memtest}" != "y" ] || [ -f "src/${memtest_bin}" ] || \
- x_ ./update project build -b memtest86plus
+ x_ ./update project trees -b memtest86plus
x_ rm -f "${romdir}/"*
@@ -148,7 +148,7 @@ build_dependency_seabios()
|| [ ! -f elf/seabios/default/libgfxinit/bios.bin.elf ] \
|| [ ! -f elf/seabios/default/vgarom/bios.bin.elf ] \
|| [ ! -f elf/seabios/default/normal/bios.bin.elf ]; then
- x_ ./update project build -b seabios
+ x_ ./update project trees -b seabios
fi
}
@@ -176,7 +176,7 @@ build_dependency_uboot()
{
[ "${payload_uboot}" = "y" ] || return 0
- x_ ./update project build -b u-boot ${board}
+ x_ ./update project trees -b u-boot ${board}
ubdir="elf/u-boot/${board}/${uboot_config}"
ubootelf="${ubdir}/u-boot.elf"
[ ! -f "${ubootelf}" ] && [ -f "${ubdir}/u-boot.bin" ] && \
@@ -213,7 +213,7 @@ build_roms()
"${cbcfg}" "${board}" "${displaymode}" "${initmode}" \
1>&2 && return 0
- x_ ./update project build -b coreboot ${board}
+ x_ ./update project trees -b coreboot ${board}
_cbrom="elf/coreboot/${board}/${initmode}_${displaymode}"
[ "${initmode}" = "normal" ] && \
diff --git a/script/build/fw/grub b/script/build/fw/grub
index 1ae7ba9c..66286732 100755
--- a/script/build/fw/grub
+++ b/script/build/fw/grub
@@ -23,7 +23,7 @@ main()
handle_dependencies()
{
- [ -d "src/grub" ] || x_ ./update project repo grub
+ [ -d "src/grub" ] || x_ ./update project trees -f grub
[ -f "src/grub/grub-mkstandalone" ] || build_grub_utils
x_ mkdir -p "${elfdir}"
x_ rm -f "${elfdir}/"*
diff --git a/script/build/fw/serprog b/script/build/fw/serprog
index bb6952e2..0525962d 100755
--- a/script/build/fw/serprog
+++ b/script/build/fw/serprog
@@ -23,12 +23,12 @@ main()
platform="rp2040"
boards_dir=${pico_sdk_dir}/src/boards/include/boards
[ -d "${pico_src_dir}/" ] || \
- x_ ./update project repo "rpi-pico-serprog"
+ x_ ./update project trees -f "rpi-pico-serprog"
elif [ "${1}" = "stm32" ]; then
platform="stm32"
boards_dir=${stm32_src_dir}/boards
[ -d "${stm32_src_dir}/" ] || \
- x_ ./update project repo "stm32-vserprog"
+ x_ ./update project trees -f "stm32-vserprog"
else
err "${usage}"
fi
diff --git a/script/update/project/build b/script/update/project/build
deleted file mode 100755
index 2d457485..00000000
--- a/script/update/project/build
+++ /dev/null
@@ -1,282 +0,0 @@
-#!/usr/bin/env sh
-# SPDX-License-Identifier: GPL-3.0-or-later
-# SPDX-FileCopyrightText: 2022 Alper Nebi Yasak <alpernebiyasak@gmail.com>
-# SPDX-FileCopyrightText: 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
-# SPDX-FileCopyrightText: 2023 Leah Rowe <leah@libreboot.org>
-
-[ "x${DEBUG+set}" = 'xset' ] && set -v
-set -u -e
-
-. "include/err.sh"
-. "include/option.sh"
-
-export LOCALVERSION="-${projectname}-${version}"
-
-eval "$(setvars "" arch cfgsdir codedir config config_name crossgcc_ada mode \
- elfdir listfile project romtype target target_dir targets tree cbfstool _f \
- target1)"
-
-tmpclean="$(mktemp -d -t makeclean.XXXXXXXXXX)"
-
-main()
-{
- while getopts b:m:u:c:x: option
- do
- _f="${1}"
- case "${1}" in
- -b) : ;;
- -u) mode="oldconfig" ;;
- -m) mode="menuconfig" ;;
- -c) mode="distclean" ;;
- -x) mode="crossgcc-clean" ;;
- *) err "Invalid option" ;;
- esac
- shift; project="${OPTARG#src/}"; shift
- done
- [ -z "${_f}" ] && err "flag not specified (-m, -u, -b, -c or -x)"
- [ -z "${project}" ] && err "project name not specified"
-
- if [ ! -f "config/${project}/build.list" ]; then
- build_projects $@
- else
- build_targets $@
- fi
-}
-
-build_projects()
-{
- [ $# -gt 0 ] && x_ ./update project build ${_f} ${@}
- codedir="src/${project}"
-
- [ -d "${codedir}" ] || x_ ./update project repo "${project}"
-
- if [ "${project}" = "uefitool" ]; then
- (
- x_ cd src/uefitool
- cmake UEFIExtract/ || [ -f Makefile ] || \
- err "build_targets: !cmake UEFIExtract/"
- )
- fi
-
- [ "${mode}" = "distclean" ] && mode="clean"
- run_make_command || return 0
-}
-
-build_targets()
-{
- elfdir="elf/${project}"
-
- cfgsdir="config/${project}"
- [ -d "${cfgsdir}" ] || err "directory, ${cfgsdir}, does not exist"
-
- listfile="${cfgsdir}/build.list"
- [ -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=$(listitems "${cfgsdir}") || \
- err "Cannot get options for ${cfgsdir}"
- [ $# -gt 0 ] && targets=$@
-
- [ -z "${mode}" ] && x_ mkdir -p "${elfdir}/"
-
- handle_targets
-}
-
-handle_targets()
-{
- for x in ${targets}; do
- target="${x}"
- printf "Running 'make %s' for project '%s, target '%s''\n" \
- "${mode}" "${project}" "${target}"
- [ "${project}" != "coreboot" ] || [ ! -z ${mode} ] || \
- x_ ./update vendor download ${target}
- x_ handle_defconfig
- done
-
- [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && return 0
- [ -z "${mode}" ] || return 0
- printf "Done! The files are stored under %s/\n\n" "${elfdir}"
-}
-
-handle_defconfig()
-{
- handle_src_tree "${target}" || return 0
-
- if [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ]; then
- handle_coreboot_utils "${tree}"
- return 0
- fi
-
- for y in "${target_dir}/config"/*; do
- [ -f "${y}" ] || continue
- config="${y}"
- config_name="${config#${target_dir}/config/}"
-
- printf "handle/make/config %s %s: handling config %s\n" \
- "${project}" "${target}" "${config_name}"
-
- [ ! -z ${mode} ] || check_config || continue
- handle_makefile
- [ ! -z ${mode} ] || copy_elf
- done
-}
-
-handle_src_tree()
-{
- target_dir="${cfgsdir}/${target}"
- x_ mkdir -p "${elfdir}/${target}"
-
- eval "$(setvars "" arch tree)"
- romtype="normal"
-
- [ -f "${target_dir}/target.cfg" ] || \
- err "handle_src_tree: ${target_dir}: missing target.cfg"
-
- # Override the above defaults using target.cfg
- . "${target_dir}/target.cfg" # source
-
- [ -z "${tree}" ] && \
- err "handle_src_tree: ${target_dir}: tree undefined"
- [ -z "${arch}" ] && \
- err "handle_src_tree: ${target_dir}: undefined cpu type"
-
- codedir="src/${project}/${tree}"
- if [ ! -d "${codedir}" ]; then
- if [ "${mode}" = "distclean" ] || \
- [ "${mode}" = "crossgcc-clean" ]; then
- printf "Directory %s doesn't exist; skipping clean\n" \
- "${codedir}" 1>&2
- return 1
- fi
- x_ ./update project trees "${project}" "${target}"
- elif [ "${mode}" = "distclean" ] || \
- [ "${mode}" = "crossgcc-clean" ]; then
- [ -f "${tmpclean}/${tree}" ] && return 1
- touch "${tmpclean}/${tree}"
- fi
-
- [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && return 0
-
- # u-boot and coreboot are both compiled with coreboot's crossgcc
- if [ "${project}" = "coreboot" ] || [ "${project}" = "u-boot" ]; then
- [ ! -z ${mode} ] || check_cross_compiler || \
- err "handle_src_tree ${project}/${target}: crossgcc"
- cbfstool="cbutils/${tree}/cbfstool"
- [ -f "${cbfstool}" ] || \
- x_ ./update project build -b coreboot utils "${tree}"
- fi
-}
-
-# set up cross-compiler (coreboot crossgcc) for u-boot and coreboot
-# (seabios and grub currently use hostcc, not crossgcc)
-check_cross_compiler()
-{
- [ "${crossgcc_ada}" = "y" ] || [ "${crossgcc_ada}" = "n" ] || \
- crossgcc_ada="y"
- [ "${crossgcc_ada}" != "y" ] && \
- export BUILD_LANGUAGES=c
-
- cbdir="src/coreboot/${tree}"
- [ "${project}" != "coreboot" ] && \
- cbdir="src/coreboot/default" # not u-boot (e.g. linux)
- [ "${project}" = "u-boot" ] && \
- cbdir="src/coreboot/cros" # u-boot only used on coreboot/cros
-
- # only true if not building coreboot:
- ctarget="${cbdir#src/coreboot/}"
- [ -d "${cbdir}" ] || \
- x_ ./update project trees coreboot ${ctarget}
-
- if [ "${arch}" = "x86_32" ] || [ "${arch}" = "x86_64" ]; then
- [ -d "${cbdir}/util/crossgcc/xgcc/i386-elf/" ] || \
- make -C "${cbdir}" crossgcc-i386 CPUS=$(nproc) || \
- return 1
- case "$(uname -m)" in
- x86*|i*86|amd64) : ;;
- *) export CROSS_COMPILE=i386-elf- ;;
- esac
- elif [ "${arch}" = "ARMv7" ]; then
- [ -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ] || \
- make -C "${cbdir}" crossgcc-arm CPUS=$(nproc) || \
- return 1
- case "$(uname -m)" in
- arm|arm32|armv6*|armv7*) : ;;
- *) export CROSS_COMPILE=arm-eabi- ;;
- esac
- elif [ "${arch}" = "AArch64" ]; then
- [ -d "${cbdir}/util/crossgcc/xgcc/aarch64-elf/" ] || \
- make -C "${cbdir}" crossgcc-aarch64 CPUS=$(nproc) || \
- return 1
- # aarch64 also needs armv7 toolchain for arm-trusted-firmware
- [ -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ] || \
- make -C "${cbdir}" crossgcc-arm CPUS=$(nproc) || \
- return 1
- case "$(uname -m)" in
- arm64|aarch64) : ;;
- *) export CROSS_COMPILE=aarch64-elf- ;;
- esac
- fi
-
- # we *must* ensure that u-boot's build system uses crossgcc first
- export PATH="$(pwd)/${cbdir}/util/crossgcc/xgcc/bin:$PATH"
-}
-
-check_config()
-{
- [ ! -f "${config}" ] && \
- err "check_config: ${project}/${target}: configs missing"
-
- dest_dir="${elfdir}/${target}/${config_name}"
- # TODO: very hacky check. do it properly (based on build.list)
- for elftest in "${dest_dir}"/*; do
- [ -f "${elftest}" ] || continue
- printf "Build already exists, so skipping build\n" 1>&2
- return 1
- done
- x_ mkdir -p "${dest_dir}"
-}
-
-handle_makefile()
-{
- x_ make clean -C "${codedir}"
- x_ cp "${config}" "${codedir}/.config"
- [ ! -z ${mode} ] || make -C "${codedir}" silentoldconfig || \
- make -C "${codedir}" oldconfig || :
-
- run_make_command || err "handle_makefile ${codedir}: no makefile!"
-
- if [ -e "${codedir}/.git" ] && [ "${project}" = "u-boot" ] && \
- [ "${mode}" = "distclean" ]; then
- x_ git -C "${codedir}" clean -fdx
- elif [ "${mode}" = "oldconfig" ] || [ "${mode}" = "menuconfig" ]; then
- x_ cp "${codedir}/.config" "${config}"
- fi
-}
-
-run_make_command()
-{
- [ -f "${codedir}/Makefile" ] || [ -f "${codedir}/makefile" ] || \
- [ -f "${codedir}/GNUmakefile" ] || return 1
- [ "${project}" = "coreboot" ] && [ -z "${mode}" ] && \
- x_ printf "%s\n" "${version}" >"${codedir}/.coreboot-version"
-
- x_ make -C "${codedir}" -j$(nproc) ${mode}
- [ "${mode}" != "clean" ] && return 0
- make -C "${codedir}" distclean 2>/dev/null || :
-}
-
-copy_elf()
-{
- [ "${project}" != "coreboot" ] || x_ modify_coreboot_rom
- while read f; do
- [ ! -f "${codedir}/$f" ] || \
- x_ cp "${codedir}/${f}" "${dest_dir}/"
- done < ${listfile}
-
- x_ make clean -C "${codedir}"
-}
-
-main $@
diff --git a/script/update/project/repo b/script/update/project/repo
deleted file mode 100755
index df522edc..00000000
--- a/script/update/project/repo
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/usr/bin/env sh
-# SPDX-License-Identifier: GPL-3.0-only
-# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com>
-# SPDX-FileCopyrightText: 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
-# SPDX-FileCopyrightText: 2023 Leah Rowe <leah@libreboot.org>
-
-. "include/err.sh"
-. "include/git.sh"
-. "include/option.sh"
-
-eval "$(setvars "" name rev loc url bkup_url depend)"
-tmp_dir="${PWD}/tmp/gitclone"
-
-main()
-{
- [ $# -gt 0 ] || fail "no argument given"
-
- [ -z "${1+x}" ] && fail 'main(): name not set'
- name=${1#src/}
-
- scan_config "${name}" "config/git" "fail"
- verify_config
-
- clone_project
- [ "${depend}" = "" ] || for d in ${depend} ; do
- xx_ ./update project repo ${d}
- done
- xx_ rm -Rf "${tmp_dir}"
-}
-
-verify_config()
-{
- [ -z "${rev+x}" ] && fail 'verify_config: rev not set'
- [ -z "${loc+x}" ] && fail 'verify_config: loc not set'
- [ -z "${url+x}" ] && fail 'verify_config: url not set'
-}
-
-clone_project()
-{
- xx_ rm -Rf "${tmp_dir}"
- xx_ mkdir -p "${tmp_dir%/*}"
-
- loc="${loc#src/}"
- loc="src/${loc}"
-
- git clone ${url} "${tmp_dir}" || git clone ${bkup_url} "${tmp_dir}" || \
- fail "clone_project: could not download ${name}"
- git_reset_rev "${tmp_dir}" "${rev}" "fail" || \
- fail "clone_project ${loc}/: cannot reset <- ${rev}"
- git_am_patches "${tmp_dir}" "${PWD}/config/${name}/patches" "fail" || \
- fail "clone_project ${loc}/: cannot apply patches"
-
- xx_ rm -Rf "${loc}"
- [ "${loc}" = "${loc%/*}" ] || xx_ mkdir -p ${loc%/*}
- xx_ mv "${tmp_dir}" "${loc}"
-}
-
-fail()
-{
- for x in "${loc}" "${tmp_dir}"; do
- [ -z "${x}" ] || [ ! -d "${x}" ] || rm -Rf "${loc}" || :
- done
- usage
- err "${1}"
-}
-
-usage()
-{
- cat <<- EOF
- Usage: ./update project repo [name]
-
- Options:
- name: Module name as specified in files under config/git/
- EOF
-}
-
-main $@
diff --git a/script/update/project/trees b/script/update/project/trees
index bb67734a..1055d500 100755
--- a/script/update/project/trees
+++ b/script/update/project/trees
@@ -1,108 +1,292 @@
#!/usr/bin/env sh
# SPDX-License-Identifier: GPL-3.0-or-later
-# SPDX-FileCopyrightText: 2014-2016,2020,2021,2023 Leah Rowe <leah@libreboot.org>
# SPDX-FileCopyrightText: 2022 Alper Nebi Yasak <alpernebiyasak@gmail.com>
# SPDX-FileCopyrightText: 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
+# SPDX-FileCopyrightText: 2023 Leah Rowe <leah@libreboot.org>
[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e
. "include/err.sh"
-. "include/git.sh"
. "include/option.sh"
+. "include/git.sh"
+
+export LOCALVERSION="-${projectname}-${version}"
-eval "$(setvars "" _target tree rev project cfgsdir _xm)"
+eval "$(setvars "" arch cfgsdir codedir config config_name crossgcc_ada mode \
+ elfdir listfile project romtype target target_dir targets tree cbfstool _f \
+ target1)"
+
+tmpclean="$(mktemp -d -t makeclean.XXXXXXXXXX)"
main()
{
- [ -z "${1}" ] && err "project name not specified"
- project="${1#src/}" && shift 1
+ while getopts f:b:m:u:c:x: option
+ do
+ _f="${1}"
+ case "${1}" in
+ -b) : ;;
+ -u) mode="oldconfig" ;;
+ -m) mode="menuconfig" ;;
+ -c) mode="distclean" ;;
+ -x) mode="crossgcc-clean" ;;
+ -f) mode="fetch" ;;
+ *) err "Invalid option" ;;
+ esac
+ shift; project="${OPTARG#src/}"; shift
+ done
+ [ -z "${_f}" ] && err "flag not specified (-m, -u, -b, -c or -x)"
+ [ -z "${project}" ] && err "project name not specified"
+
+ if [ ! -f "config/${project}/build.list" ]; then
+ build_projects $@
+ else
+ build_targets $@
+ fi
+}
+
+build_projects()
+{
+ [ $# -gt 0 ] && x_ ./update project trees ${_f} ${@}
- configure_targets $@
+ if [ "${mode}" = "fetch" ]; then
+ fetch_project_repo
+ return 0
+ fi
- printf "Downloading %s and applying patches\n" ${project}
+ codedir="src/${project}"
+ [ -d "${codedir}" ] || x_ ./update project trees -f "${project}"
- for x in ${targets}; do
- download_for_target "${x}"
- done
+ if [ "${project}" = "uefitool" ]; then
+ (
+ x_ cd src/uefitool
+ cmake UEFIExtract/ || [ -f Makefile ] || \
+ err "build_projects: !cmake UEFIExtract/"
+ )
+ fi
+
+ [ "${mode}" = "distclean" ] && mode="clean"
+ run_make_command || return 0
}
-configure_targets()
+build_targets()
{
+ elfdir="elf/${project}"
+
cfgsdir="config/${project}"
- [ -d "${cfgsdir}" ] || err "unsupported project name"
+ [ -d "${cfgsdir}" ] || err "directory, ${cfgsdir}, does not exist"
- targets=$(listitems "${cfgsdir}")
+ listfile="${cfgsdir}/build.list"
+ [ -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=$(listitems "${cfgsdir}") || \
+ err "Cannot get options for ${cfgsdir}"
[ $# -gt 0 ] && targets=$@
- [ -z "${targets}" ] || return 0
- err "No targets for project: ${project}"
+ [ -z "${mode}" ] && x_ mkdir -p "${elfdir}/"
+
+ handle_targets
+}
+
+handle_targets()
+{
+ for x in ${targets}; do
+ target="${x}"
+ printf "Running 'make %s' for project '%s, target '%s''\n" \
+ "${mode}" "${project}" "${target}"
+ [ "${project}" != "coreboot" ] || [ ! -z ${mode} ] || \
+ x_ ./update vendor download ${target}
+ x_ handle_defconfig
+ done
+
+ [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && return 0
+ [ -z "${mode}" ] || return 0
+ printf "Done! The files are stored under %s/\n\n" "${elfdir}"
}
-download_for_target()
+handle_defconfig()
{
- _target="${1}"
+ handle_src_tree "${target}" || return 0
- fetch_config
- [ -d "src/${project}/${tree}" ] && \
- printf "download/%s %s (%s): exists\n" \
- "${project}" "${tree}" "${_target}" 1>&2 && return 0
+ if [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ]; then
+ handle_coreboot_utils "${tree}"
+ return 0
+ fi
- fetch_from_upstream
- prepare_new_tree
+ for y in "${target_dir}/config"/*; do
+ [ -f "${y}" ] || continue
+ config="${y}"
+ config_name="${config#${target_dir}/config/}"
+
+ printf "handle/make/config %s %s: handling config %s\n" \
+ "${project}" "${target}" "${config_name}"
+
+ [ ! -z ${mode} ] || check_config || continue
+ handle_makefile
+ [ ! -z ${mode} ] || copy_elf
+ done
+}
+
+handle_src_tree()
+{
+ romtype="normal"
+ target_dir="${cfgsdir}/${target}"
+
+ if [ "${mode}" = "fetch" ]; then
+ fetch_project_trees
+ return 1
+ fi
+
+ x_ mkdir -p "${elfdir}/${target}"
+ eval "$(setvars "" arch tree)"
+
+ . "${target_dir}/target.cfg" || \
+ err "handle_src_tree ${target_dir}: cannot load target.cfg"
+
+ [ -z "${tree}" ] && \
+ err "handle_src_tree: ${target_dir}: tree undefined"
+ [ -z "${arch}" ] && \
+ err "handle_src_tree: ${target_dir}: undefined cpu type"
+
+ codedir="src/${project}/${tree}"
+
+ if [ ! -d "${codedir}" ]; then
+ if [ "${mode}" = "distclean" ] || \
+ [ "${mode}" = "crossgcc-clean" ]; then
+ printf "Directory %s doesn't exist; skipping clean\n" \
+ "${codedir}" 1>&2
+ return 1
+ fi
+ x_ ./update project trees -f "${project}" "${target}"
+ elif [ "${mode}" = "distclean" ] || \
+ [ "${mode}" = "crossgcc-clean" ]; then
+ [ -f "${tmpclean}/${tree}" ] && return 1
+ touch "${tmpclean}/${tree}"
+ fi
+
+ [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && return 0
+
+ # u-boot and coreboot are both compiled with coreboot's crossgcc
+ if [ "${project}" = "coreboot" ] || [ "${project}" = "u-boot" ]; then
+ [ ! -z ${mode} ] || check_cross_compiler || \
+ err "handle_src_tree ${project}/${target}: crossgcc"
+ cbfstool="cbutils/${tree}/cbfstool"
+ [ -f "${cbfstool}" ] || \
+ x_ ./update project trees -b coreboot utils "${tree}"
+ fi
}
-fetch_config()
+# set up cross-compiler (coreboot crossgcc) for u-boot and coreboot
+# (seabios and grub currently use hostcc, not crossgcc)
+check_cross_compiler()
{
- x_ rm -f "${cfgsdir}/"*/seen
- while true; do
- eval "$(setvars "" rev tree)"
- _xm="fetch_config ${project}/${_target}"
+ [ "${crossgcc_ada}" = "y" ] || [ "${crossgcc_ada}" = "n" ] || \
+ crossgcc_ada="y"
+ [ "${crossgcc_ada}" != "y" ] && \
+ export BUILD_LANGUAGES=c
- check_config_for_target "${_target}"
+ cbdir="src/coreboot/${tree}"
+ [ "${project}" != "coreboot" ] && \
+ cbdir="src/coreboot/default" # not u-boot (e.g. linux)
+ [ "${project}" = "u-boot" ] && \
+ cbdir="src/coreboot/cros" # u-boot only used on coreboot/cros
- # This is to override $rev and $tree
- . "${cfgsdir}/${_target}/target.cfg" || \
- err "fetch_config: no \"${cfgsdir}/${_target}/target.cfg\""
+ # only true if not building coreboot:
+ ctarget="${cbdir#src/coreboot/}"
+ [ -d "${cbdir}" ] || \
+ x_ ./update project trees -f coreboot ${ctarget}
+
+ if [ "${arch}" = "x86_32" ] || [ "${arch}" = "x86_64" ]; then
+ [ -d "${cbdir}/util/crossgcc/xgcc/i386-elf/" ] || \
+ make -C "${cbdir}" crossgcc-i386 CPUS=$(nproc) || \
+ return 1
+ case "$(uname -m)" in
+ x86*|i*86|amd64) : ;;
+ *) export CROSS_COMPILE=i386-elf- ;;
+ esac
+ elif [ "${arch}" = "ARMv7" ]; then
+ [ -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ] || \
+ make -C "${cbdir}" crossgcc-arm CPUS=$(nproc) || \
+ return 1
+ case "$(uname -m)" in
+ arm|arm32|armv6*|armv7*) : ;;
+ *) export CROSS_COMPILE=arm-eabi- ;;
+ esac
+ elif [ "${arch}" = "AArch64" ]; then
+ [ -d "${cbdir}/util/crossgcc/xgcc/aarch64-elf/" ] || \
+ make -C "${cbdir}" crossgcc-aarch64 CPUS=$(nproc) || \
+ return 1
+ # aarch64 also needs armv7 toolchain for arm-trusted-firmware
+ [ -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ] || \
+ make -C "${cbdir}" crossgcc-arm CPUS=$(nproc) || \
+ return 1
+ case "$(uname -m)" in
+ arm64|aarch64) : ;;
+ *) export CROSS_COMPILE=aarch64-elf- ;;
+ esac
+ fi
+
+ # we *must* ensure that u-boot's build system uses crossgcc first
+ export PATH="$(pwd)/${cbdir}/util/crossgcc/xgcc/bin:$PATH"
+}
- [ "${_target}" != "${tree}" ] && _target="${tree}" && continue
- [ -z "${tree}" ] && err "${_xm}: tree undefined"
- [ -z "${rev}" ] && err "${_xm}: revision undefined"
- break
+check_config()
+{
+ [ ! -f "${config}" ] && \
+ err "check_config: ${project}/${target}: configs missing"
+
+ dest_dir="${elfdir}/${target}/${config_name}"
+ # TODO: very hacky check. do it properly (based on build.list)
+ for elftest in "${dest_dir}"/*; do
+ [ -f "${elftest}" ] || continue
+ printf "Build already exists, so skipping build\n" 1>&2
+ return 1
done
+ x_ mkdir -p "${dest_dir}"
}
-check_config_for_target()
+handle_makefile()
{
- [ -f "${cfgsdir}/${1}/target.cfg" ] || \
- err "${_xm} check: target.cfg does not exist"
- [ -f "${cfgsdir}/${1}/seen" ] && \
- err "${_xm} check: infinite loop in tree definitions"
+ x_ make clean -C "${codedir}"
+ x_ cp "${config}" "${codedir}/.config"
+ [ ! -z ${mode} ] || make -C "${codedir}" silentoldconfig || \
+ make -C "${codedir}" oldconfig || :
+
+ run_make_command || err "handle_makefile ${codedir}: no makefile!"
- x_ touch "${cfgsdir}/${1}/seen"
+ if [ -e "${codedir}/.git" ] && [ "${project}" = "u-boot" ] && \
+ [ "${mode}" = "distclean" ]; then
+ x_ git -C "${codedir}" clean -fdx
+ elif [ "${mode}" = "oldconfig" ] || [ "${mode}" = "menuconfig" ]; then
+ x_ cp "${codedir}/.config" "${config}"
+ fi
}
-fetch_from_upstream()
+run_make_command()
{
- [ -d "src/${project}/${project}" ] && return 0
+ [ -f "${codedir}/Makefile" ] || [ -f "${codedir}/makefile" ] || \
+ [ -f "${codedir}/GNUmakefile" ] || return 1
+ [ "${project}" = "coreboot" ] && [ -z "${mode}" ] && \
+ x_ printf "%s\n" "${version}" >"${codedir}/.coreboot-version"
- x_ mkdir -p "src/${project}"
- x_ ./update project repo "${project}"
+ x_ make -C "${codedir}" -j$(nproc) ${mode}
+ [ "${mode}" != "clean" ] && return 0
+ make -C "${codedir}" distclean 2>/dev/null || :
}
-prepare_new_tree()
+copy_elf()
{
- printf "Creating %s tree %s (%s)\n" "${project}" "${tree}" "${_target}"
+ [ "${project}" != "coreboot" ] || x_ modify_coreboot_rom
+ while read f; do
+ [ ! -f "${codedir}/$f" ] || \
+ x_ cp "${codedir}/${f}" "${dest_dir}/"
+ done < ${listfile}
- x_ cp -R "src/${project}/${project}" "src/${project}/${tree}"
- x_ git_reset_rev "src/${project}/${tree}" "${rev}" "err"
- (
- x_ cd "src/${project}/${tree}"
- git submodule update --init --checkout || \
- err "prepare_new_tree ${project}/${tree}: can't update git modules"
- )
- git_am_patches "${PWD}/src/${project}/${tree}" \
- "${PWD}/${cfgsdir}/${tree}/patches" "err"
+ x_ make clean -C "${codedir}"
}
main $@
diff --git a/script/update/release/roms b/script/update/release/roms
index c34762b0..0e2ab720 100755
--- a/script/update/release/roms
+++ b/script/update/release/roms
@@ -100,9 +100,9 @@ strip_archive()
{
romdir=${1}
[ -d "src/coreboot/${tree}" ] || \
- x_ ./update project trees coreboot ${tree}
+ x_ ./update project trees -f coreboot ${tree}
- x_ ./update project build -b coreboot utils ${tree}
+ x_ ./update project trees -b coreboot utils ${tree}
if [ "${microcode_required}" = "n" ]; then
for romfile in "${romdir}"/*.rom; do
diff --git a/script/update/release/src b/script/update/release/src
index b63994b5..d75ec170 100755
--- a/script/update/release/src
+++ b/script/update/release/src
@@ -44,11 +44,10 @@ create_release_directory()
download_modules()
{
- for modname in ${trees_fetch_list}; do
- [ -d "src/${modname}" ] || xx_ ./update project trees ${modname}
- done
- for modname in ${simple_fetch_list} ${download_only_list}; do
- [ -d "src/${modname}/" ] || xx_ ./update project repo ${modname}
+ for modname in ${trees_fetch_list} ${simple_fetch_list} \
+ ${download_only_list}; do
+ [ -d "src/${modname}/" ] || \
+ xx_ ./update project trees -f ${modname}
done
}
@@ -79,12 +78,12 @@ purge_files()
(
xx_ cd "${srcdir}"
[ ! -d "src/coreboot/default/util/kbc1126" ] || \
- xx_ ./update project build -c "src/coreboot/default/util/kbc1126"
- xx_ ./update project build -x coreboot
+ xx_ ./update project trees -c "src/coreboot/default/util/kbc1126"
+ xx_ ./update project trees -x coreboot
for p in u-boot seabios coreboot; do
- xx_ ./update project build -c "${p}"
+ xx_ ./update project trees -c "${p}"
done
- xx_ ./update project build -c bios_extract flashrom grub uefitool \
+ xx_ ./update project trees -c bios_extract flashrom grub uefitool \
stm32-vserprog stm32-vserprog/libopencm3 util/* memtest86plus
xx_ rm -Rf .git */.git* */*/.git* */*/*/.git* */*/*/*/.git* \
diff --git a/script/update/vendor/download b/script/update/vendor/download
index aec59c1f..de5abb68 100755
--- a/script/update/vendor/download
+++ b/script/update/vendor/download
@@ -41,16 +41,16 @@ detect_firmware()
build_dependencies()
{
[ -d ${cbdir} ] || \
- x_ ./update project trees coreboot ${cbdir##*/}
+ x_ ./update project trees -f coreboot ${cbdir##*/}
for d in uefitool biosutilities bios_extract me_cleaner; do
[ -d "src/${d}" ] && continue
- x_ ./update project repo "${d}"
+ x_ ./update project trees -f "${d}"
done
[ -f "${uefiextract}" ] || \
- x_ ./update project build -b uefitool
+ x_ ./update project trees -b uefitool
[ -f "${kbc1126_ec_dump}" ] || \
x_ make -C "${cbdir}/util/kbc1126"
- x_ ./update project build -b coreboot utils default
+ x_ ./update project trees -b coreboot utils default
}
download_vendorfiles()
diff --git a/script/update/vendor/inject b/script/update/vendor/inject
index 846f1846..3340a723 100755
--- a/script/update/vendor/inject
+++ b/script/update/vendor/inject
@@ -87,8 +87,8 @@ detect_board()
build_dependencies()
{
- [ -d "${cbdir}" ] || x_ ./update project trees coreboot default
- x_ ./update project build -b coreboot utils default
+ [ -d "${cbdir}" ] || x_ ./update project trees -f coreboot default
+ x_ ./update project trees -b coreboot utils default
x_ ./update vendor download ${board}
}