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