bsd.kmodule.mk revision 1.59.14.1 1 # $NetBSD: bsd.kmodule.mk,v 1.59.14.1 2019/06/10 22:05:42 christos Exp $
2
3 # We are not building this with PIE
4 MKPIE=no
5
6 .include <bsd.init.mk>
7 .include <bsd.klinks.mk>
8
9 .if ${MKCTF:Uno} == "yes"
10 CFLAGS+= -g
11 # Only need symbols for ctf, strip them after converting to CTF
12 CTFFLAGS= -L VERSION
13 CTFMFLAGS= -t -L VERSION
14 .endif
15
16 .include <bsd.sys.mk>
17
18 ##### Basic targets
19 realinstall: kmodinstall
20
21 KERN= $S/kern
22 MKLDSCRIPT?= no
23
24 CFLAGS+= -ffreestanding ${COPTS}
25 CPPFLAGS+= -nostdinc -I. -I${.CURDIR} -isystem $S -isystem $S/arch
26 CPPFLAGS+= -isystem ${S}/../common/include
27 CPPFLAGS+= -D_KERNEL -D_LKM -D_MODULE -DSYSCTL_INCLUDE_DESCR
28
29 CWARNFLAGS.clang+= -Wno-error=address-of-packed-member -Wno-error=constant-conversion
30
31 # XXX until the kernel is fixed again...
32 CFLAGS+= -fno-strict-aliasing -Wno-pointer-sign
33
34 # XXX This is a workaround for platforms that have relative relocations
35 # that, when relocated by the module loader, result in addresses that
36 # overflow the size of the relocation (e.g. R_PPC_REL24 in powerpc).
37 # The real solution to this involves generating trampolines for those
38 # relocations inside the loader and removing this workaround, as the
39 # resulting code would be much faster.
40 .if ${MACHINE_CPU} == "arm"
41 CFLAGS+= -fno-common -fno-unwind-tables
42 .elif ${MACHINE_CPU} == "hppa"
43 CFLAGS+= -mlong-calls
44 .elif ${MACHINE_CPU} == "powerpc"
45 CFLAGS+= ${${ACTIVE_CC} == "gcc":? -mlongcall :}
46 .elif ${MACHINE_CPU} == "vax"
47 CFLAGS+= -fno-pic
48 .elif ${MACHINE_CPU} == "riscv"
49 CFLAGS+= -fPIC -Wa,-fno-pic
50 .elif ${MACHINE_ARCH} == "mips64eb" && !defined(BSD_MK_COMPAT_FILE)
51 CFLAGS+= -mabi=64
52 LDFLAGS+= -Wl,-m,elf64btsmip
53 .elif ${MACHINE_ARCH} == "mips64el" && !defined(BSD_MK_COMPAT_FILE)
54 CFLAGS+= -mabi=64
55 LDFLAGS+= -Wl,-m,elf64ltsmip
56 .endif
57
58 .if ${MACHINE_CPU} == "sparc64"
59 # force same memory model as rest of the kernel
60 CFLAGS+= ${${ACTIVE_CC} == "gcc":? -mcmodel=medlow :}
61 CFLAGS+= ${${ACTIVE_CC} == "clang":? -mcmodel=small :}
62 .endif
63
64 # evbppc needs some special help
65 .if ${MACHINE} == "evbppc"
66
67 . ifndef PPC_INTR_IMPL
68 PPC_INTR_IMPL=\"powerpc/intr.h\"
69 . endif
70 . ifndef PPC_PCI_MACHDEP_IMPL
71 PPC_PCI_MACHDEP_IMPL=\"powerpc/pci_machdep.h\"
72 . endif
73 CPPFLAGS+= -DPPC_INTR_IMPL=${PPC_INTR_IMPL}
74 CPPFLAGS+= -DPPC_PCI_MACHDEP_IMPL=${DPPC_PCI_MACHDEP_IMPL}
75
76 . ifdef PPC_IBM4XX
77 CPPFLAGS+= -DPPC_IBM4XX
78 . elifdef PPC_BOOKE
79 CPPFLAGS+= -DPPC_BOOKE
80 . else
81 CPPFLAGS+= -DPPC_OEA
82 . endif
83
84 .endif
85
86
87 _YKMSRCS= ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
88 DPSRCS+= ${_YKMSRCS}
89 CLEANFILES+= ${_YKMSRCS}
90
91 .if exists($S/../sys/modules/xldscripts/kmodule)
92 KMODSCRIPTSRC= $S/../sys/modules/xldscripts/kmodule
93 .else
94 KMODSCRIPTSRC= ${DESTDIR}/usr/libdata/ldscripts/kmodule
95 .endif
96 .if ${MKLDSCRIPT} == "yes"
97 KMODSCRIPT= kldscript
98 MKLDSCRIPTSH=
99 .else
100 KMODSCRIPT= ${KMODSCRIPTSRC}
101 .endif
102
103 PROG?= ${KMOD}.kmod
104
105 ##### Build rules
106 realall: ${PROG}
107
108 OBJS+= ${SRCS:N*.h:N*.sh:R:S/$/.o/g}
109
110 ${OBJS} ${LOBJS}: ${DPSRCS}
111
112 .if ${MKLDSCRIPT} == "yes"
113 ${KMODSCRIPT}: ${KMODSCRIPTSRC} ${OBJS} $S/conf/mkldscript.sh
114 @rm -f ${.TARGET}
115 @OBJDUMP=${OBJDUMP} ${HOST_SH} $S/conf/mkldscript.sh \
116 -t ${KMODSCRIPTSRC} ${OBJS} > ${.TARGET}
117 .endif
118
119 .if ${MACHINE_CPU} == "arm"
120 # The solution to limited branch space involves generating trampolines for
121 # those relocations while creating the module, as the resulting code will
122 # be much faster and simplifies the loader.
123 ARCHDIR= $S/modules/arch/${MACHINE_CPU}
124 ASM_H= $S/arch/${MACHINE_CPU}/include/asm.h
125 CLEANFILES+= tmp.o tmp.S ${KMOD}_tmp.o ${KMOD}_tramp.o ${KMOD}_tramp.S
126 ${KMOD}_tmp.o: ${OBJS} ${DPADD}
127 ${_MKTARGET_LINK}
128 ${LD} -r -o tmp.o ${OBJS}
129 ${LD} -r \
130 `${OBJDUMP} --syms --reloc tmp.o | \
131 ${TOOL_AWK} -f ${ARCHDIR}/kmodwrap.awk` \
132 -o ${.TARGET} tmp.o
133
134 ${KMOD}_tramp.S: ${KMOD}_tmp.o ${ARCHDIR}/kmodtramp.awk ${ASM_H}
135 ${_MKTARGET_CREATE}
136 ${OBJDUMP} --syms --reloc ${KMOD}_tmp.o | \
137 ${TOOL_AWK} -f ${ARCHDIR}/kmodtramp.awk \
138 > tmp.S && \
139 ${MV} tmp.S ${.TARGET}
140
141 ${PROG}: ${KMOD}_tmp.o ${KMOD}_tramp.o
142 ${_MKTARGET_LINK}
143 .if exists(${ARCHDIR}/kmodhide.awk)
144 ${LD} -r -Map=${.TARGET}.map \
145 -o tmp.o ${KMOD}_tmp.o ${KMOD}_tramp.o
146 ${OBJCOPY} \
147 `${NM} tmp.o | ${TOOL_AWK} -f ${ARCHDIR}/kmodhide.awk` \
148 tmp.o ${.TARGET} && \
149 rm tmp.o
150 .else
151 ${LD} -r -Map=${.TARGET}.map \
152 -o ${.TARGET} ${KMOD}_tmp.o ${KMOD}_tramp.o
153 .endif
154 .else
155 ${PROG}: ${OBJS} ${DPADD} ${KMODSCRIPT}
156 ${_MKTARGET_LINK}
157 ${CC} ${LDFLAGS} -nostdlib -r -Wl,-T,${KMODSCRIPT},-d \
158 -Wl,-Map=${.TARGET}.map \
159 -o ${.TARGET} ${OBJS}
160 .endif
161 .if defined(CTFMERGE)
162 ${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS}
163 .endif
164
165 ##### Install rules
166 .if !target(kmodinstall)
167 .if !defined(KMODULEDIR)
168 _OSRELEASE!= ${HOST_SH} $S/conf/osrelease.sh -k
169 # Ensure these are recorded properly in METALOG on unprived installes:
170 KMODULEARCHDIR?= ${MACHINE}
171 _INST_DIRS= ${DESTDIR}/stand/${KMODULEARCHDIR}
172 _INST_DIRS+= ${DESTDIR}/stand/${KMODULEARCHDIR}/${_OSRELEASE}
173 _INST_DIRS+= ${DESTDIR}/stand/${KMODULEARCHDIR}/${_OSRELEASE}/modules
174 KMODULEDIR= ${DESTDIR}/stand/${KMODULEARCHDIR}/${_OSRELEASE}/modules/${KMOD}
175 .endif
176 _PROG:= ${KMODULEDIR}/${PROG} # installed path
177
178 .if ${MKUPDATE} == "no"
179 ${_PROG}! ${PROG} # install rule
180 .if !defined(BUILD) && !make(all) && !make(${PROG})
181 ${_PROG}! .MADE # no build at install
182 .endif
183 .else
184 ${_PROG}: ${PROG} # install rule
185 .if !defined(BUILD) && !make(all) && !make(${PROG})
186 ${_PROG}: .MADE # no build at install
187 .endif
188 .endif
189 ${_MKTARGET_INSTALL}
190 dirs=${_INST_DIRS:Q}; \
191 for d in $$dirs; do \
192 ${INSTALL_DIR} $$d; \
193 done
194 ${INSTALL_DIR} ${KMODULEDIR}
195 ${INSTALL_FILE} -o ${KMODULEOWN} -g ${KMODULEGRP} -m ${KMODULEMODE} \
196 ${.ALLSRC} ${.TARGET}
197
198 kmodinstall:: ${_PROG}
199 .PHONY: kmodinstall
200 .PRECIOUS: ${_PROG} # keep if install fails
201
202 .undef _PROG
203 .endif # !target(kmodinstall)
204
205 ##### Clean rules
206 CLEANFILES+= a.out [Ee]rrs mklog core *.core ${PROG} ${OBJS} ${LOBJS}
207 CLEANFILES+= ${PROG}.map
208 .if ${MKLDSCRIPT} == "yes"
209 CLEANFILES+= kldscript
210 .endif
211
212 ##### Custom rules
213 lint: ${LOBJS}
214 .if defined(LOBJS) && !empty(LOBJS)
215 ${LINT} ${LINTFLAGS} ${LDFLAGS:C/-L[ ]*/-L/Wg:M-L*} ${LOBJS} ${LDADD}
216 .endif
217
218 ##### Pull in related .mk logic
219 LINKSOWN?= ${KMODULEOWN}
220 LINKSGRP?= ${KMODULEGRP}
221 LINKSMODE?= ${KMODULEMODE}
222 .include <bsd.man.mk>
223 .include <bsd.links.mk>
224 .include <bsd.dep.mk>
225 .include <bsd.clean.mk>
226
227 .-include "$S/arch/${MACHINE_CPU}/include/Makefile.inc"
228 .-include "$S/arch/${MACHINE}/include/Makefile.inc"
229