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