]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/conf/kmod.mk
Use makeobjops.awk rather than makeobjops.pl.
[FreeBSD/FreeBSD.git] / sys / conf / kmod.mk
1 #       From: @(#)bsd.prog.mk   5.26 (Berkeley) 6/25/91
2 # $FreeBSD$
3 #
4 # The include file <bsd.kmod.mk> handles installing Kernel Loadable Device
5 # drivers (KLD's).
6 #
7 #
8 # +++ variables +++
9 #
10 # CLEANFILES    Additional files to remove for the clean and cleandir targets.
11 #
12 # DISTRIBUTION  Name of distribution. [bin]
13 #
14 # KMOD          The name of the kernel module to build.
15 #
16 # KMODDIR       Base path for kernel modules (see kld(4)). [/boot/kernel]
17 #
18 # KMODOWN       KLD owner. [${BINOWN}]
19 #
20 # KMODGRP       KLD group. [${BINGRP}]
21 #
22 # KMODMODE      KLD mode. [${BINMODE}]
23 #
24 # LINKS         The list of KLD links; should be full pathnames, the
25 #               linked-to file coming first, followed by the linked
26 #               file.  The files are hard-linked.  For example, to link
27 #               /modules/master and /modules/meister, use:
28 #
29 #                       LINKS=  /modules/master /modules/meister
30 #
31 # KMODLOAD      Command to load a kernel module [/sbin/kldload]
32 #
33 # KMODUNLOAD    Command to unload a kernel module [/sbin/kldunload]
34 #
35 # PROG          The name of the kernel module to build.
36 #               If not supplied, ${KMOD}.o is used.
37 #
38 # SRCS          List of source files
39 #
40 # SUBDIR        A list of subdirectories that should be built as well.
41 #               Each of the targets will execute the same target in the
42 #               subdirectories.
43 #
44 # SYMLINKS      Same as LINKS, except it creates symlinks and the
45 #               linked-to pathname may be relative.
46 #
47 # DESTDIR, DISTDIR are set by other Makefiles (e.g. bsd.own.mk)
48 #
49 # MFILES        Optionally a list of interfaces used by the module.
50 #               This file contains a default list of interfaces.
51 #
52 # EXPORT_SYMS   A list of symbols that should be exported from the module,
53 #               or the name of a file containing a list of symbols, or YES
54 #               to export all symbols.  If not defined, no symbols are
55 #               exported.
56 #
57 # +++ targets +++
58 #
59 #       distribute:
60 #               This is a variant of install, which will
61 #               put the stuff into the right "distribution".
62 #
63 #       install:
64 #               install the kernel module; if the Makefile
65 #               does not itself define the target install, the targets
66 #               beforeinstall and afterinstall may also be used to cause
67 #               actions immediately before and after the install target
68 #               is executed.
69 #
70 #       load:
71 #               Load KLD.
72 #
73 #       unload:
74 #               Unload KLD.
75 #
76 # bsd.obj.mk: clean, cleandir and obj
77 # bsd.dep.mk: cleandepend, depend and tags
78 #
79
80 AWK?=           awk
81 KMODLOAD?=      /sbin/kldload
82 KMODUNLOAD?=    /sbin/kldunload
83 OBJCOPY?=       objcopy
84
85 .if defined(KMODDEPS)
86 .error "Do not use KMODDEPS on 5.0+, use MODULE_VERSION/MODULE_DEPEND"
87 .endif
88
89 .include <bsd.init.mk>
90
91 .SUFFIXES: .out .o .c .cc .cxx .C .y .l .s .S
92
93 CFLAGS+=        ${COPTS} -D_KERNEL ${CWARNFLAGS}
94 CFLAGS+=        -DKLD_MODULE
95
96 # Don't use any standard or source-relative include directories.
97 # Since -nostdinc will annull any previous -I paths, we repeat all
98 # such paths after -nostdinc.  It doesn't seem to be possible to
99 # add to the front of `make' variable.
100 _ICFLAGS:=      ${CFLAGS:M-I*}
101 CFLAGS+=        -nostdinc -I- ${INCLMAGIC} ${_ICFLAGS}
102
103 # Add -I paths for system headers.  Individual KLD makefiles don't
104 # need any -I paths for this.  Similar defaults for .PATH can't be
105 # set because there are no standard paths for non-headers.
106 CFLAGS+=        -I. -I@ -I@/dev
107
108 # Add a -I path to standard headers like <stddef.h>.  Use a relative
109 # path to src/include if possible.  If the @ symlink hasn't been built
110 # yet, then we can't tell if the relative path exists.  Add both the
111 # potential relative path and an absolute path in that case.
112 .if exists(@)
113 .if exists(@/../include)
114 CFLAGS+=        -I@/../include
115 .else
116 CFLAGS+=        -I${DESTDIR}/usr/include
117 .endif
118 .else # !@
119 CFLAGS+=        -I@/../include -I${DESTDIR}/usr/include
120 .endif # @
121
122 # Disallow common variables, and if we end up with commons from
123 # somewhere unexpected, allocate storage for them in the module itself.
124 CFLAGS+=        -fno-common
125 LDFLAGS+=       -d -warn-common
126
127 CFLAGS+=        ${DEBUG_FLAGS}
128
129 .if ${OBJFORMAT} == elf
130 CLEANFILES+=    setdef0.c setdef1.c setdefs.h
131 CLEANFILES+=    setdef0.o setdef1.o
132 .endif
133
134 OBJS+=  ${SRCS:N*.h:R:S/$/.o/g}
135
136 .if !defined(PROG)
137 PROG=   ${KMOD}.ko
138 .endif
139
140 .if !defined(DEBUG)
141 FULLPROG=       ${PROG}
142 .else
143 FULLPROG=       ${PROG}.debug
144 ${PROG}: ${FULLPROG}
145         ${OBJCOPY} --strip-debug ${FULLPROG} ${PROG}
146 .endif
147
148 ${FULLPROG}: ${KMOD}.kld
149         ${LD} -Bshareable ${LDFLAGS} -o ${.TARGET} ${KMOD}.kld
150
151 EXPORT_SYMS?=   NO
152 .if ${EXPORT_SYMS} != YES
153 CLEANFILES+=    ${.OBJDIR}/export_syms
154 .endif
155
156 ${KMOD}.kld: ${OBJS}
157         ${LD} ${LDFLAGS} -r -d -o ${.TARGET} ${OBJS}
158 .if defined(EXPORT_SYMS)
159 .if ${EXPORT_SYMS} != YES
160 .if ${EXPORT_SYMS} == NO
161         touch ${.OBJDIR}/export_syms
162 .elif !exists(${.CURDIR}/${EXPORT_SYMS})
163         echo ${EXPORT_SYMS} > ${.OBJDIR}/export_syms
164 .else
165         grep -v '^#' < ${EXPORT_SYMS} >  ${.OBJDIR}/export_syms
166 .endif
167         awk -f ${SYSDIR}/conf/kmod_syms.awk ${.TARGET} \
168                 ${.OBJDIR}/export_syms | \
169         xargs -J% ${OBJCOPY} % ${.TARGET}
170 .endif
171 .endif
172
173
174 _ILINKS=@ machine
175
176 all: objwarn ${PROG}
177
178 beforedepend: ${_ILINKS}
179         @rm -f .depend
180
181 # Ensure that the links exist without depending on it when it exists which
182 # causes all the modules to be rebuilt when the directory pointed to changes.
183 .for _link in ${_ILINKS}
184 .if !exists(${.OBJDIR}/${_link})
185 ${OBJS}: ${_link}
186 .endif
187 .endfor
188
189 # Search for kernel source tree in standard places.
190 .for _dir in ${.CURDIR}/../.. ${.CURDIR}/../../.. /sys /usr/src/sys
191 .if !defined(SYSDIR) && exists(${_dir}/kern/)
192 SYSDIR= ${_dir}
193 .endif
194 .endfor
195 .if !defined(SYSDIR) || !exists(${SYSDIR}/kern)
196 .error "can't find kernel source tree"
197 .endif
198
199 ${_ILINKS}:
200         @case ${.TARGET} in \
201         machine) \
202                 path=${SYSDIR}/${MACHINE_ARCH}/include ;; \
203         @) \
204                 path=${SYSDIR} ;; \
205         esac ; \
206         path=`(cd $$path && /bin/pwd)` ; \
207         ${ECHO} ${.TARGET} "->" $$path ; \
208         ln -s $$path ${.TARGET}
209
210 CLEANFILES+= ${PROG} ${FULLPROG} ${KMOD}.kld ${OBJS} ${_ILINKS} symb.tmp tmp.o
211
212 .if !target(install)
213 .if !target(beforeinstall)
214 beforeinstall:
215 .endif
216 .if !target(afterinstall)
217 afterinstall:
218 .endif
219
220 _INSTALLFLAGS:= ${INSTALLFLAGS}
221 .for ie in ${INSTALLFLAGS_EDIT}
222 _INSTALLFLAGS:= ${_INSTALLFLAGS${ie}}
223 .endfor
224
225 .if defined(DEBUG)
226 install.debug:
227         cd ${.CURDIR}; ${MAKE} -DINSTALL_DEBUG install
228 .endif
229
230 realinstall:
231 .if defined(DEBUG) && defined(INSTALL_DEBUG)
232         ${INSTALL} ${COPY} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \
233             ${_INSTALLFLAGS} ${FULLPROG} ${DESTDIR}${KMODDIR}/
234 .else
235         ${INSTALL} ${COPY} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \
236             ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${KMODDIR}/
237 .if defined(LINKS) && !empty(LINKS)
238         @set ${LINKS}; \
239         while test $$# -ge 2; do \
240                 l=${DESTDIR}$$1; \
241                 shift; \
242                 t=${DESTDIR}$$1; \
243                 shift; \
244                 ${ECHO} $$t -\> $$l; \
245                 ln -f $$l $$t; \
246         done; true
247 .endif
248 .if defined(SYMLINKS) && !empty(SYMLINKS)
249         @set ${SYMLINKS}; \
250         while test $$# -ge 2; do \
251                 l=$$1; \
252                 shift; \
253                 t=${DESTDIR}$$1; \
254                 shift; \
255                 ${ECHO} $$t -\> $$l; \
256                 ln -fs $$l $$t; \
257         done; true
258 .endif
259 .if !defined(NO_XREF)
260         @echo "FAILURES HERE ARE OK"
261         -kldxref ${DESTDIR}${KMODDIR}
262         @echo "END OF SECTION WHERE FAILURES ARE OK"
263 .endif
264 .endif
265
266 install: afterinstall
267 afterinstall: realinstall
268 realinstall: beforeinstall
269 .endif
270
271 DISTRIBUTION?=  bin
272 .if !target(distribute)
273 distribute:
274 .for dist in ${DISTRIBUTION}
275         cd ${.CURDIR} ; $(MAKE) install DESTDIR=${DISTDIR}/${dist} SHARED=copies
276 .endfor
277 .endif
278
279 .if !target(load)
280 load:   ${PROG}
281         ${KMODLOAD} -v ${.CURDIR}/${KMOD}.ko
282 .endif
283
284 .if !target(unload)
285 unload:
286         ${KMODUNLOAD} -v ${KMOD}
287 .endif
288
289 .for _src in ${SRCS:Mopt_*.h}
290 CLEANFILES+=    ${_src}
291 .if !target(${_src})
292 ${_src}:
293         touch ${.TARGET}
294 .endif
295 .endfor
296
297 MFILES?= kern/bus_if.m kern/device_if.m dev/iicbus/iicbb_if.m \
298     dev/iicbus/iicbus_if.m isa/isa_if.m \
299     libkern/iconv_converter_if.m \
300     dev/mii/miibus_if.m \
301     dev/pccard/card_if.m dev/pccard/power_if.m dev/pci/pci_if.m \
302     dev/pci/pcib_if.m dev/ppbus/ppbus_if.m dev/smbus/smbus_if.m \
303     dev/usb/usb_if.m dev/sound/pcm/ac97_if.m dev/sound/pcm/channel_if.m \
304     dev/sound/pcm/feeder_if.m dev/sound/pcm/mixer_if.m pci/agp_if.m
305
306 .for _srcsrc in ${MFILES}
307 .for _ext in c h
308 .for _src in ${SRCS:M${_srcsrc:T:R}.${_ext}}
309 CLEANFILES+=    ${_src}
310 .if !target(${_src})
311 .if !exists(@)
312 ${_src}: @
313 .endif
314 .if exists(@)
315 ${_src}: @/tools/makeobjops.awk @/${_srcsrc}
316 .endif
317         ${AWK} -f @/tools/makeobjops.awk @/${_srcsrc} -${_ext}
318 .endif
319 .endfor # _src
320 .endfor # _ext
321 .endfor # _srcsrc
322
323 .for _ext in c h
324 .if ${SRCS:Mvnode_if.${_ext}} != ""
325 CLEANFILES+=    vnode_if.${_ext}
326 .if !exists(@)
327 vnode_if.${_ext}: @
328 .endif
329 .if exists(@)
330 vnode_if.${_ext}: @/tools/vnode_if.awk @/kern/vnode_if.src
331 .endif
332         ${AWK} -f @/tools/vnode_if.awk @/kern/vnode_if.src -${_ext}
333 .endif
334 .endfor
335
336 regress:
337
338 lint: ${SRCS}
339         ${LINT} ${LINTKERNFLAGS} ${CFLAGS:M-[DILU]*} ${.ALLSRC:M*.c}
340
341 .include <bsd.dep.mk>
342
343 .if !exists(${DEPENDFILE})
344 ${OBJS}: ${SRCS:M*.h}
345 .endif
346
347 .include <bsd.obj.mk>
348
349 .include <bsd.kern.mk>