xref: /freebsd/release/Makefile (revision 523fece9d11e5d084c1d20d10d05971f5354d343)
1#
2# Makefile for building releases and release media.
3#
4# User-driven targets:
5#  cdrom: Builds release CD-ROM media (disc1.iso)
6#  dvdrom: Builds release DVD-ROM media (dvd1.iso)
7#  memstick: Builds memory stick image (memstick.img)
8#  mini-memstick: Builds minimal memory stick image (mini-memstick.img)
9#  ftp: Sets up FTP distribution area (ftp)
10#  release: Invokes real-release, vm-release, cloudware-release and oci-release targets
11#  real-release: Build all media and FTP distribution area
12#  vm-release: Build all virtual machine image targets
13#  cloudware-release: Build all cloud hosting provider targets
14#  oci-release: Build all OCI container images
15#  install: Invokes the release-install, vm-install and oci-install targets
16#  release-install: Copies all release installation media into ${DESTDIR}
17#  vm-install: Copies all virtual machine images into ${DESTDIR}
18#  cloud-install: Copies non-uploaded cloud images into ${DESTDIR}
19#  oci-install: Copies all OCI container images into ${DESTDIR}
20#
21# Variables affecting the build process:
22#  WORLDDIR: location of src tree -- must have built world and default kernel
23#            (by default, the directory above this one)
24#  NODISTSETS: if set, do not include dist sets or MANIFEST
25#  NOPKGBASE:  if set, include dist tarballs rather than pkgbase packages in
26#            disc1 and dvd1 installation media and build VM/cloud images using
27#            make installkernel installworld.
28#  PORTSDIR: location of ports tree to distribute (default: /usr/ports)
29#  XTRADIR:  xtra-bits-dir argument for <arch>/mkisoimages.sh
30#  NOPKG:    if set, do not distribute third-party packages
31#  NOPORTS:  if set, do not distribute ports tree
32#  NOSRC:    if set, do not distribute source tree
33#  WITH_DVD: if set, generate dvd1.iso
34#  WITH_COMPRESSED_IMAGES: if set, compress installation images with xz(1)
35#		(uncompressed images are not removed)
36#  WITH_VMIMAGES: if set, build virtual machine images with the release
37#  WITH_COMPRESSED_VMIMAGES: if set, compress virtual machine disk images
38#  		with xz(1) (extremely time consuming)
39#  WITH_CLOUDWARE: if set, build cloud hosting disk images with the release
40#  TARGET/TARGET_ARCH: architecture of built release
41#
42
43WORLDDIR?=	${.CURDIR}/..
44PORTSDIR?=	/usr/ports
45
46.include "${WORLDDIR}/share/mk/bsd.compat.pre.mk"
47
48.if !defined(TARGET) || empty(TARGET)
49TARGET=		${MACHINE}
50.endif
51.if !defined(TARGET_ARCH) || empty(TARGET_ARCH)
52.if ${TARGET} == ${MACHINE}
53TARGET_ARCH=	${MACHINE_ARCH}
54.else
55TARGET_ARCH=	${TARGET}
56.endif
57.endif
58IMAKE=		${MAKE} TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET} \
59		    -DNO_ROOT -DDB_FROM_SRC
60DISTDIR=	dist
61
62# Define OSRELEASE by using newvers.sh
63.if !defined(OSRELEASE) || empty(OSRELEASE)
64.for _V in TYPE BRANCH REVISION
65${_V}!=	eval $$(awk '/^${_V}=/{print}' ${.CURDIR}/../sys/conf/newvers.sh); echo $$${_V}
66.endfor
67.for _V in ${TARGET_ARCH}
68.if !empty(TARGET:M${_V})
69OSRELEASE=	${TYPE}-${REVISION}-${BRANCH}-${TARGET}
70VOLUME_LABEL=	${REVISION:C/[.-]/_/g}_${BRANCH:C/[.-]/_/g}_${TARGET}
71.else
72OSRELEASE=	${TYPE}-${REVISION}-${BRANCH}-${TARGET}-${TARGET_ARCH}
73VOLUME_LABEL=	${REVISION:C/[.-]/_/g}_${BRANCH:C/[.-]/_/g}_${TARGET_ARCH}
74.endif
75.endfor
76.endif
77
78.if ${.MAKE.OS} == "FreeBSD"
79# For installing packages into the release media.
80PKG_ENV+=	INSTALL_AS_USER=yes
81PKG_ENV+=	ASSUME_ALWAYS_YES=yes
82PKG_ARGS+=	-o METALOG=METALOG
83PKG_ARGS+=	-r ${.TARGET}
84PKG_REPO_ARGS=	-o REPOS_DIR=${.CURDIR}/pkg_repos
85PKGBASE_REPO_ARGS=-o REPOS_DIR=${.OBJDIR}/pkgbase-repo-conf
86# Pass -f to make sure pkg writes to the METALOG even if the package
87# is already installed from a previous build
88PKG_INSTALL=	env ${PKG_ENV} ${PKG_CMD} ${PKG_ARGS} ${PKG_REPO_ARGS} install -f
89PKG_CLEAN=	env ${PKG_ENV} ${PKG_CMD} ${PKG_ARGS} ${PKG_REPO_ARGS} clean -a
90# This installs from the pkgbase repo we created during build.
91PKGBASE_INSTALL=env ${PKG_ENV} ${PKG_CMD} ${PKG_ARGS} ${PKGBASE_REPO_ARGS} install -f
92PKGBASE_CLEAN=	env ${PKG_ENV} ${PKG_CMD} ${PKG_ARGS} ${PKGBASE_REPO_ARGS} clean -a
93.endif
94
95.if !defined(VOLUME_LABEL) || empty(VOLUME_LABEL)
96VOLUME_LABEL=	FreeBSD_Install
97.endif
98
99.if !exists(${PORTSDIR})
100NOPORTS= true
101.endif
102
103DISTRIBUTIONS= base.txz kernel.txz
104.if !defined(NOPORTS)
105DISTRIBUTIONS+= ports.txz
106.endif
107.if !defined(NOSRC)
108DISTRIBUTIONS+= src.txz
109.endif
110
111RELEASE_TARGETS= ftp
112IMAGES=
113.if exists(${.CURDIR}/${TARGET}/mkisoimages.sh)
114RELEASE_TARGETS+= cdrom
115IMAGES+=	disc1.iso bootonly.iso
116. if defined(WITH_DVD) && !empty(WITH_DVD)
117RELEASE_TARGETS+= dvdrom
118IMAGES+=	dvd1.iso
119. endif
120.endif
121.if exists(${.CURDIR}/${TARGET}/make-memstick.sh)
122RELEASE_TARGETS+= memstick.img
123RELEASE_TARGETS+= mini-memstick.img
124IMAGES+=	memstick.img
125IMAGES+=	mini-memstick.img
126.endif
127
128CLEANFILES=	packagesystem *.txz MANIFEST release ${IMAGES}
129.if defined(WITH_COMPRESSED_IMAGES) && !empty(WITH_COMPRESSED_IMAGES)
130. for I in ${IMAGES}
131CLEANFILES+=	${I}.xz
132. endfor
133.endif
134.if defined(WITH_DVD) && !empty(WITH_DVD)
135CLEANFILES+=	pkg-stage
136.endif
137CLEANDIRS=	dist pkgdb-dvd pkgdb-disc1 pkgbase-repo pkgbase-repo-dir ftp disc1 disc1-disc1 disc1-memstick bootonly bootonly-bootonly bootonly-memstick dvd
138beforeclean:
139	chflags -R noschg .
140.include <bsd.obj.mk>
141clean: beforeclean
142
143#
144# Legacy distribution tarballs
145#
146base.txz: # Also (if enabled) tests, compat libs, and -dbg variants for all.
147	mkdir -p ${DISTDIR}
148	( cd ${WORLDDIR} && ${IMAKE} distributeworld DISTDIR=${.OBJDIR}/${DISTDIR} )
149	# Bootstrap etcupdate(8) database.
150	sh ${WORLDDIR}/usr.sbin/etcupdate/etcupdate.sh extract -B \
151	    -m "${MAKE}" -M "TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}" \
152	    -s ${WORLDDIR} -d "${.OBJDIR}/${DISTDIR}/base/var/db/etcupdate" \
153	    -L /dev/stdout -N
154	echo "./var/db/etcupdate type=dir uname=root gname=wheel mode=0755" >> ${.OBJDIR}/${DISTDIR}/base.meta
155	sed -n 's,^\.,./var/db/etcupdate/current,p' \
156	    ${.OBJDIR}/${DISTDIR}/base/var/db/etcupdate/current/METALOG | \
157	    env -i LC_COLLATE=C sort >> ${.OBJDIR}/${DISTDIR}/base.meta
158	rm ${.OBJDIR}/${DISTDIR}/base/var/db/etcupdate/current/METALOG
159# Package all components
160	( cd ${WORLDDIR} && ${IMAKE} packageworld DISTDIR=${.OBJDIR}/${DISTDIR} )
161	mv ${DISTDIR}/*.txz .
162
163kernel.txz: # Also (if enabled) kernel-dbg.txz.
164	mkdir -p ${DISTDIR}
165	( cd ${WORLDDIR} && ${IMAKE} distributekernel DISTDIR=${.OBJDIR}/${DISTDIR} )
166	( cd ${WORLDDIR} && ${IMAKE} packagekernel DISTDIR=${.OBJDIR}/${DISTDIR} )
167	mv ${DISTDIR}/kernel*.txz .
168
169src.txz:
170	mkdir -p ${DISTDIR}/usr
171	rm -f ${DISTDIR}/usr/src
172	ln -s ${WORLDDIR} ${DISTDIR}/usr/src
173	( cd ${DISTDIR} && ${TAR_XZ_CMD} -cLvf ${.OBJDIR}/src.txz \
174	    --exclude .svn --exclude .zfs \
175	    --exclude .git --exclude @ --exclude usr/src/release/dist \
176	    --exclude usr/src/release/obj usr/src )
177
178ports.txz:
179	mkdir -p ${DISTDIR}/usr
180	rm -f ${DISTDIR}/usr/ports
181	ln -s ${PORTSDIR} ${DISTDIR}/usr/ports
182	( cd ${DISTDIR} && ${TAR_XZ_CMD} -cLvf ${.OBJDIR}/ports.txz \
183	    --exclude .git --exclude .svn \
184	    --exclude usr/ports/distfiles --exclude usr/ports/packages \
185	    --exclude 'usr/ports/INDEX*' --exclude work usr/ports )
186
187packagesystem: ${DISTRIBUTIONS}
188	sh ${.CURDIR}/scripts/make-manifest.sh $$(ls *.txz | grep -v container) > MANIFEST
189	touch ${.TARGET}
190
191.if !defined(NODISTSETS)
192disc1: packagesystem
193bootonly: packagesystem
194dvd: packagesystem
195.endif
196
197.if !defined(NOPKGBASE) || empty(NOPKGBASE)
198PKGBASE_REPO_DIR= pkgbase-repo-dir
199WSTAGEDIR!=	${IMAKE} -f Makefile.inc1 -C ${WORLDDIR} -V WSTAGEDIR
200PKG_ABI_FILE=	${WSTAGEDIR}/usr/bin/uname
201PKG_ABI=	$$(${PKG_CMD} -o ABI_FILE=${PKG_ABI_FILE} config ABI)
202.endif
203
204pkgbase-repo:
205	mkdir -p pkgbase-repo
206	mkdir -p /tmp/ports /tmp/distfiles
207	( ${IMAKE} -C ${WORLDDIR} packages REPODIR=${.OBJDIR}/pkgbase-repo \
208	    INCLUDE_PKG_IN_PKGBASE_REPO=YES BOOTSTRAP_PKG_FROM_PORTS=YES )
209
210pkgbase-repo-dir: pkgbase-repo
211	mkdir -p pkgbase-repo-dir
212	printf "FreeBSD-base: { url: "file://%s", enabled: yes }" \
213	    ${.OBJDIR}/pkgbase-repo/${PKG_ABI}/latest \
214	    > pkgbase-repo-dir/FreeBSD-base.conf
215
216disc1: ${PKGBASE_REPO_DIR}
217# Install system
218	mkdir -p ${.TARGET}
219	( cd ${WORLDDIR} && ${IMAKE} installworld installkernel distribution \
220	    DESTDIR=${.OBJDIR}/${.TARGET} MK_AT=no \
221	    MK_INSTALLLIB=no MK_MAIL=no \
222	    ${_ALL_LIBCOMPATS:@v@MK_LIB$v=no@} \
223	    MK_TOOLCHAIN=no \
224	    MK_RESCUE=no MK_DICT=no \
225	    MK_KERNEL_SYMBOLS=no MK_TESTS=no MK_DEBUG_FILES=no)
226.if !defined(NOPKGBASE) || empty(NOPKGBASE)
227# Create offline pkgbase repo on release media
228	mkdir -p ${.TARGET}/usr/freebsd-packages/repos/
229	${.CURDIR}/scripts/pkgbase-stage.lua disc \
230	    ${.OBJDIR}/pkgbase-repo-dir \
231	    ${.TARGET}/usr/freebsd-packages/offline \
232	    "${_ALL_libcompats}" ${PKG_ABI} ${.OBJDIR}/pkgdb-disc1
233	cp ${.CURDIR}/scripts/FreeBSD-base-offline.conf \
234		${.TARGET}/usr/freebsd-packages/repos/
235	mtree -c -p ${.TARGET}/usr/freebsd-packages | \
236	    mtree -C -k type,mode,link,size | \
237	    sed 's|^\.|./usr/freebsd-packages|g' >> ${.TARGET}/METALOG
238.endif
239.if !defined(NODISTSETS)
240	# Copy MANIFEST to provide legacy dist checksums in both modes
241	mkdir -p ${.TARGET}/usr/freebsd-dist
242	echo "./usr/freebsd-dist type=dir uname=root gname=wheel mode=0755" >> ${.TARGET}/METALOG
243	cp MANIFEST ${.TARGET}/usr/freebsd-dist
244	echo "./usr/freebsd-dist/MANIFEST type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
245.if defined(NOPKGBASE) && !empty(NOPKGBASE)
246# Copy distfiles
247	for dist in $$(ls *.txz | grep -v container | grep -vE -- '(${base ${_ALL_libcompats}:L:ts|})-dbg'); do \
248	    cp $${dist} ${.TARGET}/usr/freebsd-dist; \
249	    echo "./usr/freebsd-dist/$${dist} type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG; \
250	done
251.endif
252.endif
253.if ${.MAKE.OS} == "FreeBSD" && (!defined(NOPKG) || empty(NOPKG))
254# Install packages onto release media.
255.if !defined(NOPKGBASE) || empty(NOPKGBASE)
256	${PKGBASE_INSTALL} pkg
257	${PKGBASE_CLEAN}
258.else
259	${PKG_INSTALL} pkg
260.endif
261	${PKG_INSTALL} wifi-firmware-kmod-release || true
262	${PKG_CLEAN} || true
263.endif
264# Set up installation environment
265	ln -fs /tmp/bsdinstall_etc/resolv.conf ${.TARGET}/etc/resolv.conf
266	echo sendmail_enable=\"NONE\" > ${.TARGET}/etc/rc.conf
267	echo hostid_enable=\"NO\" >> ${.TARGET}/etc/rc.conf
268	echo debug.witness.trace=0 >> ${.TARGET}/etc/sysctl.conf
269	echo vfs.mountroot.timeout=\"10\" >> ${.TARGET}/boot/loader.conf
270	echo kernels_autodetect=\"NO\" >> ${.TARGET}/boot/loader.conf
271	echo loader_brand=\"install\" >> ${.TARGET}/boot/loader.conf
272	echo loader_menu_multi_user_prompt=\"Installer\" >> ${.TARGET}/boot/loader.conf
273	cp ${.CURDIR}/rc.local ${.TARGET}/etc
274	echo "./etc/resolv.conf type=link uname=root gname=wheel mode=0644 link=/tmp/bsdinstall_etc/resolv.conf" >> ${.TARGET}/METALOG
275	echo "./etc/rc.conf type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
276	echo "./etc/sysctl.conf type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
277	echo "./boot/loader.conf type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
278	echo "./etc/rc.local type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
279	touch ${.TARGET}
280
281bootonly:
282# Install system
283	mkdir -p ${.TARGET}
284	( cd ${WORLDDIR} && ${IMAKE} installworld installkernel distribution \
285	    DESTDIR=${.OBJDIR}/${.TARGET} MK_AT=no \
286	    MK_GAMES=no \
287	    MK_INSTALLLIB=no MK_MAIL=no \
288	    ${_ALL_LIBCOMPATS:@v@MK_LIB$v=no@} \
289	    MK_TOOLCHAIN=no \
290	    MK_RESCUE=no MK_DICT=no \
291	    MK_KERNEL_SYMBOLS=no MK_TESTS=no MK_DEBUG_FILES=no)
292.if !defined(NODISTSETS)
293# Copy manifest only (no distfiles) to get checksums
294	mkdir -p ${.TARGET}/usr/freebsd-dist
295	cp MANIFEST ${.TARGET}/usr/freebsd-dist
296	echo "./usr/freebsd-dist type=dir uname=root gname=wheel mode=0755" >> ${.TARGET}/METALOG
297	echo "./usr/freebsd-dist/MANIFEST type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
298.endif
299.if ${.MAKE.OS} == "FreeBSD" && (!defined(NOPKG) || empty(NOPKG))
300	${PKG_INSTALL} pkg || true
301	${PKG_INSTALL} wifi-firmware-iwlwifi-kmod wifi-firmware-rtw88-kmod || true
302	${PKG_CLEAN} || true
303.endif
304# Set up installation environment
305	ln -fs /tmp/bsdinstall_etc/resolv.conf ${.TARGET}/etc/resolv.conf
306	echo sendmail_enable=\"NONE\" > ${.TARGET}/etc/rc.conf
307	echo hostid_enable=\"NO\" >> ${.TARGET}/etc/rc.conf
308	echo debug.witness.trace=0 >> ${.TARGET}/etc/sysctl.conf
309	echo vfs.mountroot.timeout=\"10\" >> ${.TARGET}/boot/loader.conf
310	echo kernels_autodetect=\"NO\" >> ${.TARGET}/boot/loader.conf
311	echo loader_brand=\"install\" >> ${.TARGET}/boot/loader.conf
312	echo loader_menu_multi_user_prompt=\"Installer\" >> ${.TARGET}/boot/loader.conf
313	cp ${.CURDIR}/rc.local ${.TARGET}/etc
314	echo "./etc/resolv.conf type=link uname=root gname=wheel mode=0644 link=/tmp/bsdinstall_etc/resolv.conf" >> ${.TARGET}/METALOG
315	echo "./etc/rc.conf type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
316	echo "./etc/sysctl.conf type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
317	echo "./boot/loader.conf type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
318	echo "./etc/rc.local type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
319
320dvd: ${PKGBASE_REPO_DIR}
321# Install system
322	mkdir -p ${.TARGET}
323	( cd ${WORLDDIR} && ${IMAKE} installworld installkernel distribution \
324		DESTDIR=${.OBJDIR}/${.TARGET} MK_RESCUE=no MK_KERNEL_SYMBOLS=no \
325		MK_TESTS=no MK_DEBUG_FILES=no)
326.if !defined(NOPKGBASE) || empty(NOPKGBASE)
327# Create offline pkgbase repo on release media
328	mkdir -p ${.TARGET}/usr/freebsd-packages/repos/
329	${.CURDIR}/scripts/pkgbase-stage.lua dvd \
330	    ${.OBJDIR}/pkgbase-repo-dir \
331	    ${.TARGET}/usr/freebsd-packages/offline \
332	    "${_ALL_libcompats}" ${PKG_ABI} ${.OBJDIR}/pkgdb-dvd
333	cp ${.CURDIR}/scripts/FreeBSD-base-offline.conf \
334		${.TARGET}/usr/freebsd-packages/repos/
335	mtree -c -p ${.TARGET}/usr/freebsd-packages | \
336	    mtree -C -k type,mode,link,size | \
337	    sed 's|^\.|./usr/freebsd-packages|g' >> ${.TARGET}/METALOG
338.endif
339.if !defined(NODISTSETS)
340	# Copy MANIFEST to provide legacy dist checksums in both modes
341	mkdir -p ${.TARGET}/usr/freebsd-dist
342	echo "./usr/freebsd-dist type=dir uname=root gname=wheel mode=0755" >> ${.TARGET}/METALOG
343	cp MANIFEST ${.TARGET}/usr/freebsd-dist
344	echo "./usr/freebsd-dist/MANIFEST type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
345# Copy distfiles
346	mkdir -p ${.TARGET}/usr/freebsd-dist
347	for dist in $$(ls *.txz | grep -v container); do \
348	    cp $${dist} ${.TARGET}/usr/freebsd-dist; \
349	    echo "./usr/freebsd-dist/$${dist} type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG; \
350	done
351.endif
352.if ${.MAKE.OS} == "FreeBSD" && (!defined(NOPKG) || empty(NOPKG))
353# Install packages onto release media.
354.if !defined(NOPKGBASE) || empty(NOPKGBASE)
355	${PKGBASE_INSTALL} pkg
356	${PKGBASE_CLEAN}
357.else
358	${PKG_INSTALL} pkg
359.endif
360	${PKG_INSTALL} wifi-firmware-kmod-release || true
361	${PKG_CLEAN} || true
362.endif
363# Set up installation environment
364	ln -fs /tmp/bsdinstall_etc/resolv.conf ${.TARGET}/etc/resolv.conf
365	echo sendmail_enable=\"NONE\" > ${.TARGET}/etc/rc.conf
366	echo hostid_enable=\"NO\" >> ${.TARGET}/etc/rc.conf
367	echo debug.witness.trace=0 >> ${.TARGET}/etc/sysctl.conf
368	echo vfs.mountroot.timeout=\"10\" >> ${.TARGET}/boot/loader.conf
369	echo kernels_autodetect=\"NO\" >> ${.TARGET}/boot/loader.conf
370	echo loader_brand=\"install\" >> ${.TARGET}/boot/loader.conf
371	echo loader_menu_multi_user_prompt=\"Installer\" >> ${.TARGET}/boot/loader.conf
372	cp ${.CURDIR}/rc.local ${.TARGET}/etc
373	echo "./etc/resolv.conf type=link uname=root gname=wheel mode=0644 link=/tmp/bsdinstall_etc/resolv.conf" >> ${.TARGET}/METALOG
374	echo "./etc/rc.conf type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
375	echo "./etc/sysctl.conf type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
376	echo "./boot/loader.conf type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
377	echo "./etc/rc.local type=file uname=root gname=wheel mode=0644" >> ${.TARGET}/METALOG
378	touch ${.TARGET}
379
380disc1-disc1 disc1-memstick: disc1
381	mkdir ${.TARGET}
382	tar -cf- -C disc1 . | tar -xf- -C ${.TARGET}
383
384bootonly-bootonly bootonly-memstick: bootonly
385	mkdir ${.TARGET}
386	tar -cf- -C bootonly . | tar -xf- -C ${.TARGET}
387
388release.iso: disc1.iso
389disc1.iso: disc1-disc1
390	cd disc1-disc1 && sh ${.CURDIR}/${TARGET}/mkisoimages.sh -b ${VOLUME_LABEL}_CD ../${.TARGET} ./METALOG ${XTRADIR}
391
392dvd1.iso: dvd pkg-stage
393	cd dvd && sh ${.CURDIR}/${TARGET}/mkisoimages.sh -b ${VOLUME_LABEL}_DVD ../${.TARGET} ./METALOG ${XTRADIR}
394
395bootonly.iso: bootonly-bootonly
396	cd bootonly-bootonly && sh ${.CURDIR}/${TARGET}/mkisoimages.sh -b ${VOLUME_LABEL}_BO ../${.TARGET} ./METALOG ${XTRADIR}
397
398memstick: memstick.img
399memstick.img: disc1-memstick
400	cd disc1-memstick && sh ${.CURDIR}/${TARGET}/make-memstick.sh ./METALOG ../${.TARGET}
401
402mini-memstick: mini-memstick.img
403mini-memstick.img: bootonly-memstick
404	cd bootonly-memstick && sh ${.CURDIR}/${TARGET}/make-memstick.sh ./METALOG ../${.TARGET}
405
406pkg-stage: dvd
407.if !defined(NOPKG) || empty(NOPKG)
408	env PORTSDIR=${PORTSDIR} REPOS_DIR=${.CURDIR}/pkg_repos/ \
409		sh ${.CURDIR}/scripts/pkg-stage.sh -N
410	mkdir -p ${.OBJDIR}/dvd/packages/repos/
411	cp ${.CURDIR}/scripts/FreeBSD_install_cdrom.conf \
412		${.OBJDIR}/dvd/packages/repos/
413.endif
414	touch ${.TARGET}
415
416cdrom: disc1.iso bootonly.iso
417dvdrom: dvd1.iso
418ftp: packagesystem
419	rm -rf ftp
420	mkdir -p ftp
421	cp *.txz MANIFEST ftp
422	rm -f ftp/container-*.txz
423
424release:	real-release vm-release cloudware-release oci-release
425	${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} release-done
426	true
427
428release-done:
429	touch release
430
431real-release:
432	${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} obj
433	${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${RELEASE_TARGETS}
434
435install:	release-install vm-install oci-install .WAIT cloud-install
436
437release-install:
438.if defined(DESTDIR) && !empty(DESTDIR)
439	mkdir -p ${DESTDIR}
440.endif
441	cp -a ftp ${DESTDIR}/
442.if !empty(IMAGES)
443.for I in ${IMAGES}
444	cp -p ${I} ${DESTDIR}/${OSRELEASE}-${I}
445. if defined(WITH_COMPRESSED_IMAGES) && !empty(WITH_COMPRESSED_IMAGES)
446	${XZ_CMD} -k ${DESTDIR}/${OSRELEASE}-${I}
447. endif
448.endfor
449	( cd ${DESTDIR} && sha512 ${OSRELEASE}* > ${DESTDIR}/CHECKSUM.SHA512 )
450	( cd ${DESTDIR} && sha256 ${OSRELEASE}* > ${DESTDIR}/CHECKSUM.SHA256 )
451.endif
452
453.include "${.CURDIR}/Makefile.inc1"
454.include "${.CURDIR}/Makefile.vm"
455.include "${.CURDIR}/Makefile.oci"
456