1273823Sgjb# 2273823Sgjb# $FreeBSD: stable/11/release/Makefile.vm 356770 2020-01-16 01:13:32Z gjb $ 3273823Sgjb# 4273823Sgjb# 5273823Sgjb# Makefile for building virtual machine and cloud provider disk images. 6273823Sgjb# 7273823Sgjb 8277458SgjbVMTARGETS= vm-image 9273823SgjbVMFORMATS?= vhd vmdk qcow2 raw 10356573SgjbVMSIZE?= 4096M 11318810SnpSWAPSIZE?= 1G 12273823SgjbVMBASE?= vm 13273823Sgjb 14277458SgjbVHD_DESC= Azure, VirtualPC, Hyper-V, Xen disk image 15277458SgjbVMDK_DESC= VMWare, VirtualBox disk image 16277458SgjbQCOW2_DESC= Qemu, KVM disk image 17277458SgjbRAW_DESC= Unformatted raw disk image 18277458Sgjb 19300761SgjbCLOUDWARE?= EC2 \ 20277458Sgjb GCE \ 21285722Sbrd VAGRANT-VIRTUALBOX \ 22285722Sbrd VAGRANT-VMWARE 23277458SgjbAZURE_FORMAT= vhdf 24277458SgjbAZURE_DESC= Microsoft Azure platform image 25279249SgjbAZURE_DISK= ${OSRELEASE}.${AZURE_FORMAT} 26280879ScpercivaEC2_FORMAT= raw 27280879ScpercivaEC2_DESC= Amazon EC2 image 28280879ScpercivaEC2_DISK= ${OSRELEASE}.${EC2_FORMAT} 29277458SgjbGCE_FORMAT= raw 30277458SgjbGCE_DESC= Google Compute Engine image 31279249SgjbGCE_DISK= disk.${GCE_FORMAT} 32277458SgjbOPENSTACK_FORMAT=qcow2 33277458SgjbOPENSTACK_DESC= OpenStack platform image 34279249SgjbOPENSTACK_DISK= ${OSRELEASE}.${OPENSTACK_FORMAT} 35285722SbrdVAGRANT-VIRTUALBOX_FORMAT= vmdk 36285722SbrdVAGRANT-VIRTUALBOX_DESC= Vagrant Image for VirtualBox 37285722SbrdVAGRANT-VIRTUALBOX_DISK= ${OSRELEASE}.vbox.${VAGRANT_FORMAT} 38285722SbrdVAGRANT-VMWARE_FORMAT= vmdk 39285722SbrdVAGRANT-VMWARE_DESC= Vagrant Image for VMWare 40285722SbrdVAGRANT-VMWARE_DISK= ${OSRELEASE}.vmware.${VAGRANT_FORMAT} 41277458Sgjb 42356770Sgjb.for _V in TYPE BRANCH REVISION 43356770Sgjb. if !defined(${_V}) || empty(${_V}) 44356770Sgjb${_V}!= eval $$(awk '/^${_V}=/{print}' ${.CURDIR}/../sys/conf/newvers.sh); echo $$${_V} 45356770Sgjb. endif 46356770Sgjb.endfor 47356770Sgjb 48346309Scpercivaemulator-portinstall: 49346309Scperciva.if ${TARGET_ARCH} != ${MACHINE_ARCH} 50346309Scperciva.if ( ${TARGET_ARCH} != "i386" ) || ( ${MACHINE_ARCH} != "amd64" ) 51346309Scperciva.if !exists(/usr/local/bin/qemu-${TARGET_ARCH}-static) 52346309Scperciva.if exists(${PORTSDIR}/emulators/qemu-user-static/Makefile) 53346309Scperciva env - PATH=$$PATH make -C ${PORTSDIR}/emulators/qemu-user-static BATCH=1 all install clean 54346309Scperciva.else 55346309Scperciva.if !exists(/usr/local/sbin/pkg-static) 56346309Scperciva env ASSUME_ALWAYS_YES=yes pkg bootstrap -y 57346309Scperciva.endif 58346309Scperciva env ASSUME_ALWAYS_YES=yes pkg install -y emulators/qemu-user-static 59346309Scperciva.endif 60346309Scperciva.endif 61346309Scperciva 62346309ScpercivaQEMUSTATIC=/usr/local/bin/qemu-${TARGET_ARCH}-static 63346309Scperciva.endif 64346309Scperciva.endif 65346309Scperciva 66277458Sgjb.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE) 67277458Sgjb. for _CW in ${CLOUDWARE} 68279249SgjbCLOUDTARGETS+= cw-${_CW:tl} 69279249SgjbCLEANDIRS+= cw-${_CW:tl} 70277458SgjbCLEANFILES+= ${_CW:tl}.img \ 71277458Sgjb ${_CW:tl}.${${_CW:tu}_FORMAT} \ 72279257Sgjb ${_CW:tl}.${${_CW:tu}_FORMAT}.raw \ 73279257Sgjb cw${_CW:tl}-package 74279257SgjbCLOUDPACKAGE+= cw${_CW:tl}-package 75277458Sgjb${_CW:tu}IMAGE= ${_CW:tl}.${${_CW:tu}_FORMAT} 76277458Sgjb. if exists(${.CURDIR}/tools/${_CW:tl}.conf) && !defined(${_CW:tu}CONF) 77277458Sgjb${_CW:tu}CONF?= ${.CURDIR}/tools/${_CW:tl}.conf 78277458Sgjb. endif 79277458Sgjb 80346309Scpercivacw-${_CW:tl}: emulator-portinstall 81277458Sgjb mkdir -p ${.OBJDIR}/${.TARGET} 82318849Sgjb env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \ 83346309Scperciva QEMUSTATIC=${QEMUSTATIC} \ 84277458Sgjb ${.CURDIR}/scripts/mk-vmimage.sh \ 85277458Sgjb -C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} \ 86315043Sgjb -i ${.OBJDIR}/${_CW:tl}.img -s ${VMSIZE} -f ${${_CW:tu}_FORMAT} \ 87319712Sgjb -S ${WORLDDIR} -o ${.OBJDIR}/${${_CW:tu}IMAGE} -c ${${_CW:tu}CONF} 88277458Sgjb touch ${.TARGET} 89279249Sgjb 90279257Sgjbcw${_CW:tl}-package: 91279257Sgjb @# Special target to handle packaging cloud images in the formats 92279257Sgjb @# specific to each hosting provider. 93279257Sgjb.if exists(${.CURDIR}/tools/${_CW:tl}-package.sh) 94279257Sgjb env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \ 95279257Sgjb ${.CURDIR}/tools/${_CW:tl}-package.sh \ 96279257Sgjb -D ${DESTDIR} -I ${${_CW}_DISK} -S ${WORLDDIR} 97279257Sgjb.endif 98279257Sgjb touch ${.TARGET} 99279257Sgjb 100277458Sgjb. endfor 101277458Sgjb.endif 102277458Sgjb 103273823Sgjb.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 104273823SgjbCLEANDIRS+= ${VMTARGETS} 105273823Sgjb. for FORMAT in ${VMFORMATS} 106277609SgjbCLEANFILES+= ${FORMAT}.img 107273823SgjbCLEANFILES+= ${VMBASE}.${FORMAT} 108273823Sgjb. endfor 109273823Sgjb.endif 110273823Sgjb 111277458Sgjbvm-base: vm-image 112273823Sgjb 113277458Sgjbvm-image: 114273823Sgjb.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 115277458Sgjb. for FORMAT in ${VMFORMATS} 116277458Sgjb mkdir -p ${.OBJDIR}/${.TARGET} 117318849Sgjb env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \ 118277458Sgjb ${.CURDIR}/scripts/mk-vmimage.sh \ 119277458Sgjb -C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} \ 120277609Sgjb -i ${.OBJDIR}/${FORMAT}.img -s ${VMSIZE} -f ${FORMAT} \ 121277458Sgjb -S ${WORLDDIR} -o ${.OBJDIR}/${VMBASE}.${FORMAT} 122277458Sgjb. endfor 123273823Sgjb.endif 124273823Sgjb touch ${.TARGET} 125273823Sgjb 126277458Sgjbvm-cloudware: ${CLOUDTARGETS} 127277458Sgjb 128277458Sgjblist-vmtargets: list-cloudware 129277458Sgjb @${ECHO} 130277458Sgjb @${ECHO} "Supported virtual machine disk image formats:" 131277458Sgjb.for FORMAT in ${VMFORMATS:tu} 132277458Sgjb @${ECHO} " ${FORMAT:tl}: ${${FORMAT}_DESC}" 133277458Sgjb.endfor 134277458Sgjb 135277458Sgjblist-cloudware: 136277458Sgjb.if !empty(CLOUDWARE) 137277458Sgjb @${ECHO} 138277458Sgjb @${ECHO} "Supported cloud hosting provider images:" 139277458Sgjb. for _CW in ${CLOUDWARE} 140277458Sgjb @${ECHO} " ${_CW:tu}: ${${_CW:tu}_DESC}" 141277458Sgjb. endfor 142277458Sgjb.endif 143277458Sgjb 144277458Sgjbvm-install: 145273823Sgjb.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 146277458Sgjb mkdir -p ${DESTDIR}/vmimages 147277458Sgjb. for FORMAT in ${VMFORMATS} 148277458Sgjb cp -p ${VMBASE}.${FORMAT} \ 149277458Sgjb ${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT} 150277458Sgjb. endfor 151277458Sgjb. if defined(WITH_COMPRESSED_VMIMAGES) && !empty(WITH_COMPRESSED_VMIMAGES) 152273823Sgjb. for FORMAT in ${VMFORMATS} 153277458Sgjb # Don't keep the originals. There is a copy in ${.OBJDIR} if needed. 154278926Srpaulo ${XZ_CMD} ${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT} 155273823Sgjb. endfor 156273823Sgjb. endif 157289337Sgjb cd ${DESTDIR}/vmimages && sha512 ${OSRELEASE}* > \ 158289337Sgjb ${DESTDIR}/vmimages/CHECKSUM.SHA512 159277458Sgjb cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \ 160277458Sgjb ${DESTDIR}/vmimages/CHECKSUM.SHA256 161273823Sgjb.endif 162277536Sgjb 163277536Sgjbvm-release: 164277536Sgjb.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 165277536Sgjb ${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${VMTARGETS} 166277536Sgjb.endif 167277536Sgjb 168277536Sgjbcloudware-release: 169277536Sgjb.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE) 170277536Sgjb ${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${CLOUDTARGETS} 171277536Sgjb.endif 172279249Sgjb 173280928Scperciva.include "${.CURDIR}/Makefile.ec2" 174284567Sgjb.include "${.CURDIR}/Makefile.azure" 175284882Sgjb.include "${.CURDIR}/Makefile.gce" 176284893Sbrd.include "${.CURDIR}/Makefile.vagrant" 177