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>
This commit is contained in:
Leah Rowe
2023-10-07 06:55:10 +01:00
parent a413c01a3e
commit 1e89264ce3
12 changed files with 408 additions and 478 deletions
+117 -11
View File
@@ -1,15 +1,123 @@
# SPDX-License-Identifier: GPL-3.0-or-later # 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() git_reset_rev()
{ {
sdir="${1}" sdir="${1}"
_rev="${2}" _rev="${2}"
_fail="${3}"
( (
cd "${sdir}" || "${_fail}" "cannot cd to ${sdir}" x_ cd "${sdir}"
git reset --hard ${_rev} || \ 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 sdir="${1}" # assumed to be absolute path
patchdir="${2}" # ditto patchdir="${2}" # ditto
_fail="${3}"
( (
cd "${sdir}" || \ x_ cd "${sdir}"
"${_fail}" "apply_patches: !cd \"${sdir}\""
for patch in "${patchdir}/"*; do for patch in "${patchdir}/"*; do
[ -L "${patch}" ] && continue [ -L "${patch}" ] && continue
[ -f "${patch}" ] || continue [ -f "${patch}" ] || continue
if ! git am "${patch}"; then if ! git am "${patch}"; then
git am --abort || "${_fail}" "${sdir}: !git am --abort" git am --abort || err "${sdir}: !git am --abort"
"${_fail}" "!git am ${patch} -> ${sdir}" err "!git am ${patch} -> ${sdir}"
fi fi
done done
) )
for patches in "${patchdir}/"*; do for patches in "${patchdir}/"*; do
[ -L "${patches}" ] && continue [ -L "${patches}" ] && continue
[ ! -d "${patches}" ] || \ [ ! -d "${patches}" ] || \
git_am_patches "${sdir}" "${patches}" "${_fail}" || \ git_am_patches "${sdir}" "${patches}" err || \
"${_fail}" "apply_patches: !${sdir}/ ${patches}/" err "apply_patches: !${sdir}/ ${patches}/"
done done
} }
+1 -1
View File
@@ -40,7 +40,7 @@ EOF
handle_coreboot_utils() handle_coreboot_utils()
{ {
for util in cbfstool ifdtool; do 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}" ] && \ [ -z "${mode}" ] && [ ! -f "cbutils/${1}/${util}" ] && \
x_ mkdir -p "cbutils/${1}" && \ x_ mkdir -p "cbutils/${1}" && \
x_ cp "src/coreboot/${1}/util/${util}/${util}" \ x_ cp "src/coreboot/${1}/util/${util}/${util}" \
+5 -5
View File
@@ -125,13 +125,13 @@ prepare_target()
cbfstool="cbutils/${tree}/cbfstool" cbfstool="cbutils/${tree}/cbfstool"
cbrom="${cbdir}/build/coreboot.rom" cbrom="${cbdir}/build/coreboot.rom"
x_ ./update project build -b coreboot utils ${tree} x_ ./update project trees -b coreboot utils ${tree}
build_dependency_seabios build_dependency_seabios
memtest_bin="memtest86plus/build${arch#*_}/memtest.bin" memtest_bin="memtest86plus/build${arch#*_}/memtest.bin"
[ "${payload_memtest}" != "y" ] || [ -f "src/${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}/"* x_ rm -f "${romdir}/"*
@@ -148,7 +148,7 @@ build_dependency_seabios()
|| [ ! -f elf/seabios/default/libgfxinit/bios.bin.elf ] \ || [ ! -f elf/seabios/default/libgfxinit/bios.bin.elf ] \
|| [ ! -f elf/seabios/default/vgarom/bios.bin.elf ] \ || [ ! -f elf/seabios/default/vgarom/bios.bin.elf ] \
|| [ ! -f elf/seabios/default/normal/bios.bin.elf ]; then || [ ! -f elf/seabios/default/normal/bios.bin.elf ]; then
x_ ./update project build -b seabios x_ ./update project trees -b seabios
fi fi
} }
@@ -176,7 +176,7 @@ build_dependency_uboot()
{ {
[ "${payload_uboot}" = "y" ] || return 0 [ "${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}" ubdir="elf/u-boot/${board}/${uboot_config}"
ubootelf="${ubdir}/u-boot.elf" ubootelf="${ubdir}/u-boot.elf"
[ ! -f "${ubootelf}" ] && [ -f "${ubdir}/u-boot.bin" ] && \ [ ! -f "${ubootelf}" ] && [ -f "${ubdir}/u-boot.bin" ] && \
@@ -213,7 +213,7 @@ build_roms()
"${cbcfg}" "${board}" "${displaymode}" "${initmode}" \ "${cbcfg}" "${board}" "${displaymode}" "${initmode}" \
1>&2 && return 0 1>&2 && return 0
x_ ./update project build -b coreboot ${board} x_ ./update project trees -b coreboot ${board}
_cbrom="elf/coreboot/${board}/${initmode}_${displaymode}" _cbrom="elf/coreboot/${board}/${initmode}_${displaymode}"
[ "${initmode}" = "normal" ] && \ [ "${initmode}" = "normal" ] && \
+1 -1
View File
@@ -23,7 +23,7 @@ main()
handle_dependencies() 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 [ -f "src/grub/grub-mkstandalone" ] || build_grub_utils
x_ mkdir -p "${elfdir}" x_ mkdir -p "${elfdir}"
x_ rm -f "${elfdir}/"* x_ rm -f "${elfdir}/"*
+2 -2
View File
@@ -23,12 +23,12 @@ main()
platform="rp2040" platform="rp2040"
boards_dir=${pico_sdk_dir}/src/boards/include/boards boards_dir=${pico_sdk_dir}/src/boards/include/boards
[ -d "${pico_src_dir}/" ] || \ [ -d "${pico_src_dir}/" ] || \
x_ ./update project repo "rpi-pico-serprog" x_ ./update project trees -f "rpi-pico-serprog"
elif [ "${1}" = "stm32" ]; then elif [ "${1}" = "stm32" ]; then
platform="stm32" platform="stm32"
boards_dir=${stm32_src_dir}/boards boards_dir=${stm32_src_dir}/boards
[ -d "${stm32_src_dir}/" ] || \ [ -d "${stm32_src_dir}/" ] || \
x_ ./update project repo "stm32-vserprog" x_ ./update project trees -f "stm32-vserprog"
else else
err "${usage}" err "${usage}"
fi fi
-282
View File
@@ -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 $@
-77
View File
@@ -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 $@
+266 -82
View File
@@ -1,108 +1,292 @@
#!/usr/bin/env sh #!/usr/bin/env sh
# SPDX-License-Identifier: GPL-3.0-or-later # 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 Alper Nebi Yasak <alpernebiyasak@gmail.com>
# SPDX-FileCopyrightText: 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com> # SPDX-FileCopyrightText: 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
# SPDX-FileCopyrightText: 2023 Leah Rowe <leah@libreboot.org>
[ "x${DEBUG+set}" = 'xset' ] && set -v [ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e set -u -e
. "include/err.sh" . "include/err.sh"
. "include/git.sh"
. "include/option.sh" . "include/option.sh"
. "include/git.sh"
eval "$(setvars "" _target tree rev project cfgsdir _xm)" 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() main()
{ {
[ -z "${1}" ] && err "project name not specified" while getopts f:b:m:u:c:x: option
project="${1#src/}" && shift 1 do
_f="${1}"
configure_targets $@ case "${1}" in
-b) : ;;
printf "Downloading %s and applying patches\n" ${project} -u) mode="oldconfig" ;;
-m) mode="menuconfig" ;;
for x in ${targets}; do -c) mode="distclean" ;;
download_for_target "${x}" -x) mode="crossgcc-clean" ;;
-f) mode="fetch" ;;
*) err "Invalid option" ;;
esac
shift; project="${OPTARG#src/}"; shift
done 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
} }
configure_targets() build_projects()
{ {
cfgsdir="config/${project}" [ $# -gt 0 ] && x_ ./update project trees ${_f} ${@}
[ -d "${cfgsdir}" ] || err "unsupported project name"
targets=$(listitems "${cfgsdir}") if [ "${mode}" = "fetch" ]; then
[ $# -gt 0 ] && targets=$@ fetch_project_repo
[ -z "${targets}" ] || return 0 return 0
fi
err "No targets for project: ${project}" codedir="src/${project}"
} [ -d "${codedir}" ] || x_ ./update project trees -f "${project}"
download_for_target() if [ "${project}" = "uefitool" ]; then
{
_target="${1}"
fetch_config
[ -d "src/${project}/${tree}" ] && \
printf "download/%s %s (%s): exists\n" \
"${project}" "${tree}" "${_target}" 1>&2 && return 0
fetch_from_upstream
prepare_new_tree
}
fetch_config()
{
x_ rm -f "${cfgsdir}/"*/seen
while true; do
eval "$(setvars "" rev tree)"
_xm="fetch_config ${project}/${_target}"
check_config_for_target "${_target}"
# This is to override $rev and $tree
. "${cfgsdir}/${_target}/target.cfg" || \
err "fetch_config: no \"${cfgsdir}/${_target}/target.cfg\""
[ "${_target}" != "${tree}" ] && _target="${tree}" && continue
[ -z "${tree}" ] && err "${_xm}: tree undefined"
[ -z "${rev}" ] && err "${_xm}: revision undefined"
break
done
}
check_config_for_target()
{
[ -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_ touch "${cfgsdir}/${1}/seen"
}
fetch_from_upstream()
{
[ -d "src/${project}/${project}" ] && return 0
x_ mkdir -p "src/${project}"
x_ ./update project repo "${project}"
}
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}" "err"
( (
x_ cd "src/${project}/${tree}" x_ cd src/uefitool
git submodule update --init --checkout || \ cmake UEFIExtract/ || [ -f Makefile ] || \
err "prepare_new_tree ${project}/${tree}: can't update git modules" err "build_projects: !cmake UEFIExtract/"
) )
git_am_patches "${PWD}/src/${project}/${tree}" \ fi
"${PWD}/${cfgsdir}/${tree}/patches" "err"
[ "${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()
{
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
}
# 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 -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"
}
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 $@ main $@
+2 -2
View File
@@ -100,9 +100,9 @@ strip_archive()
{ {
romdir=${1} romdir=${1}
[ -d "src/coreboot/${tree}" ] || \ [ -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 if [ "${microcode_required}" = "n" ]; then
for romfile in "${romdir}"/*.rom; do for romfile in "${romdir}"/*.rom; do
+8 -9
View File
@@ -44,11 +44,10 @@ create_release_directory()
download_modules() download_modules()
{ {
for modname in ${trees_fetch_list}; do for modname in ${trees_fetch_list} ${simple_fetch_list} \
[ -d "src/${modname}" ] || xx_ ./update project trees ${modname} ${download_only_list}; do
done [ -d "src/${modname}/" ] || \
for modname in ${simple_fetch_list} ${download_only_list}; do xx_ ./update project trees -f ${modname}
[ -d "src/${modname}/" ] || xx_ ./update project repo ${modname}
done done
} }
@@ -79,12 +78,12 @@ purge_files()
( (
xx_ cd "${srcdir}" xx_ cd "${srcdir}"
[ ! -d "src/coreboot/default/util/kbc1126" ] || \ [ ! -d "src/coreboot/default/util/kbc1126" ] || \
xx_ ./update project build -c "src/coreboot/default/util/kbc1126" xx_ ./update project trees -c "src/coreboot/default/util/kbc1126"
xx_ ./update project build -x coreboot xx_ ./update project trees -x coreboot
for p in u-boot seabios coreboot; do for p in u-boot seabios coreboot; do
xx_ ./update project build -c "${p}" xx_ ./update project trees -c "${p}"
done 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 stm32-vserprog stm32-vserprog/libopencm3 util/* memtest86plus
xx_ rm -Rf .git */.git* */*/.git* */*/*/.git* */*/*/*/.git* \ xx_ rm -Rf .git */.git* */*/.git* */*/*/.git* */*/*/*/.git* \
+4 -4
View File
@@ -41,16 +41,16 @@ detect_firmware()
build_dependencies() build_dependencies()
{ {
[ -d ${cbdir} ] || \ [ -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 for d in uefitool biosutilities bios_extract me_cleaner; do
[ -d "src/${d}" ] && continue [ -d "src/${d}" ] && continue
x_ ./update project repo "${d}" x_ ./update project trees -f "${d}"
done done
[ -f "${uefiextract}" ] || \ [ -f "${uefiextract}" ] || \
x_ ./update project build -b uefitool x_ ./update project trees -b uefitool
[ -f "${kbc1126_ec_dump}" ] || \ [ -f "${kbc1126_ec_dump}" ] || \
x_ make -C "${cbdir}/util/kbc1126" x_ make -C "${cbdir}/util/kbc1126"
x_ ./update project build -b coreboot utils default x_ ./update project trees -b coreboot utils default
} }
download_vendorfiles() download_vendorfiles()
+2 -2
View File
@@ -87,8 +87,8 @@ detect_board()
build_dependencies() build_dependencies()
{ {
[ -d "${cbdir}" ] || x_ ./update project trees coreboot default [ -d "${cbdir}" ] || x_ ./update project trees -f coreboot default
x_ ./update project build -b coreboot utils default x_ ./update project trees -b coreboot utils default
x_ ./update vendor download ${board} x_ ./update vendor download ${board}
} }