summaryrefslogtreecommitdiff
path: root/distrib/common/Makefile.image
blob: aaec31041567cc901743efbd3f763a609ad52ee4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#	$NetBSD: Makefile.image,v 1.38 2014/08/12 11:48:22 martin Exp $
#
# Makefile snippet to build a tree from the provided lists,
# and make an ffs file system image from that tree
#
# Required variables:
#	NETBSDSRCDIR	top level of src tree (set by <bsd.own.mk>)
#	LISTS		list file(s) to use
#	IMAGEDEPENDS	depends for ${IMAGE}
#	IMAGEENDIAN	endianness of ${IMAGE}
#	IMAGESIZE	size of ${IMAGE}
#	MTREECONF	mtree specfiles to use to build a master specfile
#
# Optional variables:
#	IMAGE		name of target image
#	IMAGEPREBUILD	additional operations to run pre image creation
#	IMAGEPOSTBUILD	operation to run on ${IMAGE} ${.TARGET} after its built
#			(if this returns non zero, ${.TARGET} is removed)
#	CRUNCHBIN	name of crunchgen(1)ed binary
#	DESTDIR		destination directory
#	MAKEFS_FLAGS	extra options to ${TOOL_MAKEFS}
#	PARSELISTENV	environment variables to set for parselist.awk
#	WORKDIR		directory to build image in to 
#	IMAGETAR	tar.gz file to create containing ${IMAGE}'s contents
#
#	IMAGE_RELEASEDIR	where to install ${IMAGE}.gz
#	IMAGETAR_RELEASEDIR	where to install ${IMAGETAR}
#

.if !defined(_MAKEFILE_IMAGE_)
_MAKEFILE_IMAGE_=1


WORKDIR?=	work
WORKSPEC?=	work.spec
WORKBUILT?=	work.built

.include "${DISTRIBDIR}/common/Makefile.parselist"

PARSELISTENV+=	TARGETDIR=${.OBJDIR}/${WORKDIR:Q}

GZIP_FLAGS= -9 ${GZIP_N_FLAG}

.if !target(${WORKBUILT})					# {
${WORKBUILT}: ${IMAGEDEPENDS} ${WORKSPEC} ${PARSELISTDEP} ${LISTS}
#	There is a .PHONY ${CRUNCHBIN}, so check if out of date by hand
#	Default to `.' if ${CRUNCHBIN} isn't set, to always force a rebuild.
	[ "${.OODATE}" = ${CRUNCHBIN:U.} -a -f ${WORKBUILT} -a ${WORKBUILT} -nt ${CRUNCHBIN:U.} ]  || { \
	${_MKSHMSG} "  build " ${.CURDIR:T}/${WORKDIR}; \
	rm -rf ${WORKDIR} ${WORKBUILT}; \
	mkdir -m 755 ${WORKDIR} &&  \
	${TOOL_MTREE} -def ${WORKSPEC} -p ${WORKDIR}/ -UW && \
	${PARSELIST} -v mode=populate ${LISTS} | \
	${HOST_SH} -e ${POPULATE_DEBUG} \
	&& touch ${WORKBUILT} ; \
	}

CLEANFILES+=	${WORKBUILT}

clean cleandir distclean: cleanfsimage

.PHONY: cleanfsimage

cleanfsimage:
	-rm -rf ${WORKDIR} ${WORKBUILT}

.endif	# ! target (${WORKBUILT})				# }

.if !target(${WORKSPEC})					# {
${WORKSPEC}: ${MTREECONF} ${LISTS} ${PARSELISTDEP}
	${_MKTARGET_CREATE}
	-rm -f ${.TARGET} ${.TARGET}.tmp
	( for i in ${MTREECONF}; do	\
		echo "# --" ; \
		echo "# entries from: $$i" ; \
		echo "#" ; \
		cat $$i ;		\
		echo "/unset all" ;	\
	done ) >> ${.TARGET}.tmp
	${PARSELIST} -v mode=mtree ${LISTS} >> ${.TARGET}.tmp \
	&& mv ${.TARGET}.tmp ${.TARGET}

CLEANFILES+=	${WORKSPEC} ${WORKSPEC}.tmp
.endif	# ! target (${WORKSPEC})				# }

.if defined(IMAGE)						# {
IMGMAKEFSOPTIONS?= -o bsize=4096,fsize=512
${IMAGE}: ${WORKBUILT}
.if defined(IMAGEPREBUILD)
	${IMAGEPREBUILD}
.endif
	[ "${.OODATE}" = ${WORKBUILT} -a -f ${IMAGE} -a ! ${IMAGE} -ot ${WORKBUILT} ]  || { \
	${_MKSHMSG_CREATE} ${.CURDIR:T}/${.TARGET}; \
	rm -f ${.TARGET} ${.TARGET}.tmp; \
	${TOOL_MAKEFS} -t ffs -B ${IMAGEENDIAN} -s ${IMAGESIZE} -F ${WORKSPEC} \
	    -N ${NETBSDSRCDIR}/etc ${IMGMAKEFSOPTIONS} \
	    -o optimization=space,minfree=0 \
	    ${MAKEFS_FLAGS} ${.TARGET}.tmp ${WORKDIR} \
	&& mv -f ${.TARGET}.tmp ${.TARGET}; \
	}
.if defined(IMAGEPOSTBUILD)
	${IMAGEPOSTBUILD} || { rm -f ${.TARGET} ; false; }
.endif

.PHONY: fsimage
fsimage: ${IMAGE}

${IMAGE}.gz: ${IMAGE}
	${_MKTARGET_CREATE}
	-rm -f ${.TARGET}
	${TOOL_GZIP} ${GZIP_FLAGS} -c ${.ALLSRC} > ${.TARGET}

realall: ${IMAGE}

.if defined(IMAGE_RELEASEDIR)
release:: check_RELEASEDIR .WAIT ${IMAGE}.gz
	${RELEASE_INSTALL} ${IMAGE}.gz \
	    ${RELEASEDIR}/${RELEASEMACHINEDIR}/${IMAGE_RELEASEDIR}
.endif

CLEANFILES+=	${IMAGE} ${IMAGE}.gz ${IMAGE}.tmp
.endif	# ! defined(IMAGE)					# }


.if defined(IMAGETAR)						# {
${IMAGETAR}: ${WORKBUILT} ${WORKSPEC} ${IMAGEDEPENDS}
	${_MKTARGET_CREATE}
	( cd ${WORKDIR}; \
	  GZIP=${GZIP_FLAGS:Q} \
	  ${TOOL_PAX} --use-compress-program=${TOOL_GZIP:Q} \
	      -ON ${NETBSDSRCDIR}/etc -wdM <${.OBJDIR}/${WORKSPEC} \
	) > ${.TARGET}.tmp \
	&& mv ${.TARGET}.tmp ${.TARGET}

realall: ${IMAGETAR}

CLEANFILES+=	${IMAGETAR} ${IMAGETAR}.tmp

.if defined(IMAGETAR_RELEASEDIR)
release:: check_RELEASEDIR .WAIT ${IMAGETAR}
	${RELEASE_INSTALL} ${IMAGETAR} \
	    ${RELEASEDIR}/${RELEASEMACHINEDIR}/${IMAGETAR_RELEASEDIR}
.endif

.endif	# ! defined(IMAGETAR)					# }


.endif	# _MAKEFILE_IMAGE_