69c7d069af
installation ISOs: - TYPE, BRANCH, and REVISION are only defined if OSRELEASE is not defined, so in situations where one might set OSRELEASE for an in-house ISO build, VOLUME_LABEL would be empty. - makefs(8) limits the volume label to 32 characters, which for the powerpc64 case, OSRELEASE expands to FreeBSD-11.0-CURRENT-powerpc-powerpc64. Even with removing the prefixing 'FreeBSD-', the string is 30 characters long, leaving zero room for suffixing the type of ISO media (BO for bootonly, CD for cdrom, and DVD for dvdrom). Resolve these by defining VOLUME_LABEL when defining OSRELEASE if unset. If OSRELEASE is defined by the builder, use the OSRELEASE from that definition as the VOLUME_LABEL. In addition, for cases where both TARGET and TARGET_ARCH are used for the VOLUME_LABEL, use TARGET_ARCH if it differs from TARGET. There are probably a few sharp edges here yet, but these problems are going to affect the powerpc/powerpc64 builds for 10.1-RELEASE, so the immediate concern is fixing the underlying problem at hand quickly, and less so about the elegance of the fix. MFC after: 3 days X-MFC-10.1: yes, asap Sponsored by: The FreeBSD Foundation
362 lines
11 KiB
Makefile
362 lines
11 KiB
Makefile
# $FreeBSD$
|
|
#
|
|
# Makefile for building releases and release media.
|
|
#
|
|
# User-driven targets:
|
|
# cdrom: Builds release CD-ROM media (disc1.iso)
|
|
# dvdrom: Builds release DVD-ROM media (dvd1.iso)
|
|
# memstick: Builds memory stick image (memstick.img)
|
|
# mini-memstick: Builds minimal memory stick image (mini-memstick.img)
|
|
# ftp: Sets up FTP distribution area (ftp)
|
|
# release: Build all media and FTP distribution area
|
|
# install: Copies all release media into ${DESTDIR}
|
|
#
|
|
# Variables affecting the build process:
|
|
# WORLDDIR: location of src tree -- must have built world and default kernel
|
|
# (by default, the directory above this one)
|
|
# PORTSDIR: location of ports tree to distribute (default: /usr/ports)
|
|
# DOCDIR: location of doc tree (default: /usr/doc)
|
|
# NOPKG: if set, do not distribute third-party packages
|
|
# NOPORTS: if set, do not distribute ports tree
|
|
# NOSRC: if set, do not distribute source tree
|
|
# NODOC: if set, do not generate release documentation
|
|
# WITH_DVD: if set, generate dvd1.iso
|
|
# WITH_COMPRESSED_IMAGES: if set, compress installation images with xz(1)
|
|
# (uncompressed images are not removed)
|
|
# WITH_VMIMAGES: if set, build virtual machine images with the release
|
|
# WITH_COMPRESSED_VMIMAGES: if set, compress virtual machine disk images
|
|
# with xz(1) (extremely time consuming)
|
|
# TARGET/TARGET_ARCH: architecture of built release
|
|
#
|
|
|
|
WORLDDIR?= ${.CURDIR}/..
|
|
PORTSDIR?= /usr/ports
|
|
DOCDIR?= /usr/doc
|
|
RELNOTES_LANG?= en_US.ISO8859-1
|
|
XZCMD?= /usr/bin/xz
|
|
|
|
.if !defined(TARGET) || empty(TARGET)
|
|
TARGET= ${MACHINE}
|
|
.endif
|
|
.if !defined(TARGET_ARCH) || empty(TARGET_ARCH)
|
|
.if ${TARGET} == ${MACHINE}
|
|
TARGET_ARCH= ${MACHINE_ARCH}
|
|
.else
|
|
TARGET_ARCH= ${TARGET}
|
|
.endif
|
|
.endif
|
|
IMAKE= ${MAKE} TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}
|
|
DISTDIR= dist
|
|
|
|
# Define OSRELEASE by using newvars.sh
|
|
.if !defined(OSRELEASE) || empty(OSRELEASE)
|
|
.for _V in TYPE BRANCH REVISION
|
|
${_V}!= eval $$(awk '/^${_V}=/{print}' ${.CURDIR}/../sys/conf/newvers.sh); echo $$${_V}
|
|
.endfor
|
|
.for _V in ${TARGET_ARCH}
|
|
.if !empty(TARGET:M${_V})
|
|
OSRELEASE= ${TYPE}-${REVISION}-${BRANCH}-${TARGET}
|
|
VOLUME_LABEL= ${REVISION:C/\./_/g:}_${BRANCH}_${TARGET}
|
|
.else
|
|
OSRELEASE= ${TYPE}-${REVISION}-${BRANCH}-${TARGET}-${TARGET_ARCH}
|
|
VOLUME_LABEL= ${REVISION:C/\./_/g:}_${BRANCH}_${TARGET_ARCH}
|
|
.endif
|
|
.endfor
|
|
.endif
|
|
|
|
.if !defined(VOLUME_LABEL) || empty(VOLUME_LABEL)
|
|
VOLUME_LABEL= FreeBSD_Install
|
|
.endif
|
|
|
|
.if !exists(${DOCDIR})
|
|
NODOC= true
|
|
.endif
|
|
.if !exists(${PORTSDIR})
|
|
NOPORTS= true
|
|
.endif
|
|
|
|
EXTRA_PACKAGES=
|
|
.if !defined(NOPORTS)
|
|
EXTRA_PACKAGES+= ports.txz
|
|
.endif
|
|
.if !defined(NOSRC)
|
|
EXTRA_PACKAGES+= src.txz
|
|
.endif
|
|
.if !defined(NODOC)
|
|
EXTRA_PACKAGES+= reldoc
|
|
.endif
|
|
|
|
RELEASE_TARGETS= ftp
|
|
IMAGES=
|
|
.if exists(${.CURDIR}/${TARGET}/mkisoimages.sh)
|
|
RELEASE_TARGETS+= cdrom
|
|
IMAGES+= disc1.iso bootonly.iso
|
|
. if defined(WITH_DVD) && !empty(WITH_DVD)
|
|
RELEASE_TARGETS+= dvdrom
|
|
IMAGES+= dvd1.iso
|
|
. endif
|
|
.endif
|
|
.if exists(${.CURDIR}/${TARGET}/make-memstick.sh)
|
|
RELEASE_TARGETS+= memstick.img
|
|
RELEASE_TARGETS+= mini-memstick.img
|
|
IMAGES+= memstick.img
|
|
IMAGES+= mini-memstick.img
|
|
.endif
|
|
|
|
VMTARGETS= vm-base vm-image
|
|
VMFORMATS?= vhd vmdk qcow2 raw
|
|
VMSIZE?= 20G
|
|
VMBASE?= vm
|
|
AZURECONF?= ${.CURDIR}/tools/azure.conf
|
|
|
|
CLEANFILES= packagesystem *.txz MANIFEST system ${IMAGES}
|
|
.if defined(WITH_COMPRESSED_IMAGES) && !empty(WITH_COMPRESSED_IMAGES)
|
|
. for I in ${IMAGES}
|
|
CLEANFILES+= ${I}.xz
|
|
. endfor
|
|
.endif
|
|
.if defined(WITH_DVD) && !empty(WITH_DVD)
|
|
CLEANFILES+= pkg-stage
|
|
.endif
|
|
.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
|
|
CLEANFILES+= ${VMBASE}.img
|
|
. for FORMAT in ${VMFORMATS}
|
|
CLEANFILES+= ${VMBASE}.${FORMAT}
|
|
. endfor
|
|
.endif
|
|
CLEANDIRS= dist ftp release bootonly dvd
|
|
.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
|
|
CLEANDIRS+= ${VMTARGETS}
|
|
.endif
|
|
.if exists(${.CURDIR}/${TARGET}/mk-azure.sh)
|
|
CLEANFILES+= ${OSRELEASE}.vhd \
|
|
${OSRELEASE}.vhd.raw \
|
|
azure.img
|
|
CLEANDIRS+= vm-azure
|
|
.endif
|
|
beforeclean:
|
|
chflags -R noschg .
|
|
.include <bsd.obj.mk>
|
|
clean: beforeclean
|
|
|
|
base.txz:
|
|
mkdir -p ${DISTDIR}
|
|
cd ${WORLDDIR} && ${IMAKE} distributeworld DISTDIR=${.OBJDIR}/${DISTDIR}
|
|
# Set up mergemaster root database
|
|
sh ${.CURDIR}/scripts/mm-mtree.sh -m ${WORLDDIR} -F \
|
|
"TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}" -D "${.OBJDIR}/${DISTDIR}/base"
|
|
etcupdate extract -B -M "TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}" \
|
|
-s ${WORLDDIR} -d "${.OBJDIR}/${DISTDIR}/base/var/db/etcupdate"
|
|
# Package all components
|
|
cd ${WORLDDIR} && ${IMAKE} packageworld DISTDIR=${.OBJDIR}/${DISTDIR}
|
|
mv ${DISTDIR}/*.txz .
|
|
|
|
kernel.txz:
|
|
mkdir -p ${DISTDIR}
|
|
cd ${WORLDDIR} && ${IMAKE} distributekernel packagekernel DISTDIR=${.OBJDIR}/${DISTDIR}
|
|
mv ${DISTDIR}/kernel*.txz .
|
|
|
|
src.txz:
|
|
mkdir -p ${DISTDIR}/usr
|
|
ln -fs ${WORLDDIR} ${DISTDIR}/usr/src
|
|
cd ${DISTDIR} && tar cLvJf ${.OBJDIR}/src.txz --exclude .svn --exclude .zfs \
|
|
--exclude .git --exclude @ --exclude usr/src/release/dist usr/src
|
|
|
|
ports.txz:
|
|
mkdir -p ${DISTDIR}/usr
|
|
ln -fs ${PORTSDIR} ${DISTDIR}/usr/ports
|
|
cd ${DISTDIR} && tar cLvJf ${.OBJDIR}/ports.txz \
|
|
--exclude .git --exclude .svn \
|
|
--exclude usr/ports/distfiles --exclude usr/ports/packages \
|
|
--exclude 'usr/ports/INDEX*' --exclude work usr/ports
|
|
|
|
reldoc:
|
|
cd ${.CURDIR}/doc && ${MAKE} all install clean 'FORMATS=html txt' \
|
|
INSTALL_COMPRESSED='' URLS_ABSOLUTE=YES DOCDIR=${.OBJDIR}/rdoc
|
|
mkdir -p reldoc
|
|
.for i in hardware readme relnotes errata
|
|
ln -f rdoc/${RELNOTES_LANG}/${i}/article.txt reldoc/${i:tu}.TXT
|
|
ln -f rdoc/${RELNOTES_LANG}/${i}/article.html reldoc/${i:tu}.HTM
|
|
.endfor
|
|
cp rdoc/${RELNOTES_LANG}/readme/docbook.css reldoc
|
|
|
|
system: packagesystem
|
|
# Install system
|
|
mkdir -p release
|
|
cd ${WORLDDIR} && ${IMAKE} installkernel installworld distribution \
|
|
DESTDIR=${.OBJDIR}/release MK_RESCUE=no MK_KERNEL_SYMBOLS=no \
|
|
MK_PROFILE=no MK_SENDMAIL=no MK_TESTS=no MK_LIB32=no \
|
|
MK_DEBUG_FILES=no
|
|
# Copy distfiles
|
|
mkdir -p release/usr/freebsd-dist
|
|
for dist in MANIFEST $$(ls *.txz | grep -v -- '-dbg'); \
|
|
do cp $${dist} release/usr/freebsd-dist; \
|
|
done
|
|
# Copy documentation, if generated
|
|
.if !defined(NODOC)
|
|
cp reldoc/* release
|
|
.endif
|
|
# Set up installation environment
|
|
ln -fs /tmp/bsdinstall_etc/resolv.conf release/etc/resolv.conf
|
|
echo sendmail_enable=\"NONE\" > release/etc/rc.conf
|
|
echo hostid_enable=\"NO\" >> release/etc/rc.conf
|
|
echo debug.witness.trace=0 >> release/etc/sysctl.conf
|
|
cp ${.CURDIR}/rc.local release/etc
|
|
touch ${.TARGET}
|
|
|
|
bootonly: packagesystem
|
|
# Install system
|
|
mkdir -p bootonly
|
|
cd ${WORLDDIR} && ${IMAKE} installkernel installworld distribution \
|
|
DESTDIR=${.OBJDIR}/bootonly MK_AMD=no MK_AT=no \
|
|
MK_GAMES=no MK_GROFF=no \
|
|
MK_INSTALLLIB=no MK_LIB32=no MK_MAIL=no \
|
|
MK_NCP=no MK_TOOLCHAIN=no MK_PROFILE=no \
|
|
MK_INSTALLIB=no MK_RESCUE=no MK_DICT=no \
|
|
MK_KERNEL_SYMBOLS=no MK_TESTS=no MK_DEBUG_FILES=no
|
|
# Copy manifest only (no distfiles) to get checksums
|
|
mkdir -p bootonly/usr/freebsd-dist
|
|
cp MANIFEST bootonly/usr/freebsd-dist
|
|
# Copy documentation, if generated
|
|
.if !defined(NODOC)
|
|
cp reldoc/* bootonly
|
|
.endif
|
|
# Set up installation environment
|
|
ln -fs /tmp/bsdinstall_etc/resolv.conf bootonly/etc/resolv.conf
|
|
echo sendmail_enable=\"NONE\" > bootonly/etc/rc.conf
|
|
echo hostid_enable=\"NO\" >> bootonly/etc/rc.conf
|
|
echo debug.witness.trace=0 >> bootonly/etc/sysctl.conf
|
|
cp ${.CURDIR}/rc.local bootonly/etc
|
|
|
|
dvd:
|
|
# Install system
|
|
mkdir -p ${.TARGET}
|
|
cd ${WORLDDIR} && ${IMAKE} installkernel installworld distribution \
|
|
DESTDIR=${.OBJDIR}/${.TARGET} MK_RESCUE=no MK_KERNEL_SYMBOLS=no \
|
|
MK_TESTS=no MK_DEBUG_FILES=no
|
|
# Copy distfiles
|
|
mkdir -p ${.TARGET}/usr/freebsd-dist
|
|
for dist in MANIFEST $$(ls *.txz | grep -v -- '-dbg'); \
|
|
do cp $${dist} ${.TARGET}/usr/freebsd-dist; \
|
|
done
|
|
# Copy documentation, if generated
|
|
.if !defined(NODOC)
|
|
cp reldoc/* ${.TARGET}
|
|
.endif
|
|
# Set up installation environment
|
|
ln -fs /tmp/bsdinstall_etc/resolv.conf ${.TARGET}/etc/resolv.conf
|
|
echo sendmail_enable=\"NONE\" > ${.TARGET}/etc/rc.conf
|
|
echo hostid_enable=\"NO\" >> ${.TARGET}/etc/rc.conf
|
|
echo debug.witness.trace=0 >> ${.TARGET}/etc/sysctl.conf
|
|
cp ${.CURDIR}/rc.local ${.TARGET}/etc
|
|
touch ${.TARGET}
|
|
|
|
release.iso: disc1.iso
|
|
disc1.iso: system
|
|
sh ${.CURDIR}/${TARGET}/mkisoimages.sh -b ${VOLUME_LABEL}_CD ${.TARGET} release
|
|
|
|
dvd1.iso: dvd pkg-stage
|
|
sh ${.CURDIR}/${TARGET}/mkisoimages.sh -b ${VOLUME_LABEL}_DVD ${.TARGET} dvd
|
|
|
|
bootonly.iso: bootonly
|
|
sh ${.CURDIR}/${TARGET}/mkisoimages.sh -b ${VOLUME_LABEL}_BO ${.TARGET} bootonly
|
|
|
|
memstick: memstick.img
|
|
memstick.img: system
|
|
sh ${.CURDIR}/${TARGET}/make-memstick.sh release ${.TARGET}
|
|
|
|
mini-memstick: mini-memstick.img
|
|
mini-memstick.img: system
|
|
sh ${.CURDIR}/${TARGET}/make-memstick.sh bootonly ${.TARGET}
|
|
|
|
packagesystem: base.txz kernel.txz ${EXTRA_PACKAGES}
|
|
sh ${.CURDIR}/scripts/make-manifest.sh *.txz > MANIFEST
|
|
touch ${.TARGET}
|
|
|
|
pkg-stage:
|
|
.if !defined(NOPKG)
|
|
env REPOS_DIR=${.CURDIR}/pkg_repos/ \
|
|
sh ${.CURDIR}/scripts/pkg-stage.sh
|
|
mkdir -p ${.OBJDIR}/dvd/packages/repos/
|
|
cp ${.CURDIR}/scripts/FreeBSD_install_cdrom.conf \
|
|
${.OBJDIR}/dvd/packages/repos/
|
|
.endif
|
|
touch ${.TARGET}
|
|
|
|
cdrom: disc1.iso bootonly.iso
|
|
dvdrom: dvd1.iso
|
|
ftp: packagesystem
|
|
rm -rf ftp
|
|
mkdir -p ftp
|
|
cp *.txz MANIFEST ftp
|
|
|
|
release:
|
|
${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} obj
|
|
${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${RELEASE_TARGETS}
|
|
.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
|
|
${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${VMTARGETS}
|
|
.endif
|
|
|
|
install:
|
|
.if defined(DESTDIR) && !empty(DESTDIR)
|
|
mkdir -p ${DESTDIR}
|
|
.endif
|
|
cp -a ftp ${DESTDIR}/
|
|
.for I in ${IMAGES}
|
|
cp -p ${I} ${DESTDIR}/${OSRELEASE}-${I}
|
|
. if defined(WITH_COMPRESSED_IMAGES) && !empty(WITH_COMPRESSED_IMAGES)
|
|
${XZCMD} -k ${DESTDIR}/${OSRELEASE}-${I}
|
|
. endif
|
|
.endfor
|
|
cd ${DESTDIR} && sha256 ${OSRELEASE}* > ${DESTDIR}/CHECKSUM.SHA256
|
|
cd ${DESTDIR} && md5 ${OSRELEASE}* > ${DESTDIR}/CHECKSUM.MD5
|
|
.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
|
|
mkdir -p ${DESTDIR}/vmimages
|
|
. for FORMAT in ${VMFORMATS}
|
|
cp -p ${VMBASE}.${FORMAT} \
|
|
${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT}
|
|
. endfor
|
|
. if defined(WITH_COMPRESSED_VMIMAGES) && !empty(WITH_COMPRESSED_VMIMAGES)
|
|
# This is very time consuming, so defer it after the images are moved to
|
|
# the DESTDIR.
|
|
. for FORMAT in ${VMFORMATS}
|
|
# Don't keep the originals. There is a copy in ${.OBJDIR} if needed.
|
|
${XZCMD} ${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT}
|
|
. endfor
|
|
. endif
|
|
cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \
|
|
${DESTDIR}/vmimages/CHECKSUM.SHA256
|
|
cd ${DESTDIR}/vmimages && md5 ${OSRELEASE}* > \
|
|
${DESTDIR}/vmimages/CHECKSUM.MD5
|
|
.endif
|
|
|
|
vm-base:
|
|
.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
|
|
. if exists(${.CURDIR}/${TARGET}/mk-vmimage.sh)
|
|
env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
|
|
${.CURDIR}/${TARGET}/mk-vmimage.sh ${.TARGET} \
|
|
${VMBASE}.img ${WORLDDIR} ${.OBJDIR}/${.TARGET} ${VMSIZE}
|
|
. endif
|
|
.endif
|
|
touch ${.TARGET}
|
|
|
|
vm-image: vm-base
|
|
.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
|
|
. if exists(${.CURDIR}/${TARGET}/mk-vmimage.sh)
|
|
. for FORMAT in ${VMFORMATS}
|
|
env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
|
|
${.CURDIR}/${TARGET}/mk-vmimage.sh ${.TARGET} \
|
|
${VMBASE}.img ${FORMAT} ${VMBASE}.${FORMAT}
|
|
. endfor
|
|
. endif
|
|
.endif
|
|
touch ${.TARGET}
|
|
|
|
vm-azure:
|
|
.if exists(${.CURDIR}/${TARGET}/mk-azure.sh)
|
|
env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} AZURECONF=${AZURECONF} \
|
|
${.CURDIR}/${TARGET}/mk-azure.sh ${.TARGET} azure.img \
|
|
${WORLDDIR} ${.TARGET} ${VMSIZE} ${OSRELEASE}.vhd
|
|
.endif
|
|
touch ${.TARGET}
|