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}" = "/" ] && \

Reply via email to