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}/../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 -d ${.OBJDIR}/${.TARGET}-${FORMAT}-${FS} -F ${FS} \ 215 -i ${.OBJDIR}/${FORMAT}.${FS}.img -s ${VMSIZE} -f ${FORMAT} \ 216 -S ${WORLDDIR} -o ${.OBJDIR}/${VMBASE}.${FS}.${FORMAT} || true 217. endfor 218. endfor 219.endif 220 touch ${.TARGET} 221 222vm-cloudware: ${CLOUDTARGETS} 223 224list-vmtargets: list-cloudware 225 @${ECHO} 226 @${ECHO} "Supported virtual machine disk image formats:" 227.for FORMAT in ${VMFORMATS:tu} 228 @${ECHO} " ${FORMAT:tl}: ${${FORMAT}_DESC}" 229.endfor 230 231list-cloudware: 232.if !empty(CLOUDWARE) 233 @${ECHO} 234 @${ECHO} "Supported cloud hosting provider images:" 235. for _CW in ${CLOUDWARE} 236 @${ECHO} " ${_CW:tu}: ${${_CW:tu}_DESC}" 237. endfor 238.endif 239 240vm-install: 241.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 242 mkdir -p ${DESTDIR}/vmimages 243. for FORMAT in ${VMFORMATS} 244. for FS in ${VMFSLIST} 245 cp -p ${VMBASE}.${FS}.${FORMAT} \ 246 ${DESTDIR}/vmimages/${OSRELEASE}-${FS}.${FORMAT} 247. endfor 248. endfor 249. if defined(WITH_COMPRESSED_VMIMAGES) && !empty(WITH_COMPRESSED_VMIMAGES) 250. for FORMAT in ${VMFORMATS} 251. for FS in ${VMFSLIST} 252 # Don't keep the originals. There is a copy in ${.OBJDIR} if needed. 253 ${XZ_CMD} -f ${DESTDIR}/vmimages/${OSRELEASE}-${FS}.${FORMAT} 254. endfor 255. endfor 256. endif 257 cd ${DESTDIR}/vmimages && sha512 ${OSRELEASE}* > \ 258 ${DESTDIR}/vmimages/CHECKSUM.SHA512 259 cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \ 260 ${DESTDIR}/vmimages/CHECKSUM.SHA256 261.endif 262 263cloud-install-BASIC-CI: 264 mkdir -p ${DESTDIR}/ciimages 265.for _FS in ${BASIC-CI_FSLIST} 266. for _FMT in ${BASIC-CI_FORMAT} 267 cp -p ${.OBJDIR}/${BASIC-CI${_FS:tu}${_FMT:tu}IMAGE} \ 268 ${DESTDIR}/ciimages/${OSRELEASE}-BASIC-CI-${_FS}.${_FMT} 269 ${XZ_CMD} -f ${DESTDIR}/ciimages/${OSRELEASE}-BASIC-CI-${_FS}.${_FMT} 270. endfor 271.endfor 272 cd ${DESTDIR}/ciimages && sha512 ${OSRELEASE}* > \ 273 ${DESTDIR}/ciimages/CHECKSUM.SHA512 274 cd ${DESTDIR}/ciimages && sha256 ${OSRELEASE}* > \ 275 ${DESTDIR}/ciimages/CHECKSUM.SHA256 276 277cloud-install-BASIC-CLOUDINIT: 278 mkdir -p ${DESTDIR}/vmimages 279.for _FS in ${BASIC-CLOUDINIT_FSLIST} 280. for _FMT in ${BASIC-CLOUDINIT_FORMAT} 281 cp -p ${.OBJDIR}/${BASIC-CLOUDINIT${_FS:tu}${_FMT:tu}IMAGE} \ 282 ${DESTDIR}/vmimages/${OSRELEASE}-BASIC-CLOUDINIT-${_FS}.${_FMT} 283 ${XZ_CMD} -f ${DESTDIR}/vmimages/${OSRELEASE}-BASIC-CLOUDINIT-${_FS}.${_FMT} 284. endfor 285.endfor 286 cd ${DESTDIR}/vmimages && sha512 ${OSRELEASE}* > \ 287 ${DESTDIR}/vmimages/CHECKSUM.SHA512 288 cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \ 289 ${DESTDIR}/vmimages/CHECKSUM.SHA256 290 291CLOUD_INSTALL_TGTS= 292.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) 293. for _CW in ${CLOUDWARE} 294. if target(cloud-install-${_CW}) 295CLOUD_INSTALL_TGTS+= cloud-install-${_CW} 296. endif 297. endfor 298.endif 299cloud-install: ${CLOUD_INSTALL_TGTS} 300 301.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 302vm-release: ${VMTARGETS} 303.else 304vm-release: 305.endif 306 307.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE) 308cloudware-release: ${CLOUDTARGETS} 309.else 310cloudware-release: 311.endif 312 313.include "${.CURDIR}/Makefile.azure" 314.include "${.CURDIR}/Makefile.ec2" 315.include "${.CURDIR}/Makefile.firecracker" 316.include "${.CURDIR}/Makefile.gce" 317.include "${.CURDIR}/Makefile.oracle" 318.include "${.CURDIR}/Makefile.vagrant" 319.include "${.CURDIR}/Makefile.inc1" 320