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