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