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