1# $NetBSD: Makefile.bootcd,v 1.32 2015/05/29 06:28:50 martin Exp $ 2# 3# Makefile snipped to create a CD/DVD ISO 4# 5 6# XXX TODO: 7# 1) merge with src/distrib/cdrom 8# 2) teach makefs to add data from more than 1 directory (see below) 9 10# 11# Required variables: 12# CDBASE Basename of the iso 13# 14# Optional variables: 15# CDRELEASE Set to 'true' to include $RELEASEDIR/$MACHINE on the CD 16# CDRELEASE_NOISOS Excludes installation/cdrom directory if set 17# CDSOURCE Set to 'true' to include $RELEASEDIR/source on the CD 18# CDEXTRA Set to a list of files or directories containing extra 19# stuff to put on CD (set by build.sh -C flag) 20# CDBUILDEXTRA Set to a list of files or directories containing extra 21# stuff to put on CD (use in Makefiles) 22# CDEXTRA_SKIP A list of file exclusion paths to exclude when copying 23# directories of extra stuff in CDEXTRA AND CDBUILDEXTRA 24# BOOT Defaults to $DESTDIR/usr/mdec/boot 25# BOOTXX_CD9660 Defaults to $DESTDIR/usr/mdec/bootxx_cd9660 26# CDBOOTOPTIONS Options for installboot, eg -o console=com0,speed=9600 27# CDMAKEFSOPTIONS Options for makefs, eg bootimage=i386;bootxx,no-emul-boot 28# CDMAKEFSEXTRAOPTS additional options for makefs, e.g. -F specfile 29# CDROMS_RELEASEDIR Where to install ${CDBASE}.iso 30# CDINSTKERNEL instkernel directory (relative to ${.CURDIR}) 31# CDKERNELS couples of the form: 32# source name_on_cd 33# CDRUNTIME files/directories to copy from $DESTDIR onto the CD 34# CD_SETS sets to be extracted onto the CD 35# SETS_DIR where the CD_SETS are found (default provided) 36# source kernels are copied from ${CDINSTKERNEL} (or its obj dir) 37# note that as of yet, bootxx_cd9660 can't load kernel names of more than 38# 8 chars (though they can be in a sub-directory meaning the pathname is 39# longer than 8 chars) 40# 41 42BOOT?= ${DESTDIR}/usr/mdec/boot 43BOOTXX_CD9660?= ${DESTDIR}/usr/mdec/bootxx_cd9660 44CDRELEASE?= false 45CDSOURCE?= false 46.if ${CDRELEASE} == false 47CDROMS_RELEASEDIR?= ${MACHINE}/installation/cdrom 48.else 49CDROMS_RELEASEDIR?= images 50.endif 51.if defined(CDRELEASE_NOISOS) 52CDRELEASE_EXCLUDE= -s ',./installation/cdrom.*,,gp' 53.endif 54.if !defined(CDRELEASE_LIVEIMAGE) 55CDRELEASE_EXCLUDE+= -s ',./installation/liveimage.*,,gp' 56.endif 57.if !defined(CDRELEASE_INSTALLIMAGE) 58CDRELEASE_EXCLUDE+= -s ',./installation/installimage.*,,gp' 59.endif 60 61SETS_DIR?= ${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets 62 63.include <bsd.own.mk> # For PRINTOBJDIR 64.include <bsd.kernobj.mk> # For KERNSRCDIR 65 66DISTRIBVER!= ${HOST_SH} ${KERNSRCDIR}/conf/osrelease.sh 67DISTRIBREV!= ${HOST_SH} ${KERNSRCDIR}/conf/osrelease.sh -s 68CUROBJDIR!= cd ${.CURDIR} && ${PRINTOBJDIR} 69ISO_VOLID!= echo NETBSD_${DISTRIBREV} | tr a-z A-Z 70PUBLISHER?= The_NetBSD_Project 71.if defined(CDMAKEFSOPTIONS) 72_CDMAKEFSOPTIONS= rockridge,label=${ISO_VOLID},publisher=${PUBLISHER},${CDMAKEFSOPTIONS} 73.else 74_CDMAKEFSOPTIONS= rockridge,label=${ISO_VOLID},publisher=${PUBLISHER} 75.endif 76 77.if ${MKUNPRIVED} == "no" 78CD_METALOG.unpriv= 79mtunpriv= 80.else 81CD_METALOG.unpriv=-M ${METALOG}.sanitised 82mtunpriv="-U" 83.endif 84 85# Stuff that should come from elsewhere - XXX where? - HF 86CP?= cp 87RM?= rm 88MKDIR?= mkdir -p 89CHMOD?= chmod 90ECHO?= echo 91 92.if ${CDRELEASE} == false 93CDIMAGE= ${CDBASE}.iso 94.else 95CDIMAGE= NetBSD-${DISTRIBVER}-${CDBASE:S/cd$//}.iso 96.endif 97WORKSPEC= fs.spec 98 99CLEANFILES+= ${CDIMAGE} 100CLEANFILES+= bootxx.${MACHINE} 101CLEANFILES+= ${WORKSPEC} 102 103CDSETSENV= DESTDIR=${DESTDIR:Q} \ 104 MACHINE=${MACHINE:Q} \ 105 MACHINE_ARCH=${MACHINE_ARCH:Q} \ 106 AWK=${TOOL_AWK:Q} \ 107 CKSUM=${TOOL_CKSUM:Q} \ 108 DB=${TOOL_DB:Q} \ 109 HOST_SH=${HOST_SH:Q} \ 110 MAKE=${MAKE:Q} \ 111 MKTEMP=${TOOL_MKTEMP:Q} \ 112 MTREE=${TOOL_MTREE:Q} \ 113 PAX=${TOOL_PAX:Q} \ 114 COMPRESS_PROGRAM=${COMPRESS_PROGRAM:Q} \ 115 GZIP=${GZIP_FLAGS:Q} \ 116 PKG_CREATE=${TOOL_PKG_CREATE:Q} \ 117 SED=${TOOL_SED:Q} \ 118 TSORT=${TSORT:Q} \ 119 MKRUMP=no \ 120 MKCOMPAT=no \ 121 MKDEBUG=no \ 122 MKDEBUGLIB=no 123 124CDSETSCMD= cd ${NETBSDSRCDIR}/distrib/sets && \ 125 ${CDSETSENV} \ 126 ${HOST_SH} 127 128.include "${NETBSDSRCDIR}/distrib/common/Makefile.distrib" 129 130.if defined(CDINSTKERNEL) 131_INSTKERNELNOBJDIR!= cd ${.CURDIR}/${CDINSTKERNEL} && ${PRINTOBJDIR} 132.endif 133.if exists(${DESTDIR}/usr/mdec/bootxx_cd9660) 134.if exists(${DESTDIR}/usr/mdec/boot.${MACHINE}) 135BOOT2=boot.${MACHINE} 136.else 137BOOT2=boot 138.endif 139.endif 140 141prepare: 142 ${MKDIR} "${CUROBJDIR}/cdrom" 143.if defined(CDKERNELS) 144.for kernel target in ${CDKERNELS} 145 ${CP} ${_INSTKERNELNOBJDIR}/${kernel} cdrom/${target} 146.endfor 147.if exists(${DESTDIR}/usr/mdec/bootxx_cd9660) 148 ${RM} -f cdrom/${BOOT2} 149 ${CP} ${DESTDIR}/usr/mdec/${BOOT2} cdrom/${BOOT2} 150 ${RM} -f bootxx.${MACHINE} 151 ${CP} ${DESTDIR}/usr/mdec/bootxx_cd9660 bootxx.${MACHINE} 152 ${CHMOD} +w bootxx.${MACHINE} 153.if defined(CDBOOTOPTIONS) 154 ${TOOL_INSTALLBOOT} -m${MACHINE} -e ${CDBOOTOPTIONS} bootxx.${MACHINE} 155.endif 156.endif 157.endif 158 159.if ${MAKEVERBOSE} >= 2 160PAX_v?= -v 161.else 162PAX_v?= 163.endif 164 165# Copy $RELEASEDIR/${MACHINE} in the CDROM dir 166# 167# XXX This could be done a lot easier if makefs(8) could 168# XXX include more than one directory on the image - HF 169# 170copy-releasedir: 171 ${RM} -f ${RELEASEDIR}/${CDROMS_RELEASEDIR}/${CDIMAGE} 172 if ${CDRELEASE}; then \ 173 if [ ! -d ${RELEASEDIR}/${RELEASEMACHINEDIR} ]; then \ 174 echo "Missing ${RELEASEDIR}/${RELEASEMACHINEDIR}, aborting"; \ 175 exit 1; \ 176 fi; \ 177 ${MKDIR} "${CUROBJDIR}/cdrom/${MACHINE}"; \ 178 release_destdir="${CUROBJDIR}/cdrom/${MACHINE}"; \ 179 cd ${RELEASEDIR}/${RELEASEMACHINEDIR}; \ 180 echo Copying $$(pwd) to $$release_destdir ...; \ 181 ${TOOL_PAX} \ 182 -rw -pe ${PAX_v} \ 183 ${CDRELEASE_EXCLUDE} \ 184 . $$release_destdir; \ 185 cd "${CUROBJDIR}"; \ 186 fi 187 if ${CDSOURCE}; then \ 188 if [ ! -d ${RELEASEDIR}/source ]; then \ 189 echo "Missing ${RELEASEDIR}/source, aborting"; \ 190 exit 1; \ 191 fi; \ 192 ${MKDIR} "${CUROBJDIR}/cdrom/source"; \ 193 release_destdir="${CUROBJDIR}/cdrom/source"; \ 194 cd ${RELEASEDIR}/source; \ 195 echo Copying $$(pwd) to $$release_destdir ...; \ 196 ${TOOL_PAX} \ 197 -rw -pe ${PAX_v} \ 198 . $$release_destdir; \ 199 cd "${CUROBJDIR}"; \ 200 fi 201 if [ "X${CDRUNTIME}" != "X" ]; then \ 202 release_destdir=$${curdir}/cdrom; \ 203 cd $$release_destdir; \ 204 cd ${DESTDIR}; \ 205 for cde in ${CDRUNTIME}; \ 206 do \ 207 ${TOOL_PAX} -rw -pp ${PAX_v} $${cde} $$release_destdir;\ 208 done; \ 209 cd "${CUROBJDIR}"; \ 210 fi 211 if [ "X${CDEXTRA}${CDBUILDEXTRA}" != "X" ]; then \ 212 skipflag=""; \ 213 cdextra_skip="${CDEXTRA_SKIP}"; \ 214 if [ "X$${cdextra_skip}" != "X" ]; then \ 215 rm -f cdskip; \ 216 for skip in $${cdextra_skip}; \ 217 do \ 218 echo $${skip} >> cdskip; \ 219 done; \ 220 skipflag="-X ${CUROBJDIR:Q}/cdskip"; \ 221 fi; \ 222 cdextra="${CDEXTRA}"; \ 223 cdbuildextra="${CDBUILDEXTRA}"; \ 224 for cde in $${cdextra} $${cdbuildextra}; \ 225 do \ 226 release_destdir="${CUROBJDIR}/cdrom"; \ 227 if [ -f $${cde} ]; then \ 228 echo Copying $${cde} to $$release_destdir ...; \ 229 ${CP} $${cde} $${release_destdir}; \ 230 elif [ -d $${cde} ]; then \ 231 cd $${cde}; \ 232 echo Copying $$(pwd) to $$release_destdir ...; \ 233 ${TOOL_MTREE} -c $${skipflag} | \ 234 ${TOOL_PAX} -rw -pe ${PAX_v} -M \ 235 $$release_destdir; \ 236 else \ 237 echo "Missing $${cde}, aborting"; \ 238 exit 1; \ 239 fi; \ 240 cd "${CUROBJDIR}"; \ 241 done; \ 242 fi 243.if !empty(CD_SETS) 244 ${MKDIR} "${CUROBJDIR}/cdrom/etc/mtree" 245.for set in ${CD_SETS} 246 if [ -f ${CUROBJDIR:Q}/cdrom/etc/mtree/set.${set} ]; then \ 247 ${CHMOD} +w ${CUROBJDIR:Q}/cdrom/etc/mtree/set.${set}; \ 248 fi; \ 249 ${CDSETSCMD} ./maketars -i "${CUROBJDIR}/cdrom" \ 250 ${CD_METALOG.unpriv} ${mtunpriv} -N ${NETBSDSRCDIR}/etc \ 251 -F "${CUROBJDIR}/cdrom/etc/mtree" \ 252 -d "${DESTDIR:S,^$,/,}" ${set} 253.endfor 254 if [ -d "${CUROBJDIR}/cdrom/var/spool/ftp/hidden" ]; then \ 255 ${CHMOD} +r "${CUROBJDIR}/cdrom/var/spool/ftp/hidden"; \ 256 fi 257.endif 258 259image: 260 @echo Preparing spec files for makefs... 261 ${RM} -f ${WORKSPEC} 262 if [ -d cdrom/etc/mtree ]; then \ 263 cat cdrom/etc/mtree/* | \ 264 ${TOOL_SED} -e 's/ size=[0-9]*//' \ 265 -e '/^\.\/etc\/gettytab/d' > ${WORKSPEC}; \ 266 fi 267 if [ -r cdrom/dev/MAKEDEV ]; then \ 268 ${HOST_SH} cdrom/dev/MAKEDEV -s init | \ 269 ${TOOL_SED} -e '/^\. type=dir/d' \ 270 -e 's,^\.,./dev,' >> ${WORKSPEC}; \ 271 fi 272.if defined(SPEC_IN) 273 cat ${SPEC_IN} >> ${WORKSPEC} 274.endif 275.if defined(SECONDARY_BOOT) 276 echo "./${SECONDARY_BOOT} type=file uname=root gname=wheel mode=0444" \ 277 >> ${WORKSPEC} 278.endif 279.if defined(SPEC_EXTRA) 280 cat ${SPEC_EXTRA} >> ${WORKSPEC} 281.endif 282 if [ -s ${WORKSPEC} ]; then specarg="-F ${WORKSPEC}"; fi; \ 283 ${TOOL_MAKEFS} -N ${NETBSDSRCDIR}/etc -t cd9660 $${specarg} \ 284 ${CDMAKEFSEXTRAOPTS} -o ${_CDMAKEFSOPTIONS:Q} ${CDIMAGE} cdrom 285 286.if ${CDRELEASE} == false 287release: prepare .WAIT prepare_md_post .WAIT copy-releasedir .WAIT image_md_pre .WAIT image .WAIT image_md_post 288 ${MKDIR} ${RELEASEDIR}/${CDROMS_RELEASEDIR} 289 ${RELEASE_INSTALL} ${CDIMAGE} ${RELEASEDIR}/${CDROMS_RELEASEDIR} 290 291iso_image: 292.else 293release: 294 295iso_image: prepare .WAIT prepare_md_post .WAIT copy-releasedir .WAIT image_md_pre .WAIT image .WAIT image_md_post 296 ${MKDIR} ${RELEASEDIR}/${CDROMS_RELEASEDIR} 297 ${RELEASE_INSTALL} ${CDIMAGE} ${RELEASEDIR}/${CDROMS_RELEASEDIR} 298.endif 299 300clean: 301 @if [ -d cdrom/var/spool/ftp/hidden ]; then \ 302 ${CHMOD} +r cdrom/var/spool/ftp/hidden; \ 303 fi # XXX 304 ${RM} -fr cdrom 305 306prepare_md_post: .PHONY 307image_md_post: .PHONY 308image_md_pre: .PHONY 309 310.include <bsd.prog.mk> 311