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