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 DESKTOP 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-DESKTOP_DESC= Amazon EC2 GUI image 44EC2-SMALL_DESC= Amazon EC2 small image 45GCE_FORMAT= raw 46GCE_FSLIST?= ufs zfs 47GCE_DESC= Google Compute Engine 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:H}/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} && !defined(WITHOUT_QEMU) 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)) || \ 102 (defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)) 103.if (defined(WITHOUT_QEMU) && !defined(NO_ROOT)) 104.error WITHOUT_QEMU requires NO_ROOT 105.elif (!defined(WITHOUT_QEMU) && defined(NO_ROOT)) 106.error NO_ROOT requires WITHOUT_QEMU 107.endif 108.endif 109 110.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE) 111. for _CW in ${CLOUDWARE} 112. if exists(${.CURDIR}/tools/${_CW:tl}.conf) && !defined(${_CW:tu}CONF) 113${_CW:tu}CONF?= ${.CURDIR}/tools/${_CW:tl}.conf 114. endif 115. for _FS in ${${_CW:tu}_FSLIST} 116. for _FMT in ${${_CW:tu}_FORMAT} 117CLOUDTARGETS+= cw-${_CW:tl}-${_FS}-${_FMT} 118CLEANDIRS+= cw-${_CW:tl}-${_FS}-${_FMT} 119CLEANFILES+= ${_CW:tl}.${_FS}.${_FMT}.img \ 120 ${_CW:tl}.${_FS}.${_FMT} \ 121 ${_CW:tl}.${_FS}.${_FMT}.raw 122${_CW:tu}${_FS:tu}${_FMT:tu}IMAGE= ${_CW:tl}.${_FS}.${_FMT} 123 124# Special handling: EC2 "AMI Builder" images need a copy of the "base" disk 125# built first. 126.if ${_CW} == EC2-BUILDER 127cw-${_CW:tl}-${_FS}-${_FMT}: cw-ec2-base-${_FS}-${_FMT} 128.endif 129 130# Special handling: GCE images ingest src.txz and ports.txz and expect them 131# to be in the /ftp/ directory. Note: This will need to be reworked before 132# distribution sets go away! 133.if ${_CW} == GCE 134cw-${_CW:tl}-${_FS}-${_FMT}: ftp 135.endif 136 137cw-${_CW:tl}-${_FS}-${_FMT}: ${QEMUTGT} ${PKGBASE_REPO_DIR} 138 mkdir -p ${.OBJDIR}/${.TARGET} 139 env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \ 140 QEMUSTATIC=${QEMUSTATIC} \ 141 EC2BASEIMG=${.OBJDIR}/${EC2-BASE${_FS:tu}${_FMT:tu}IMAGE} \ 142 ${WITHOUT_QEMU:DWITHOUT_QEMU=true} \ 143 ${NO_ROOT:DNO_ROOT=true} \ 144 PKG_CMD=${PKG_CMD:Upkg} \ 145 PKG_ABI=${PKG_ABI} \ 146 PKG_REPOS_DIR=${PKG_REPOS_DIR:U${.OBJDIR}/${.TARGET}/etc/pkg} \ 147 PKG_REPO_NAME=${PKG_REPO_NAME:UFreeBSD-ports} \ 148 PKG_INSTALL_EPOCH=${PKG_INSTALL_EPOCH:U${GITEPOCH}} \ 149 NOPKGBASE=${NOPKGBASE} \ 150 PKGBASE_REPO_DIR=${.OBJDIR}/pkgbase-repo-dir \ 151 ${.CURDIR}/scripts/mk-vmimage.sh \ 152 -C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} \ 153 -F ${"${_CW:MEC2-BUILDER}" != "":?ufs:${_FS}} \ 154 -i ${.OBJDIR}/${_CW:tl}.${_FS}.${_FMT}.img -s ${VMSIZE} -f ${_FMT} \ 155 -S ${WORLDDIR} -o ${.OBJDIR}/${${_CW:tu}${_FS:tu}${_FMT:tu}IMAGE} -c ${${_CW:tu}CONF} || true 156 touch ${.TARGET} 157. endfor 158. endfor 159 160# Hardlinks from "foo.${FMT}" to "foo-${VMFS}.${FMT}". These can go away once 161# all of the cloudware code knows how to handle multiple filesystem images (or 162# at least knows the name of the UFS image). 163. for _FMT in ${${_CW:tu}_FORMAT} 164CLOUDTARGETS+= cw-${_CW:tl}-${_FMT} 165CLEANFILES+= ${_CW:tl}.${_FMT} 166${_CW:tu}${_FMT:tu}IMAGE= ${_CW:tl}.${_FMT} 167cw-${_CW:tl}-${_FMT}: cw-${_CW:tl}-${VMFS}-${_FMT} 168 ln -f ${${_CW:tu}${VMFS:tu}${_FMT:tu}IMAGE} ${${_CW:tu}${_FMT:tu}IMAGE} || true 169. endfor 170 171# Targets without a disk format listed are the first disk format on the list 172. for _FS in ${${_CW:tu}_FSLIST} 173${_CW:tu}${_FS:tu}IMAGE= ${_CW:tl}.${_FS}.${${_CW:tu}_FORMAT:[1]} 174cw-${_CW:tl}-${_FS}: cw-${_CW:tl}-${_FS}-${${_CW:tu}_FORMAT:[1]} 175. endfor 176${_CW:tu}IMAGE= ${_CW:tl}.${${_CW:tu}_FORMAT:[1]} 177cw-${_CW:tl}: cw-${_CW:tl}-${${_CW:tu}_FORMAT:[1]} 178. endfor 179.endif 180 181.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 182CLEANFILES+= vm-image 183. for FORMAT in ${VMFORMATS} 184. for FS in ${VMFSLIST} 185CLEANDIRS+= vm-image-${FORMAT}-${FS} 186CLEANFILES+= ${FORMAT}.${FS}.img 187CLEANFILES+= ${VMBASE}.${FS}.${FORMAT} 188. endfor 189. endfor 190.endif 191 192vm-base: vm-image 193 194vm-image: ${QEMUTGT} ${PKGBASE_REPO_DIR} 195.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 196. for FORMAT in ${VMFORMATS} 197. for FS in ${VMFSLIST} 198 mkdir -p ${.OBJDIR}/${.TARGET}-${FORMAT}-${FS} 199 env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \ 200 QEMUSTATIC=${QEMUSTATIC} \ 201 ${WITHOUT_QEMU:DWITHOUT_QEMU=true} \ 202 ${NO_ROOT:DNO_ROOT=true} \ 203 PKG_CMD=${PKG_CMD:Upkg} \ 204 PKG_ABI=${PKG_ABI} \ 205 PKG_REPOS_DIR=${PKG_REPOS_DIR:U${.OBJDIR}/${.TARGET}-${FORMAT}-${FS}/etc/pkg} \ 206 PKG_REPO_NAME=${PKG_REPO_NAME:UFreeBSD-ports} \ 207 PKG_INSTALL_EPOCH=${PKG_INSTALL_EPOCH:U${GITEPOCH}} \ 208 NOPKGBASE=${NOPKGBASE} \ 209 PKGBASE_REPO_DIR=${.OBJDIR}/pkgbase-repo-dir \ 210 ${.CURDIR}/scripts/mk-vmimage.sh \ 211 -C ${.CURDIR}/tools/vmimage.subr \ 212 ${VM_IMAGE_CONFIG:D-c ${VM_IMAGE_CONFIG}} \ 213 -d ${.OBJDIR}/${.TARGET}-${FORMAT}-${FS} -F ${FS} \ 214 -i ${.OBJDIR}/${FORMAT}.${FS}.img -s ${VMSIZE} -f ${FORMAT} \ 215 -S ${WORLDDIR} -o ${.OBJDIR}/${VMBASE}.${FS}.${FORMAT} || true 216. endfor 217. endfor 218.endif 219 touch ${.TARGET} 220 221vm-cloudware: ${CLOUDTARGETS} 222 223list-vmtargets: list-cloudware 224 @${ECHO} 225 @${ECHO} "Supported virtual machine disk image formats:" 226.for FORMAT in ${VMFORMATS:tu} 227 @${ECHO} " ${FORMAT:tl}: ${${FORMAT}_DESC}" 228.endfor 229 230list-cloudware: 231.if !empty(CLOUDWARE) 232 @${ECHO} 233 @${ECHO} "Supported cloud hosting provider images:" 234. for _CW in ${CLOUDWARE} 235 @${ECHO} " ${_CW:tu}: ${${_CW:tu}_DESC}" 236. endfor 237.endif 238 239vm-install: 240.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 241 mkdir -p ${DESTDIR}/vmimages 242. for FORMAT in ${VMFORMATS} 243. for FS in ${VMFSLIST} 244 cp -p ${VMBASE}.${FS}.${FORMAT} \ 245 ${DESTDIR}/vmimages/${OSRELEASE}-${FS}.${FORMAT} 246. endfor 247. endfor 248. if defined(WITH_COMPRESSED_VMIMAGES) && !empty(WITH_COMPRESSED_VMIMAGES) 249. for FORMAT in ${VMFORMATS} 250. for FS in ${VMFSLIST} 251 # Don't keep the originals. There is a copy in ${.OBJDIR} if needed. 252 ${XZ_CMD} -f ${DESTDIR}/vmimages/${OSRELEASE}-${FS}.${FORMAT} 253. endfor 254. endfor 255. endif 256 cd ${DESTDIR}/vmimages && sha512 ${OSRELEASE}* > \ 257 ${DESTDIR}/vmimages/CHECKSUM.SHA512 258 cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \ 259 ${DESTDIR}/vmimages/CHECKSUM.SHA256 260.endif 261 262cloud-install-BASIC-CI: 263 mkdir -p ${DESTDIR}/ciimages 264.for _FS in ${BASIC-CI_FSLIST} 265. for _FMT in ${BASIC-CI_FORMAT} 266 cp -p ${.OBJDIR}/${BASIC-CI${_FS:tu}${_FMT:tu}IMAGE} \ 267 ${DESTDIR}/ciimages/${OSRELEASE}-BASIC-CI-${_FS}.${_FMT} 268 ${XZ_CMD} -f ${DESTDIR}/ciimages/${OSRELEASE}-BASIC-CI-${_FS}.${_FMT} 269. endfor 270.endfor 271 cd ${DESTDIR}/ciimages && sha512 ${OSRELEASE}* > \ 272 ${DESTDIR}/ciimages/CHECKSUM.SHA512 273 cd ${DESTDIR}/ciimages && sha256 ${OSRELEASE}* > \ 274 ${DESTDIR}/ciimages/CHECKSUM.SHA256 275 276cloud-install-BASIC-CLOUDINIT: 277 mkdir -p ${DESTDIR}/vmimages 278.for _FS in ${BASIC-CLOUDINIT_FSLIST} 279. for _FMT in ${BASIC-CLOUDINIT_FORMAT} 280 cp -p ${.OBJDIR}/${BASIC-CLOUDINIT${_FS:tu}${_FMT:tu}IMAGE} \ 281 ${DESTDIR}/vmimages/${OSRELEASE}-BASIC-CLOUDINIT-${_FS}.${_FMT} 282 ${XZ_CMD} -f ${DESTDIR}/vmimages/${OSRELEASE}-BASIC-CLOUDINIT-${_FS}.${_FMT} 283. endfor 284.endfor 285 cd ${DESTDIR}/vmimages && sha512 ${OSRELEASE}* > \ 286 ${DESTDIR}/vmimages/CHECKSUM.SHA512 287 cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \ 288 ${DESTDIR}/vmimages/CHECKSUM.SHA256 289 290CLOUD_INSTALL_TGTS= 291.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) 292. for _CW in ${CLOUDWARE} 293. if target(cloud-install-${_CW}) 294CLOUD_INSTALL_TGTS+= cloud-install-${_CW} 295. endif 296. endfor 297.endif 298cloud-install: ${CLOUD_INSTALL_TGTS} 299 300.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 301vm-release: ${VMTARGETS} 302.else 303vm-release: 304.endif 305 306.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE) 307cloudware-release: ${CLOUDTARGETS} 308.else 309cloudware-release: 310.endif 311 312.include "${.CURDIR}/Makefile.azure" 313.include "${.CURDIR}/Makefile.ec2" 314.include "${.CURDIR}/Makefile.firecracker" 315.include "${.CURDIR}/Makefile.gce" 316.include "${.CURDIR}/Makefile.vagrant" 317.include "${.CURDIR}/Makefile.inc1" 318