kmod.mk revision 68027
18705Sjkh#	From: @(#)bsd.prog.mk	5.26 (Berkeley) 6/25/91
28705Sjkh# $FreeBSD: head/sys/conf/kmod.mk 68027 2000-10-31 02:25:20Z takawata $
38705Sjkh#
48705Sjkh# The include file <bsd.kmod.mk> handles installing Kernel Loadable Device
58705Sjkh# drivers (KLD's).
68705Sjkh#
750479Speter#
88705Sjkh# +++ variables +++
98705Sjkh#
108705Sjkh# CLEANFILES	Additional files to remove for the clean and cleandir targets.
118705Sjkh#
128705Sjkh# DISTRIBUTION  Name of distribution. [bin]
138705Sjkh#
148705Sjkh# KMOD          The name of the kernel module to build.
158705Sjkh#
168881Srgrimes# KMODDIR	Base path for kernel modules (see kld(4)). [/boot/kernel]
178881Srgrimes#
188705Sjkh# KMODOWN	KLD owner. [${BINOWN}]
198705Sjkh#
208705Sjkh# KMODGRP	KLD group. [${BINGRP}]
218705Sjkh#
228705Sjkh# KMODMODE	KLD mode. [${BINMODE}]
238705Sjkh#
248705Sjkh# LINKS		The list of KLD links; should be full pathnames, the
258705Sjkh#               linked-to file coming first, followed by the linked
268705Sjkh#               file.  The files are hard-linked.  For example, to link
278705Sjkh#               /modules/master and /modules/meister, use:
288705Sjkh#
298705Sjkh#			LINKS=  /modules/master /modules/meister
308705Sjkh#
318705Sjkh# KMODLOAD	Command to load a kernel module [/sbin/kldload]
328705Sjkh#
338705Sjkh# KMODUNLOAD	Command to unload a kernel module [/sbin/kldunload]
348705Sjkh#
358705Sjkh# NOMAN		KLD does not have a manual page if set.
368705Sjkh#
378705Sjkh# PROG          The name of the kernel module to build. 
388705Sjkh#		If not supplied, ${KMOD}.o is used.
398768Sjkh#
4015417Sjkh# SRCS          List of source files 
4115417Sjkh#
4215417Sjkh# SUBDIR        A list of subdirectories that should be built as well.
4315417Sjkh#               Each of the targets will execute the same target in the
4415417Sjkh#               subdirectories.
4515417Sjkh#
4615417Sjkh# SYMLINKS	Same as LINKS, except it creates symlinks and the
478705Sjkh#		linked-to pathname may be relative.
488705Sjkh#
498705Sjkh# DESTDIR, DISTDIR are set by other Makefiles (e.g. bsd.own.mk)
5020484Sjkh#
518705Sjkh# MFILES	Optionally a list of interfaces used by the module.
528705Sjkh#		This file contains a default list of interfaces.
538705Sjkh#
5412661Speter# +++ targets +++
558705Sjkh#
5612661Speter#       distribute:
578705Sjkh#               This is a variant of install, which will
5812661Speter#               put the stuff into the right "distribution".
5912661Speter#
6012661Speter# 	install:
6112661Speter#               install the program and its manual pages; if the Makefile
6214793Sjoerg#               does not itself define the target install, the targets
6312661Speter#               beforeinstall and afterinstall may also be used to cause
6414793Sjoerg#               actions immediately before and after the install target
6512661Speter#		is executed.
6614793Sjoerg#
678705Sjkh# 	load:	
688705Sjkh#		Load KLD.
6914793Sjoerg#
708705Sjkh# 	unload:
718705Sjkh#		Unload KLD.
7212661Speter#
7312661Speter# bsd.obj.mk: clean, cleandir and obj
7412661Speter# bsd.dep.mk: cleandepend, depend and tags
7512661Speter# bsd.man.mk: maninstall
7612661Speter#
7712661Speter
7812661SpeterKMODLOAD?=	/sbin/kldload
7912661SpeterKMODUNLOAD?=	/sbin/kldunload
8012661Speter
8112661Speter.if !target(__initialized__)
8212661Speter__initialized__:
8312661Speter.if exists(${.CURDIR}/../Makefile.inc)
8412661Speter.include "${.CURDIR}/../Makefile.inc"
8512661Speter.endif
8612661Speter.endif
8712661Speter
8812661Speter.SUFFIXES: .out .o .c .cc .cxx .C .y .l .s .S
8920484Sjkh
9020484SjkhCFLAGS+=	${COPTS} -D_KERNEL ${CWARNFLAGS}
9120484SjkhCFLAGS+=	-DKLD_MODULE
9220484Sjkh
9320484Sjkh# Don't use any standard or source-relative include directories.
9420484Sjkh# Since -nostdinc will annull any previous -I paths, we repeat all
9520484Sjkh# such paths after -nostdinc.  It doesn't seem to be possible to
9620484Sjkh# add to the front of `make' variable.
9720484Sjkh_ICFLAGS:=	${CFLAGS:M-I*}
9820484SjkhCFLAGS+=	-nostdinc -I- ${INCLMAGIC} ${_ICFLAGS}
9920484Sjkh
10020484Sjkh# Add -I paths for system headers.  Individual KLD makefiles don't
10120484Sjkh# need any -I paths for this.  Similar defaults for .PATH can't be
10220484Sjkh# set because there are no standard paths for non-headers.
10320484SjkhCFLAGS+=	-I. -I@
1048705Sjkh
10512661Speter# Add a -I path to standard headers like <stddef.h>.  Use a relative
1068751Sjkh# path to src/include if possible.  If the @ symlink hasn't been built
10734394Sjkh# yet, then we can't tell if the relative path exists.  Add both the
1088751Sjkh# potential relative path and an absolute path in that case.
1098751Sjkh.if exists(@)
1108751Sjkh.if exists(@/../include)
1118705SjkhCFLAGS+=	-I@/../include
1128705Sjkh.else
1139202SrgrimesCFLAGS+=	-I${DESTDIR}/usr/include
1149202Srgrimes.endif
1159202Srgrimes.else # !@
11614793SjoergCFLAGS+=	-I@/../include -I${DESTDIR}/usr/include
1178705Sjkh.endif # @
1188705Sjkh
1198705SjkhCFLAGS+=	${DEBUG_FLAGS}
1208705Sjkh
1218705Sjkh.if ${OBJFORMAT} == elf
1228705SjkhCLEANFILES+=	setdef0.c setdef1.c setdefs.h
1238756SjkhCLEANFILES+=	setdef0.o setdef1.o
1248705Sjkh.endif
1258705Sjkh
1268705SjkhOBJS+=  ${SRCS:N*.h:R:S/$/.o/g}
1278705Sjkh
1288705Sjkh.if !defined(PROG)
1298705SjkhPROG=	${KMOD}.ko
1308705Sjkh.endif
1319202Srgrimes
1328705Sjkh${PROG}: ${KMOD}.kld
1338705Sjkh.if ${OBJFORMAT} == elf
1348705Sjkh	gensetdefs ${KMOD}.kld
1358705Sjkh	${CC} ${CFLAGS} -c setdef0.c
1368705Sjkh	${CC} ${CFLAGS} -c setdef1.c
1378705Sjkh	${LD} -Bshareable ${LDFLAGS} -o ${.TARGET} setdef0.o ${KMOD}.kld setdef1.o
13820484Sjkh.else
13920484Sjkh	${LD} -Bshareable ${LDFLAGS} -o ${.TARGET} ${KMOD}.kld
14020484Sjkh.endif
14120484Sjkh
14220484Sjkh${KMOD}.kld: ${OBJS}
14320484Sjkh	${LD} ${LDFLAGS} -r -o ${.TARGET} ${OBJS}
1448705Sjkh
1458705Sjkh.if !defined(NOMAN)
1468705Sjkh.include <bsd.man.mk>
14720484Sjkh.if !defined(_MANPAGES) || empty(_MANPAGES)
14820484SjkhMAN1=	${KMOD}.4
14920484Sjkh.endif
15020484Sjkh
15120484Sjkh.elif !target(maninstall)
15220484Sjkhmaninstall: _SUBDIR
1538705Sjkhall-man:
1548705Sjkh.endif
1558705Sjkh
1568705Sjkh_ILINKS=@ machine
1578705Sjkh
1588705Sjkh.MAIN: all
15920484Sjkhall: objwarn ${PROG} all-man _SUBDIR
16020484Sjkh
16120484Sjkhbeforedepend ${OBJS}: ${_ILINKS}
16228391Sjkh
16328391Sjkh# Search for kernel source tree in standard places.
16420484Sjkh.for _dir in ${.CURDIR}/../.. ${.CURDIR}/../../.. /sys /usr/src/sys
16528391Sjkh.if !defined(SYSDIR) && exists(${_dir}/kern/)
16620484SjkhSYSDIR=	${_dir}
1679202Srgrimes.endif
1688705Sjkh.endfor
1698705Sjkh.if !defined(SYSDIR) || !exists(${SYSDIR}/kern/)
17012661Speter.error "can't find kernel source tree"
17141162Sjkh.endif
1728705Sjkh
1738705Sjkh${_ILINKS}:
1748705Sjkh	@case ${.TARGET} in \
1758705Sjkh	machine) \
1768705Sjkh		path=${SYSDIR}/${MACHINE_ARCH}/include ;; \
1778705Sjkh	@) \
1788705Sjkh		path=${SYSDIR} ;; \
1799202Srgrimes	esac ; \
1809202Srgrimes	path=`(cd $$path && /bin/pwd)` ; \
18115242Sjkh	${ECHO} ${.TARGET} "->" $$path ; \
18212661Speter	ln -s $$path ${.TARGET}
18312661Speter
18412661SpeterCLEANFILES+= ${PROG} ${KMOD}.kld ${OBJS} ${_ILINKS} symb.tmp tmp.o
18512661Speter
18612661Speter.if !target(install)
1879202Srgrimes.if !target(beforeinstall)
18812661Speterbeforeinstall:
1898705Sjkh.endif
1908705Sjkh.if !target(afterinstall)
1918705Sjkhafterinstall:
19215242Sjkh.endif
1938705Sjkh
1948705Sjkh_INSTALLFLAGS:=	${INSTALLFLAGS}
1958705Sjkh.for ie in ${INSTALLFLAGS_EDIT}
1969202Srgrimes_INSTALLFLAGS:=	${_INSTALLFLAGS${ie}}
1978705Sjkh.endfor
1988705Sjkh
1998705Sjkhrealinstall: _SUBDIR
2008705Sjkh	${INSTALL} ${COPY} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \
2018705Sjkh	    ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${KMODDIR}
2028705Sjkh.if defined(LINKS) && !empty(LINKS)
2038751Sjkh	@set ${LINKS}; \
2048751Sjkh	while test $$# -ge 2; do \
2058751Sjkh		l=${DESTDIR}$$1; \
20614793Sjoerg		shift; \
2078705Sjkh		t=${DESTDIR}$$1; \
2088751Sjkh		shift; \
2098751Sjkh		${ECHO} $$t -\> $$l; \
21014793Sjoerg		ln -f $$l $$t; \
2118751Sjkh	done; true
2128751Sjkh.endif
2138705Sjkh.if defined(SYMLINKS) && !empty(SYMLINKS)
21412661Speter	@set ${SYMLINKS}; \
21512661Speter	while test $$# -ge 2; do \
21641162Sjkh		l=$$1; \
2178705Sjkh		shift; \
2188705Sjkh		t=${DESTDIR}$$1; \
21912661Speter		shift; \
22012661Speter		${ECHO} $$t -\> $$l; \
22115242Sjkh		ln -fs $$l $$t; \
2228705Sjkh	done; true
22341162Sjkh.endif
22420484Sjkh
22541162Sjkhinstall: afterinstall _SUBDIR
2268705Sjkh.if !defined(NOMAN)
2278837Sjkhafterinstall: realinstall maninstall
22823751Sjkh.else
2299202Srgrimesafterinstall: realinstall
23022722Sjkh.endif
2319202Srgrimesrealinstall: beforeinstall
23241162Sjkh.endif
2338705Sjkh
2348705SjkhDISTRIBUTION?=	bin
2358705Sjkh.if !target(distribute)
23641162Sjkhdistribute: _SUBDIR
23741162Sjkh.for dist in ${DISTRIBUTION}
23841162Sjkh	cd ${.CURDIR} ; $(MAKE) install DESTDIR=${DISTDIR}/${dist} SHARED=copies
2398705Sjkh.endfor
24041162Sjkh.endif
24141162Sjkh
24241162Sjkh.if !target(load)
24312661Speterload:	${PROG}
24412661Speter	${KMODLOAD} -v ./${KMOD}.ko
24523751Sjkh.endif
2468705Sjkh
24741162Sjkh.if !target(unload)
24841162Sjkhunload:
24941162Sjkh	${KMODUNLOAD} -v ${KMOD}
25041162Sjkh.endif
25141162Sjkh
2528705Sjkh.for _src in ${SRCS:Mopt_*.h}
2539202SrgrimesCLEANFILES+=	${_src}
2549202Srgrimes.if !target(${_src})
25515242Sjkh${_src}:
2568705Sjkh	touch ${.TARGET}
2578705Sjkh.endif
25822721Sjkh.endfor
25922721Sjkh
26041162SjkhMFILES?= kern/bus_if.m kern/device_if.m dev/iicbus/iicbb_if.m \
26122721Sjkh    dev/iicbus/iicbus_if.m isa/isa_if.m dev/mii/miibus_if.m \
26222721Sjkh    dev/pccard/card_if.m dev/pccard/power_if.m pci/pci_if.m pci/pcib_if.m \
26322721Sjkh    dev/ppbus/ppbus_if.m dev/smbus/smbus_if.m dev/usb/usb_if.m
26422721Sjkh
26522721Sjkh.for _srcsrc in ${MFILES}
26622721Sjkh.for _ext in c h
26722721Sjkh.for _src in ${SRCS:M${_srcsrc:T:R}.${_ext}}
26822721SjkhCLEANFILES+=	${_src}
26922721Sjkh.if !target(${_src})
27022721Sjkh${_src}: @
27122721Sjkh.if exists(@)
27222721Sjkh${_src}: @/kern/makeobjops.pl @/${_srcsrc}
27322721Sjkh.endif
27422721Sjkh	perl @/kern/makeobjops.pl -${_ext} @/${_srcsrc}
27522721Sjkh.endif
27622721Sjkh.endfor # _src
27722721Sjkh.endfor # _ext
27822721Sjkh.endfor # _srcsrc
27922721Sjkh
28022721Sjkh.for _ext in c h
28122721Sjkh.if ${SRCS:Mvnode_if.${_ext}} != ""
28222721SjkhCLEANFILES+=	vnode_if.${_ext}
28322721Sjkhvnode_if.${_ext}: @
28422721Sjkh.if exists(@)
28522721Sjkhvnode_if.${_ext}: @/kern/vnode_if.pl @/kern/vnode_if.src
28622721Sjkh.endif
28722721Sjkh	perl @/kern/vnode_if.pl -${_ext} @/kern/vnode_if.src
28822721Sjkh.endif
28922721Sjkh.endfor
29043255Sjkh
29143685Sjkhregress:
29222721Sjkh
29322722Sjkh.include <bsd.dep.mk>
29426560Sjkh
29522721Sjkh.if !exists(${DEPENDFILE})
29622721Sjkh${OBJS}: ${SRCS:M*.h}
29722721Sjkh.endif
29822721Sjkh
29922721Sjkh.include <bsd.obj.mk>
30022721Sjkh
30122721Sjkh.include <bsd.kern.mk>
30222721Sjkh