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_
|