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