Files
lbmk/script/build/release/roms
T
Leah Rowe 225e2609fa only remove microcode in build/release/roms
libreboot's build system, lbmk, *is* available to use
in releases aswell (use the _src tarball), but it is
mostly intended for development, in lbmk.git

well, there's not much point wasting time / disk space
generating no-microcode roms within lbmk

they should be generated only at release time, alongside
the default ones

this patch implements that, thus speeding up the build
process and saving disk usage during development

the other alternative was to add a new option in
build/boot/roms, -m, that would opt in to removing them,
but this is extra complexity for something that is ill
advised and only provided to appease certain people

Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-08-31 23:30:56 +01:00

238 lines
7.3 KiB
Bash
Executable File

#!/usr/bin/env sh
# helper script: generate release archive (ROM images)
#
# Copyright (C) 2020,2021,2022,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"
projectname="$(cat projectname)"
version="version-unknown"
versiondate="version-date-unknown"
tree="default"
target=""
CONFIG_HAVE_MRC=""
CONFIG_HAVE_ME_BIN=""
CONFIG_KBC1126_FIRMWARE=""
CONFIG_INCLUDE_SMSC_SCH5545_EC_FW=""
ifdtool="cbutils/${tree}/ifdtool"
cbfstool="cbutils/${tree}/cbfstool"
microcode_required="y"
main()
{
printf "Building ROM image archives for version %s\n" "${version}"
init_check
for romdir in bin/*; do
[ -d "${romdir}" ] || continue
make_archive "${romdir}"
done
printf "\nROM archives available at release/%s/roms/\n\n" "${version}"
}
init_check()
{
[ -f version ] && \
version="$(cat version)"
[ -f versiondate ] && \
versiondate="$(cat versiondate)"
[ ! -d "bin/" ] && \
err "init_check: no ROMs built yet (error)"
[ -d "release/" ] || \
mkdir -p release/ || \
err "init_check: !mkdir -p release/"
[ -d "release/${version}/" ] || \
mkdir -p "release/${version}/" || \
err "init_check: !mkdir -p release/${version}/"
[ ! -d "release/${version}/roms/" ] || \
rm -Rf "release/${version}/roms/" || \
err "init_check: !rm -Rf release/${version}/roms/"
if [ ! -d "release/${version}/roms/" ]; then
mkdir -p "release/${version}/roms/" || \
err "init_check: !mkdir -p release/${version}/roms/"
fi
}
make_archive()
{
builddir="${1}"
romdir="$(mktemp -d -t coreboot_rom.XXXXXXXXXX)" || \
err "make_archive: cannot create tmpdir"
rm -Rf "${romdir}" || err "make_archive: can't remove tmpdir"
target="${builddir##*/}"
romdir="${romdir}/bin/${target}"
mkdir -p "${romdir}" || \
err "make_archive: can't mkdir tmpdir"
cp "${builddir}"/* "${romdir}" || \
err "make_archive: cannot copy ROM images directory -> ${romdir}"
echo ${target}
[ -f "resources/coreboot/${target}/target.cfg" ] || \
err "make_archive: ${target}: target.cfg is missing"
. "resources/coreboot/${target}/target.cfg"
[ "${microcode_required}" = "y" ] || \
[ "${microcode_required}" = "n" ] || microcode_required="y"
CONFIG_HAVE_MRC="y"
CONFIG_HAVE_ME_BIN="y"
CONFIG_KBC1126_FIRMWARE="y"
CONFIG_INCLUDE_SMSC_SCH5545_EC_FW="y"
grep "CONFIG_HAVE_ME_BIN=y" "resources/coreboot/${target}/config/"* || \
CONFIG_HAVE_ME_BIN="n"
grep "CONFIG_HAVE_MRC=y" "resources/coreboot/${target}/config/"* || \
CONFIG_HAVE_MRC="n"
grep "CONFIG_KBC1126_FIRMWARE=y" \
"resources/coreboot/${target}/config"/* || \
CONFIG_KBC1126_FIRMWARE="n"
grep "CONFIG_INCLUDE_SMSC_SCH5545_EC_FW=y" \
"resources/coreboot/${target}/config"/* || \
CONFIG_INCLUDE_SMSC_SCH5545_EC_FW="n"
# remove ME/MRC/EC firmware from ROM images
if [ "${CONFIG_HAVE_ME_BIN}" = "y" ] || \
[ "${target}" = "e6400nvidia_4mb" ] || \
[ "${microcode_required}" = "n" ]; then
strip_archive "${romdir}"
fi
printf "Generating release/%s/roms/%s-%s_%s.tar.xz\n" \
"${version}" "${projectname}" "${version}" "${target##*/}"
printf "%s\n" "${version}" > "${romdir}/version" || \
err "make_archive: can't create ${romdir}/version"
printf "%s\n" "${versiondate}" > "${romdir}/versiondate" || \
err "make_archive: can't create ${romdir}/versiondate"
printf "%s\n" "${projectname}" > "${romdir}/projectname" || \
err "make_archive: can't create ${romdir}/projectname"
archivename="${projectname}-${version}_${target##*/}"
f="release/${version}/roms/${archivename}"
(
cd "${romdir%/bin/${target}}" || err "make_archive: can't cd to tmpdir"
tar -c "bin/${target}/" | xz -9e > "${archivename}.tar.xz" || \
err "make_archive:cant make ${projectname}-${version}_${target##*/}"
)
cp "${romdir%/bin/${target}}/${archivename}.tar.xz" "${f}.tar.xz" || \
err "make_archive: can't copy tarball"
rm -Rf "${romdir%/bin/${target}}" || \
err "make_archive: can't delete tmpdir"
}
strip_archive()
{
romdir=${1}
[ -d "coreboot/${tree}" ] || \
./fetch_trees coreboot ${tree} || \
err "strip_archive: coreboot/${tree}: can't fetch source"
./build coreboot utils ${tree} || \
err "strip_archive: coreboot/${tree}: can't build utils"
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
mv "${romfile}" "${romfile%.tmprom}.rom" || \
err "can't make no-u rom: ${romfile%.tmprom}.rom"
done
fi
# Hash the rom before removing blobs
rm -f "${romdir}/blobhashes" || \
err "strip_archive: !rm -f ${blobdir}/blobhashes"
touch "${romdir}/blobhashes" || \
err "strip_archive: !touch ${blobdir}/blobhashes"
(
cd "${romdir}" || err "strip_archive: !cd ${romdir}"
sha1sum *.rom >> blobhashes || \
err "strip_archive: ${romdir}: !sha1sum *.rom >> blobhashes"
)
for romfile in "${romdir}"/*.rom; do
[ -f "${romfile}" ] || continue
strip_rom_image "${romfile}"
done
}
strip_ucode()
{
romfile=${1}
_newrom_b="${romfile%.rom}_nomicrocode.tmprom"
cp "${romfile}" "${_newrom_b}" || \
err "strip_rom_image: cp \"${romfile}\" \"${_newrom_b}\""
microcode_present="y"
"${cbfstool}" "${_newrom_b}" remove -n \
cpu_microcode_blob.bin 2>/dev/null || microcode_present="n"
if [ "${microcode_present}" = "n" ]; then
printf "REMARK: '%s' already lacks microcode\n" \
"${romfile}"
printf "Renaming default ROM file instead.\n"
mv "${romfile}" "${_newrom_b}" || \
err "strip_rom_image: can't rename no-u ${romfile}"
fi
}
strip_rom_image()
{
romfile=${1}
[ -f "${romfile}" ] || return 0
if [ "${CONFIG_HAVE_ME_BIN}" = "y" ]; then
"${ifdtool}" --nuke me "${romfile}" -O "${romfile}" || \
err "strip_rom_images: ${romfile}: cannot nuke Intel ME"
fi
if [ "${CONFIG_HAVE_MRC}" = "y" ]; then
"${cbfstool}" "${romfile}" remove -n mrc.bin || \
err "strip_rom_images: ${romfile}: cannot nuke mrc.bin"
"${cbfstool}" "${romfile}" print || :
fi
if [ "${CONFIG_KBC1126_FIRMWARE}" = "y" ]; then
"${cbfstool}" "${romfile}" remove -n ecfw1.bin || \
err "strip_rom_images: ${romfile}: can't nuke ecfw1.bin"
"${cbfstool}" "${romfile}" remove -n ecfw2.bin || \
err "strip_rom_images: ${romfile}: can't nuke ecfw2.bin"
fi
[ "${CONFIG_INCLUDE_SMSC_SCH5545_EC_FW}" != "y" ] || \
"${cbfstool}" "${romfile}" remove -n sch5545_ecfw.bin || \
err "strip_rom_images: ${romfile}: can't nuke sch5545ec fw"
# TODO: replace this board-specific hack
if [ "${target}" = "e6400nvidia_4mb" ]; then
"${cbfstool}" "${romfile}" remove -n "pci10de,06eb.rom" || \
err "strip_rom_images: ${romfile}: can't nuke e6400 vga rom"
fi
}
main $@