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