diff --git a/release/Makefile b/release/Makefile --- a/release/Makefile +++ b/release/Makefile @@ -40,6 +40,23 @@ # TARGET/TARGET_ARCH: architecture of built release # +# These variables control which package sets are installed on the release +# media (NOT the installed system). You almost certainly want to keep the +# "kernels" set, or the installer won't be able to boot! +RELEASE_MEDIA_SETS?= kernels optional +# dvd gets the entire system by default. +RELEASE_MEDIA_SETS.dvd?= kernels optional devel +# Using minimal for bootonly saves about 100MB. +RELEASE_MEDIA_SETS.bootonly?= kernels minimal + +# Base packages which should be installed in addition to the sets above. +# bsdinstall and bsdconfig must be listed here since they aren't part of +# minimal. +RELEASE_MEDIA_PACKAGES?= bsdinstall bsdconfig + +# Set this to not print the warning about distsets being deprecated. +#RELEASE_SKIP_DISTSET_WARNING=yes + WORLDDIR?= ${.CURDIR:H} PORTSDIR?= /usr/ports @@ -77,7 +94,9 @@ .if !defined(NOPKGBASE) || empty(NOPKGBASE) PKGBASE_REPO_DIR= pkgbase-repo-dir +PKG_NAME_PREFIX!= ${IMAKE} -f Makefile.inc1 -C ${WORLDDIR} -V PKG_NAME_PREFIX WSTAGEDIR!= ${IMAKE} -f Makefile.inc1 -C ${WORLDDIR} -V WSTAGEDIR + PKG_ABI_FILE= ${WSTAGEDIR}/usr/bin/uname PKG_ABI= $$(${PKG_CMD} -o ABI_FILE=${PKG_ABI_FILE} config ABI) .endif @@ -203,10 +222,11 @@ touch ${.TARGET} .if !defined(NODISTSETS) || empty(NODISTSETS) -disc1: packagesystem -bootonly: packagesystem -dvd: packagesystem +disc1: print-distset-warning packagesystem +bootonly: print-distset-warning packagesystem +dvd: print-distset-warning packagesystem .endif + .if !defined(NOPKGBASE) || empty(NOPKGBASE) disc1: pkgbase-repo-dir bootonly: pkgbase-repo-dir @@ -228,17 +248,72 @@ ${.OBJDIR}/pkgbase-repo/${PKG_ABI}/latest \ > pkgbase-repo-dir/FreeBSD-base.conf +# Install a system suitable for an installer from the release package repo. +# This is usually invoked via submake by the various media targets, and +# should not be added as a dependency of other targets. +.if make(install-system) + +. if !defined(INSTALL_SYSTEM_ROOT) || empty(INSTALL_SYSTEM_ROOT) +. error INSTALL_SYSTEM_ROOT must be defined +. endif + +. if !defined(INSTALL_SYSTEM_MEDIATYPE) || empty(INSTALL_SYSTEM_MEDIATYPE) +. error INSTALL_SYSTEM_MEDIATYPE must be defined +. endif + +_INSTALL_SYSTEM_SETS=${RELEASE_MEDIA_SETS.${INSTALL_SYSTEM_MEDIATYPE}:U${RELEASE_MEDIA_SETS}} +_INSTALL_SYSTEM_PKG=\ + ${PKG_CMD} \ + -o INSTALL_AS_USER=yes \ + -o ASSUME_ALWAYS_YES=yes \ + -o METALOG="${INSTALL_SYSTEM_ROOT}/METALOG" \ + -o ABI="${PKG_ABI}" \ + -o REPOS_DIR="${.OBJDIR}/pkgbase-repo-dir" \ + -r "${INSTALL_SYSTEM_ROOT}" + +# Don't depend on pkgbase-repo here, since the medium target should have +# already built it. +install-system: .PHONY + mkdir -p "${INSTALL_SYSTEM_ROOT}" + ${_INSTALL_SYSTEM_PKG} \ + install -f pkg \ + ${_INSTALL_SYSTEM_SETS:S/^/${PKG_NAME_PREFIX}-set-/} \ + ${RELEASE_MEDIA_PACKAGES:S/^/${PKG_NAME_PREFIX}-/} + ${_INSTALL_SYSTEM_PKG} clean -ay + + # These files are created in post-install scripts and pkg doesn't + # currently support adding those to METALOG, so we need to do that + # ourselves. + echo "./etc/passwd type=file uname=root gname=wheel mode=0644" >>"${INSTALL_SYSTEM_ROOT}/METALOG" + echo "./etc/pwd.db type=file uname=root gname=wheel mode=0644" >>"${INSTALL_SYSTEM_ROOT}/METALOG" + echo "./etc/spwd.db type=file uname=root gname=wheel mode=0600" >>"${INSTALL_SYSTEM_ROOT}/METALOG" + echo "./etc/login.conf.db type=file uname=root gname=wheel mode=0644" >>"${INSTALL_SYSTEM_ROOT}/METALOG" + echo "./var/db/services.db type=file uname=root gname=wheel mode=0644" >>"${INSTALL_SYSTEM_ROOT}/METALOG" + +.endif # make(install-system) + +# Here be one, or possibly several dragons. +print-distset-warning: .PHONY +.if !defined(RELEASE_SKIP_DISTSET_WARNING) && (defined(NOPKGBASE) && !empty(NOPKGBASE)) + @echo >&2 "" + @echo >&2 " *** WARNING *** WARNING *** WARNING ***" + @echo >&2 "" + @echo >&2 "Support for distribution set media is provided for use by downstream projects" + @echo >&2 "and is NOT supported by FreeBSD. This feature is not regularly tested, might" + @echo >&2 "not work correctly, and may be removed at any time." + @echo >&2 "" + @echo >&2 " *** WARNING *** WARNING *** WARNING ***" + @echo >&2 "" + @sleep 10 +.endif + disc1: -# Install system - mkdir -p ${.TARGET} - ( cd ${WORLDDIR} && ${IMAKE} installworld installkernel distribution \ - DESTDIR=${.OBJDIR}/${.TARGET} MK_AT=no \ - MK_INSTALLLIB=no MK_MAIL=no \ - ${_ALL_LIBCOMPATS:@v@MK_LIB$v=no@} \ - MK_TOOLCHAIN=no \ - MK_RESCUE=no MK_DICT=no \ - MK_KERNEL_SYMBOLS=no MK_TESTS=no MK_DEBUG_FILES=no) .if !defined(NOPKGBASE) || empty(NOPKGBASE) +# Install system + ${MAKE} -C ${.CURDIR} \ + INSTALL_SYSTEM_ROOT=${.OBJDIR}/${.TARGET} \ + INSTALL_SYSTEM_MEDIATYPE="${.TARGET}" \ + install-system # Create offline pkgbase repo on release media mkdir -p ${.TARGET}/usr/freebsd-packages/repos/ ${.CURDIR}/scripts/pkgbase-stage.lua disc \ @@ -250,7 +325,17 @@ mtree -c -p ${.TARGET}/usr/freebsd-packages | \ mtree -C -k type,mode,link,size | \ sed 's|^\.|./usr/freebsd-packages|g' >> ${.TARGET}/METALOG -.endif +.else # not pkgbase +# Install system + mkdir -p ${.TARGET} + ( cd ${WORLDDIR} && ${IMAKE} installworld installkernel distribution \ + DESTDIR=${.OBJDIR}/${.TARGET} MK_AT=no \ + MK_INSTALLLIB=no MK_MAIL=no \ + ${_ALL_LIBCOMPATS:@v@MK_LIB$v=no@} \ + MK_TOOLCHAIN=no \ + MK_RESCUE=no MK_DICT=no \ + MK_KERNEL_SYMBOLS=no MK_TESTS=no MK_DEBUG_FILES=no) +.endif # if pkgbase .if !defined(NODISTSETS) || empty(NODISTSETS) # Copy MANIFEST to provide legacy dist checksums in both modes mkdir -p ${.TARGET}/usr/freebsd-dist @@ -267,13 +352,7 @@ .endif .if ${.MAKE.OS} == "FreeBSD" && (!defined(NOPKG) || empty(NOPKG)) # Install packages onto release media. -.if !defined(NOPKGBASE) || empty(NOPKGBASE) - ${PKGBASE_INSTALL} pkg - ${PKGBASE_CLEAN} -.else - ${PKG_INSTALL} pkg -.endif - ${PKG_INSTALL} wifi-firmware-kmod-release || true + ${PKG_INSTALL} pkg wifi-firmware-kmod-release || true ${PKG_CLEAN} || true .endif # Set up installation environment @@ -295,6 +374,12 @@ bootonly: # Install system +.if !defined(NOPKGBASE) || empty(NOPKGBASE) + ${MAKE} -C ${.CURDIR} \ + INSTALL_SYSTEM_ROOT=${.OBJDIR}/${.TARGET} \ + INSTALL_SYSTEM_MEDIATYPE="${.TARGET}" \ + install-system +.else # not pkgbase mkdir -p ${.TARGET} ( cd ${WORLDDIR} && ${IMAKE} installworld installkernel distribution \ DESTDIR=${.OBJDIR}/${.TARGET} MK_AT=no \ @@ -304,6 +389,7 @@ MK_TOOLCHAIN=no \ MK_RESCUE=no MK_DICT=no \ MK_KERNEL_SYMBOLS=no MK_TESTS=no MK_DEBUG_FILES=no) +.endif # if pkgbase .if !defined(NODISTSETS) || empty(NODISTSETS) # Copy manifest only (no distfiles) to get checksums mkdir -p ${.TARGET}/usr/freebsd-dist @@ -312,13 +398,7 @@ echo "./usr/freebsd-dist/MANIFEST type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG .endif .if ${.MAKE.OS} == "FreeBSD" && (!defined(NOPKG) || empty(NOPKG)) -.if !defined(NOPKGBASE) || empty(NOPKGBASE) - ${PKGBASE_INSTALL} pkg - ${PKGBASE_CLEAN} -.else - ${PKG_INSTALL} pkg -.endif - ${PKG_INSTALL} wifi-firmware-iwlwifi-kmod wifi-firmware-rtw88-kmod || true + ${PKG_INSTALL} pkg wifi-firmware-iwlwifi-kmod wifi-firmware-rtw88-kmod || true ${PKG_CLEAN} || true .endif # Set up installation environment @@ -338,12 +418,12 @@ echo "./etc/rc.local type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG dvd: -# Install system - mkdir -p ${.TARGET} - ( cd ${WORLDDIR} && ${IMAKE} installworld installkernel distribution \ - DESTDIR=${.OBJDIR}/${.TARGET} MK_RESCUE=no MK_KERNEL_SYMBOLS=no \ - MK_TESTS=no MK_DEBUG_FILES=no) .if !defined(NOPKGBASE) || empty(NOPKGBASE) +# Install system + ${MAKE} -C ${.CURDIR} \ + INSTALL_SYSTEM_ROOT=${.OBJDIR}/${.TARGET} \ + INSTALL_SYSTEM_MEDIATYPE="${.TARGET}" \ + install-system # Create offline pkgbase repo on release media mkdir -p ${.TARGET}/usr/freebsd-packages/repos/ ${.CURDIR}/scripts/pkgbase-stage.lua dvd \ @@ -355,7 +435,13 @@ mtree -c -p ${.TARGET}/usr/freebsd-packages | \ mtree -C -k type,mode,link,size | \ sed 's|^\.|./usr/freebsd-packages|g' >> ${.TARGET}/METALOG -.endif +.else # not pkgbase +# Install system + mkdir -p ${.TARGET} + ( cd ${WORLDDIR} && ${IMAKE} installworld installkernel distribution \ + DESTDIR=${.OBJDIR}/${.TARGET} MK_RESCUE=no MK_KERNEL_SYMBOLS=no \ + MK_TESTS=no MK_DEBUG_FILES=no) +.endif # if pkgbase .if !defined(NODISTSETS) || empty(NODISTSETS) # Copy MANIFEST to provide legacy dist checksums in both modes mkdir -p ${.TARGET}/usr/freebsd-dist @@ -371,13 +457,7 @@ .endif .if ${.MAKE.OS} == "FreeBSD" && (!defined(NOPKG) || empty(NOPKG)) # Install packages onto release media. -.if !defined(NOPKGBASE) || empty(NOPKGBASE) - ${PKGBASE_INSTALL} pkg - ${PKGBASE_CLEAN} -.else - ${PKG_INSTALL} pkg -.endif - ${PKG_INSTALL} wifi-firmware-kmod-release || true + ${PKG_INSTALL} pkg wifi-firmware-kmod-release || true ${PKG_CLEAN} || true .endif # Set up installation environment