1# $NetBSD: Makefile.image,v 1.25 2003/07/10 10:34:04 lukem Exp $ 2# 3# Makefile snippet to build a tree from the provided lists, 4# and make an ffs file system image from that tree 5# 6# Required variables: 7# NETBSDSRCDIR top level of src tree (set by <bsd.own.mk>) 8# CRUNCHBIN name of crunchgen(1)ed binary 9# LISTS list file(s) to use 10# IMAGEDEPENDS depends for ${IMAGE} 11# IMAGEENDIAN endianness of ${IMAGE} 12# IMAGESIZE size of ${IMAGE} 13# MTREECONF mtree specfiles to use to build a master specfile 14# 15# Optional variables: 16# IMAGE name of target image 17# IMAGEPOSTBUILD operation to run on ${IMAGE} ${.TARGET} after its built 18# (if this returns non zero, ${.TARGET} is removed) 19# DESTDIR destination directory 20# MAKEFS_FLAGS extra options to ${TOOL_MAKEFS} 21# PARSELISTENV environment variables to set for parselist.awk 22# WORKDIR directory to build image in to 23# IMAGETAR tar.gz file to create containing ${IMAGE}'s contents 24# 25# IMAGE_RELEASEDIR where to install ${IMAGE}.gz 26# IMAGETAR_RELEASEDIR where to install ${IMAGETAR} 27# 28 29.if !defined(_MAKEFILE_IMAGE_) 30_MAKEFILE_IMAGE_=1 31 32 33WORKDIR?= work 34WORKSPEC?= work.spec 35WORKBUILT?= work.built 36 37.include "${DISTRIBDIR}/common/Makefile.parselist" 38 39PARSELISTENV+= TARGETDIR=${.OBJDIR}/${WORKDIR:Q} 40 41 42.if !target(${WORKBUILT}) # { 43${WORKBUILT}: ${IMAGEDEPENDS} ${WORKSPEC} ${PARSELISTDEP} ${LISTS} 44 @# There is a .PHONY ${CRUNCHBIN}, so check if out of date by hand 45 [ "${.OODATE}" = ${CRUNCHBIN} -a -f ${WORKBUILT} -a ${WORKBUILT} -nt ${CRUNCHBIN} ] || { \ 46 echo "Building tree into ${WORKDIR}"; \ 47 rm -rf ${WORKDIR} ${WORKBUILT}; \ 48 mkdir -m 755 ${WORKDIR} && \ 49 ${TOOL_MTREE} -def ${WORKSPEC} -p ${WORKDIR}/ -UW && \ 50 ${PARSELIST} -v mode=populate ${LISTS} | \ 51 sh -e ${POPULATE_DEBUG} \ 52 && touch ${WORKBUILT} ; \ 53 } 54 55CLEANFILES+= ${WORKBUILT} 56 57clean cleandir distclean: cleanfsimage 58 59.PHONY: cleanfsimage 60 61cleanfsimage: 62 -rm -rf ${WORKDIR} 63 64.endif # ! target (${WORKBUILT}) # } 65 66.if !target(${WORKSPEC}) # { 67${WORKSPEC}: ${MTREECONF} ${LISTS} ${PARSELISTDEP} 68 -rm -f ${.TARGET} ${.TARGET}.tmp 69 ( for i in ${MTREECONF}; do \ 70 cat $$i ; \ 71 echo "/unset all" ; \ 72 done ) >> ${.TARGET}.tmp 73 ${PARSELIST} -v mode=mtree ${LISTS} >> ${.TARGET}.tmp \ 74 && mv ${.TARGET}.tmp ${.TARGET} 75 76CLEANFILES+= ${WORKSPEC} ${WORKSPEC}.tmp 77.endif # ! target (${WORKSPEC}) # } 78 79.if defined(IMAGE) # { 80${IMAGE}: ${WORKBUILT} 81 [ "${.OODATE}" = ${WORKBUILT} -a -f ${IMAGE} -a ! ${IMAGE} -ot ${WORKBUILT} ] || { \ 82 echo "Creating image into ${.TARGET}..."; \ 83 rm -f ${.TARGET} ${.TARGET}.tmp; \ 84 ${TOOL_MAKEFS} -t ffs -B ${IMAGEENDIAN} -s ${IMAGESIZE} -F ${WORKSPEC} \ 85 -N ${NETBSDSRCDIR}/etc -o bsize=4096,fsize=512 \ 86 -o optimization=space,minfree=0 \ 87 ${MAKEFS_FLAGS} ${.TARGET}.tmp ${WORKDIR} \ 88 && mv -f ${.TARGET}.tmp ${.TARGET}; \ 89 } 90.if defined(IMAGEPOSTBUILD) 91 ${IMAGEPOSTBUILD} || { rm -f ${.TARGET} ; false; } 92.endif 93 94${IMAGE}.gz: ${IMAGE} 95 -rm -f ${.TARGET} 96 gzip -9c ${.ALLSRC} > ${.TARGET} 97 98realall: ${IMAGE} 99 100.if defined(IMAGE_RELEASEDIR) 101release:: check_RELEASEDIR .WAIT ${IMAGE}.gz 102 ${RELEASE_INSTALL} ${IMAGE}.gz \ 103 ${RELEASEDIR}/${MACHINE}/${IMAGE_RELEASEDIR} 104.endif 105 106CLEANFILES+= ${IMAGE} ${IMAGE}.gz ${IMAGE}.tmp 107.endif # ! defined(IMAGE) # } 108 109 110.if defined(IMAGETAR) # { 111${IMAGETAR}: ${WORKBUILT} ${WORKSPEC} ${IMAGEDEPENDS} 112 ( cd ${WORKDIR}; \ 113 GZIP=-9 ${TOOL_PAX} -ON ${NETBSDSRCDIR}/etc -wdzM <${.OBJDIR}/${WORKSPEC} \ 114 ) > ${.TARGET}.tmp \ 115 && mv ${.TARGET}.tmp ${.TARGET} 116 117realall: ${IMAGETAR} 118 119CLEANFILES+= ${IMAGETAR} ${IMAGETAR}.tmp 120 121.if defined(IMAGETAR_RELEASEDIR) 122release:: check_RELEASEDIR .WAIT ${IMAGETAR} 123 ${RELEASE_INSTALL} ${IMAGETAR} \ 124 ${RELEASEDIR}/${MACHINE}/${IMAGETAR_RELEASEDIR} 125.endif 126 127.endif # ! defined(IMAGETAR) # } 128 129 130.endif # _MAKEFILE_IMAGE_ 131