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>
btrfsvols
Leah Rowe 2023-10-07 06:55:10 +01:00
parent a413c01a3e
commit 1e89264ce3
12 changed files with 408 additions and 478 deletions

View File

@ -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
}

View File

@ -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}" \

View File

@ -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" ] && \

View File

@ -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}/"*

View File

@ -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

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 $@

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 $@

View File

@ -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"
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()
{
[ -z "${1}" ] && err "project name not specified"
project="${1#src/}" && shift 1
configure_targets $@
printf "Downloading %s and applying patches\n" ${project}
for x in ${targets}; do
download_for_target "${x}"
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
}
configure_targets()
build_projects()
{
cfgsdir="config/${project}"
[ -d "${cfgsdir}" ] || err "unsupported project name"
[ $# -gt 0 ] && x_ ./update project trees ${_f} ${@}
targets=$(listitems "${cfgsdir}")
[ $# -gt 0 ] && targets=$@
[ -z "${targets}" ] || return 0
if [ "${mode}" = "fetch" ]; then
fetch_project_repo
return 0
fi
err "No targets for project: ${project}"
}
codedir="src/${project}"
[ -d "${codedir}" ] || x_ ./update project trees -f "${project}"
download_for_target()
{
_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"
if [ "${project}" = "uefitool" ]; then
(
x_ cd "src/${project}/${tree}"
git submodule update --init --checkout || \
err "prepare_new_tree ${project}/${tree}: can't update git modules"
x_ cd src/uefitool
cmake UEFIExtract/ || [ -f Makefile ] || \
err "build_projects: !cmake UEFIExtract/"
)
git_am_patches "${PWD}/src/${project}/${tree}" \
"${PWD}/${cfgsdir}/${tree}/patches" "err"
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()
{
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 $@

View File

@ -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

View File

@ -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* \

View File

@ -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()

View File

@ -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}
}