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