1#
2# $FreeBSD: stable/10/release/Makefile.vm 330243 2018-03-01 16:41:37Z gjb $
3#
4#
5# Makefile for building virtual machine and cloud provider disk images.
6#
7
8VMTARGETS=	vm-image
9VMFORMATS?=	vhd vmdk qcow2 raw
10VMSIZE?=	30G
11SWAPSIZE?=	1G
12VMBASE?=	vm
13
14VHD_DESC=	Azure, VirtualPC, Hyper-V, Xen disk image
15VMDK_DESC=	VMWare, VirtualBox disk image
16QCOW2_DESC=	Qemu, KVM disk image
17RAW_DESC=	Unformatted raw disk image
18
19CLOUDWARE?=	EC2 \
20		GCE \
21		VAGRANT-VIRTUALBOX \
22		VAGRANT-VMWARE
23AZURE_FORMAT=	vhdf
24AZURE_DESC=	Microsoft Azure platform image
25AZURE_DISK=	${OSRELEASE}.${AZURE_FORMAT}
26EC2_FORMAT=	raw
27EC2_DESC=	Amazon EC2 image
28EC2_DISK=	${OSRELEASE}.${EC2_FORMAT}
29GCE_FORMAT=	raw
30GCE_DESC=	Google Compute Engine image
31GCE_DISK=	disk.${GCE_FORMAT}
32OPENSTACK_FORMAT=qcow2
33OPENSTACK_DESC=	OpenStack platform image
34OPENSTACK_DISK=	${OSRELEASE}.${OPENSTACK_FORMAT}
35VAGRANT-VIRTUALBOX_FORMAT=	vmdk
36VAGRANT-VIRTUALBOX_DESC=	Vagrant Image for VirtualBox
37VAGRANT-VIRTUALBOX_DISK=	${OSRELEASE}.vbox.${VAGRANT_FORMAT}
38VAGRANT-VMWARE_FORMAT=	vmdk
39VAGRANT-VMWARE_DESC=	Vagrant Image for VMWare
40VAGRANT-VMWARE_DISK=	${OSRELEASE}.vmware.${VAGRANT_FORMAT}
41
42.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE)
43. for _CW in ${CLOUDWARE}
44CLOUDTARGETS+=	cw-${_CW:tl}
45CLEANDIRS+=	cw-${_CW:tl}
46CLEANFILES+=	${_CW:tl}.img \
47		${_CW:tl}.${${_CW:tu}_FORMAT} \
48		${_CW:tl}.${${_CW:tu}_FORMAT}.raw \
49		cw${_CW:tl}-package
50CLOUDINSTALL+=	cw${_CW:tl}-install
51CLOUDPACKAGE+=	cw${_CW:tl}-package
52${_CW:tu}IMAGE=	${_CW:tl}.${${_CW:tu}_FORMAT}
53.  if exists(${.CURDIR}/tools/${_CW:tl}.conf) && !defined(${_CW:tu}CONF)
54${_CW:tu}CONF?=	${.CURDIR}/tools/${_CW:tl}.conf
55.  endif
56
57cw-${_CW:tl}:
58	mkdir -p ${.OBJDIR}/${.TARGET}
59	env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \
60		${.CURDIR}/scripts/mk-vmimage.sh \
61		-C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} \
62		-i ${.OBJDIR}/${_CW:tl}.img -s ${VMSIZE} -f ${${_CW:tu}_FORMAT} \
63		-S ${WORLDDIR} -o ${.OBJDIR}/${${_CW:tu}IMAGE} -c ${${_CW:tu}CONF}
64	touch ${.TARGET}
65
66cw${_CW:tl}-install:
67	mkdir -p ${DESTDIR}/${_CW:tl}
68	cp -p ${${_CW}IMAGE} \
69		${DESTDIR}/${_CW:tl}/${${_CW}_DISK}
70	cd ${DESTDIR}/${_CW:tl} && sha512 ${${_CW}_DISK}* > \
71		${DESTDIR}/${_CW:tl}/CHECKSUM.SHA512
72	cd ${DESTDIR}/${_CW:tl} && sha256 ${${_CW}_DISK}* > \
73		${DESTDIR}/${_CW:tl}/CHECKSUM.SHA256
74
75cw${_CW:tl}-package:
76	@# Special target to handle packaging cloud images in the formats
77	@# specific to each hosting provider.
78.if exists(${.CURDIR}/tools/${_CW:tl}-package.sh)
79	env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
80		${.CURDIR}/tools/${_CW:tl}-package.sh \
81		-D ${DESTDIR} -I ${${_CW}_DISK} -S ${WORLDDIR}
82.endif
83	touch ${.TARGET}
84
85. endfor
86.endif
87
88.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
89CLEANDIRS+=	${VMTARGETS}
90. for FORMAT in ${VMFORMATS}
91CLEANFILES+=	${FORMAT}.img
92CLEANFILES+=	${VMBASE}.${FORMAT}
93. endfor
94.endif
95
96vm-base:	vm-image
97
98vm-image:
99.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
100. for FORMAT in ${VMFORMATS}
101	mkdir -p ${.OBJDIR}/${.TARGET}
102	env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \
103		${.CURDIR}/scripts/mk-vmimage.sh \
104		-C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} \
105		-i ${.OBJDIR}/${FORMAT}.img -s ${VMSIZE} -f ${FORMAT} \
106		-S ${WORLDDIR} -o ${.OBJDIR}/${VMBASE}.${FORMAT}
107. endfor
108.endif
109	touch ${.TARGET}
110
111vm-cloudware:	${CLOUDTARGETS}
112
113list-vmtargets:	list-cloudware
114	@${ECHO}
115	@${ECHO} "Supported virtual machine disk image formats:"
116.for FORMAT in ${VMFORMATS:tu}
117	@${ECHO} "  ${FORMAT:tl}: ${${FORMAT}_DESC}"
118.endfor
119
120list-cloudware:
121.if !empty(CLOUDWARE)
122	@${ECHO}
123	@${ECHO} "Supported cloud hosting provider images:"
124. for _CW in ${CLOUDWARE}
125	@${ECHO} "  ${_CW:tu}: ${${_CW:tu}_DESC}"
126. endfor
127.endif
128
129vm-install:
130.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
131	mkdir -p ${DESTDIR}/vmimages
132. for FORMAT in ${VMFORMATS}
133	cp -p ${VMBASE}.${FORMAT} \
134		${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT}
135. endfor
136. if defined(WITH_COMPRESSED_VMIMAGES) && !empty(WITH_COMPRESSED_VMIMAGES)
137.  for FORMAT in ${VMFORMATS}
138	# Don't keep the originals.  There is a copy in ${.OBJDIR} if needed.
139	${XZ_CMD} ${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT}
140.  endfor
141. endif
142	cd ${DESTDIR}/vmimages && sha512 ${OSRELEASE}* > \
143		${DESTDIR}/vmimages/CHECKSUM.SHA512
144	cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \
145		${DESTDIR}/vmimages/CHECKSUM.SHA256
146.endif
147
148vm-release:
149.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
150	${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${VMTARGETS}
151.endif
152
153cloudware-release:
154.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE)
155	${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${CLOUDTARGETS}
156.endif
157
158cloudware-install:
159.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE)
160	${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${CLOUDINSTALL}
161.endif
162
163.include "${.CURDIR}/Makefile.ec2"
164.include "${.CURDIR}/Makefile.azure"
165.include "${.CURDIR}/Makefile.gce"
166.include "${.CURDIR}/Makefile.vagrant"
167