1639a2e50SGarrett Wollman# From: @(#)bsd.prog.mk 5.26 (Berkeley) 6/25/91 27f3dea24SPeter Wemm# $FreeBSD$ 353996fadSWolfram Schneider# 4fe3cac87SNick Hibma# The include file <bsd.kmod.mk> handles installing Kernel Loadable Device 5fe3cac87SNick Hibma# drivers (KLD's). 653996fadSWolfram Schneider# 753996fadSWolfram Schneider# 853996fadSWolfram Schneider# +++ variables +++ 953996fadSWolfram Schneider# 1053996fadSWolfram Schneider# CLEANFILES Additional files to remove for the clean and cleandir targets. 1153996fadSWolfram Schneider# 1253996fadSWolfram Schneider# DISTRIBUTION Name of distribution. [bin] 1353996fadSWolfram Schneider# 14fe3cac87SNick Hibma# KMOD The name of the kernel module to build. 1553996fadSWolfram Schneider# 163bdfa9e5SDavid E. O'Brien# KMODDIR Base path for kernel modules (see kld(4)). [/boot/kernel] 1753996fadSWolfram Schneider# 18fe3cac87SNick Hibma# KMODOWN KLD owner. [${BINOWN}] 1953996fadSWolfram Schneider# 20fe3cac87SNick Hibma# KMODGRP KLD group. [${BINGRP}] 2153996fadSWolfram Schneider# 22fe3cac87SNick Hibma# KMODMODE KLD mode. [${BINMODE}] 2353996fadSWolfram Schneider# 24fe3cac87SNick Hibma# LINKS The list of KLD links; should be full pathnames, the 2553996fadSWolfram Schneider# linked-to file coming first, followed by the linked 2653996fadSWolfram Schneider# file. The files are hard-linked. For example, to link 2771395925SPeter Wemm# /modules/master and /modules/meister, use: 2853996fadSWolfram Schneider# 2971395925SPeter Wemm# LINKS= /modules/master /modules/meister 3053996fadSWolfram Schneider# 31fe3cac87SNick Hibma# KMODLOAD Command to load a kernel module [/sbin/kldload] 327bc830bbSWolfram Schneider# 33fe3cac87SNick Hibma# KMODUNLOAD Command to unload a kernel module [/sbin/kldunload] 347bc830bbSWolfram Schneider# 35fe3cac87SNick Hibma# PROG The name of the kernel module to build. 367bc830bbSWolfram Schneider# If not supplied, ${KMOD}.o is used. 3753996fadSWolfram Schneider# 3853996fadSWolfram Schneider# SRCS List of source files 3953996fadSWolfram Schneider# 4053996fadSWolfram Schneider# SUBDIR A list of subdirectories that should be built as well. 4153996fadSWolfram Schneider# Each of the targets will execute the same target in the 4253996fadSWolfram Schneider# subdirectories. 4353996fadSWolfram Schneider# 442336a7eaSBruce Evans# SYMLINKS Same as LINKS, except it creates symlinks and the 452336a7eaSBruce Evans# linked-to pathname may be relative. 462336a7eaSBruce Evans# 4753996fadSWolfram Schneider# DESTDIR, DISTDIR are set by other Makefiles (e.g. bsd.own.mk) 4853996fadSWolfram Schneider# 497fecffecSDoug Rabson# MFILES Optionally a list of interfaces used by the module. 507fecffecSDoug Rabson# This file contains a default list of interfaces. 5153996fadSWolfram Schneider# 520b3178a4SMike Smith# EXPORT_SYMS A list of symbols that should be exported from the module, 5393f03548SMike Smith# or the name of a file containing a list of symbols, or YES 5493f03548SMike Smith# to export all symbols. If not defined, no symbols are 550b3178a4SMike Smith# exported. 560b3178a4SMike Smith# 5753996fadSWolfram Schneider# +++ targets +++ 5853996fadSWolfram Schneider# 5953996fadSWolfram Schneider# distribute: 6053996fadSWolfram Schneider# This is a variant of install, which will 6153996fadSWolfram Schneider# put the stuff into the right "distribution". 6253996fadSWolfram Schneider# 6353996fadSWolfram Schneider# install: 6417d6c636SRuslan Ermilov# install the kernel module; if the Makefile 6553996fadSWolfram Schneider# does not itself define the target install, the targets 6653996fadSWolfram Schneider# beforeinstall and afterinstall may also be used to cause 6753996fadSWolfram Schneider# actions immediately before and after the install target 6853996fadSWolfram Schneider# is executed. 6953996fadSWolfram Schneider# 7053996fadSWolfram Schneider# load: 71fe3cac87SNick Hibma# Load KLD. 7253996fadSWolfram Schneider# 7353996fadSWolfram Schneider# unload: 74fe3cac87SNick Hibma# Unload KLD. 7553996fadSWolfram Schneider# 7653996fadSWolfram Schneider# bsd.obj.mk: clean, cleandir and obj 77161e8999SBruce Evans# bsd.dep.mk: cleandepend, depend and tags 7853996fadSWolfram Schneider# 79639a2e50SGarrett Wollman 80b7bbb709SDavid E. O'BrienAWK?= awk 81fe3cac87SNick HibmaKMODLOAD?= /sbin/kldload 82fe3cac87SNick HibmaKMODUNLOAD?= /sbin/kldunload 83f6611608SSheldon HearnOBJCOPY?= objcopy 847bc830bbSWolfram Schneider 8506639be7SPeter Wemm.if defined(KMODDEPS) 8606639be7SPeter Wemm.error "Do not use KMODDEPS on 5.0+, use MODULE_VERSION/MODULE_DEPEND" 8706639be7SPeter Wemm.endif 8806639be7SPeter Wemm 890ac2fc87SRuslan Ermilov.include <bsd.init.mk> 90639a2e50SGarrett Wollman 91639a2e50SGarrett Wollman.SUFFIXES: .out .o .c .cc .cxx .C .y .l .s .S 92639a2e50SGarrett Wollman 93c4473420SPeter WemmCFLAGS+= ${COPTS} -D_KERNEL ${CWARNFLAGS} 948fe644b2SMike SmithCFLAGS+= -DKLD_MODULE 954a2d2630SBruce Evans 96021886ffSBruce Evans# Don't use any standard or source-relative include directories. 97021886ffSBruce Evans# Since -nostdinc will annull any previous -I paths, we repeat all 98021886ffSBruce Evans# such paths after -nostdinc. It doesn't seem to be possible to 99021886ffSBruce Evans# add to the front of `make' variable. 100021886ffSBruce Evans_ICFLAGS:= ${CFLAGS:M-I*} 10126dac111SPoul-Henning KampCFLAGS+= -nostdinc -I- ${INCLMAGIC} ${_ICFLAGS} 102021886ffSBruce Evans 103fe3cac87SNick Hibma# Add -I paths for system headers. Individual KLD makefiles don't 104021886ffSBruce Evans# need any -I paths for this. Similar defaults for .PATH can't be 105021886ffSBruce Evans# set because there are no standard paths for non-headers. 1067e820aaaSMike SmithCFLAGS+= -I. -I@ -I@/dev 1074a2d2630SBruce Evans 108a0b845feSBruce Evans# Add a -I path to standard headers like <stddef.h>. Use a relative 109a0b845feSBruce Evans# path to src/include if possible. If the @ symlink hasn't been built 110a0b845feSBruce Evans# yet, then we can't tell if the relative path exists. Add both the 111a0b845feSBruce Evans# potential relative path and an absolute path in that case. 112a0b845feSBruce Evans.if exists(@) 113a0b845feSBruce Evans.if exists(@/../include) 114a0b845feSBruce EvansCFLAGS+= -I@/../include 115a0b845feSBruce Evans.else 116b3e17ba2SSatoshi AsamiCFLAGS+= -I${DESTDIR}/usr/include 117b3e17ba2SSatoshi Asami.endif 118a0b845feSBruce Evans.else # !@ 119a0b845feSBruce EvansCFLAGS+= -I@/../include -I${DESTDIR}/usr/include 120a0b845feSBruce Evans.endif # @ 12156bac51bSPoul-Henning Kamp 1220b3178a4SMike Smith# Disallow common variables, and if we end up with commons from 1230b3178a4SMike Smith# somewhere unexpected, allocate storage for them in the module itself. 1240b3178a4SMike SmithCFLAGS+= -fno-common 1250b3178a4SMike SmithLDFLAGS+= -d -warn-common 1260b3178a4SMike Smith 1279e4be63dSBruce EvansCFLAGS+= ${DEBUG_FLAGS} 1289e4be63dSBruce Evans 12971395925SPeter Wemm.if ${OBJFORMAT} == elf 130fdbdd3a0SPeter WemmCLEANFILES+= setdef0.c setdef1.c setdefs.h 131fdbdd3a0SPeter WemmCLEANFILES+= setdef0.o setdef1.o 132fdbdd3a0SPeter Wemm.endif 133fdbdd3a0SPeter Wemm 134639a2e50SGarrett WollmanOBJS+= ${SRCS:N*.h:R:S/$/.o/g} 135639a2e50SGarrett Wollman 136639a2e50SGarrett Wollman.if !defined(PROG) 13790f60fc9SMike SmithPROG= ${KMOD}.ko 13890f60fc9SMike Smith.endif 139639a2e50SGarrett Wollman 140f6611608SSheldon Hearn.if !defined(DEBUG) 141f6611608SSheldon HearnFULLPROG= ${PROG} 142f6611608SSheldon Hearn.else 143f6611608SSheldon HearnFULLPROG= ${PROG}.debug 144f6611608SSheldon Hearn${PROG}: ${FULLPROG} 145f6611608SSheldon Hearn ${OBJCOPY} --strip-debug ${FULLPROG} ${PROG} 146f6611608SSheldon Hearn.endif 147f6611608SSheldon Hearn 148f6611608SSheldon Hearn${FULLPROG}: ${KMOD}.kld 14909be11baSPeter Wemm ${LD} -Bshareable ${LDFLAGS} -o ${.TARGET} ${KMOD}.kld 15009be11baSPeter Wemm 15193f03548SMike SmithEXPORT_SYMS?= NO 15293f03548SMike Smith.if ${EXPORT_SYMS} != YES 1530b3178a4SMike SmithCLEANFILES+= ${.OBJDIR}/export_syms 1540b3178a4SMike Smith.endif 1550b3178a4SMike Smith 15609be11baSPeter Wemm${KMOD}.kld: ${OBJS} 1570b3178a4SMike Smith ${LD} ${LDFLAGS} -r -d -o ${.TARGET} ${OBJS} 1580b3178a4SMike Smith.if defined(EXPORT_SYMS) 15993f03548SMike Smith.if ${EXPORT_SYMS} != YES 1600b3178a4SMike Smith.if ${EXPORT_SYMS} == NO 1610b3178a4SMike Smith touch ${.OBJDIR}/export_syms 1620b3178a4SMike Smith.elif !exists(${.CURDIR}/${EXPORT_SYMS}) 1630b3178a4SMike Smith echo ${EXPORT_SYMS} > ${.OBJDIR}/export_syms 1640b3178a4SMike Smith.else 1650b3178a4SMike Smith grep -v '^#' < ${EXPORT_SYMS} > ${.OBJDIR}/export_syms 1660b3178a4SMike Smith.endif 1670b3178a4SMike Smith awk -f ${SYSDIR}/conf/kmod_syms.awk ${.TARGET} \ 1680b3178a4SMike Smith ${.OBJDIR}/export_syms | \ 16993f03548SMike Smith xargs -J% ${OBJCOPY} % ${.TARGET} 17093f03548SMike Smith.endif 1710b3178a4SMike Smith.endif 1720b3178a4SMike Smith 1734a2d2630SBruce Evans_ILINKS=@ machine 174639a2e50SGarrett Wollman 175b25a566dSRuslan Ermilovall: objwarn ${PROG} 1764a2d2630SBruce Evans 177985f41afSWarner Loshbeforedepend: ${_ILINKS} 178985f41afSWarner Losh @rm -f .depend 179985f41afSWarner Losh 180f3cc9575SWarner Losh# Ensure that the links exist without depending on it when it exists which 181f3cc9575SWarner Losh# causes all the modules to be rebuilt when the directory pointed to changes. 182f3cc9575SWarner Losh.for _link in ${_ILINKS} 183f3cc9575SWarner Losh.if !exists(${.OBJDIR}/${_link}) 184f3cc9575SWarner Losh${OBJS}: ${_link} 185f3cc9575SWarner Losh.endif 186f3cc9575SWarner Losh.endfor 1874a2d2630SBruce Evans 1889a8631b3SWarner Losh# Search for kernel source tree in standard places. 1899a8631b3SWarner Losh.for _dir in ${.CURDIR}/../.. ${.CURDIR}/../../.. /sys /usr/src/sys 1909a8631b3SWarner Losh.if !defined(SYSDIR) && exists(${_dir}/kern/) 1919a8631b3SWarner LoshSYSDIR= ${_dir} 1929a8631b3SWarner Losh.endif 1939a8631b3SWarner Losh.endfor 194aabafca0SJason Evans.if !defined(SYSDIR) || !exists(${SYSDIR}/kern) 1959a8631b3SWarner Losh.error "can't find kernel source tree" 1969a8631b3SWarner Losh.endif 1979a8631b3SWarner Losh 1984a2d2630SBruce Evans${_ILINKS}: 1999a8631b3SWarner Losh @case ${.TARGET} in \ 20008a04a89SPeter Wemm machine) \ 2019a8631b3SWarner Losh path=${SYSDIR}/${MACHINE_ARCH}/include ;; \ 20208a04a89SPeter Wemm @) \ 2039a8631b3SWarner Losh path=${SYSDIR} ;; \ 20408a04a89SPeter Wemm esac ; \ 20508a04a89SPeter Wemm path=`(cd $$path && /bin/pwd)` ; \ 20608a04a89SPeter Wemm ${ECHO} ${.TARGET} "->" $$path ; \ 20708a04a89SPeter Wemm ln -s $$path ${.TARGET} 2084a2d2630SBruce Evans 209f6611608SSheldon HearnCLEANFILES+= ${PROG} ${FULLPROG} ${KMOD}.kld ${OBJS} ${_ILINKS} symb.tmp tmp.o 210639a2e50SGarrett Wollman 211639a2e50SGarrett Wollman.if !target(install) 212639a2e50SGarrett Wollman.if !target(beforeinstall) 213639a2e50SGarrett Wollmanbeforeinstall: 214639a2e50SGarrett Wollman.endif 215639a2e50SGarrett Wollman.if !target(afterinstall) 216639a2e50SGarrett Wollmanafterinstall: 217639a2e50SGarrett Wollman.endif 218639a2e50SGarrett Wollman 219ea87b3cbSDavid E. O'Brien_INSTALLFLAGS:= ${INSTALLFLAGS} 220e902c1bbSTim Vanderhoek.for ie in ${INSTALLFLAGS_EDIT} 221e902c1bbSTim Vanderhoek_INSTALLFLAGS:= ${_INSTALLFLAGS${ie}} 222e902c1bbSTim Vanderhoek.endfor 223e902c1bbSTim Vanderhoek 2242cbc81ffSRuslan Ermilov.if defined(DEBUG) 225b25a566dSRuslan Ermilovinstall.debug: 2262cbc81ffSRuslan Ermilov cd ${.CURDIR}; ${MAKE} -DINSTALL_DEBUG install 2272cbc81ffSRuslan Ermilov.endif 228a4c00586SDag-Erling Smørgrav 229b25a566dSRuslan Ermilovrealinstall: 2302cbc81ffSRuslan Ermilov.if defined(DEBUG) && defined(INSTALL_DEBUG) 2312cbc81ffSRuslan Ermilov ${INSTALL} ${COPY} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \ 2322cbc81ffSRuslan Ermilov ${_INSTALLFLAGS} ${FULLPROG} ${DESTDIR}${KMODDIR}/ 2332cbc81ffSRuslan Ermilov.else 2345ce6c3cfSWolfram Schneider ${INSTALL} ${COPY} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \ 2352f7538d6SPeter Pentchev ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${KMODDIR}/ 236639a2e50SGarrett Wollman.if defined(LINKS) && !empty(LINKS) 237639a2e50SGarrett Wollman @set ${LINKS}; \ 238639a2e50SGarrett Wollman while test $$# -ge 2; do \ 239639a2e50SGarrett Wollman l=${DESTDIR}$$1; \ 240639a2e50SGarrett Wollman shift; \ 241639a2e50SGarrett Wollman t=${DESTDIR}$$1; \ 242639a2e50SGarrett Wollman shift; \ 243639a2e50SGarrett Wollman ${ECHO} $$t -\> $$l; \ 2442336a7eaSBruce Evans ln -f $$l $$t; \ 2452336a7eaSBruce Evans done; true 2462336a7eaSBruce Evans.endif 2472336a7eaSBruce Evans.if defined(SYMLINKS) && !empty(SYMLINKS) 2482336a7eaSBruce Evans @set ${SYMLINKS}; \ 2492336a7eaSBruce Evans while test $$# -ge 2; do \ 2502336a7eaSBruce Evans l=$$1; \ 2512336a7eaSBruce Evans shift; \ 2522336a7eaSBruce Evans t=${DESTDIR}$$1; \ 2532336a7eaSBruce Evans shift; \ 2542336a7eaSBruce Evans ${ECHO} $$t -\> $$l; \ 2552336a7eaSBruce Evans ln -fs $$l $$t; \ 256639a2e50SGarrett Wollman done; true 257639a2e50SGarrett Wollman.endif 258505222d3SPeter Wemm.if !defined(NO_XREF) 259be1d673dSRuslan Ermilov @if type kldxref >/dev/null 2>&1; then \ 260be1d673dSRuslan Ermilov ${ECHO} kldxref ${DESTDIR}${KMODDIR}; \ 261be1d673dSRuslan Ermilov kldxref ${DESTDIR}${KMODDIR}; \ 262be1d673dSRuslan Ermilov fi 263505222d3SPeter Wemm.endif 2642cbc81ffSRuslan Ermilov.endif 265639a2e50SGarrett Wollman 266b25a566dSRuslan Ermilovinstall: afterinstall 267639a2e50SGarrett Wollmanafterinstall: realinstall 268639a2e50SGarrett Wollmanrealinstall: beforeinstall 269639a2e50SGarrett Wollman.endif 270639a2e50SGarrett Wollman 271d9584d76SJordan K. HubbardDISTRIBUTION?= bin 27255ff8fb1SPoul-Henning Kamp.if !target(distribute) 273b25a566dSRuslan Ermilovdistribute: 274398ac038SJordan K. Hubbard.for dist in ${DISTRIBUTION} 275398ac038SJordan K. Hubbard cd ${.CURDIR} ; $(MAKE) install DESTDIR=${DISTDIR}/${dist} SHARED=copies 276398ac038SJordan K. Hubbard.endfor 27755ff8fb1SPoul-Henning Kamp.endif 27855ff8fb1SPoul-Henning Kamp 279639a2e50SGarrett Wollman.if !target(load) 2809a8631b3SWarner Loshload: ${PROG} 281dba3dc7bSNick Hibma ${KMODLOAD} -v ${.OBJDIR}/${KMOD}.ko 282639a2e50SGarrett Wollman.endif 283639a2e50SGarrett Wollman 284639a2e50SGarrett Wollman.if !target(unload) 285fe3cac87SNick Hibmaunload: 2869a8631b3SWarner Losh ${KMODUNLOAD} -v ${KMOD} 28708a04a89SPeter Wemm.endif 2881aa57be3SGarrett Wollman 2894fea6704SBruce Evans.for _src in ${SRCS:Mopt_*.h} 2904fea6704SBruce EvansCLEANFILES+= ${_src} 2914fea6704SBruce Evans.if !target(${_src}) 2924fea6704SBruce Evans${_src}: 2934fea6704SBruce Evans touch ${.TARGET} 2944fea6704SBruce Evans.endif 2954fea6704SBruce Evans.endfor 2964fea6704SBruce Evans 2977fecffecSDoug RabsonMFILES?= kern/bus_if.m kern/device_if.m dev/iicbus/iicbb_if.m \ 2986f2d8adbSBoris Popov dev/iicbus/iicbus_if.m isa/isa_if.m \ 2996f2d8adbSBoris Popov libkern/iconv_converter_if.m \ 3006f2d8adbSBoris Popov dev/mii/miibus_if.m \ 3017e820aaaSMike Smith dev/pccard/card_if.m dev/pccard/power_if.m dev/pci/pci_if.m \ 3027e820aaaSMike Smith dev/pci/pcib_if.m dev/ppbus/ppbus_if.m dev/smbus/smbus_if.m \ 3030f55ac6cSCameron Grant dev/usb/usb_if.m dev/sound/pcm/ac97_if.m dev/sound/pcm/channel_if.m \ 304ed277dc9SPeter Wemm dev/sound/pcm/feeder_if.m dev/sound/pcm/mixer_if.m pci/agp_if.m 3057fecffecSDoug Rabson 3067fecffecSDoug Rabson.for _srcsrc in ${MFILES} 3074fea6704SBruce Evans.for _ext in c h 3084fea6704SBruce Evans.for _src in ${SRCS:M${_srcsrc:T:R}.${_ext}} 3094fea6704SBruce EvansCLEANFILES+= ${_src} 3104fea6704SBruce Evans.if !target(${_src}) 311f3cc9575SWarner Losh.if !exists(@) 3124fea6704SBruce Evans${_src}: @ 313f3cc9575SWarner Losh.endif 3144fea6704SBruce Evans.if exists(@) 3159fa411aeSDavid E. O'Brien${_src}: @/tools/makeobjops.awk @/${_srcsrc} 3164fea6704SBruce Evans.endif 3179fa411aeSDavid E. O'Brien ${AWK} -f @/tools/makeobjops.awk @/${_srcsrc} -${_ext} 3184fea6704SBruce Evans.endif 3194fea6704SBruce Evans.endfor # _src 3204fea6704SBruce Evans.endfor # _ext 3214fea6704SBruce Evans.endfor # _srcsrc 3224fea6704SBruce Evans 3239029b644SPeter Wemm.for _ext in c h 3249029b644SPeter Wemm.if ${SRCS:Mvnode_if.${_ext}} != "" 3259029b644SPeter WemmCLEANFILES+= vnode_if.${_ext} 326f3cc9575SWarner Losh.if !exists(@) 3279029b644SPeter Wemmvnode_if.${_ext}: @ 328f3cc9575SWarner Losh.endif 3294fea6704SBruce Evans.if exists(@) 330b7bbb709SDavid E. O'Brienvnode_if.${_ext}: @/tools/vnode_if.awk @/kern/vnode_if.src 3314fea6704SBruce Evans.endif 332b7bbb709SDavid E. O'Brien ${AWK} -f @/tools/vnode_if.awk @/kern/vnode_if.src -${_ext} 3334fea6704SBruce Evans.endif 3349029b644SPeter Wemm.endfor 3351aa57be3SGarrett Wollman 33671395925SPeter Wemmregress: 33769b87d3eSEivind Eklund 338766f7d6eSMark Murraylint: ${SRCS} 339bbb467cdSRuslan Ermilov ${LINT} ${LINTKERNFLAGS} ${CFLAGS:M-[DILU]*} ${.ALLSRC:M*.c} 340766f7d6eSMark Murray 34168e00b92SJordan K. Hubbard.include <bsd.dep.mk> 34247da63c3SBruce Evans 34347da63c3SBruce Evans.if !exists(${DEPENDFILE}) 344589d9341SBruce Evans${OBJS}: ${SRCS:M*.h} 34547da63c3SBruce Evans.endif 34647da63c3SBruce Evans 347afba897fSBruce Evans.include <bsd.obj.mk> 3489e72552fSBruce Evans.include <bsd.kern.mk> 349