16513e474SGlen Barber# 26513e474SGlen Barber# $FreeBSD$ 36513e474SGlen Barber# 46513e474SGlen Barber# 56513e474SGlen Barber# Makefile for building virtual machine and cloud provider disk images. 66513e474SGlen Barber# 76513e474SGlen Barber 81e7c1f17SGlen BarberVMTARGETS= vm-image 96513e474SGlen BarberVMFORMATS?= vhd vmdk qcow2 raw 101dfcff29SGlen BarberVMSIZE?= 5120m 1189585511SMark JohnstonVMFS?= ufs 1232ae9a6bSColin PercivalVMFSLIST?= ufs zfs 13fa04db47SGlen BarberSWAPSIZE?= 1g 146513e474SGlen BarberVMBASE?= vm 15d08ce983SGlen Barber 1685311c29SGlen BarberVHD_DESC= Azure, VirtualPC, Hyper-V, Xen disk image 1785311c29SGlen BarberVMDK_DESC= VMWare, VirtualBox disk image 1885311c29SGlen BarberQCOW2_DESC= Qemu, KVM disk image 1985311c29SGlen BarberRAW_DESC= Unformatted raw disk image 2085311c29SGlen Barber 21ea070051SEmmanuel VadotCLOUDWARE?= BASIC-CI \ 22ea070051SEmmanuel Vadot EC2 \ 235f87b8f5SGlen Barber GCE \ 240af49f00SDave Cottlehuber OCI \ 25a54bd595SBrad Davis VAGRANT-VIRTUALBOX \ 26a54bd595SBrad Davis VAGRANT-VMWARE 27f27438c7SGlen BarberAZURE_FORMAT= vhdf 28*8dec4738SColin PercivalAZURE_FSLIST= ufs 2999e908c9SGlen BarberAZURE_DESC= Microsoft Azure platform image 300e44fa6cSGlen BarberAZURE_DISK= ${OSRELEASE}.${AZURE_FORMAT} 31ea070051SEmmanuel VadotBASIC-CI_FORMAT= raw 32*8dec4738SColin PercivalBASIC-CI_FSLIST= ufs 33ea070051SEmmanuel VadotBASIC-CI_DESC= Image for CI 34ea070051SEmmanuel VadotBASIC-CI_DISK= ${OSRELEASE}.${BASIC-CI_FORMAT} 35f65557efSColin PercivalEC2_FORMAT= raw 36*8dec4738SColin PercivalEC2_FSLIST= ufs 37f65557efSColin PercivalEC2_DESC= Amazon EC2 image 38f65557efSColin PercivalEC2_DISK= ${OSRELEASE}.${EC2_FORMAT} 395f87b8f5SGlen BarberGCE_FORMAT= raw 40*8dec4738SColin PercivalGCE_FSLIST= ufs 415f87b8f5SGlen BarberGCE_DESC= Google Compute Engine image 420e44fa6cSGlen BarberGCE_DISK= disk.${GCE_FORMAT} 430af49f00SDave CottlehuberOCI_FORMAT= qcow2 44*8dec4738SColin PercivalOCI_FSLIST= ufs 450af49f00SDave CottlehuberOCI_DESC= Oracle Cloud Infrastructure image 460af49f00SDave CottlehuberOCI_DISK= ${OSRELEASE}.${OCI_FORMAT} 47573e7ccaSGlen BarberOPENSTACK_FORMAT=qcow2 48*8dec4738SColin PercivalOPENSTACK_FSLIST= ufs 4999e908c9SGlen BarberOPENSTACK_DESC= OpenStack platform image 500e44fa6cSGlen BarberOPENSTACK_DISK= ${OSRELEASE}.${OPENSTACK_FORMAT} 51a54bd595SBrad DavisVAGRANT-VIRTUALBOX_FORMAT= vmdk 52*8dec4738SColin PercivalVAGRANT-VIRTUALBOX_FSLIST= ufs 53a54bd595SBrad DavisVAGRANT-VIRTUALBOX_DESC= Vagrant Image for VirtualBox 54a54bd595SBrad DavisVAGRANT-VIRTUALBOX_DISK= ${OSRELEASE}.vbox.${VAGRANT_FORMAT} 55a54bd595SBrad DavisVAGRANT-VMWARE_FORMAT= vmdk 56*8dec4738SColin PercivalVAGRANT-VMWARE_FSLIST= ufs 57a54bd595SBrad DavisVAGRANT-VMWARE_DESC= Vagrant Image for VMWare 58a54bd595SBrad DavisVAGRANT-VMWARE_DISK= ${OSRELEASE}.vmware.${VAGRANT_FORMAT} 59d08ce983SGlen Barber 60e2827b51SGlen Barber.for _V in TYPE BRANCH REVISION 61e2827b51SGlen Barber. if !defined(${_V}) || empty(${_V}) 62e2827b51SGlen Barber${_V}!= eval $$(awk '/^${_V}=/{print}' ${.CURDIR}/../sys/conf/newvers.sh); echo $$${_V} 63e2827b51SGlen Barber. endif 64e2827b51SGlen Barber.endfor 65e2827b51SGlen Barber 661ecaa3f7SColin Percivalemulator-portinstall: 671ecaa3f7SColin Percival.if ${TARGET_ARCH} != ${MACHINE_ARCH} 681ecaa3f7SColin Percival.if ( ${TARGET_ARCH} != "i386" ) || ( ${MACHINE_ARCH} != "amd64" ) 691ecaa3f7SColin Percival.if !exists(/usr/local/bin/qemu-${TARGET_ARCH}-static) 701ecaa3f7SColin Percival.if exists(${PORTSDIR}/emulators/qemu-user-static/Makefile) 710be274d3SGlen Barber env - UNAME_r=${UNAME_r} PATH=$$PATH make -C ${PORTSDIR}/emulators/qemu-user-static BATCH=1 all install clean 721ecaa3f7SColin Percival.else 731ecaa3f7SColin Percival.if !exists(/usr/local/sbin/pkg-static) 741ecaa3f7SColin Percival env ASSUME_ALWAYS_YES=yes pkg bootstrap -y 751ecaa3f7SColin Percival.endif 761ecaa3f7SColin Percival env ASSUME_ALWAYS_YES=yes pkg install -y emulators/qemu-user-static 771ecaa3f7SColin Percival.endif 781ecaa3f7SColin Percival.endif 791ecaa3f7SColin Percival 801ecaa3f7SColin PercivalQEMUSTATIC=/usr/local/bin/qemu-${TARGET_ARCH}-static 811ecaa3f7SColin Percival.endif 821ecaa3f7SColin Percival.endif 831ecaa3f7SColin Percival 84d08ce983SGlen Barber.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE) 85d08ce983SGlen Barber. for _CW in ${CLOUDWARE} 86d08ce983SGlen Barber. if exists(${.CURDIR}/tools/${_CW:tl}.conf) && !defined(${_CW:tu}CONF) 87d08ce983SGlen Barber${_CW:tu}CONF?= ${.CURDIR}/tools/${_CW:tl}.conf 88d08ce983SGlen Barber. endif 89*8dec4738SColin Percival. for _FS in ${${_CW:tu}_FSLIST} 90*8dec4738SColin PercivalCLOUDTARGETS+= cw-${_CW:tl}-${_FS} 91*8dec4738SColin PercivalCLEANDIRS+= cw-${_CW:tl}-${_FS} 92*8dec4738SColin PercivalCLEANFILES+= ${_CW:tl}.${_FS}.img \ 93*8dec4738SColin Percival ${_CW:tl}.${_FS}.${${_CW:tu}_FORMAT} \ 94*8dec4738SColin Percival ${_CW:tl}.${_FS}.${${_CW:tu}_FORMAT}.raw \ 95*8dec4738SColin Percival cw${_CW:tl}-package 96*8dec4738SColin PercivalCLOUDPACKAGE+= cw${_CW:tl}-package 97*8dec4738SColin Percival${_CW:tu}${_FS:tu}IMAGE= ${_CW:tl}.${_FS}.${${_CW:tu}_FORMAT} 9848096f81SColin Percival 99*8dec4738SColin Percivalcw-${_CW:tl}-${_FS}: emulator-portinstall 10048096f81SColin Percival mkdir -p ${.OBJDIR}/${.TARGET} 101ea18fc2fSGlen Barber env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \ 1021ecaa3f7SColin Percival QEMUSTATIC=${QEMUSTATIC} \ 10348096f81SColin Percival ${.CURDIR}/scripts/mk-vmimage.sh \ 104*8dec4738SColin Percival -C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} -F ${_FS} \ 105*8dec4738SColin Percival -i ${.OBJDIR}/${_CW:tl}.${_FS}.img -s ${VMSIZE} -f ${${_CW:tu}_FORMAT} \ 106*8dec4738SColin Percival -S ${WORLDDIR} -o ${.OBJDIR}/${${_CW:tu}${_FS:tu}IMAGE} -c ${${_CW:tu}CONF} 10748096f81SColin Percival touch ${.TARGET} 108*8dec4738SColin Percival. endfor 109*8dec4738SColin Percival 110*8dec4738SColin Percival# Hardlinks from "foo.bar" to "foo-${VMFS}.bar". These can go away once all 111*8dec4738SColin Percival# of the cloudware code knows how to handle multiple filesystem images (or 112*8dec4738SColin Percival# at least knows the name of the UFS image). 113*8dec4738SColin PercivalCLOUDTARGETS+= cw-${_CW:tl} 114*8dec4738SColin PercivalCLEANFILES+= ${_CW:tl}.${${_CW:tu}_FORMAT} 115*8dec4738SColin Percival${_CW:tu}IMAGE= ${_CW:tl}.${${_CW:tu}_FORMAT} 116*8dec4738SColin Percivalcw-${_CW:tl}: cw-${_CW:tl}-${VMFS} 117*8dec4738SColin Percival ln -f ${${_CW:tu}${VMFS:tu}IMAGE} ${${_CW:tu}IMAGE} 1180e44fa6cSGlen Barber 119dc1c4500SGlen Barbercw${_CW:tl}-package: 120dc1c4500SGlen Barber @# Special target to handle packaging cloud images in the formats 121dc1c4500SGlen Barber @# specific to each hosting provider. 122dc1c4500SGlen Barber.if exists(${.CURDIR}/tools/${_CW:tl}-package.sh) 123dc1c4500SGlen Barber env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \ 124dc1c4500SGlen Barber ${.CURDIR}/tools/${_CW:tl}-package.sh \ 125dc1c4500SGlen Barber -D ${DESTDIR} -I ${${_CW}_DISK} -S ${WORLDDIR} 126dc1c4500SGlen Barber.endif 127dc1c4500SGlen Barber touch ${.TARGET} 128dc1c4500SGlen Barber 129d08ce983SGlen Barber. endfor 130d08ce983SGlen Barber.endif 1316513e474SGlen Barber 1326513e474SGlen Barber.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 1336513e474SGlen BarberCLEANDIRS+= ${VMTARGETS} 1346513e474SGlen Barber. for FORMAT in ${VMFORMATS} 13532ae9a6bSColin Percival. for FS in ${VMFSLIST} 13632ae9a6bSColin PercivalCLEANFILES+= ${FORMAT}.${FS}.img 13732ae9a6bSColin PercivalCLEANFILES+= ${VMBASE}.${FS}.${FORMAT} 13832ae9a6bSColin Percival. endfor 1396513e474SGlen Barber. endfor 1406513e474SGlen Barber.endif 1416513e474SGlen Barber 1421e7c1f17SGlen Barbervm-base: vm-image 1436513e474SGlen Barber 1441e7c1f17SGlen Barbervm-image: 1456513e474SGlen Barber.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 1466513e474SGlen Barber. for FORMAT in ${VMFORMATS} 14732ae9a6bSColin Percival. for FS in ${VMFSLIST} 1481c34bf95SGlen Barber mkdir -p ${.OBJDIR}/${.TARGET} 149240e2395SGlen Barber env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \ 15026bb2a60SGlen Barber ${.CURDIR}/scripts/mk-vmimage.sh \ 15132ae9a6bSColin Percival -C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} -F ${FS} \ 15232ae9a6bSColin Percival -i ${.OBJDIR}/${FORMAT}.${FS}.img -s ${VMSIZE} -f ${FORMAT} \ 15332ae9a6bSColin Percival -S ${WORLDDIR} -o ${.OBJDIR}/${VMBASE}.${FS}.${FORMAT} 15432ae9a6bSColin Percival. endfor 1556513e474SGlen Barber. endfor 1566513e474SGlen Barber.endif 1576513e474SGlen Barber touch ${.TARGET} 1586513e474SGlen Barber 1597d2ef961SGlen Barbervm-cloudware: ${CLOUDTARGETS} 16099e908c9SGlen Barber 16185311c29SGlen Barberlist-vmtargets: list-cloudware 16285311c29SGlen Barber @${ECHO} 16385311c29SGlen Barber @${ECHO} "Supported virtual machine disk image formats:" 16485311c29SGlen Barber.for FORMAT in ${VMFORMATS:tu} 16585311c29SGlen Barber @${ECHO} " ${FORMAT:tl}: ${${FORMAT}_DESC}" 16685311c29SGlen Barber.endfor 16785311c29SGlen Barber 16899e908c9SGlen Barberlist-cloudware: 16999e908c9SGlen Barber.if !empty(CLOUDWARE) 17085311c29SGlen Barber @${ECHO} 17185311c29SGlen Barber @${ECHO} "Supported cloud hosting provider images:" 17299e908c9SGlen Barber. for _CW in ${CLOUDWARE} 17399e908c9SGlen Barber @${ECHO} " ${_CW:tu}: ${${_CW:tu}_DESC}" 17499e908c9SGlen Barber. endfor 17599e908c9SGlen Barber.endif 1762d4ff62fSGlen Barber 1772d4ff62fSGlen Barbervm-install: 1782d4ff62fSGlen Barber.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 1792d4ff62fSGlen Barber mkdir -p ${DESTDIR}/vmimages 1802d4ff62fSGlen Barber. for FORMAT in ${VMFORMATS} 18132ae9a6bSColin Percival. for FS in ${VMFSLIST} 18232ae9a6bSColin Percival cp -p ${VMBASE}.${FS}.${FORMAT} \ 18332ae9a6bSColin Percival ${DESTDIR}/vmimages/${OSRELEASE}-${FS}.${FORMAT} 18432ae9a6bSColin Percival. endfor 1852d4ff62fSGlen Barber. endfor 1862d4ff62fSGlen Barber. if defined(WITH_COMPRESSED_VMIMAGES) && !empty(WITH_COMPRESSED_VMIMAGES) 1872d4ff62fSGlen Barber. for FORMAT in ${VMFORMATS} 18832ae9a6bSColin Percival. for FS in ${VMFSLIST} 1892d4ff62fSGlen Barber # Don't keep the originals. There is a copy in ${.OBJDIR} if needed. 19032ae9a6bSColin Percival ${XZ_CMD} ${DESTDIR}/vmimages/${OSRELEASE}-${FS}.${FORMAT} 19132ae9a6bSColin Percival. endfor 1922d4ff62fSGlen Barber. endfor 1932d4ff62fSGlen Barber. endif 19432ae9a6bSColin Percival # Compatibility hardlinks from "foo.bar" to "foo-${VMFS}.bar". 19532ae9a6bSColin Percival. for FORMAT in ${VMFORMATS} 19632ae9a6bSColin Percival. if defined(WITH_COMPRESSED_VMIMAGES) && !empty(WITH_COMPRESSED_VMIMAGES) 19732ae9a6bSColin Percival ln -f ${DESTDIR}/vmimages/${OSRELEASE}-${VMFS}.${FORMAT}.xz ${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT}.xz 19832ae9a6bSColin Percival. else 19932ae9a6bSColin Percival ln -f ${DESTDIR}/vmimages/${OSRELEASE}-${VMFS}.${FORMAT} ${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT} 20032ae9a6bSColin Percival. endif 20132ae9a6bSColin Percival. endfor 20234187a08SGlen Barber cd ${DESTDIR}/vmimages && sha512 ${OSRELEASE}* > \ 20334187a08SGlen Barber ${DESTDIR}/vmimages/CHECKSUM.SHA512 2042d4ff62fSGlen Barber cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \ 2052d4ff62fSGlen Barber ${DESTDIR}/vmimages/CHECKSUM.SHA256 2062d4ff62fSGlen Barber.endif 2074afe7cf5SGlen Barber 2084afe7cf5SGlen Barbervm-release: 2094afe7cf5SGlen Barber.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES) 2104afe7cf5SGlen Barber ${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${VMTARGETS} 2114afe7cf5SGlen Barber.endif 2124afe7cf5SGlen Barber 2134afe7cf5SGlen Barbercloudware-release: 2144afe7cf5SGlen Barber.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE) 2154afe7cf5SGlen Barber ${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${CLOUDTARGETS} 2164afe7cf5SGlen Barber.endif 2170e44fa6cSGlen Barber 218873fc703SGlen Barber.include "${.CURDIR}/Makefile.azure" 219fbece760SLi-Wen Hsu.include "${.CURDIR}/Makefile.ec2" 2207acb5381SColin Percival.include "${.CURDIR}/Makefile.firecracker" 221eb64cd58SGlen Barber.include "${.CURDIR}/Makefile.gce" 22241f7db3aSBrad Davis.include "${.CURDIR}/Makefile.vagrant" 223c883b6fdSGlen Barber.include "${.CURDIR}/Makefile.inc1" 224