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