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