Module Name: src
Committed By: riastradh
Date: Fri Nov 29 16:55:24 UTC 2024
Modified Files:
src: build.sh
Log Message:
build.sh: Experimental new target pkg=CATEGORY/PACKAGE.
Cross-builds a binary package of CATEGORY/PACKAGE from pkgsrc,
bootstrapping pkgsrc as necessary for the cross-build.
Requires pkgsrc, which can be specified by either:
- setting PKGSRCDIR with -V or in the environment
- having it at ./pkgsrc
- having it at ../pkgsrc
- having it at /usr/pkgsrc
This isn't perfect -- it'd be better if we had some kind of manifest
for the packages you want built and/or included in install images --
but I've been sitting on this for months; let's just give it a try
and see where this goes. We can take it out again if the experiment
turns out not to be fruitful.
PR toolchain/58536: build.sh should support cross-building packages
into images
To generate a diff of this commit:
cvs rdiff -u -r1.379 -r1.380 src/build.sh
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/build.sh
diff -u src/build.sh:1.379 src/build.sh:1.380
--- src/build.sh:1.379 Tue Jul 23 20:46:40 2024
+++ src/build.sh Fri Nov 29 16:55:24 2024
@@ -1,5 +1,5 @@
#! /usr/bin/env sh
-# $NetBSD: build.sh,v 1.379 2024/07/23 20:46:40 riastradh Exp $
+# $NetBSD: build.sh,v 1.380 2024/11/29 16:55:24 riastradh Exp $
#
# Copyright (c) 2001-2023 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -557,6 +557,7 @@ level of source directory"
do_sets=false
do_sourcesets=false
do_syspkgs=false
+ do_pkg=false
do_iso_image=false
do_iso_image_source=false
do_live_image=false
@@ -985,6 +986,18 @@ safe_unsetmakeenv()
unsetmakeenv "$1"
}
+# Clear all variables defined in makeenv. Used to run a subprocess
+# outside the usual NetBSD build's make environment.
+#
+clearmakeenv()
+{
+ local var
+
+ for var in ${makeenv}; do
+ unset ${var}
+ done
+}
+
# Given a variable name in $1, modify the variable in place as follows:
# For each space-separated word in the variable, call resolvepath.
#
@@ -1078,6 +1091,7 @@ help()
sourcesets Create source sets in RELEASEDIR/source/sets.
syspkgs Create syspkgs in
RELEASEDIR/RELEASEMACHINEDIR/binary/syspkgs.
+ pkg=CATEGORY/PKG (EXPERIMENT) Build a package CATEGORY/PKG from pkgsrc.
iso-image Create CD-ROM image in RELEASEDIR/images.
iso-image-source Create CD-ROM image with source in RELEASEDIR/images.
live-image Create bootable live image in
@@ -1433,6 +1447,13 @@ parseoptions()
;;
+ pkg=*)
+ arg=${op#*=}
+ op=${op%%=*}
+ [ -n "${arg}" ] ||
+ bomb "Must supply category/package with 'pkg=...'"
+ ;;
+
install=*|installmodules=*)
arg=${op#*=}
op=${op%%=*}
@@ -1562,6 +1583,24 @@ sanitycheck()
done
bomb "Asked to build X11 but no xsrc"
done
+
+ while $do_pkg; do # not really a loop
+ test -n "${PKGSRCDIR}" && {
+ test -f "${PKGSRCDIR}/mk/bsd.pkg.mk" ||
+ bomb "PKGSRCDIR (${PKGSRCDIR}) does not exist"
+ break
+ }
+ for _pd in \
+ "${NETBSDSRCDIR%/*}/pkgsrc" \
+ "${NETBSDSRCDIR}/pkgsrc" \
+ /usr/pkgsrc
+ do
+ test -f "${_pd}/mk/bsd.pkg.mk" &&
+ setmakeenv PKGSRCDIR "${_pd}" &&
+ break 2
+ done
+ bomb "Asked to build package but no pkgsrc"
+ done
}
# print_tooldir_program --
@@ -2031,7 +2070,7 @@ createmakewrapper()
eval cat <<EOF ${makewrapout}
#! ${HOST_SH}
# Set proper variables to allow easy "make" building of a NetBSD subtree.
-# Generated from: \$NetBSD: build.sh,v 1.379 2024/07/23 20:46:40 riastradh Exp $
+# Generated from: \$NetBSD: build.sh,v 1.380 2024/11/29 16:55:24 riastradh Exp $
# with these arguments: ${_args}
#
@@ -2245,6 +2284,103 @@ builddtb()
statusmsg "Successful build of devicetree blobs for NetBSD/${MACHINE} ${DISTRIBVER}"
}
+buildpkg()
+{
+ local catpkg
+ local pkgroot
+ local makejobsarg
+ local makejobsvar
+ local quiet
+ local opsys_version
+
+ catpkg="$1"
+
+ pkgroot="${TOP_objdir:-${TOP}}/pkgroot"
+ ${runcmd} mkdir -p "${pkgroot}" ||
+ bomb "Can't create package root" "${pkgroot}"
+
+ # Get a symlink-free absolute path to pkg -- pkgsrc wants this.
+ #
+ # XXX See TOP= above regarding pwd -P.
+ pkgroot=$(unset PWD; cd "${pkgroot}" &&
+ ((exec pwd -P 2>/dev/null) || (exec pwd 2>/dev/null)))
+
+ case $parallel in
+ "-j "*)
+ makejobsarg="--make-jobs ${parallel#-j }"
+ makejobsvar="MAKE_JOBS=${parallel#-j }"
+ ;;
+ *) makejobsarg=""
+ makejobsvar=""
+ ;;
+ esac
+
+ if [ "${MAKEVERBOSE}" -eq 0 ]; then
+ quiet="--quiet"
+ else
+ quiet=""
+ fi
+
+ # Derived from pkgsrc/mk/bsd.prefs.mk rev. 1.451.
+ opsys_version=$(echo "${DISTRIBVER}" |
+ awk -F. '{major=int($1); minor=int($2); if (minor>=100) minor=99; patch=int($3); if (patch>=100) patch=99; printf "%02d%02d%02d", major, minor, patch}')
+
+ # Bootstrap pkgsrc if needed.
+ #
+ # XXX Redo this if it's out-of-date, not just if it's missing.
+ if ! [ -x "${pkgroot}/pkg/bin/bmake" ]; then
+ statusmsg "Bootstrapping pkgsrc"
+
+ cat >"${pkgroot}/mk.conf-fragment" <<EOF
+USE_CROSS_COMPILE?= no
+TOOLDIR= ${TOOLDIR}
+CROSS_DESTDIR= ${DESTDIR}
+CROSS_MACHINE_ARCH= ${MACHINE_ARCH}
+CROSS_OPSYS= NetBSD
+CROSS_OS_VERSION= ${DISTRIBVER}
+CROSS_OPSYS_VERSION= ${opsys_version}
+CROSS_LOWER_OPSYS= netbsd
+CROSS_LOWER_OPSYS_VERSUFFIX= # empty
+CROSS_LOWER_OS_VARIANT= # empty
+CROSS_LOWER_VARIANT_VERSION= # empty
+CROSS_LOWER_VENDOR= # empty
+CROSS_OBJECT_FMT= ELF
+
+ALLOW_VULNERABLE_PACKAGES= yes
+BINPKG_SITES= # empty
+FAILOVER_FETCH= yes
+FETCH_TIMEOUT= 1800
+PASSIVE_FETCH= yes
+
+DISTDIR= ${pkgroot}/distfiles
+PACKAGES= ${pkgroot}/packages
+WRKOBJDIR= ${pkgroot}/work
+
+.-include "${MAKECONF}"
+
+MKDEBUG= no # interferes with pkgsrc builds
+EOF
+
+ # XXX Set --abi for mips and whatever else needs it?
+ # XXX Unprivileged native tools, privileged cross.
+ (cd "${PKGSRCDIR}" && clearmakeenv && ./bootstrap/bootstrap \
+ ${makejobsarg} \
+ --mk-fragment "${pkgroot}/mk.conf-fragment" \
+ --prefix "${pkgroot}/pkg" \
+ ${quiet} \
+ --unprivileged \
+ --workdir "${pkgroot}/bootwork") \
+ || bomb "Failed to bootstrap pkgsrc"
+ fi
+
+ # Build the package.
+ (cd "${PKGSRCDIR}/${catpkg}" && clearmakeenv && \
+ "${pkgroot}/pkg/bin/bmake" package \
+ USE_CROSS_COMPILE=yes \
+ ${makejobsvar}) \
+ || bomb "Failed to build ${catpkg}"
+}
+
installmodules()
{
dir="$1"
@@ -2562,6 +2698,14 @@ main()
buildmodules
;;
+ pkg=*)
+ arg=${op#*=}
+ if ! [ -d "$PKGSRCDIR"/"$arg" ]; then
+ bomb "no such package ${arg}"
+ fi
+ buildpkg "${arg}"
+ ;;
+
installmodules=*)
arg=${op#*=}
if [ "${arg}" = "/" ] && \