From 8d9aeef3de28bcb908e33b804517bdeacce7be38 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Fri, 20 Oct 2023 00:17:30 +0100 Subject: lbmk: use 2-level directory structure in script/ as opposed to the current 3-level structure. recent build system simplifications have enabled this change, thus: ./build fw coreboot -> ./build roms ./build fw grub -> ./build grub ./build fw serprog -> ./build serprog ./update project release -> ./update release ./update project trees -> ./update trees ./update vendor download -> ./vendor download ./update vendor inject -> ./vendor inject alper criticised that the commands were too long, so i made them shorter! Signed-off-by: Leah Rowe --- script/update/project/release | 247 ----------------------------------- script/update/project/trees | 297 ------------------------------------------ 2 files changed, 544 deletions(-) delete mode 100755 script/update/project/release delete mode 100755 script/update/project/trees (limited to 'script/update/project') diff --git a/script/update/project/release b/script/update/project/release deleted file mode 100755 index e7973537..00000000 --- a/script/update/project/release +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/env sh -# SPDX-License-Identifier: MIT -# SPDX-FileCopyrightText: 2020-2023 Leah Rowe - -[ "x${DEBUG+set}" = 'xset' ] && set -v -set -u -e - -. "include/err.sh" -. "include/option.sh" - -eval "$(setvars "" vdir relname src_dirname srcdir _nogit _xm target romdir \ - microcode_required mode)" - -_f="coreboot u-boot seabios flashrom grub memtest86plus uefitool" -_f="${_f} bios_extract biosutilities pico-serprog stm32-vserprog" -_f="${_f} rpi-pico-serprog" - -main() -{ - vdir="release" - while getopts d:m: option; do - [ -z "${OPTARG}" ] && err "Empty argument not allowed" - case "${option}" in - d) vdir="${OPTARG}" ;; - m) mode="${OPTARG}" ;; - *) err "Invalid option" ;; - esac - done - - vdir="${vdir}/${version}" - relname="${projectname}-${version}" - src_dirname="${relname}_src" - srcdir="${vdir}/${src_dirname}" - - [ -e "${vdir}" ] && err "already exists: \"${vdir}\"" - - mkvdir - build_release -} - -mkvdir() -{ - mkdir -p "${vdir}" || err "mkvdir: !mkdir -p \"${vdir}\"" - - git_init || err "mkvdir: !git_init \"${vdir}\"" - git clone . "${srcdir}" || err "mkdir: !gitclone \"${srcdir}\"" - [ -z "${_nogit}" ] || x_ rm -Rf ".git" - - rm -Rf "${srcdir}/.git" - insert_version_files "${srcdir}" || err "mkvdir ${srcdir}: versionfile" -} - -# release archives contain .gitignore, but not .git. -# this script can be run from lbmk.git, or an archive. -git_init() -{ - [ -L ".git" ] && err "Reference .git is a symlink" - [ -e ".git" ] && return 0 - eval "$(setvars "$(date -Rd @${versiondate})" cdate _nogit)" - - git init || return 1 - git add -A . || return 1 - git commit -m "${projectname} ${version}" --date "${cdate}" || return 1 - git tag -a "${version}" -m "${projectname} ${version}" || return 1 -} - -build_release() -{ - _xm="build_release ${vdir}" - ( - cd "${srcdir}" || err "${_xm}: !cd \"${srcdir}\"" - fetch_trees - ) - ( - cd "${srcdir%/*}" || err "${_xm}: mktarball \"${srcdir}\"" - mktarball "${srcdir##*/}" "${srcdir##*/}.tar.xz" || err "${_xm}: mksrc" - ) - if [ "${mode}" != "src" ]; then - ( - cd "${srcdir}" || err "${_xm}: 2 !cd \"${srcdir}\"" - mkrom_images - ) - fi - rm -Rf "${srcdir}" || err "${_xm}: !rm -Rf \"${srcdir}\"" -} - -fetch_trees() -{ - for x in ${_f}; do - ./update project trees -f "${x}" || err "${_xm}: fetch ${x}" - done - for x in config/*/build.list; do - [ -f "${x}" ] || continue - xp="${x#*/}"; xp="${xp%/*}" - [ -L "${xp}" ] || x_ rm -Rf "src/${xp}/${xp}" - done - rm -Rf */.git* */*/.git* */*/*/.git* */*/*/*/.git* */*/*/*/*/.git* \ - */*/*/*/*/*/.git* */*/*/*/*/*/*/.git* */*/*/*/*/*/*/*/.git* \ - .git tmp || err "${_xm}: rm-dotgit" -} - -mkrom_images() -{ - ./build fw coreboot all || err "${_xm}: roms-all" - ./build fw serprog rp2040 || err "${_xm}: rp2040" - ./build fw serprog stm32 || err "${_xm}: stm32" - - for rombuild in bin/*; do - [ -d "${rombuild}" ] || continue - handle_rom_archive "${rombuild}" - done - - mv "release/${version}/roms/" ../roms || err "${_xm}: copy roms/" -} - -handle_rom_archive() -{ - builddir="${1}" - romdir="tmp/romdir" - x_ rm -Rf "${romdir}" - target="${builddir##*/}" - - if [ ! -f "config/coreboot/${target}/target.cfg" ]; then - # No config, just make a tarball - tarball="release/${version}/roms/${relname}_${target}.tar.xz" - insert_copying_files "${builddir}" - mktarball "${builddir}" "${tarball}" - return 0 - fi - - romdir="${romdir}/bin/${target}" - x_ mkdir -p "${romdir}" - x_ cp "${builddir}/"* "${romdir}" - - nukerom - - printf "Generating release/%s/roms/%s-%s_%s.tar.xz\n" \ - "${version}" "${projectname}" "${version}" "${target##*/}" - insert_version_files "${romdir}" || \ - err "mkrom_tarball ${romdir}: versionfile" - - insert_copying_files "${romdir}" - mkrom_tarball -} - -nukerom() -{ - microcode_required="y" - . "config/coreboot/${target}/target.cfg" - if [ "${microcode_required}" != "y" ] && \ - [ "${microcode_required}" != "n" ]; then microcode_required="y"; fi - if [ "${microcode_required}" = "n" ]; then - for romfile in "${romdir}"/*.rom; do - [ -f "${romfile}" ] || continue - strip_ucode "${romfile}" - done - for romfile in "${romdir}"/*.tmprom; do - [ -f "${romfile}" ] || continue - x_ mv "${romfile}" "${romfile%.tmprom}.rom" - done - fi - - # Hash the images before removing vendor files - # which ./update vendor inject uses for verification - x_ rm -f "${romdir}/vendorhashes" - x_ touch "${romdir}/vendorhashes" - ( - x_ cd "${romdir}" - x_ sha512sum *.rom >> vendorhashes - ) - - for romfile in "${romdir}"/*.rom; do - [ -f "${romfile}" ] || continue - x_ ./update vendor inject -r "${romfile}" -b ${target} -n nuke - done -} - -strip_ucode() -{ - romfile=${1} - _newrom_b="${romfile%.rom}_nomicrocode.tmprom" - x_ cp "${romfile}" "${_newrom_b}" - microcode_present="y" - "${cbfstool}" "${_newrom_b}" remove -n \ - cpu_microcode_blob.bin 2>/dev/null || microcode_present="n" - [ "${microcode_present}" = "n" ] || return 0 - printf "REMARK: '%s' already lacks microcode\n" "${romfile}" 1>&2 - printf "Renaming default ROM file instead.\n" 1>&2 - x_ mv "${romfile}" "${_newrom_b}" -} - -insert_copying_files() -{ - x_ rm -Rf "${1}/licenses" - x_ mkdir -p "${1}/licenses" - l="${1}/licenses" - # copy licenses to rom image archive, for completion - x_ cp "src/grub/COPYING" "${l}/COPYING.grub" - x_ cp "src/coreboot/default/COPYING" "${l}/COPYING.coreboot" - x_ cp -R "src/coreboot/default/LICENSES" "${l}/LICENSES.coreboot" - x_ cp "src/seabios/default/COPYING" "${l}/COPYING.coreboot" - x_ cp "src/seabios/default/COPYING.LESSER" "${l}/COPYING.LESSER.seabios" - x_ cp -R "src/u-boot/default/Licenses" "${l}/COPYING.u-boot" -} - -mkrom_tarball() -{ - archivename="${relname}_${target##*/}" - f="release/${version}/roms/${archivename}" - x_ mkdir -p "${f%/*}" - ( - x_ cd "${romdir%/bin/${target}}" - mktarball "bin/${target}" "${archivename}.tar.xz" - ) - x_ mv "${romdir%/bin/${target}}/${archivename}.tar.xz"* "${f%/*}" - - printf "Created ROM archive: ${f%/*}/${archivename}.tar.xz" -} - -insert_version_files() -{ - printf "%s\n" "${version}" > "${1}/version" || return 1 - printf "%s\n" "${versiondate}" > "${1}/versiondate" || return 1 - printf "%s\n" "${projectname}" > "${1}/projectname" || return 1 -} - -mktarball() -{ - # preserve timestamps for reproducible tarballs - tar_implementation=$(tar --version | head -n1) || : - - [ "${2%/*}" = "${2}" ] || x_ mkdir -p "${2%/*}" - if [ "${tar_implementation% *}" = "tar (GNU tar)" ]; then - tar --sort=name --owner=root:0 --group=root:0 \ - --mtime="UTC 2023-10-14" -c "${1}" | xz -T0 -9e > "${2}" || \ - err "mktarball 1, ${1}" - else - # TODO: reproducible tarballs on non-GNU systems - tar -c "${1}" | xz -T0 -9e > "${2}" || err "mktarball 2, ${1}" - fi - ( - [ "${2%/*}" != "${2}" ] && x_ cd "${2%/*}" - x_ sha512sum "${2##*/}" > "${2##*/}.sha512" - ) -} - -main $@ diff --git a/script/update/project/trees b/script/update/project/trees deleted file mode 100755 index 7ba9a38b..00000000 --- a/script/update/project/trees +++ /dev/null @@ -1,297 +0,0 @@ -#!/usr/bin/env sh -# SPDX-License-Identifier: GPL-3.0-or-later -# SPDX-FileCopyrightText: 2022-2023 Alper Nebi Yasak -# SPDX-FileCopyrightText: 2022 Ferass El Hafidi -# SPDX-FileCopyrightText: 2023 Leah Rowe - -[ "x${DEBUG+set}" = 'xset' ] && set -v -set -u -e - -. "include/err.sh" -. "include/option.sh" -. "include/git.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 _f target1)" - -tmpclean="$(mktemp -d -t makeclean.XXXXXXXXXX)" - -main() -{ - while getopts f:b:m:u:c:x:s:l:n: option - do - _f="${1}" - case "${1}" in - -b) : ;; - -u) mode="oldconfig" ;; - -m) mode="menuconfig" ;; - -c) mode="distclean" ;; - -x) mode="crossgcc-clean" ;; - -f) mode="fetch" ;; - -s) mode="savedefconfig" ;; - -l) mode="olddefconfig" ;; - -n) mode="nconfig" ;; - *) err "Invalid option" ;; - esac - shift; project="${OPTARG#src/}"; shift - done - [ -z "${_f}" ] && err "flag not specified (-m, -u, -b, -c, -x, -f, -s, -l or -n)" - [ -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} ${@} - - if [ "${mode}" = "fetch" ]; then - fetch_project_repo - return 0 - fi - - codedir="src/${project}" - [ -d "${codedir}" ] || x_ ./update project trees -f "${project}" - - 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 -} - -build_targets() -{ - elfdir="elf/${project}" - [ "${elfdir}" = "elf/coreboot" ] && \ - elfdir="elf/coreboot_nopayload_DO_NOT_FLASH" - - 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=$(items "${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 - [ "$project" != "coreboot" ] && [ "$project" != "u-boot" ] && return 0 - - # u-boot and coreboot are both compiled with coreboot's crossgcc - [ ! -z ${mode} ] || check_cross_compiler || \ - err "handle_src_tree ${project}/${target}: crossgcc" - cbfstool="cbutils/${tree}/cbfstool" - [ -f "${cbfstool}" ] && return 0 - x_ ./update project trees -b coreboot utils "${tree}" -} - -# 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" - - # 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}" = "olddefconfig" ] || \ - [ "${mode}" = "menuconfig" ] || [ "${mode}" = "nconfig" ]; then - x_ cp "${codedir}/.config" "${config}" - elif [ "${mode}" = "savedefconfig" ]; then - x_ cp "${codedir}/defconfig" "${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 ${mode} -j$(nproc) -C "${codedir}" - - [ "${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 $@ -- cgit v1.2.1