HardenedBSD/release/scripts/pkg-stage.sh
John Baldwin ea2663040d release: Use the ABI of the target release to fetch packages
- Point --rootdir at the installed destdir in the dvd tree.  This
  causes pkg to determine the ABI from the installed destdir instead
  of the host's binaries.  Previously the result was that packages
  for the host's ABI were always downloaded breaking cross-releases
  (e.g. arm64 releases built on an amd64 host included amd64
  packages on the DVD ISO image rather than arm64 packages).  This
  also handles version mismatches, and I tested this by cross-building
  a 15.x arm64 release on a 14.x amd64 host.

- As a result, pkg now does a chdir(3) to the rootdir before running,
  so the -o argument to fetch needs to be updated to be relative to
  rootdir instead of the CWD as make runs.

- Add a new ROOTDIR variable to limit references to "dvd" to one
  place.  Ideally ROOTDIR would be an argument to this script so
  that it didn't really know about the dvd layout at all.

- While here, simplify creation of symlinks by just using a longer
  path to the link name instead of using 'cd' in the shell before
  invoking ln(1).  Also use ln -sf to create the pkg.pkg symlink
  rather than rm + ln.

PR:		278273
Reported by:	gatekeeper <tiago.gasiba@gmail.com>
Reviewed by:	imp, delphij
MFC after:	3 days
Differential Revision:	https://reviews.freebsd.org/D44749
2024-04-14 16:45:40 -07:00

96 lines
2.3 KiB
Bash
Executable File

#!/bin/sh
#
#
set -e
export ASSUME_ALWAYS_YES="YES"
export PKG_DBDIR="/tmp/pkg"
export PERMISSIVE="YES"
export REPO_AUTOUPDATE="NO"
export ROOTDIR="$PWD/dvd"
export PKGCMD="/usr/sbin/pkg -d --rootdir ${ROOTDIR}"
export PORTSDIR="${PORTSDIR:-/usr/ports}"
_DVD_PACKAGES="archivers/unzip
devel/git
emulators/linux_base-c7
graphics/drm-kmod
graphics/drm-510-kmod
graphics/drm-515-kmod
misc/freebsd-doc-all
net/mpd5
net/rsync
ports-mgmt/pkg
ports-mgmt/portmaster
shells/bash
shells/zsh
security/sudo
sysutils/screen
sysutils/tmux
www/firefox
www/links
x11-drivers/xf86-video-vmware
x11/gnome
x11/kde5
x11/sddm
x11/xorg"
# If NOPORTS is set for the release, do not attempt to build pkg(8).
if [ ! -f ${PORTSDIR}/Makefile ]; then
echo "*** ${PORTSDIR} is missing! ***"
echo "*** Skipping pkg-stage.sh ***"
echo "*** Unset NOPORTS to fix this ***"
exit 0
fi
if [ ! -x /usr/local/sbin/pkg ]; then
/etc/rc.d/ldconfig restart
/usr/bin/make -C ${PORTSDIR}/ports-mgmt/pkg install clean
fi
export PKG_ABI=$(pkg --rootdir ${ROOTDIR} config ABI)
export PKG_ALTABI=$(pkg --rootdir ${ROOTDIR} config ALTABI 2>/dev/null)
export PKG_REPODIR="packages/${PKG_ABI}"
/bin/mkdir -p ${ROOTDIR}/${PKG_REPODIR}
if [ ! -z "${PKG_ALTABI}" ]; then
ln -s ${PKG_ABI} ${ROOTDIR}/packages/${PKG_ALTABI}
fi
# Ensure the ports listed in _DVD_PACKAGES exist to sanitize the
# final list.
for _P in ${_DVD_PACKAGES}; do
if [ -d "${PORTSDIR}/${_P}" ]; then
DVD_PACKAGES="${DVD_PACKAGES} ${_P}"
else
echo "*** Skipping nonexistent port: ${_P}"
fi
done
# Make sure the package list is not empty.
if [ -z "${DVD_PACKAGES}" ]; then
echo "*** The package list is empty."
echo "*** Something is very wrong."
# Exit '0' so the rest of the build process continues
# so other issues (if any) can be addressed as well.
exit 0
fi
# Print pkg(8) information to make debugging easier.
${PKGCMD} -vv
${PKGCMD} update -f
${PKGCMD} fetch -o ${PKG_REPODIR} -d ${DVD_PACKAGES}
# Create the 'Latest/pkg.txz' symlink so 'pkg bootstrap' works
# using the on-disc packages.
export LATEST_DIR="${ROOTDIR}/${PKG_REPODIR}/Latest"
mkdir -p ${LATEST_DIR}
ln -s ../All/$(${PKGCMD} rquery %n-%v pkg).pkg ${LATEST_DIR}/pkg.pkg
ln -sf pkg.pkg ${LATEST_DIR}/pkg.txz
${PKGCMD} repo ${PKG_REPODIR}
# Always exit '0', even if pkg(8) complains about conflicts.
exit 0