1#         $NetBSD: Makefile.mdset,v 1.47 2024/04/23 21:58:57 christos Exp $
2#
3# Makefile snippet to ${TOOL_MDSETIMAGE} file system images into kernels
4#
5
6#
7# Required variables:
8#         NETBSDSRCDIR        Top level of src tree (set by <bsd.own.mk>)
9#         MDSETTARGETS        List of images to ${TOOL_MDSETIMAGE} into kernels,
10#                             containing one or more tuples of the form:
11#                                       KERNEL    IMAGE     FILENAME
12#
13#                             The kernel is ${TOOL_MDSETIMAGE} with ${IMAGE},
14#                             ${STRIP}ped (after the symbols are stored in
15#                             ${FILENAME}.symbols.gz), and gzipped into
16#                             ${FILENAME}.gz.
17#
18#                             If KERNEL does not contain a `/', use
19#                             ${KERNOBJDIR}/KERNEL/netbsd as the kernel.
20#
21#                             If FILENAME is "-", use "netbsd-${KERNEL}" as
22#                             the target name.  This may not be a sensible
23#                             name if KERNEL contains a `/'.
24#
25# Optional variables:
26#         MDSET_RELEASEDIR              Where to install release kernels.
27#
28#         MDSET_NOGZIP                            If defined, don't gzip any kernels.
29#
30#         MDSET_NOGZIP.${FILENAME}      If defined, don't gzip ${FILENAME}
31#
32#         MDSET_NOIMAGE.${FILENAME}     If defined, don't add ${IMAGE} to
33#                                                 ${FILENAME}
34#
35#         MDSET_NOSTRIP                           If defined, don't strip any kernels.
36#
37#         MDSET_NOSTRIP.${FILENAME}     If defined, don't strip ${FILENAME}
38#
39#         MDSET_NOSYMBOLS                         If defined, don't generate *.symbols.gz
40#
41#         MDSET_NOSYMBOLS.${FILENAME}   If defined, don't generate
42#                                                 ${FILENAME}.symbols.gz
43#
44#         MDSET_POST                              For each kernel,
45#                                                 execute this after ${NM} / ${STRIP}.
46#                                                 Kernel is available as "${.TARGET}"
47#
48#         MDSET_POST.${FILENAME}                  For each kernel named ${FILENAME},
49#                                                 execute this after ${NM} / ${STRIP}.
50#                                                 Kernel is available as "${.TARGET}"
51#
52#         MDSET_SUFFIXES.${FILENAME}    List of extra install kernel suffixes
53#                                                 and build commands to create from
54#                                                 ${FILENAME} after its created by
55#                                                 ${TOOL_MDSETIMAGE} ; ${NM} ; ${STRIP}:
56#                                                           SUFFIX    COMMANDVAR
57#                                                 "${.TARGET}" is "${FILENAME}.${SUFFIX}"
58#                                                 COMMANDVAR is the name of the variable
59#                                                 containing the command to build
60#                                                 ${.TARGET}.
61#
62# Variables modified by this:
63#         KERNELS                       List of kernel .gz files to build
64#         KERNELSYMS                    List of kernel .symbol.gz files to build
65#
66
67.if !defined(_MAKEFILE_MDSET_)
68_MAKEFILE_MDSET_=1
69
70.include <bsd.kernobj.mk>
71
72# The default is to build for all MDSETTARGETS
73ALL_KERNELS?= +
74
75.for _K _I _F in ${MDSETTARGETS}                            # {
76.for currentsel in ${ALL_KERNELS}                           # {
77.if ${currentsel} == "+" || ${_K} == ${currentsel}
78
79_KERNEL:=${_K}                          # (work around obscure issue in make(1))
80.if (${_KERNEL:M*/*} != "")
81_KERNNAME.${_K}.${_F}:=       ${_K}
82.else
83_KERNNAME.${_K}.${_F}:=       ${KERNOBJDIR}/${_K}/netbsd
84.endif
85
86_FILENAME:=${_F}              # (work around obscure issue in make(1))
87.if ${_FILENAME} == "-"
88_KERNEL.${_K}.${_F}:=         netbsd-${_K}
89_FILENAME:=                   ${_KERNEL.${_K}.${_F}}
90.else
91_KERNEL.${_K}.${_F}:=         ${_F}
92.endif
93
94.for _S _C in ${MDSET_SUFFIXES.${_F}}             # {
95CLEANFILES+=        ${_KERNEL.${_K}.${_F}}.${_S}
96
97${_KERNEL.${_K}.${_F}}.${_S}: ${_KERNEL.${_K}.${_F}} ${MDSET_.${_K}.${_F}.${_S}.deps}
98.if defined(${_C})
99          ${${_C}}
100.else
101          @echo "No such variable \"${_C}\""
102          false
103.endif
104
105.if defined(MDSET_NOGZIP.${_FILENAME}) || defined(MDSET_NOGZIP)
106KERNELS+= ${_KERNEL.${_K}.${_F}}.${_S}
107.else                                                                 # {
108KERNELS+= ${_KERNEL.${_K}.${_F}}.${_S}.gz
109
110${_KERNEL.${_K}.${_F}}.${_S}.gz: ${_KERNEL.${_K}.${_F}}.${_S}
111          ${_MKTARGET_CREATE}
112          -rm -f ${.TARGET}
113          ${TOOL_GZIP_N} -9c ${.ALLSRC} > ${.TARGET}
114.endif                                                                # }
115
116.endfor                                                               # }
117
118.if !defined(MDSET_NOSYMBOLS.${_FILENAME}) && !defined(MDSET_NOSYMBOLS)
119KERNELSYMS+=        ${_KERNEL.${_K}.${_F}}.symbols.gz
120.endif
121
122.if defined(MDSET_POST.${_FILENAME})
123_POST.${_KERNEL.${_K}.${_F}}:= ${MDSET_POST.${_FILENAME}}
124.elif defined(MDSET_POST)
125_POST.${_KERNEL.${_K}.${_F}}:= ${MDSET_POST}
126.endif
127
128CLEANFILES+=        ${_KERNEL.${_K}.${_F}} ${_KERNEL.${_K}.${_F}}.tmp
129
130.if defined(MDSET_NOIMAGE.${_FILENAME})
131${_I}=
132.endif
133
134# Darwin requires a special hack - this is documented in
135# doc/HACKS, and just works around the problems described more
136# fully in http://mail-index.netbsd.org/current-users/2008/06/27/msg003242.html
137OPSYS!= uname -s
138.if ${OPSYS} == "Darwin"
139MDSETIMAGEFLAGS=
140.else
141MDSETIMAGEFLAGS=-v
142.endif
143
144${_KERNEL.${_K}.${_F}}: .NOTMAIN ${_KERNNAME.${_K}.${_F}} ${_I}
145          ${_MKTARGET_CREATE} "(from: ${.ALLSRC})"
146          @rm -f ${.TARGET} ${.TARGET}.tmp ${.TARGET}.symbols.gz
147          @cp ${_KERNNAME.${_K}.${_F}} ${.TARGET}.tmp
148.if !defined(MDSET_NOIMAGE.${_FILENAME})
149          ${TOOL_MDSETIMAGE} ${MDSETIMAGEFLAGS} ${.TARGET}.tmp ${_I}
150.endif
151.if !defined(MDSET_NOSYMBOLS.${_FILENAME}) && !defined(MDSET_NOSYMBOLS)
152          ${NM} ${.TARGET}.tmp | LC_ALL=C sort | ${TOOL_GZIP_N} -9 > ${.TARGET}.symbols.gz
153.endif
154.if !defined(MDSET_NOSTRIP.${_FILENAME}) && !defined(MDSET_NOSTRIP)
155          ${STRIP} -R .eh_frame -R .eh_frame_hdr -R .comment -R .ident ${MDSET_STRIPSECTIONS} ${.TARGET}.tmp
156.endif
157          @mv ${.TARGET}.tmp ${.TARGET}
158.if defined(MDSET_POST.${_FILENAME}) || defined(MDSET_POST)
159          ${_POST.${.TARGET}}
160.endif
161
162.if defined(MDSET_NOGZIP.${_FILENAME}) || defined(MDSET_NOGZIP)
163KERNELS+= ${_KERNEL.${_K}.${_F}}
164.else                                                                 # {
165KERNELS+= ${_KERNEL.${_K}.${_F}}.gz
166
167${_KERNEL.${_K}.${_F}}.gz: ${_KERNEL.${_K}.${_F}}
168          ${_MKTARGET_CREATE}
169          -rm -f ${.TARGET}
170          ${TOOL_GZIP_N} -9c ${.ALLSRC} > ${.TARGET}
171.endif                                                                # }
172
173.endif
174.endfor                                                               # }
175.endfor                                                               # }
176
177CLEANFILES+=        ${KERNELS} ${KERNELSYMS}
178
179realall: ${KERNELS}
180
181.if defined(MDSET_RELEASEDIR)
182release:: check_RELEASEDIR .WAIT ${KERNELS}
183          test -z "${KERNELS}" || \
184          ${RELEASE_INSTALL} ${KERNELS} ${KERNELSYMS} \
185              ${RELEASEDIR}/${RELEASEMACHINEDIR}/${MDSET_RELEASEDIR}
186.endif
187
188
189.endif    # _MAKEFILE_MDSET_
190