mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-13 14:59:34 +02:00
move resources/scripts/ to script/
Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
Executable
+257
@@ -0,0 +1,257 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
# helper script: build elf files on build systems that use defconfig/kconfig
|
||||
#
|
||||
# Copyright (C) 2022 Alper Nebi Yasak <alpernebiyasak@gmail.com>
|
||||
# Copyright (C) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
|
||||
# Copyright (C) 2023 Leah Rowe <leah@libreboot.org>
|
||||
#
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
# you could probably build *linux* with this script!
|
||||
|
||||
[ "x${DEBUG+set}" = 'xset' ] && set -v
|
||||
set -u -e
|
||||
|
||||
. "include/err.sh"
|
||||
|
||||
projectname="$(cat projectname)"
|
||||
our_version="$(cat version)"
|
||||
|
||||
export LOCALVERSION="-${projectname}-${our_version}"
|
||||
|
||||
arch=""
|
||||
cfgsdir=""
|
||||
codedir=""
|
||||
config=""
|
||||
config_name=""
|
||||
crossgcc_ada=""
|
||||
elfdir=""
|
||||
listfile=""
|
||||
mode=""
|
||||
project=""
|
||||
target=""
|
||||
target_dir=""
|
||||
tree=""
|
||||
|
||||
main()
|
||||
{
|
||||
while getopts b:m:u: option
|
||||
do
|
||||
case "${1}" in
|
||||
-b)
|
||||
mode="all"
|
||||
shift ;;
|
||||
-u)
|
||||
mode="oldconfig"
|
||||
shift ;;
|
||||
-m)
|
||||
mode="menuconfig"
|
||||
shift ;;
|
||||
*)
|
||||
fail "Invalid option" ;;
|
||||
esac
|
||||
project="${OPTARG}"
|
||||
shift
|
||||
done
|
||||
[ -z "${mode}" ] && fail "mode not given (-m, -u or -b)"
|
||||
|
||||
elfdir="elf/${project}"
|
||||
|
||||
cfgsdir="resources/${project}"
|
||||
[ -d "${cfgsdir}" ] || fail "directory, ${cfgsdir}, does not exist"
|
||||
|
||||
listfile="${cfgsdir}/build.list"
|
||||
[ -f "${listfile}" ] || fail "list file, ${listfile}, does not exist"
|
||||
|
||||
# Build for all targets if no argument is given
|
||||
targets=$(./build command options "${cfgsdir}")
|
||||
[ $# -gt 0 ] && targets=$@
|
||||
|
||||
[ -d "${elfdir}" ] || [ "${mode}" != "all" ] || \
|
||||
mkdir -p "${elfdir}/" || fail "can't create directory ${elfdir}"
|
||||
|
||||
for x in ${targets}; do
|
||||
target="${x}"
|
||||
printf "Running 'make %s' for project '%s, target '%s''\n" \
|
||||
"${mode}" "${project}" "${target}"
|
||||
[ "${project}" != "coreboot" ] || [ "${mode}" != "all" ] || \
|
||||
./update blobs download ${target} || fail "blobutil"
|
||||
handle_defconfig || fail "error handling config file"
|
||||
done
|
||||
|
||||
if [ "${mode}" = "all" ]; then
|
||||
printf "Done! The files are stored under %s/\n\n" "${elfdir}"
|
||||
fi
|
||||
}
|
||||
|
||||
handle_defconfig()
|
||||
{
|
||||
handle_dependencies "${target}" || \
|
||||
fail "handle_defconfig: failed call to handle_dependencies"
|
||||
|
||||
for y in "${target_dir}/config"/*; do
|
||||
[ -f "${y}" ] || continue
|
||||
config="${y}"
|
||||
config_name="${config#$target_dir/config/}"
|
||||
|
||||
printf "build/defconfig/%s %s: handling config %s\n" \
|
||||
"${project}" "${target}" "${config_name}"
|
||||
|
||||
[ "${mode}" != "all" ] || check_config || continue
|
||||
run_make_command
|
||||
[ "${mode}" != "all" ] || copy_elf
|
||||
done
|
||||
}
|
||||
|
||||
handle_dependencies()
|
||||
{
|
||||
target_dir="${cfgsdir}/${target}"
|
||||
mkdir -p "${elfdir}/${target}" || \
|
||||
fail "handle_dependencies: !mkdir -p ${elfdir}/${target}"
|
||||
|
||||
tree="undefined"
|
||||
arch="undefined"
|
||||
|
||||
[ ! -f "${target_dir}/target.cfg" ] && \
|
||||
fail "handle_dependencies: ${target_dir}: missing target.cfg"
|
||||
|
||||
# Override the above defaults using target.cfg
|
||||
. "${target_dir}/target.cfg" # source
|
||||
|
||||
[ "${tree}" = "undefined" ] && \
|
||||
fail "handle_dependencies: ${target_dir}: tree undefined"
|
||||
[ "${arch}" = "undefined" ] && \
|
||||
fail "handle_dependencies: ${target_dir}: undefined cpu type"
|
||||
|
||||
codedir="${project}/${tree}"
|
||||
[ -d "${codedir}" ] || \
|
||||
./fetch_trees "${project}" "${target}" || \
|
||||
fail "handle_dependencies: can't fetch ${project}/${target}"
|
||||
|
||||
# u-boot and coreboot are both compiled with coreboot's crossgcc
|
||||
if [ "${project}" = "coreboot" ] || [ "${project}" = "u-boot" ]; then
|
||||
[ "${mode}" != "all" ] || check_cross_compiler || \
|
||||
fail "handle_dependencies ${project}/${target}: crossgcc"
|
||||
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="coreboot/${tree}"
|
||||
[ "${project}" != "coreboot" ] && \
|
||||
cbdir="coreboot/default" # not u-boot (e.g. linux will use it)
|
||||
[ "${project}" = "u-boot" ] && \
|
||||
cbdir="coreboot/cros" # u-boot only used on coreboot/cros
|
||||
# only true if not building coreboot:
|
||||
ctarget="${cbdir#coreboot/}"
|
||||
[ -d "${cbdir}" ] || \
|
||||
./fetch_trees coreboot ${ctarget} || \
|
||||
fail "check_cross_compiler: can't fetch 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}" ] && \
|
||||
fail "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
|
||||
if [ -f "${elftest}" ]; then
|
||||
printf "Build already exists, so skipping build\n" 1>&2
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
mkdir -p "${dest_dir}" || \
|
||||
fail "check_config: cannot mkdir: ${dest_dir}"
|
||||
}
|
||||
|
||||
run_make_command()
|
||||
{
|
||||
./handle make file -c "${codedir}" || \
|
||||
fail "run_make_command: make distclean/clean failed"
|
||||
|
||||
cp "${config}" "${codedir}/.config" || \
|
||||
fail "run_make_command: can't copy config for: ${project}/${target}"
|
||||
[ "${mode}" != "all" ] || make -C "${codedir}" silentoldconfig || \
|
||||
make -C "${codedir}" oldconfig || : # don't error on oldconfig
|
||||
|
||||
if [ "${project}" = "coreboot" ] && [ "${mode}" = "all" ]; then
|
||||
printf "%s\n" "${our_version}" >"${codedir}/.coreboot-version" \
|
||||
|| fail "run_make_command: ${codedir}: can't set version"
|
||||
fi
|
||||
make -C "${codedir}" -j$(nproc) ${mode} || \
|
||||
fail "run_make_command: make-all: ${codedir} (${project}/${target})"
|
||||
}
|
||||
|
||||
copy_elf()
|
||||
{
|
||||
for f in $(cat "${listfile}"); do
|
||||
[ ! -f "${codedir}/$f" ] || \
|
||||
cp "${codedir}/${f}" "${dest_dir}/" || \
|
||||
fail "copy_elf: cannot copy elf file"
|
||||
done
|
||||
|
||||
./handle make file -c "${codedir}" || \
|
||||
fail "copy_elf: clean: ${codedir} (${project}/${target})"
|
||||
}
|
||||
|
||||
fail()
|
||||
{
|
||||
[ -z "${codedir}" ] || ./handle make file -c "${codedir}" || :
|
||||
err "${1}"
|
||||
}
|
||||
|
||||
main $@
|
||||
Executable
+80
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
# helper script: build utils used by lbmk
|
||||
#
|
||||
# Copyright (C) 2023 Leah Rowe <info@minifree.org>
|
||||
#
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
[ "x${DEBUG+set}" = 'xset' ] && set -v
|
||||
set -u -e
|
||||
|
||||
. "include/err.sh"
|
||||
|
||||
mode=""
|
||||
project=""
|
||||
|
||||
main()
|
||||
{
|
||||
while getopts b:c: option
|
||||
do
|
||||
case "${1}" in
|
||||
-b)
|
||||
shift ;;
|
||||
-c)
|
||||
mode="distclean"
|
||||
shift ;;
|
||||
*)
|
||||
err "Invalid option" ;;
|
||||
esac
|
||||
project="${OPTARG}"
|
||||
shift
|
||||
done
|
||||
|
||||
[ -z "${project}" ] && err "project name not specified"
|
||||
[ "${project}" = "ich9utils" ] && project="util/ich9utils"
|
||||
|
||||
handle_dependencies
|
||||
run_make_command
|
||||
}
|
||||
|
||||
handle_dependencies()
|
||||
{
|
||||
[ -d "${project}" ] || ./fetch "${project%/*}" || \
|
||||
err "handle_dependencies: can't fetch ${project%/*}"
|
||||
[ -d "${project}" ] || \
|
||||
err "handle_dependencies: ${project%/*} not downloaded"
|
||||
|
||||
if [ "${project}" = "uefitool" ]; then
|
||||
(
|
||||
cd uefitool || err "handle_dependencies: !cd uefitool"
|
||||
cmake UEFIExtract/ || \
|
||||
err "handle_dependencies: !cmake UEFIExtract/"
|
||||
)
|
||||
fi
|
||||
}
|
||||
|
||||
run_make_command()
|
||||
{
|
||||
if [ -z "${mode}" ]; then
|
||||
make -C "${project}" -j$(nproc) || \
|
||||
err "run_make_command: !make -C ${project}"
|
||||
else
|
||||
make -C "${project}" distclean || make -C "${project}" clean \
|
||||
|| err "run_make_command: ${project}: make-clean failed"
|
||||
fi
|
||||
}
|
||||
|
||||
main $@
|
||||
Reference in New Issue
Block a user