2023-08-16 20:34:21 +00:00
|
|
|
#!/usr/bin/env sh
|
2023-09-25 01:19:30 +00:00
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
2023-10-13 08:16:41 +00:00
|
|
|
# SPDX-FileCopyrightText: 2022-2023 Alper Nebi Yasak <alpernebiyasak@gmail.com>
|
2023-09-25 01:19:30 +00:00
|
|
|
# SPDX-FileCopyrightText: 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
|
2023-10-07 05:55:10 +00:00
|
|
|
# SPDX-FileCopyrightText: 2023 Leah Rowe <leah@libreboot.org>
|
2023-08-16 20:34:21 +00:00
|
|
|
|
|
|
|
[ "x${DEBUG+set}" = 'xset' ] && set -v
|
|
|
|
set -u -e
|
|
|
|
|
2023-08-23 17:56:31 +00:00
|
|
|
. "include/err.sh"
|
2023-09-27 20:46:20 +00:00
|
|
|
. "include/option.sh"
|
2023-10-07 05:55:10 +00:00
|
|
|
. "include/git.sh"
|
|
|
|
|
update/release/*: merge to update/project/release
The logic has been re-written, where source archives are
concerned. This clones the current repository, and starts
a new build from scratch. A custom release directory is
possible, by passing -d
This eliminates a step during build-testing, saving hours
of time, because it builds the release archive *inside* the
release archive, with git files removed, thus replicating
the same setup that the user would have.
This also makes everything a bit more consistent, because
it's guaranteed that a release archive will always have
the same files; previously, the release build script would
only copy what was already built, without building anything.
Now, this script builds everything itself.
The script also builds serprog images, not just coreboot.
Usage:
./update project release
If -d is not passed, release/ is used inside lbmk.
Otherwise, you could do:
./update project release -d /path/to/directory
If the directory exists, this script will exit (error).
Other minor fixes: build/fw/coreboot: make version in
coreboot-version (file) not contain hyphens, to work
around a quirk in coreboot's build system when not building
on regular libreboot releases. this quirk only appears
when lbmk is not being compiled under git.
The other main benefit of this change is that the new
script will probably require a lot less maintenance.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-10-08 01:34:50 +00:00
|
|
|
export LOCALVERSION="-${projectname}-${version%%-*}"
|
2023-08-23 17:56:31 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
eval "$(setvars "" arch cfgsdir codedir config config_name crossgcc_ada mode \
|
2023-10-15 10:22:43 +00:00
|
|
|
elfdir listfile project romtype target target_dir targets tree _f target1)"
|
2023-10-07 05:55:10 +00:00
|
|
|
|
2023-08-16 20:34:21 +00:00
|
|
|
main()
|
|
|
|
{
|
2023-10-13 08:16:41 +00:00
|
|
|
while getopts f:b:m:u:c:x:s:l:n: option
|
2023-10-07 05:55:10 +00:00
|
|
|
do
|
|
|
|
_f="${1}"
|
|
|
|
case "${1}" in
|
|
|
|
-b) : ;;
|
|
|
|
-u) mode="oldconfig" ;;
|
|
|
|
-m) mode="menuconfig" ;;
|
|
|
|
-c) mode="distclean" ;;
|
|
|
|
-x) mode="crossgcc-clean" ;;
|
|
|
|
-f) mode="fetch" ;;
|
2023-10-13 08:16:41 +00:00
|
|
|
-s) mode="savedefconfig" ;;
|
|
|
|
-l) mode="olddefconfig" ;;
|
|
|
|
-n) mode="nconfig" ;;
|
2023-10-07 05:55:10 +00:00
|
|
|
*) err "Invalid option" ;;
|
|
|
|
esac
|
|
|
|
shift; project="${OPTARG#src/}"; shift
|
|
|
|
done
|
2023-10-20 02:29:55 +00:00
|
|
|
[ -z "${_f}" ] && err "missing flag (-m/-u/-b/-c/-x/-f/-s/-l/-n)"
|
2023-10-07 05:55:10 +00:00
|
|
|
[ -z "${project}" ] && err "project name not specified"
|
|
|
|
|
|
|
|
if [ ! -f "config/${project}/build.list" ]; then
|
|
|
|
build_projects $@
|
|
|
|
else
|
|
|
|
build_targets $@
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
build_projects()
|
|
|
|
{
|
2023-10-19 23:17:30 +00:00
|
|
|
[ $# -gt 0 ] && x_ ./update trees ${_f} ${@}
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2023-10-20 02:29:55 +00:00
|
|
|
[ "${mode}" = "fetch" ] && fetch_project_repo && return 0
|
2023-08-27 13:14:49 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
codedir="src/${project}"
|
2023-10-19 23:17:30 +00:00
|
|
|
[ -d "${codedir}" ] || x_ ./update trees -f "${project}"
|
2023-10-06 21:59:36 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
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
|
2023-08-16 20:34:21 +00:00
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
build_targets()
|
2023-10-03 12:21:30 +00:00
|
|
|
{
|
2023-10-07 05:55:10 +00:00
|
|
|
elfdir="elf/${project}"
|
2023-10-10 05:04:47 +00:00
|
|
|
[ "${elfdir}" = "elf/coreboot" ] && \
|
|
|
|
elfdir="elf/coreboot_nopayload_DO_NOT_FLASH"
|
2023-10-07 05:55:10 +00:00
|
|
|
|
2023-10-03 12:21:30 +00:00
|
|
|
cfgsdir="config/${project}"
|
2023-10-07 05:55:10 +00:00
|
|
|
[ -d "${cfgsdir}" ] || err "directory, ${cfgsdir}, does not exist"
|
2023-10-03 12:21:30 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
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
|
2023-10-19 22:36:56 +00:00
|
|
|
targets=$(items "${cfgsdir}") || \
|
2023-10-07 05:55:10 +00:00
|
|
|
err "Cannot get options for ${cfgsdir}"
|
2023-10-03 12:21:30 +00:00
|
|
|
[ $# -gt 0 ] && targets=$@
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
[ -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} ] || \
|
2023-10-19 23:17:30 +00:00
|
|
|
x_ ./vendor download ${target}
|
2023-10-07 05:55:10 +00:00
|
|
|
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}"
|
2023-10-03 12:21:30 +00:00
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
handle_defconfig()
|
2023-08-16 20:34:21 +00:00
|
|
|
{
|
2023-10-07 05:55:10 +00:00
|
|
|
handle_src_tree "${target}" || return 0
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
if [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ]; then
|
|
|
|
handle_coreboot_utils "${tree}"
|
|
|
|
return 0
|
|
|
|
fi
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
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}"
|
|
|
|
|
2023-10-20 02:29:55 +00:00
|
|
|
[ "${mode}" = "fetch" ] && fetch_project_trees && return 1
|
2023-10-07 05:55:10 +00:00
|
|
|
|
|
|
|
x_ mkdir -p "${elfdir}/${target}"
|
|
|
|
eval "$(setvars "" arch tree)"
|
|
|
|
|
|
|
|
. "${target_dir}/target.cfg" || \
|
|
|
|
err "handle_src_tree ${target_dir}: cannot load target.cfg"
|
|
|
|
|
2023-10-20 02:29:55 +00:00
|
|
|
for ix in arch tree; do
|
|
|
|
eval "[ -z \"\${$ix}\" ] && err \"handle_src: $ix undefined\""
|
|
|
|
done
|
2023-10-07 05:55:10 +00:00
|
|
|
|
|
|
|
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
|
2023-10-19 23:17:30 +00:00
|
|
|
x_ ./update trees -f "${project}" "${target}"
|
2023-10-07 05:55:10 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
[ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && return 0
|
2023-10-19 22:36:56 +00:00
|
|
|
[ "$project" != "coreboot" ] && [ "$project" != "u-boot" ] && return 0
|
2023-10-07 05:55:10 +00:00
|
|
|
|
|
|
|
# u-boot and coreboot are both compiled with coreboot's crossgcc
|
2023-10-20 02:29:55 +00:00
|
|
|
[ -z ${mode} ] || return 0
|
|
|
|
check_cross_compiler
|
2023-08-16 20:34:21 +00:00
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
# set up cross-compiler (coreboot crossgcc) for u-boot and coreboot
|
|
|
|
# (seabios and grub currently use hostcc, not crossgcc)
|
|
|
|
check_cross_compiler()
|
2023-08-16 20:34:21 +00:00
|
|
|
{
|
2023-10-07 05:55:10 +00:00
|
|
|
[ "${crossgcc_ada}" = "y" ] || [ "${crossgcc_ada}" = "n" ] || \
|
|
|
|
crossgcc_ada="y"
|
2023-10-20 02:29:55 +00:00
|
|
|
[ "${crossgcc_ada}" = "y" ] || export BUILD_LANGUAGES=c
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
cbdir="src/coreboot/${tree}"
|
2023-10-20 02:29:55 +00:00
|
|
|
[ "${project}" != "coreboot" ] && cbdir="src/coreboot/default"
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
# only true if not building coreboot:
|
|
|
|
ctarget="${cbdir#src/coreboot/}"
|
2023-10-20 02:29:55 +00:00
|
|
|
[ -d "${cbdir}" ] || x_ ./update trees -f coreboot ${ctarget}
|
2023-10-07 05:55:10 +00:00
|
|
|
|
|
|
|
if [ "${arch}" = "x86_32" ] || [ "${arch}" = "x86_64" ]; then
|
|
|
|
[ -d "${cbdir}/util/crossgcc/xgcc/i386-elf/" ] || \
|
2023-10-20 02:29:55 +00:00
|
|
|
x_ make -C "${cbdir}" crossgcc-i386 CPUS=$(nproc)
|
2023-10-07 05:55:10 +00:00
|
|
|
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/" ] || \
|
2023-10-20 02:29:55 +00:00
|
|
|
x_ make -C "${cbdir}" crossgcc-arm CPUS=$(nproc)
|
2023-10-07 05:55:10 +00:00
|
|
|
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/" ] || \
|
2023-10-20 02:29:55 +00:00
|
|
|
x_ make -C "${cbdir}" crossgcc-aarch64 CPUS=$(nproc)
|
2023-10-07 05:55:10 +00:00
|
|
|
# aarch64 also needs armv7 toolchain for arm-trusted-firmware
|
|
|
|
[ -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ] || \
|
2023-10-20 02:29:55 +00:00
|
|
|
x_ make -C "${cbdir}" crossgcc-arm CPUS=$(nproc)
|
2023-10-07 05:55:10 +00:00
|
|
|
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"
|
|
|
|
}
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
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
|
2023-08-16 20:34:21 +00:00
|
|
|
done
|
2023-10-07 05:55:10 +00:00
|
|
|
x_ mkdir -p "${dest_dir}"
|
2023-08-16 20:34:21 +00:00
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
handle_makefile()
|
2023-08-16 20:34:21 +00:00
|
|
|
{
|
2023-10-07 05:55:10 +00:00
|
|
|
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!"
|
2023-10-02 04:21:20 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
if [ -e "${codedir}/.git" ] && [ "${project}" = "u-boot" ] && \
|
|
|
|
[ "${mode}" = "distclean" ]; then
|
|
|
|
x_ git -C "${codedir}" clean -fdx
|
2023-10-13 08:16:41 +00:00
|
|
|
elif [ "${mode}" = "oldconfig" ] || [ "${mode}" = "olddefconfig" ] || \
|
|
|
|
[ "${mode}" = "menuconfig" ] || [ "${mode}" = "nconfig" ]; then
|
2023-10-07 05:55:10 +00:00
|
|
|
x_ cp "${codedir}/.config" "${config}"
|
2023-10-13 08:16:41 +00:00
|
|
|
elif [ "${mode}" = "savedefconfig" ]; then
|
|
|
|
x_ cp "${codedir}/defconfig" "${config}"
|
2023-10-07 05:55:10 +00:00
|
|
|
fi
|
2023-08-16 20:34:21 +00:00
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
run_make_command()
|
2023-08-16 20:34:21 +00:00
|
|
|
{
|
2023-10-07 05:55:10 +00:00
|
|
|
[ -f "${codedir}/Makefile" ] || [ -f "${codedir}/makefile" ] || \
|
|
|
|
[ -f "${codedir}/GNUmakefile" ] || return 1
|
|
|
|
[ "${project}" = "coreboot" ] && [ -z "${mode}" ] && \
|
update/release/*: merge to update/project/release
The logic has been re-written, where source archives are
concerned. This clones the current repository, and starts
a new build from scratch. A custom release directory is
possible, by passing -d
This eliminates a step during build-testing, saving hours
of time, because it builds the release archive *inside* the
release archive, with git files removed, thus replicating
the same setup that the user would have.
This also makes everything a bit more consistent, because
it's guaranteed that a release archive will always have
the same files; previously, the release build script would
only copy what was already built, without building anything.
Now, this script builds everything itself.
The script also builds serprog images, not just coreboot.
Usage:
./update project release
If -d is not passed, release/ is used inside lbmk.
Otherwise, you could do:
./update project release -d /path/to/directory
If the directory exists, this script will exit (error).
Other minor fixes: build/fw/coreboot: make version in
coreboot-version (file) not contain hyphens, to work
around a quirk in coreboot's build system when not building
on regular libreboot releases. this quirk only appears
when lbmk is not being compiled under git.
The other main benefit of this change is that the new
script will probably require a lot less maintenance.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-10-08 01:34:50 +00:00
|
|
|
x_ printf "%s\n" "${version%%-*}" >"${codedir}/.coreboot-version"
|
2023-08-21 23:34:15 +00:00
|
|
|
|
update/release/*: merge to update/project/release
The logic has been re-written, where source archives are
concerned. This clones the current repository, and starts
a new build from scratch. A custom release directory is
possible, by passing -d
This eliminates a step during build-testing, saving hours
of time, because it builds the release archive *inside* the
release archive, with git files removed, thus replicating
the same setup that the user would have.
This also makes everything a bit more consistent, because
it's guaranteed that a release archive will always have
the same files; previously, the release build script would
only copy what was already built, without building anything.
Now, this script builds everything itself.
The script also builds serprog images, not just coreboot.
Usage:
./update project release
If -d is not passed, release/ is used inside lbmk.
Otherwise, you could do:
./update project release -d /path/to/directory
If the directory exists, this script will exit (error).
Other minor fixes: build/fw/coreboot: make version in
coreboot-version (file) not contain hyphens, to work
around a quirk in coreboot's build system when not building
on regular libreboot releases. this quirk only appears
when lbmk is not being compiled under git.
The other main benefit of this change is that the new
script will probably require a lot less maintenance.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-10-08 01:34:50 +00:00
|
|
|
x_ make ${mode} -j$(nproc) -C "${codedir}"
|
2023-10-19 22:36:56 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
[ "${mode}" != "clean" ] && return 0
|
|
|
|
make -C "${codedir}" distclean 2>/dev/null || :
|
2023-08-16 20:34:21 +00:00
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
copy_elf()
|
2023-08-16 20:34:21 +00:00
|
|
|
{
|
2023-10-07 05:55:10 +00:00
|
|
|
[ "${project}" != "coreboot" ] || x_ modify_coreboot_rom
|
|
|
|
while read f; do
|
|
|
|
[ ! -f "${codedir}/$f" ] || \
|
|
|
|
x_ cp "${codedir}/${f}" "${dest_dir}/"
|
|
|
|
done < ${listfile}
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
x_ make clean -C "${codedir}"
|
much, much stricter, more verbose error handling
lbmk is much more likely to crash now, in error conditions,
which is a boon for further auditing.
also: in "fetch", remove the downloaded program
if fail() was called.
this would also be done for gnulib, when downloading
grub, but done in such a way that gnulib goes first.
where calls to err write "ERROR" in the string, they
no longer say "ERROR" because the "err" function itself
now does that automatically.
also: listmodes/listoptions (in "lbmk") now reports an
error if no scripts and/or directories are found.
also: where a warning is given, but not an error, i've
gone through in some places and redirected the output
to stderr, not stdout
as part of error checks: running anything as root, except
for the "./build dependencies *" commands, is no longer
permitted and lbmk will throw an error
mrc downloads: debugfs output no longer redirected to /dev/null,
and stderr no longer redirected to stdout. everything is verbose.
certain non-error states are also more verbose. for example,
patch_rom in blobs/inject will now state when injection succeeds
certain actual errors(bugs) were fixed:
for example, build/release/roms now correctly prepares the blobs
hash files for a given target, containing only the files and
checksums in the list. Previously, a printf message was included.
Now, with this new code: blobutil/inject rightly verifies hashes.
doing all of this in one giant patch is cleaner
than 100 patches changing each file. even this is yet part
of a much larger audit going on in the Libreboot project.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-08-24 19:19:41 +00:00
|
|
|
}
|
|
|
|
|
2023-08-16 20:34:21 +00:00
|
|
|
main $@
|