Makefile revision 279558
1169689Skan# $FreeBSD: stable/10/release/Makefile 279558 2015-03-03 02:46:59Z gjb $
2169689Skan#
3169689Skan# Makefile for building releases and release media.
4169689Skan#
5169689Skan# User-driven targets:
6169689Skan#  cdrom: Builds release CD-ROM media (disc1.iso)
7169689Skan#  dvdrom: Builds release DVD-ROM media (dvd1.iso)
8169689Skan#  memstick: Builds memory stick image (memstick.img)
9169689Skan#  mini-memstick: Builds minimal memory stick image (mini-memstick.img)
10169689Skan#  ftp: Sets up FTP distribution area (ftp)
11169689Skan#  release: Invokes real-release, vm-release, and cloudware-release targets
12169689Skan#  real-release: Build all media and FTP distribution area
13169689Skan#  vm-release: Build all virtual machine image targets
14169689Skan#  cloudware-release: Build all cloud hosting provider targets
15169689Skan#  install: Invokes the release-install and vm-install targets
16169689Skan#  release-install: Copies all release installation media into ${DESTDIR}
17169689Skan#  vm-install: Copies all virtual machine images into ${DESTDIR}
18169689Skan#
19169689Skan# Variables affecting the build process:
20169689Skan#  WORLDDIR: location of src tree -- must have built world and default kernel
21169689Skan#            (by default, the directory above this one)
22169689Skan#  PORTSDIR: location of ports tree to distribute (default: /usr/ports)
23169689Skan#  DOCDIR:   location of doc tree (default: /usr/doc)
24169689Skan#  NOPKG:    if set, do not distribute third-party packages
25169689Skan#  NOPORTS:  if set, do not distribute ports tree
26169689Skan#  NOSRC:    if set, do not distribute source tree
27169689Skan#  NODOC:    if set, do not generate release documentation
28169689Skan#  WITH_DVD: if set, generate dvd1.iso
29169689Skan#  WITH_COMPRESSED_IMAGES: if set, compress installation images with xz(1)
30169689Skan#		(uncompressed images are not removed)
31169689Skan#  WITH_VMIMAGES: if set, build virtual machine images with the release
32169689Skan#  WITH_COMPRESSED_VMIMAGES: if set, compress virtual machine disk images
33169689Skan#  		with xz(1) (extremely time consuming)
34169689Skan#  WITH_CLOUDWARE: if set, build cloud hosting disk images with the release
35169689Skan#  TARGET/TARGET_ARCH: architecture of built release
36169689Skan#
37169689Skan
38169689SkanWORLDDIR?=	${.CURDIR}/..
39169689SkanPORTSDIR?=	/usr/ports
40169689SkanDOCDIR?=	/usr/doc
41169689SkanRELNOTES_LANG?= en_US.ISO8859-1
42169689SkanXZCMD?=		/usr/bin/xz
43169689Skan
44169689Skan.if !defined(TARGET) || empty(TARGET)
45169689SkanTARGET=		${MACHINE}
46169689Skan.endif
47169689Skan.if !defined(TARGET_ARCH) || empty(TARGET_ARCH)
48169689Skan.if ${TARGET} == ${MACHINE}
49169689SkanTARGET_ARCH=	${MACHINE_ARCH}
50169689Skan.else
51169689SkanTARGET_ARCH=	${TARGET}
52169689Skan.endif
53169689Skan.endif
54169689SkanIMAKE=		${MAKE} TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}
55169689SkanDISTDIR=	dist
56169689Skan
57169689Skan# Define OSRELEASE by using newvars.sh
58169689Skan.if !defined(OSRELEASE) || empty(OSRELEASE)
59169689Skan.for _V in TYPE BRANCH REVISION
60169689Skan${_V}!=	eval $$(awk '/^${_V}=/{print}' ${.CURDIR}/../sys/conf/newvers.sh); echo $$${_V}
61169689Skan.endfor
62169689Skan.for _V in ${TARGET_ARCH}
63169689Skan.if !empty(TARGET:M${_V})
64169689SkanOSRELEASE=	${TYPE}-${REVISION}-${BRANCH}-${TARGET}
65169689SkanVOLUME_LABEL=	${REVISION:C/[.-]/_/g}_${BRANCH:C/[.-]/_/g}_${TARGET}
66169689Skan.else
67169689SkanOSRELEASE=	${TYPE}-${REVISION}-${BRANCH}-${TARGET}-${TARGET_ARCH}
68169689SkanVOLUME_LABEL=	${REVISION:C/[.-]/_/g}_${BRANCH:C/[.-]/_/g}_${TARGET_ARCH}
69169689Skan.endif
70169689Skan.endfor
71169689Skan.endif
72169689Skan
73169689Skan.if !defined(VOLUME_LABEL) || empty(VOLUME_LABEL)
74169689SkanVOLUME_LABEL=	FreeBSD_Install
75169689Skan.endif
76169689Skan
77169689Skan.if !exists(${DOCDIR})
78169689SkanNODOC= true
79169689Skan.endif
80169689Skan.if !exists(${PORTSDIR})
81169689SkanNOPORTS= true
82169689Skan.endif
83169689Skan
84169689SkanEXTRA_PACKAGES=
85169689Skan.if !defined(NOPORTS)
86169689SkanEXTRA_PACKAGES+= ports.txz
87169689Skan.endif
88169689Skan.if !defined(NOSRC)
89169689SkanEXTRA_PACKAGES+= src.txz
90169689Skan.endif
91169689Skan.if !defined(NODOC)
92169689SkanEXTRA_PACKAGES+= reldoc
93169689Skan.endif
94169689Skan
95169689SkanRELEASE_TARGETS= ftp
96169689SkanIMAGES=
97169689Skan.if exists(${.CURDIR}/${TARGET}/mkisoimages.sh)
98169689SkanRELEASE_TARGETS+= cdrom
99169689SkanIMAGES+=	disc1.iso bootonly.iso
100169689Skan. if defined(WITH_DVD) && !empty(WITH_DVD)
101169689SkanRELEASE_TARGETS+= dvdrom
102169689SkanIMAGES+=	dvd1.iso
103169689Skan. endif
104169689Skan.endif
105169689Skan.if exists(${.CURDIR}/${TARGET}/make-memstick.sh)
106169689SkanRELEASE_TARGETS+= memstick.img
107169689SkanRELEASE_TARGETS+= mini-memstick.img
108169689SkanIMAGES+=	memstick.img
109169689SkanIMAGES+=	mini-memstick.img
110169689Skan.endif
111169689Skan.if exists(${.CURDIR}/${TARGET}/make-uefi-memstick.sh)
112169689SkanRELEASE_TARGETS+=uefi-memstick.img
113169689SkanRELEASE_TARGETS+=uefi-mini-memstick.img
114169689SkanIMAGES+=	uefi-memstick.img
115169689SkanIMAGES+=	uefi-mini-memstick.img
116169689Skan.endif
117169689Skan.if exists(${.CURDIR}/${TARGET}/mkisoimages-uefi.sh)
118169689SkanRELEASE_TARGETS+=uefi-disc1.iso
119169689SkanRELEASE_TARGETS+=uefi-bootonly.iso
120169689SkanIMAGES+=	uefi-disc1.iso
121169689SkanIMAGES+=	uefi-bootonly.iso
122169689Skan. if defined(WITH_DVD) && !empty(WITH_DVD)
123169689SkanRELEASE_TARGETS+=uefi-dvd1.iso
124169689SkanIMAGES+=	uefi-dvd1.iso
125169689Skan. endif
126169689Skan.endif
127169689Skan
128169689SkanCLEANFILES=	packagesystem *.txz MANIFEST release ${IMAGES}
129169689Skan.if defined(WITH_COMPRESSED_IMAGES) && !empty(WITH_COMPRESSED_IMAGES)
130169689Skan. for I in ${IMAGES}
131169689SkanCLEANFILES+=	${I}.xz
132169689Skan. endfor
133169689Skan.endif
134169689Skan.if defined(WITH_DVD) && !empty(WITH_DVD)
135169689SkanCLEANFILES+=	pkg-stage
136169689Skan.endif
137169689SkanCLEANDIRS=	dist ftp disc1 bootonly dvd
138169689Skanbeforeclean:
139169689Skan	chflags -R noschg .
140169689Skan.include <bsd.obj.mk>
141169689Skanclean: beforeclean
142169689Skan
143169689Skanbase.txz:
144169689Skan	mkdir -p ${DISTDIR}
145169689Skan	cd ${WORLDDIR} && ${IMAKE} distributeworld DISTDIR=${.OBJDIR}/${DISTDIR}
146169689Skan# Set up mergemaster root database
147169689Skan	sh ${.CURDIR}/scripts/mm-mtree.sh -m ${WORLDDIR} -F \
148169689Skan	    "TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}" -D "${.OBJDIR}/${DISTDIR}/base"
149169689Skan	etcupdate extract -B -M "TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}" \
150169689Skan	    -s ${WORLDDIR} -d "${.OBJDIR}/${DISTDIR}/base/var/db/etcupdate"
151169689Skan# Package all components
152169689Skan	cd ${WORLDDIR} && ${IMAKE} packageworld DISTDIR=${.OBJDIR}/${DISTDIR}
153169689Skan	mv ${DISTDIR}/*.txz .
154169689Skan
155169689Skankernel.txz:
156169689Skan	mkdir -p ${DISTDIR}
157169689Skan	cd ${WORLDDIR} && ${IMAKE} distributekernel packagekernel DISTDIR=${.OBJDIR}/${DISTDIR}
158169689Skan	mv ${DISTDIR}/kernel*.txz .
159169689Skan
160169689Skansrc.txz:
161169689Skan	mkdir -p ${DISTDIR}/usr
162169689Skan	ln -fs ${WORLDDIR} ${DISTDIR}/usr/src
163169689Skan	cd ${DISTDIR} && tar cLvJf ${.OBJDIR}/src.txz --exclude .svn --exclude .zfs \
164169689Skan	    --exclude .git --exclude @ --exclude usr/src/release/dist usr/src
165169689Skan
166169689Skanports.txz:
167169689Skan	mkdir -p ${DISTDIR}/usr
168169689Skan	ln -fs ${PORTSDIR} ${DISTDIR}/usr/ports
169169689Skan	cd ${DISTDIR} && tar cLvJf ${.OBJDIR}/ports.txz \
170169689Skan	    --exclude .git --exclude .svn \
171169689Skan	    --exclude usr/ports/distfiles --exclude usr/ports/packages \
172169689Skan	    --exclude 'usr/ports/INDEX*' --exclude work usr/ports
173169689Skan
174169689Skanreldoc:
175169689Skan	cd ${.CURDIR}/doc && ${MAKE} all install clean 'FORMATS=html txt' \
176169689Skan	    INSTALL_COMPRESSED='' URLS_ABSOLUTE=YES DOCDIR=${.OBJDIR}/rdoc
177169689Skan	mkdir -p reldoc
178169689Skan.for i in hardware readme relnotes errata
179169689Skan	ln -f rdoc/${RELNOTES_LANG}/${i}/article.txt reldoc/${i:tu}.TXT
180169689Skan	ln -f rdoc/${RELNOTES_LANG}/${i}/article.html reldoc/${i:tu}.HTM
181169689Skan.endfor
182169689Skan	cp rdoc/${RELNOTES_LANG}/readme/docbook.css reldoc
183169689Skan
184169689Skandisc1: packagesystem
185169689Skan# Install system
186169689Skan	mkdir -p ${.TARGET}
187169689Skan	cd ${WORLDDIR} && ${IMAKE} installkernel installworld distribution \
188169689Skan		DESTDIR=${.OBJDIR}/${.TARGET} WITHOUT_RESCUE=1 WITHOUT_KERNEL_SYMBOLS=1 \
189169689Skan		WITHOUT_PROFILE=1 WITHOUT_SENDMAIL=1 WITHOUT_ATF=1 WITHOUT_LIB32=1
190169689Skan# Copy distfiles
191169689Skan	mkdir -p ${.TARGET}/usr/freebsd-dist
192169689Skan	cp *.txz MANIFEST ${.TARGET}/usr/freebsd-dist
193169689Skan# Copy documentation, if generated
194169689Skan.if !defined(NODOC)
195169689Skan	cp reldoc/* ${.TARGET}
196169689Skan.endif
197169689Skan# Set up installation environment
198169689Skan	ln -fs /tmp/bsdinstall_etc/resolv.conf ${.TARGET}/etc/resolv.conf
199169689Skan	echo sendmail_enable=\"NONE\" > ${.TARGET}/etc/rc.conf
200169689Skan	echo hostid_enable=\"NO\" >> ${.TARGET}/etc/rc.conf
201169689Skan	cp ${.CURDIR}/rc.local ${.TARGET}/etc
202169689Skan	touch ${.TARGET}
203169689Skan
204169689Skanbootonly: packagesystem
205169689Skan# Install system
206169689Skan	mkdir -p ${.TARGET}
207169689Skan	cd ${WORLDDIR} && ${IMAKE} installkernel installworld distribution \
208169689Skan	    DESTDIR=${.OBJDIR}/${.TARGET} WITHOUT_AMD=1 WITHOUT_AT=1 \
209169689Skan	    WITHOUT_GAMES=1 WITHOUT_GROFF=1 \
210169689Skan	    WITHOUT_INSTALLLIB=1 WITHOUT_LIB32=1 WITHOUT_MAIL=1 \
211169689Skan	    WITHOUT_NCP=1 WITHOUT_TOOLCHAIN=1 WITHOUT_PROFILE=1 \
212169689Skan	    WITHOUT_INSTALLIB=1 WITHOUT_RESCUE=1 WITHOUT_DICT=1 \
213169689Skan	    WITHOUT_KERNEL_SYMBOLS=1
214169689Skan# Copy manifest only (no distfiles) to get checksums
215169689Skan	mkdir -p ${.TARGET}/usr/freebsd-dist
216169689Skan	cp MANIFEST ${.TARGET}/usr/freebsd-dist
217169689Skan# Copy documentation, if generated
218169689Skan.if !defined(NODOC)
219169689Skan	cp reldoc/* ${.TARGET}
220169689Skan.endif
221169689Skan# Set up installation environment
222169689Skan	ln -fs /tmp/bsdinstall_etc/resolv.conf ${.TARGET}/etc/resolv.conf
223169689Skan	echo sendmail_enable=\"NONE\" > ${.TARGET}/etc/rc.conf
224169689Skan	echo hostid_enable=\"NO\" >> ${.TARGET}/etc/rc.conf
225169689Skan	cp ${.CURDIR}/rc.local ${.TARGET}/etc
226169689Skan
227169689Skandvd: packagesystem
228169689Skan# Install system
229169689Skan	mkdir -p ${.TARGET}
230169689Skan	cd ${WORLDDIR} && ${IMAKE} installkernel installworld distribution \
231169689Skan		DESTDIR=${.OBJDIR}/${.TARGET} WITHOUT_RESCUE=1 WITHOUT_KERNEL_SYMBOLS=1
232169689Skan# Copy distfiles
233169689Skan	mkdir -p ${.TARGET}/usr/freebsd-dist
234169689Skan	cp *.txz MANIFEST ${.TARGET}/usr/freebsd-dist
235169689Skan# Copy documentation, if generated
236169689Skan.if !defined(NODOC)
237169689Skan	cp reldoc/* ${.TARGET}
238169689Skan.endif
239169689Skan# Set up installation environment
240169689Skan	ln -fs /tmp/bsdinstall_etc/resolv.conf ${.TARGET}/etc/resolv.conf
241169689Skan	echo sendmail_enable=\"NONE\" > ${.TARGET}/etc/rc.conf
242169689Skan	echo hostid_enable=\"NO\" >> ${.TARGET}/etc/rc.conf
243169689Skan	cp ${.CURDIR}/rc.local ${.TARGET}/etc
244169689Skan	touch ${.TARGET}
245169689Skan
246169689Skanrelease.iso: disc1.iso
247169689Skandisc1.iso: disc1
248169689Skan	sh ${.CURDIR}/${TARGET}/mkisoimages.sh -b ${VOLUME_LABEL}_CD ${.TARGET} disc1
249169689Skan
250169689Skanuefi-disc1.iso: disc1
251169689Skan.if exists(${.CURDIR}/${TARGET}/mkisoimages-uefi.sh)
252169689Skan	sh ${.CURDIR}/${TARGET}/mkisoimages-uefi.sh -b ${VOLUME_LABEL}_UEFICD \
253169689Skan		${.TARGET} disc1
254169689Skan.endif
255169689Skan
256169689Skanuefi-bootonly.iso: bootonly
257169689Skan.if exists(${.CURDIR}/${TARGET}/mkisoimages-uefi.sh)
258169689Skan	sh ${.CURDIR}/${TARGET}/mkisoimages-uefi.sh -b ${VOLUME_LABEL}_UEFIBO \
259169689Skan		${.TARGET} bootonly
260169689Skan.endif
261169689Skan
262169689Skandvd1.iso: dvd pkg-stage
263169689Skan	sh ${.CURDIR}/${TARGET}/mkisoimages.sh -b ${VOLUME_LABEL}_DVD ${.TARGET} dvd
264169689Skan
265169689Skanuefi-dvd1.iso: dvd pkg-stage
266169689Skan.if exists(${.CURDIR}/${TARGET}/mkisoimages-uefi.sh)
267169689Skan	sh ${.CURDIR}/${TARGET}/mkisoimages-uefi.sh -b ${VOLUME_LABEL}_UEFIDVD \
268169689Skan		${.TARGET} dvd
269169689Skan.endif
270169689Skan
271169689Skanbootonly.iso: bootonly
272169689Skan	sh ${.CURDIR}/${TARGET}/mkisoimages.sh -b ${VOLUME_LABEL}_BO ${.TARGET} bootonly
273169689Skan
274169689Skanmemstick: memstick.img
275169689Skanmemstick.img: disc1
276169689Skan	sh ${.CURDIR}/${TARGET}/make-memstick.sh disc1 ${.TARGET}
277169689Skan
278169689Skanmini-memstick: mini-memstick.img
279169689Skanmini-memstick.img: bootonly
280169689Skan	sh ${.CURDIR}/${TARGET}/make-memstick.sh bootonly ${.TARGET}
281169689Skan
282169689Skanuefi-memstick: uefi-memstick.img
283169689Skanuefi-memstick.img: disc1
284169689Skan.if exists(${.CURDIR}/${TARGET}/make-uefi-memstick.sh)
285169689Skan	sh ${.CURDIR}/${TARGET}/make-uefi-memstick.sh disc1 ${.TARGET}
286169689Skan.endif
287169689Skan
288169689Skanuefi-mini-memstick: uefi-mini-memstick.img
289169689Skanuefi-mini-memstick.img: bootonly
290169689Skan.if exists(${.CURDIR}/${TARGET}/make-uefi-memstick.sh)
291169689Skan	sh ${.CURDIR}/${TARGET}/make-uefi-memstick.sh bootonly ${.TARGET}
292169689Skan.endif
293169689Skan
294169689Skanpackagesystem: base.txz kernel.txz ${EXTRA_PACKAGES}
295169689Skan	sh ${.CURDIR}/scripts/make-manifest.sh *.txz > MANIFEST
296169689Skan	touch ${.TARGET}
297169689Skan
298169689Skanpkg-stage:
299169689Skan.if !defined(NOPKG)
300169689Skan	env REPOS_DIR=${.CURDIR}/pkg_repos/ \
301169689Skan		sh ${.CURDIR}/scripts/pkg-stage.sh
302169689Skan	mkdir -p ${.OBJDIR}/dvd/packages/repos/
303169689Skan	cp ${.CURDIR}/scripts/FreeBSD_install_cdrom.conf \
304169689Skan		${.OBJDIR}/dvd/packages/repos/
305169689Skan.endif
306169689Skan	touch ${.TARGET}
307169689Skan
308169689Skancdrom: disc1.iso bootonly.iso
309169689Skandvdrom: dvd1.iso
310169689Skanftp: packagesystem
311169689Skan	rm -rf ftp
312169689Skan	mkdir -p ftp
313169689Skan	cp *.txz MANIFEST ftp
314169689Skan
315169689Skanrelease:	real-release vm-release cloudware-release
316169689Skan	touch ${.TARGET}
317169689Skan
318169689Skanreal-release:
319169689Skan	${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} obj
320169689Skan	${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${RELEASE_TARGETS}
321169689Skan
322169689Skaninstall:	release-install vm-install cloudware-install
323169689Skan
324169689Skanrelease-install:
325169689Skan.if defined(DESTDIR) && !empty(DESTDIR)
326169689Skan	mkdir -p ${DESTDIR}
327169689Skan.endif
328169689Skan	cp -a ftp ${DESTDIR}/
329169689Skan.for I in ${IMAGES}
330169689Skan	cp -p ${I} ${DESTDIR}/${OSRELEASE}-${I}
331169689Skan. if defined(WITH_COMPRESSED_IMAGES) && !empty(WITH_COMPRESSED_IMAGES)
332169689Skan	${XZCMD} -k ${DESTDIR}/${OSRELEASE}-${I}
333169689Skan. endif
334169689Skan.endfor
335169689Skan	cd ${DESTDIR} && sha256 ${OSRELEASE}* > ${DESTDIR}/CHECKSUM.SHA256
336169689Skan	cd ${DESTDIR} && md5 ${OSRELEASE}* > ${DESTDIR}/CHECKSUM.MD5
337169689Skan
338169689Skan.include "${.CURDIR}/Makefile.vm"
339169689Skan