kmod.mk revision 269540
11553Srgrimes#	From: @(#)bsd.prog.mk	5.26 (Berkeley) 6/25/91
21553Srgrimes# $FreeBSD: head/sys/conf/kmod.mk 269540 2014-08-04 22:37:02Z imp $
31553Srgrimes#
41553Srgrimes# The include file <bsd.kmod.mk> handles building and installing loadable
51553Srgrimes# kernel modules.
61553Srgrimes#
71553Srgrimes#
81553Srgrimes# +++ variables +++
91553Srgrimes#
101553Srgrimes# CLEANFILES	Additional files to remove for the clean and cleandir targets.
111553Srgrimes#
121553Srgrimes# EXPORT_SYMS	A list of symbols that should be exported from the module,
131553Srgrimes#		or the name of a file containing a list of symbols, or YES
141553Srgrimes#		to export all symbols.  If not defined, no symbols are
151553Srgrimes#		exported.
161553Srgrimes#
171553Srgrimes# KMOD		The name of the kernel module to build.
181553Srgrimes#
191553Srgrimes# KMODDIR	Base path for kernel modules (see kld(4)). [/boot/kernel]
201553Srgrimes#
211553Srgrimes# KMODOWN	Module file owner. [${BINOWN}]
221553Srgrimes#
231553Srgrimes# KMODGRP	Module file group. [${BINGRP}]
241553Srgrimes#
251553Srgrimes# KMODMODE	Module file mode. [${BINMODE}]
261553Srgrimes#
271553Srgrimes# KMODLOAD	Command to load a kernel module [/sbin/kldload]
283037Swollman#
2950476Speter# KMODUNLOAD	Command to unload a kernel module [/sbin/kldunload]
301553Srgrimes#
31244198Sdelphij# MFILES	Optionally a list of interfaces used by the module.
321553Srgrimes#		This file contains a default list of interfaces.
331553Srgrimes#
341553Srgrimes# PROG		The name of the kernel module to build.
351553Srgrimes#		If not supplied, ${KMOD}.ko is used.
361553Srgrimes#
371553Srgrimes# SRCS		List of source files.
3868960Sru#
39244106Salfred# FIRMWS	List of firmware images in format filename:shortname:version
40244198Sdelphij#
4177330Sdes# FIRMWARE_LICENSE
4277330Sdes#		Set to the name of the license the user has to agree on in
4368960Sru#		order to use this firmware. See /usr/share/doc/legal
44244106Salfred#
4577330Sdes# DESTDIR	The tree where the module gets installed. [not set]
461553Srgrimes#
471553Srgrimes# +++ targets +++
4830602Scharnier#
4977330Sdes# 	install:
5077330Sdes#               install the kernel module; if the Makefile
5179314Sru#               does not itself define the target install, the targets
5279314Sru#               beforeinstall and afterinstall may also be used to cause
5379314Sru#               actions immediately before and after the install target
5479314Sru#		is executed.
5577330Sdes#
5612946Sphk# 	load:
5730602Scharnier#		Load a module.
5830602Scharnier#
5930602Scharnier# 	unload:
6077330Sdes#		Unload a module.
6179314Sru#
6277330Sdes
6377330SdesAWK?=		awk
6477330SdesKMODLOAD?=	/sbin/kldload
6577330SdesKMODUNLOAD?=	/sbin/kldunload
6677330SdesOBJCOPY?=	objcopy
6777374Sdd
6877374Sdd.include <bsd.init.mk>
6977374Sdd# Grab all the options for a kernel build. For backwards compat, we need to
7077374Sdd# do this after bsd.own.mk.
7188006Sluigi.include "kern.opts.mk"
7288006Sluigi.include <bsd.compiler.mk>
7385747Stobez
7485769Stobez.SUFFIXES: .out .o .c .cc .cxx .C .y .l .s .S
7585769Stobez
7685747Stobez# amd64 and mips use direct linking for kmod, all others use shared binaries
7785747Stobez.if ${MACHINE_CPUARCH} != amd64 && ${MACHINE_CPUARCH} != mips
7885747Stobez__KLD_SHARED=yes
7985747Stobez.else
8085747Stobez__KLD_SHARED=no
8185747Stobez.endif
8285747Stobez
8385747Stobez.if !empty(CFLAGS:M-O[23s]) && empty(CFLAGS:M-fno-strict-aliasing)
84244198SdelphijCFLAGS+=	-fno-strict-aliasing
85244198Sdelphij.endif
86244198SdelphijWERROR?=	-Werror
87244198SdelphijCFLAGS+=	${WERROR}
88244198SdelphijCFLAGS+=	-D_KERNEL
89122233SdesCFLAGS+=	-DKLD_MODULE
90122233Sdes
91203310Sgavin# Don't use any standard or source-relative include directories.
92203310SgavinCSTD=		c99
93203310SgavinNOSTDINC=	-nostdinc
94203310SgavinCFLAGS:=	${CFLAGS:N-I*} ${NOSTDINC} ${INCLMAGIC} ${CFLAGS:M-I*}
95203310Sgavin.if defined(KERNBUILDDIR)
96203310SgavinCFLAGS+=	-DHAVE_KERNEL_OPTION_HEADERS -include ${KERNBUILDDIR}/opt_global.h
9771043Sdes.endif
9871043Sdes
9977330Sdes# Add -I paths for system headers.  Individual module makefiles don't
10077330Sdes# need any -I paths for this.  Similar defaults for .PATH can't be
10177330Sdes# set because there are no standard paths for non-headers.
102148011SbruefferCFLAGS+=	-I. -I@
10377330Sdes
10479314Sru# Add -I path for altq headers as they are included via net/if_var.h
10577330Sdes# for example.
10677330SdesCFLAGS+=	-I@/contrib/altq
10777330Sdes
108138421ShmpCFLAGS.gcc+=	-finline-limit=${INLINE_LIMIT}
109138421ShmpCFLAGS.gcc+= --param inline-unit-growth=100
110138421ShmpCFLAGS.gcc+= --param large-function-growth=1000
111138421Shmp
112139987Sru# Disallow common variables, and if we end up with commons from
113139987Sru# somewhere unexpected, allocate storage for them in the module itself.
11430602ScharnierCFLAGS+=	-fno-common
11577330SdesLDFLAGS+=	-d -warn-common
11677330Sdes
11779314SruCFLAGS+=	${DEBUG_FLAGS}
11879314Sru.if ${MACHINE_CPUARCH} == amd64
11979314SruCFLAGS+=	-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
12079314Sru.endif
12179314Sru
12277374Sdd.if ${MACHINE_CPUARCH} == powerpc
12377330SdesCFLAGS+=	-mlongcall -fno-omit-frame-pointer
12477330Sdes.endif
12577330Sdes
126150167Srwatson.if ${MACHINE_CPUARCH} == mips
127150167SrwatsonCFLAGS+=	-G0 -fno-pic -mno-abicalls -mlong-calls
128150167Srwatson.endif
129150167Srwatson
130244106Salfred.if defined(DEBUG) || defined(DEBUG_FLAGS)
131244106SalfredCTFFLAGS+=	-g
132244106Salfred.endif
133244106Salfred
134244106Salfred.if defined(FIRMWS)
13577330Sdes.if !exists(@)
13677330Sdes${KMOD:S/$/.c/}: @
13779314Sru.else
13877330Sdes${KMOD:S/$/.c/}: @/tools/fw_stub.awk
13977330Sdes.endif
14077330Sdes	${AWK} -f @/tools/fw_stub.awk ${FIRMWS} -m${KMOD} -c${KMOD:S/$/.c/g} \
14177330Sdes	    ${FIRMWARE_LICENSE:C/.+/-l/}${FIRMWARE_LICENSE}
14277330Sdes
14377330SdesSRCS+=	${KMOD:S/$/.c/}
14430602ScharnierCLEANFILES+=	${KMOD:S/$/.c/}
1451553Srgrimes
1461553Srgrimes.for _firmw in ${FIRMWS}
14730602Scharnier${_firmw:C/\:.*$/.fwo/}:	${_firmw:C/\:.*$//}
148217521Smdf	@${ECHO} ${_firmw:C/\:.*$//} ${.ALLSRC:M*${_firmw:C/\:.*$//}}
14999503Scharnier	@if [ -e ${_firmw:C/\:.*$//} ]; then			\
15099503Scharnier		${LD} -b binary --no-warn-mismatch ${_LDFLAGS}	\
15199503Scharnier		    -r -d -o ${.TARGET}	${_firmw:C/\:.*$//};	\
15212946Sphk	else							\
15312946Sphk		ln -s ${.ALLSRC:M*${_firmw:C/\:.*$//}} ${_firmw:C/\:.*$//}; \
15412946Sphk		${LD} -b binary --no-warn-mismatch ${_LDFLAGS}	\
1551553Srgrimes		    -r -d -o ${.TARGET}	${_firmw:C/\:.*$//};	\
156116038Scharnier		rm ${_firmw:C/\:.*$//};				\
157116038Scharnier	fi
1581553Srgrimes
159116038ScharnierOBJS+=	${_firmw:C/\:.*$/.fwo/}
16012946Sphk.endfor
161115121Sbrueffer.endif
162115121Sbrueffer
163115121SbruefferOBJS+=	${SRCS:N*.h:R:S/$/.o/g}
164115121Sbrueffer
165115121Sbrueffer.if !defined(PROG)
166115092SbruefferPROG=	${KMOD}.ko
167115121Sbrueffer.endif
168115121Sbrueffer
169115121Sbrueffer.if !defined(DEBUG_FLAGS)
170115092SbruefferFULLPROG=	${PROG}
17113744Smpp.else
1721553SrgrimesFULLPROG=	${PROG}.debug
1731553Srgrimes${PROG}: ${FULLPROG} ${PROG}.symbols
17412946Sphk	${OBJCOPY} --strip-debug --add-gnu-debuglink=${PROG}.symbols\
1751553Srgrimes	    ${FULLPROG} ${.TARGET}
1761553Srgrimes${PROG}.symbols: ${FULLPROG}
177217522Smdf	${OBJCOPY} --only-keep-debug ${FULLPROG} ${.TARGET}
17891997Sdd.endif
17989414Sarr
180233510Sjoel.if ${__KLD_SHARED} == yes
181233510Sjoel${FULLPROG}: ${KMOD}.kld
182233510Sjoel	${LD} -Bshareable ${_LDFLAGS} -o ${.TARGET} ${KMOD}.kld
183233510Sjoel.if !defined(DEBUG_FLAGS)
184233510Sjoel	${OBJCOPY} --strip-debug ${.TARGET}
185233510Sjoel.endif
186233510Sjoel.endif
187233510Sjoel
188233510SjoelEXPORT_SYMS?=	NO
189233510Sjoel.if ${EXPORT_SYMS} != YES
190233510SjoelCLEANFILES+=	export_syms
191233510Sjoel.endif
192233510Sjoel
193233510Sjoel.if ${__KLD_SHARED} == yes
194233510Sjoel${KMOD}.kld: ${OBJS}
195233510Sjoel.else
196233510Sjoel${FULLPROG}: ${OBJS}
197233510Sjoel.endif
198233510Sjoel	${LD} ${_LDFLAGS} -r -d -o ${.TARGET} ${OBJS}
199233510Sjoel.if ${MK_CTF} != "no"
200233510Sjoel	${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS}
201233510Sjoel.endif
202233510Sjoel.if defined(EXPORT_SYMS)
203233510Sjoel.if ${EXPORT_SYMS} != YES
204233510Sjoel.if ${EXPORT_SYMS} == NO
205233510Sjoel	:> export_syms
206233510Sjoel.elif !exists(${.CURDIR}/${EXPORT_SYMS})
207233510Sjoel	echo ${EXPORT_SYMS} > export_syms
208233510Sjoel.else
209233510Sjoel	grep -v '^#' < ${EXPORT_SYMS} > export_syms
210233510Sjoel.endif
211233510Sjoel	awk -f ${SYSDIR}/conf/kmod_syms.awk ${.TARGET} \
212233510Sjoel	    export_syms | xargs -J% ${OBJCOPY} % ${.TARGET}
213233510Sjoel.endif
214233510Sjoel.endif
215233510Sjoel.if !defined(DEBUG_FLAGS) && ${__KLD_SHARED} == no
216233510Sjoel	${OBJCOPY} --strip-debug ${.TARGET}
217233510Sjoel.endif
218233510Sjoel
219233510Sjoel_ILINKS=@ machine
220233510Sjoel.if ${MACHINE} != ${MACHINE_CPUARCH}
221233510Sjoel_ILINKS+=${MACHINE_CPUARCH}
222233510Sjoel.endif
223233510Sjoel.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
224233510Sjoel_ILINKS+=x86
225233510Sjoel.endif
226233510SjoelCLEANFILES+=${_ILINKS}
227233510Sjoel
228233510Sjoelall: objwarn ${PROG}
229233510Sjoel
230233510Sjoelbeforedepend: ${_ILINKS}
231233510Sjoel
232233510Sjoel# Ensure that the links exist without depending on it when it exists which
233233510Sjoel# causes all the modules to be rebuilt when the directory pointed to changes.
234233510Sjoel.for _link in ${_ILINKS}
235233510Sjoel.if !exists(${.OBJDIR}/${_link})
236233510Sjoel${OBJS}: ${.OBJDIR}/${_link}
237233510Sjoel.endif
238233510Sjoel.endfor
239233510Sjoel
240233510Sjoel# Search for kernel source tree in standard places.
241233510Sjoel.for _dir in ${.CURDIR}/../.. ${.CURDIR}/../../.. /sys /usr/src/sys
242233510Sjoel.if !defined(SYSDIR) && exists(${_dir}/kern/)
243233510SjoelSYSDIR=	${_dir}
244233510Sjoel.endif
245233510Sjoel.endfor
2461553Srgrimes.if !defined(SYSDIR) || !exists(${SYSDIR}/kern/)
247140415Sru.error "can't find kernel source tree"
248140415Sru.endif
249140415Sru
250140415Sru.for _link in ${_ILINKS}
251140415Sru.PHONY: ${_link}
252140415Sru${_link}: ${.OBJDIR}/${_link}
253140415Sru
254140415Sru${.OBJDIR}/${_link}:
255140415Sru	@case ${.TARGET:T} in \
256140415Sru	machine) \
257140415Sru		path=${SYSDIR}/${MACHINE}/include ;; \
258140415Sru	@) \
259140415Sru		path=${SYSDIR} ;; \
260140415Sru	*) \
261140415Sru		path=${SYSDIR}/${.TARGET:T}/include ;; \
262140415Sru	esac ; \
263140415Sru	path=`(cd $$path && /bin/pwd)` ; \
264140415Sru	${ECHO} ${.TARGET:T} "->" $$path ; \
265140415Sru	ln -sf $$path ${.TARGET:T}
2661553Srgrimes.endfor
2671553Srgrimes
26857516SsteveCLEANFILES+= ${PROG} ${KMOD}.kld ${OBJS}
2691553Srgrimes
27079314Sru.if defined(DEBUG_FLAGS)
27179314SruCLEANFILES+= ${FULLPROG} ${PROG}.symbols
2721553Srgrimes.endif
27357516Ssteve
2741553Srgrimes.if !target(install)
27580634Syar
27679314Sru_INSTALLFLAGS:=	${INSTALLFLAGS}
2771553Srgrimes.for ie in ${INSTALLFLAGS_EDIT}
2781553Srgrimes_INSTALLFLAGS:=	${_INSTALLFLAGS${ie}}
27979314Sru.endfor
28079314Sru
28130602Scharnier.if !target(realinstall)
28212946Sphkrealinstall: _kmodinstall
28379314Sru.ORDER: beforeinstall _kmodinstall
28479314Sru_kmodinstall:
28579314Sru	${INSTALL} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \
28612946Sphk	    ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${KMODDIR}
28712946Sphk.if defined(DEBUG_FLAGS) && !defined(INSTALL_NODEBUG) && ${MK_KERNEL_SYMBOLS} != "no"
28881045Syar	${INSTALL} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \
28981045Syar	    ${_INSTALLFLAGS} ${PROG}.symbols ${DESTDIR}${KMODDIR}
29081045Syar.endif
29181045Syar
2921553Srgrimes.include <bsd.links.mk>
29370025Sphantom
294115092Sbrueffer.if !defined(NO_XREF)
295115092Sbruefferafterinstall: _kldxref
296115092Sbrueffer.ORDER: realinstall _kldxref
2971553Srgrimes.ORDER: _installlinks _kldxref
29899503Scharnier_kldxref:
29999503Scharnier	@if type kldxref >/dev/null 2>&1; then \
30099503Scharnier		${ECHO} kldxref ${DESTDIR}${KMODDIR}; \
30117786Smpp		kldxref ${DESTDIR}${KMODDIR}; \
30212946Sphk	fi
30379314Sru.endif
30430602Scharnier.endif # !target(realinstall)
30530602Scharnier
30617786Smpp.endif # !target(install)
307140415Sru
308140415Sru.if !target(load)
309140415Sruload: ${PROG}
310140415Sru	${KMODLOAD} -v ${.OBJDIR}/${PROG}
311140415Sru.endif
312140415Sru
313140415Sru.if !target(unload)
314unload:
315	${KMODUNLOAD} -v ${PROG}
316.endif
317
318# Generate options files that otherwise would be built
319# in substantially similar ways through the tree. Move
320# the code here when they all produce identical results
321# (or should)
322.if !defined(KERNBUILDDIR)
323opt_bpf.h:
324	echo "#define DEV_BPF 1" > ${.TARGET}
325.if ${MK_INET_SUPPORT} != "no"
326opt_inet.h:
327	@echo "#define INET 1" > ${.TARGET}
328	@echo "#define TCP_OFFLOAD 1" >> ${.TARGET}
329.endif
330.if ${MK_INET6_SUPPORT} != "no"
331opt_inet6.h:
332	@echo "#define INET6 1" > ${.TARGET}
333.endif
334opt_mrouting.h:
335	echo "#define MROUTING 1" > ${.TARGET}
336opt_natm.h:
337	echo "#define NATM 1" > ${.TARGET}
338opt_scsi.h:
339	echo "#define SCSI_DELAY 15000" > ${.TARGET}
340opt_wlan.h:
341	echo "#define IEEE80211_DEBUG 1" > ${.TARGET}
342	echo "#define IEEE80211_AMPDU_AGE 1" >> ${.TARGET}
343	echo "#define IEEE80211_SUPPORT_MESH 1" >> ${.TARGET}
344.endif
345
346.if defined(KERNBUILDDIR)
347.PATH: ${KERNBUILDDIR}
348CFLAGS+=	-I${KERNBUILDDIR}
349.for _src in ${SRCS:Mopt_*.h}
350CLEANFILES+=	${_src}
351.if !target(${_src})
352${_src}:
353	ln -sf ${KERNBUILDDIR}/${_src} ${.TARGET}
354.endif
355.endfor
356.else
357.for _src in ${SRCS:Mopt_*.h}
358CLEANFILES+=	${_src}
359.if !target(${_src})
360${_src}:
361	:> ${.TARGET}
362.endif
363.endfor
364.endif
365
366# Respect configuration-specific C flags.
367CFLAGS+=	${CONF_CFLAGS}
368
369MFILES?= dev/acpica/acpi_if.m dev/acpi_support/acpi_wmi_if.m \
370	dev/agp/agp_if.m dev/ata/ata_if.m dev/eisa/eisa_if.m \
371	dev/fb/fb_if.m dev/gpio/gpio_if.m dev/gpio/gpiobus_if.m \
372	dev/iicbus/iicbb_if.m dev/iicbus/iicbus_if.m \
373	dev/mmc/mmcbr_if.m dev/mmc/mmcbus_if.m \
374	dev/mii/miibus_if.m dev/mvs/mvs_if.m dev/ofw/ofw_bus_if.m \
375	dev/pccard/card_if.m dev/pccard/power_if.m dev/pci/pci_if.m \
376	dev/pci/pcib_if.m dev/ppbus/ppbus_if.m \
377	dev/sdhci/sdhci_if.m dev/smbus/smbus_if.m dev/spibus/spibus_if.m \
378	dev/sound/pci/hda/hdac_if.m \
379	dev/sound/pcm/ac97_if.m dev/sound/pcm/channel_if.m \
380	dev/sound/pcm/feeder_if.m dev/sound/pcm/mixer_if.m \
381	dev/sound/midi/mpu_if.m dev/sound/midi/mpufoi_if.m \
382	dev/sound/midi/synth_if.m dev/usb/usb_if.m isa/isa_if.m \
383	kern/bus_if.m kern/clock_if.m \
384	kern/cpufreq_if.m kern/device_if.m kern/serdev_if.m \
385	libkern/iconv_converter_if.m opencrypto/cryptodev_if.m \
386	pc98/pc98/canbus_if.m dev/etherswitch/mdio_if.m
387
388.for _srcsrc in ${MFILES}
389.for _ext in c h
390.for _src in ${SRCS:M${_srcsrc:T:R}.${_ext}}
391CLEANFILES+=	${_src}
392.if !target(${_src})
393.if !exists(@)
394${_src}: @
395.else
396${_src}: @/tools/makeobjops.awk @/${_srcsrc}
397.endif
398	${AWK} -f @/tools/makeobjops.awk @/${_srcsrc} -${_ext}
399.endif
400.endfor # _src
401.endfor # _ext
402.endfor # _srcsrc
403
404.if !empty(SRCS:Mvnode_if.c)
405CLEANFILES+=	vnode_if.c
406.if !exists(@)
407vnode_if.c: @
408.else
409vnode_if.c: @/tools/vnode_if.awk @/kern/vnode_if.src
410.endif
411	${AWK} -f @/tools/vnode_if.awk @/kern/vnode_if.src -c
412.endif
413
414.if !empty(SRCS:Mvnode_if.h)
415CLEANFILES+=	vnode_if.h vnode_if_newproto.h vnode_if_typedef.h
416.if !exists(@)
417vnode_if.h vnode_if_newproto.h vnode_if_typedef.h: @
418.else
419vnode_if.h vnode_if_newproto.h vnode_if_typedef.h: @/tools/vnode_if.awk \
420    @/kern/vnode_if.src
421.endif
422vnode_if.h: vnode_if_newproto.h vnode_if_typedef.h
423	${AWK} -f @/tools/vnode_if.awk @/kern/vnode_if.src -h
424vnode_if_newproto.h:
425	${AWK} -f @/tools/vnode_if.awk @/kern/vnode_if.src -p
426vnode_if_typedef.h:
427	${AWK} -f @/tools/vnode_if.awk @/kern/vnode_if.src -q
428.endif
429
430.for _i in mii pccard
431.if !empty(SRCS:M${_i}devs.h)
432CLEANFILES+=	${_i}devs.h
433.if !exists(@)
434${_i}devs.h: @
435.else
436${_i}devs.h: @/tools/${_i}devs2h.awk @/dev/${_i}/${_i}devs
437.endif
438	${AWK} -f @/tools/${_i}devs2h.awk @/dev/${_i}/${_i}devs
439.endif
440.endfor # _i
441
442.if !empty(SRCS:Musbdevs.h)
443CLEANFILES+=	usbdevs.h
444.if !exists(@)
445usbdevs.h: @
446.else
447usbdevs.h: @/tools/usbdevs2h.awk @/dev/usb/usbdevs
448.endif
449	${AWK} -f @/tools/usbdevs2h.awk @/dev/usb/usbdevs -h
450.endif
451
452.if !empty(SRCS:Musbdevs_data.h)
453CLEANFILES+=	usbdevs_data.h
454.if !exists(@)
455usbdevs_data.h: @
456.else
457usbdevs_data.h: @/tools/usbdevs2h.awk @/dev/usb/usbdevs
458.endif
459	${AWK} -f @/tools/usbdevs2h.awk @/dev/usb/usbdevs -d
460.endif
461
462.if !empty(SRCS:Macpi_quirks.h)
463CLEANFILES+=	acpi_quirks.h
464.if !exists(@)
465acpi_quirks.h: @
466.else
467acpi_quirks.h: @/tools/acpi_quirks2h.awk @/dev/acpica/acpi_quirks
468.endif
469	${AWK} -f @/tools/acpi_quirks2h.awk @/dev/acpica/acpi_quirks
470.endif
471
472.if !empty(SRCS:Massym.s)
473CLEANFILES+=	assym.s genassym.o
474assym.s: genassym.o
475.if defined(KERNBUILDDIR)
476genassym.o: opt_global.h
477.endif
478.if !exists(@)
479assym.s: @
480.else
481assym.s: @/kern/genassym.sh
482.endif
483	sh @/kern/genassym.sh genassym.o > ${.TARGET}
484.if exists(@)
485genassym.o: @/${MACHINE_CPUARCH}/${MACHINE_CPUARCH}/genassym.c
486.endif
487genassym.o: @ machine ${SRCS:Mopt_*.h}
488	${CC} -c ${CFLAGS:N-fno-common} \
489	    @/${MACHINE_CPUARCH}/${MACHINE_CPUARCH}/genassym.c
490.endif
491
492lint: ${SRCS}
493	${LINT} ${LINTKERNFLAGS} ${CFLAGS:M-[DILU]*} ${.ALLSRC:M*.c}
494
495.if defined(KERNBUILDDIR)
496${OBJS}: opt_global.h
497.endif
498
499.include <bsd.dep.mk>
500
501cleandepend: cleanilinks
502# .depend needs include links so we remove them only together.
503cleanilinks:
504	rm -f ${_ILINKS}
505
506.if !exists(${.OBJDIR}/${DEPENDFILE})
507${OBJS}: ${SRCS:M*.h}
508.endif
509
510.include <bsd.obj.mk>
511.include "kern.mk"
512