xref: /freebsd/release/Makefile.vm (revision a259b98fa211ed87bfee58c575de4e2de94ee0fa)
1#
2# Makefile for building virtual machine and cloud provider disk images.
3#
4
5VMTARGETS=	vm-image
6VMFORMATS?=	vhd vmdk qcow2 raw
7.if ${TARGET_ARCH} == riscv64
8VMSIZE?=	6144m
9.else
10VMSIZE?=	5120m
11.endif
12VMFS?=		ufs
13VMFSLIST?=	ufs zfs
14SWAPSIZE?=	1g
15VMBASE?=	vm
16
17VHD_DESC=	Azure, VirtualPC, Hyper-V, Xen disk image
18VMDK_DESC=	VMWare, VirtualBox disk image
19QCOW2_DESC=	Qemu, KVM disk image
20RAW_DESC=	Unformatted raw disk image
21
22CLOUDWARE_TYPES?= AZURE \
23		BASIC-CI \
24		BASIC-CLOUDINIT \
25		EC2 \
26		GCE \
27		VAGRANT
28AZURE_FORMAT=	vhdf
29AZURE_FSLIST?=	ufs zfs
30AZURE_DESC=	Microsoft Azure platform image
31BASIC-CI_FORMAT=	raw
32BASIC-CI_FSLIST?=	ufs
33BASIC-CI_DESC=		Image for CI
34BASIC-CLOUDINIT_FORMAT=	raw qcow2
35BASIC-CLOUDINIT_FSLIST?=	ufs zfs
36BASIC-CLOUDINIT_DESC?=	Images for VM with cloudinit disk config support
37EC2_FORMAT=	raw
38EC2_FSLIST?=	ufs zfs
39EC2_FLAVOURS?=	BASE BUILDER CLOUD-INIT DESKTOP SMALL
40EC2-BASE_DESC=	Amazon EC2 image
41EC2-BUILDER_DESC=	Amazon EC2 AMI Builder image
42EC2-CLOUD-INIT_DESC=	Amazon EC2 Cloud-Init image
43EC2-DESKTOP_DESC=	Amazon EC2 GUI image
44EC2-SMALL_DESC=	Amazon EC2 small image
45GCE_FORMAT=	raw
46GCE_FSLIST?=	ufs zfs
47GCE_DESC=	Google Compute Engine image
48OPENSTACK_FORMAT=qcow2
49OPENSTACK_FSLIST?=	ufs
50OPENSTACK_DESC=	OpenStack platform image
51VAGRANT_FORMAT=	vmdk
52VAGRANT_FSLIST?=	ufs
53VAGRANT_FLAVOURS?=	VIRTUALBOX VMWARE
54VAGRANT-VIRTUALBOX_DESC=	Vagrant Image for VirtualBox
55VAGRANT-VMWARE_DESC=	Vagrant Image for VMWare
56
57.for _CWT in ${CLOUDWARE_TYPES}
58. if defined(${_CWT}_FLAVOURS)
59.  for _CWF in ${${_CWT}_FLAVOURS}
60CLOUDWARE_GEN+=	${_CWT}-${_CWF}
61${_CWT}-${_CWF}_FORMAT?=	${${_CWT}_FORMAT}
62${_CWT}-${_CWF}_FSLIST?=	${${_CWT}_FSLIST}
63${_CWT}-${_CWF}_DESC?=	${${_CWT}_DESC}
64.  endfor
65. else
66CLOUDWARE_GEN+=	${_CWT}
67. endif
68.endfor
69CLOUDWARE?=	${CLOUDWARE_GEN}
70
71.for _V in TYPE BRANCH REVISION
72. if !defined(${_V}) || empty(${_V})
73${_V}!=	eval $$(awk '/^${_V}=/{print}' ${.CURDIR:H}/sys/conf/newvers.sh); echo $$${_V}
74. endif
75.endfor
76
77emulator-portinstall:
78.if !exists(/usr/local/bin/qemu-${TARGET_ARCH}-static)
79.if exists(${PORTSDIR}/emulators/qemu-user-static/Makefile)
80	env - UNAME_r=${UNAME_r} PATH=$$PATH \
81	    make -C ${PORTSDIR}/emulators/qemu-user-static \
82	    BATCH=1 WRKDIRPREFIX=/tmp/ports DISTDIR=/tmp/distfiles \
83	    all install clean
84.else
85.if !exists(/usr/local/sbin/pkg-static)
86	env ASSUME_ALWAYS_YES=yes pkg bootstrap -y
87.endif
88	env ASSUME_ALWAYS_YES=yes pkg install -y emulators/qemu-user-static
89.endif
90.endif
91	touch ${.TARGET}
92
93.if ${TARGET_ARCH} != ${MACHINE_ARCH} && !defined(WITHOUT_QEMU)
94.if ( ${TARGET_ARCH} != "i386" ) || ( ${MACHINE_ARCH} != "amd64" )
95QEMUSTATIC=/usr/local/bin/qemu-${TARGET_ARCH}-static
96QEMUTGT=emulator-portinstall
97.endif
98.endif
99QEMUTGT?=
100
101.if (defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE)) || \
102    (defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES))
103.if (defined(WITHOUT_QEMU) && !defined(NO_ROOT))
104.error WITHOUT_QEMU requires NO_ROOT
105.elif (!defined(WITHOUT_QEMU) && defined(NO_ROOT))
106.error NO_ROOT requires WITHOUT_QEMU
107.endif
108.endif
109
110.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE)
111. for _CW in ${CLOUDWARE}
112.  if exists(${.CURDIR}/tools/${_CW:tl}.conf) && !defined(${_CW:tu}CONF)
113${_CW:tu}CONF?=	${.CURDIR}/tools/${_CW:tl}.conf
114.  endif
115.  for _FS in ${${_CW:tu}_FSLIST}
116.   for _FMT in ${${_CW:tu}_FORMAT}
117CLOUDTARGETS+=	cw-${_CW:tl}-${_FS}-${_FMT}
118CLEANDIRS+=	cw-${_CW:tl}-${_FS}-${_FMT}
119CLEANFILES+=	${_CW:tl}.${_FS}.${_FMT}.img \
120		${_CW:tl}.${_FS}.${_FMT} \
121		${_CW:tl}.${_FS}.${_FMT}.raw
122${_CW:tu}${_FS:tu}${_FMT:tu}IMAGE=	${_CW:tl}.${_FS}.${_FMT}
123
124# Special handling: EC2 "AMI Builder" images need a copy of the "base" disk
125# built first.
126.if ${_CW} == EC2-BUILDER
127cw-${_CW:tl}-${_FS}-${_FMT}: cw-ec2-base-${_FS}-${_FMT}
128.endif
129
130# Special handling: GCE images ingest src.txz and ports.txz and expect them
131# to be in the /ftp/ directory.  Note: This will need to be reworked before
132# distribution sets go away!
133.if ${_CW} == GCE
134cw-${_CW:tl}-${_FS}-${_FMT}: ftp
135.endif
136
137cw-${_CW:tl}-${_FS}-${_FMT}: ${QEMUTGT} ${PKGBASE_REPO_DIR}
138	mkdir -p ${.OBJDIR}/${.TARGET}
139	env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \
140		QEMUSTATIC=${QEMUSTATIC} \
141		EC2BASEIMG=${.OBJDIR}/${EC2-BASE${_FS:tu}${_FMT:tu}IMAGE} \
142		${WITHOUT_QEMU:DWITHOUT_QEMU=true} \
143		${NO_ROOT:DNO_ROOT=true} \
144		PKG_CMD=${PKG_CMD:Upkg} \
145		PKG_ABI=${PKG_ABI} \
146		PKG_REPOS_DIR=${PKG_REPOS_DIR:U${.OBJDIR}/${.TARGET}/etc/pkg} \
147		PKG_REPO_NAME=${PKG_REPO_NAME:UFreeBSD-ports} \
148		PKG_INSTALL_EPOCH=${PKG_INSTALL_EPOCH:U${GITEPOCH}} \
149		NOPKGBASE=${NOPKGBASE} \
150		PKGBASE_REPO_DIR=${.OBJDIR}/pkgbase-repo-dir \
151		${.CURDIR}/scripts/mk-vmimage.sh \
152		-C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} \
153		-F ${"${_CW:MEC2-BUILDER}" != "":?ufs:${_FS}} \
154		-i ${.OBJDIR}/${_CW:tl}.${_FS}.${_FMT}.img -s ${VMSIZE} -f ${_FMT} \
155		-S ${WORLDDIR} -o ${.OBJDIR}/${${_CW:tu}${_FS:tu}${_FMT:tu}IMAGE} -c ${${_CW:tu}CONF} || true
156	touch ${.TARGET}
157.   endfor
158.  endfor
159
160# Hardlinks from "foo.${FMT}" to "foo-${VMFS}.${FMT}".  These can go away once
161# all of the cloudware code knows how to handle multiple filesystem images (or
162# at least knows the name of the UFS image).
163.  for _FMT in ${${_CW:tu}_FORMAT}
164CLOUDTARGETS+=	cw-${_CW:tl}-${_FMT}
165CLEANFILES+=	${_CW:tl}.${_FMT}
166${_CW:tu}${_FMT:tu}IMAGE=	${_CW:tl}.${_FMT}
167cw-${_CW:tl}-${_FMT}: cw-${_CW:tl}-${VMFS}-${_FMT}
168	ln -f ${${_CW:tu}${VMFS:tu}${_FMT:tu}IMAGE} ${${_CW:tu}${_FMT:tu}IMAGE} || true
169.  endfor
170
171# Targets without a disk format listed are the first disk format on the list
172.  for _FS in ${${_CW:tu}_FSLIST}
173${_CW:tu}${_FS:tu}IMAGE=	${_CW:tl}.${_FS}.${${_CW:tu}_FORMAT:[1]}
174cw-${_CW:tl}-${_FS}: cw-${_CW:tl}-${_FS}-${${_CW:tu}_FORMAT:[1]}
175.  endfor
176${_CW:tu}IMAGE=	${_CW:tl}.${${_CW:tu}_FORMAT:[1]}
177cw-${_CW:tl}:	cw-${_CW:tl}-${${_CW:tu}_FORMAT:[1]}
178. endfor
179.endif
180
181.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
182CLEANFILES+=	vm-image
183. for FORMAT in ${VMFORMATS}
184.  for FS in ${VMFSLIST}
185CLEANDIRS+=	vm-image-${FORMAT}-${FS}
186CLEANFILES+=	${FORMAT}.${FS}.img
187CLEANFILES+=	${VMBASE}.${FS}.${FORMAT}
188.  endfor
189. endfor
190.endif
191
192vm-base:	vm-image
193
194vm-image:	${QEMUTGT} ${PKGBASE_REPO_DIR}
195.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
196. for FORMAT in ${VMFORMATS}
197.  for FS in ${VMFSLIST}
198	mkdir -p ${.OBJDIR}/${.TARGET}-${FORMAT}-${FS}
199	env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \
200		QEMUSTATIC=${QEMUSTATIC} \
201		${WITHOUT_QEMU:DWITHOUT_QEMU=true} \
202		${NO_ROOT:DNO_ROOT=true} \
203		PKG_CMD=${PKG_CMD:Upkg} \
204		PKG_ABI=${PKG_ABI} \
205		PKG_REPOS_DIR=${PKG_REPOS_DIR:U${.OBJDIR}/${.TARGET}-${FORMAT}-${FS}/etc/pkg} \
206		PKG_REPO_NAME=${PKG_REPO_NAME:UFreeBSD-ports} \
207		PKG_INSTALL_EPOCH=${PKG_INSTALL_EPOCH:U${GITEPOCH}} \
208		NOPKGBASE=${NOPKGBASE} \
209		PKGBASE_REPO_DIR=${.OBJDIR}/pkgbase-repo-dir \
210		${.CURDIR}/scripts/mk-vmimage.sh \
211		-C ${.CURDIR}/tools/vmimage.subr \
212		${VM_IMAGE_CONFIG:D-c ${VM_IMAGE_CONFIG}} \
213		-d ${.OBJDIR}/${.TARGET}-${FORMAT}-${FS} -F ${FS} \
214		-i ${.OBJDIR}/${FORMAT}.${FS}.img -s ${VMSIZE} -f ${FORMAT} \
215		-S ${WORLDDIR} -o ${.OBJDIR}/${VMBASE}.${FS}.${FORMAT} || true
216.  endfor
217. endfor
218.endif
219	touch ${.TARGET}
220
221vm-cloudware:	${CLOUDTARGETS}
222
223list-vmtargets:	list-cloudware
224	@${ECHO}
225	@${ECHO} "Supported virtual machine disk image formats:"
226.for FORMAT in ${VMFORMATS:tu}
227	@${ECHO} "  ${FORMAT:tl}: ${${FORMAT}_DESC}"
228.endfor
229
230list-cloudware:
231.if !empty(CLOUDWARE)
232	@${ECHO}
233	@${ECHO} "Supported cloud hosting provider images:"
234. for _CW in ${CLOUDWARE}
235	@${ECHO} "  ${_CW:tu}: ${${_CW:tu}_DESC}"
236. endfor
237.endif
238
239vm-install:
240.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
241	mkdir -p ${DESTDIR}/vmimages
242. for FORMAT in ${VMFORMATS}
243.  for FS in ${VMFSLIST}
244	cp -p ${VMBASE}.${FS}.${FORMAT} \
245		${DESTDIR}/vmimages/${OSRELEASE}-${FS}.${FORMAT}
246.  endfor
247. endfor
248. if defined(WITH_COMPRESSED_VMIMAGES) && !empty(WITH_COMPRESSED_VMIMAGES)
249.  for FORMAT in ${VMFORMATS}
250.   for FS in ${VMFSLIST}
251	# Don't keep the originals.  There is a copy in ${.OBJDIR} if needed.
252	${XZ_CMD} -f ${DESTDIR}/vmimages/${OSRELEASE}-${FS}.${FORMAT}
253.   endfor
254.  endfor
255. endif
256	cd ${DESTDIR}/vmimages && sha512 ${OSRELEASE}* > \
257		${DESTDIR}/vmimages/CHECKSUM.SHA512
258	cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \
259		${DESTDIR}/vmimages/CHECKSUM.SHA256
260.endif
261
262cloud-install-BASIC-CI:
263	mkdir -p ${DESTDIR}/ciimages
264.for _FS in ${BASIC-CI_FSLIST}
265. for _FMT in ${BASIC-CI_FORMAT}
266	cp -p ${.OBJDIR}/${BASIC-CI${_FS:tu}${_FMT:tu}IMAGE} \
267		${DESTDIR}/ciimages/${OSRELEASE}-BASIC-CI-${_FS}.${_FMT}
268	${XZ_CMD} -f ${DESTDIR}/ciimages/${OSRELEASE}-BASIC-CI-${_FS}.${_FMT}
269. endfor
270.endfor
271	cd ${DESTDIR}/ciimages && sha512 ${OSRELEASE}* > \
272		${DESTDIR}/ciimages/CHECKSUM.SHA512
273	cd ${DESTDIR}/ciimages && sha256 ${OSRELEASE}* > \
274		${DESTDIR}/ciimages/CHECKSUM.SHA256
275
276cloud-install-BASIC-CLOUDINIT:
277	mkdir -p ${DESTDIR}/vmimages
278.for _FS in ${BASIC-CLOUDINIT_FSLIST}
279. for _FMT in ${BASIC-CLOUDINIT_FORMAT}
280	cp -p ${.OBJDIR}/${BASIC-CLOUDINIT${_FS:tu}${_FMT:tu}IMAGE} \
281		${DESTDIR}/vmimages/${OSRELEASE}-BASIC-CLOUDINIT-${_FS}.${_FMT}
282	${XZ_CMD} -f ${DESTDIR}/vmimages/${OSRELEASE}-BASIC-CLOUDINIT-${_FS}.${_FMT}
283. endfor
284.endfor
285	cd ${DESTDIR}/vmimages && sha512 ${OSRELEASE}* > \
286		${DESTDIR}/vmimages/CHECKSUM.SHA512
287	cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \
288		${DESTDIR}/vmimages/CHECKSUM.SHA256
289
290CLOUD_INSTALL_TGTS=
291.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE)
292. for _CW in ${CLOUDWARE}
293.  if target(cloud-install-${_CW})
294CLOUD_INSTALL_TGTS+=	cloud-install-${_CW}
295.  endif
296. endfor
297.endif
298cloud-install:	${CLOUD_INSTALL_TGTS}
299
300.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
301vm-release:	${VMTARGETS}
302.else
303vm-release:
304.endif
305
306.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE)
307cloudware-release:	${CLOUDTARGETS}
308.else
309cloudware-release:
310.endif
311
312.include "${.CURDIR}/Makefile.azure"
313.include "${.CURDIR}/Makefile.ec2"
314.include "${.CURDIR}/Makefile.firecracker"
315.include "${.CURDIR}/Makefile.gce"
316.include "${.CURDIR}/Makefile.vagrant"
317.include "${.CURDIR}/Makefile.inc1"
318