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