1# The include file <bsd.kmod.mk> handles building and installing loadable 2# kernel modules. 3# 4# 5# +++ variables +++ 6# 7# CLEANFILES Additional files to remove for the clean and cleandir targets. 8# 9# EXPORT_SYMS A list of symbols that should be exported from the module, 10# or the name of a file containing a list of symbols, or YES 11# to export all symbols. If not defined, no symbols are 12# exported. 13# 14# KMOD The name of the kernel module to build. 15# 16# KMODDIR Base path for kernel modules (see kld(4)). [/boot/kernel] 17# 18# KMODOWN Module file owner. [${BINOWN}] 19# 20# KMODGRP Module file group. [${BINGRP}] 21# 22# KMODMODE Module file mode. [${BINMODE}] 23# 24# KMODLOAD Command to load a kernel module [/sbin/kldload] 25# 26# KMODUNLOAD Command to unload a kernel module [/sbin/kldunload] 27# 28# KMODISLOADED Command to check whether a kernel module is 29# loaded [/sbin/kldstat -q -n] 30# 31# PROG The name of the kernel module to build. 32# If not supplied, ${KMOD}.ko is used. 33# 34# SRCS List of source files. 35# 36# FIRMWS List of firmware images in format filename:shortname:version 37# 38# FIRMWARE_LICENSE 39# Set to the name of the license the user has to agree on in 40# order to use this firmware. See /usr/share/doc/legal 41# 42# DESTDIR The tree where the module gets installed. [not set] 43# 44# KERNBUILDDIR Set to the location of the kernel build directory where 45# the opt_*.h files, .o's and kernel winds up. 46# 47# BLOB_OBJS Prebuilt binary blobs .o's from the src tree to be linked into 48# the module. These are precious and not removed in make clean. 49# 50# +++ targets +++ 51# 52# install: 53# install the kernel module; if the Makefile 54# does not itself define the target install, the targets 55# beforeinstall and afterinstall may also be used to cause 56# actions immediately before and after the install target 57# is executed. 58# 59# load: 60# Load a module. 61# 62# unload: 63# Unload a module. 64# 65# reload: 66# Unload if loaded, then load. 67# 68 69AWK?= awk 70KMODLOAD?= /sbin/kldload 71KMODUNLOAD?= /sbin/kldunload 72KMODISLOADED?= /sbin/kldstat -q -n 73OBJCOPY?= objcopy 74XARGS?= xargs 75XARGS_J?= -J 76 77.include "kmod.opts.mk" 78.include <bsd.sysdir.mk> 79 80.SUFFIXES: .out .o .c .cc .cxx .C .y .l .s .S .m 81 82# amd64 uses direct linking for kmod, all others use shared binaries 83.if ${MACHINE_CPUARCH} != amd64 84__KLD_SHARED=yes 85.else 86__KLD_SHARED=no 87.endif 88 89.if !empty(CFLAGS:M-O[23s]) && empty(CFLAGS:M-fno-strict-aliasing) 90CFLAGS+= -fno-strict-aliasing 91.endif 92WERROR?= -Werror 93 94LINUXKPI_GENSRCS+= \ 95 backlight_if.h \ 96 bus_if.h \ 97 device_if.h \ 98 iicbus_if.h \ 99 iicbb_if.h \ 100 lkpi_iic_if.c \ 101 lkpi_iic_if.h \ 102 pci_if.h \ 103 pci_iov_if.h \ 104 pcib_if.h \ 105 vnode_if.h \ 106 opt_stack.h 107 108.if ${MK_USB} != "no" 109LINUXKPI_GENSRCS+= \ 110 usb_if.h \ 111 opt_usb.h 112.endif 113 114LINUXKPI_INCLUDES+= \ 115 -I${SYSDIR}/compat/linuxkpi/common/include \ 116 -I${SYSDIR}/compat/linuxkpi/dummy/include \ 117 -include ${SYSDIR}/compat/linuxkpi/common/include/linux/kconfig.h 118 119CFLAGS+= ${WERROR} 120CFLAGS+= -D_KERNEL 121CFLAGS+= -DKLD_MODULE 122.if defined(MODULE_TIED) 123CFLAGS+= -DKLD_TIED 124.endif 125 126# Don't use any standard or source-relative include directories. 127NOSTDINC= -nostdinc 128CFLAGS:= ${CFLAGS:N-I*} ${NOSTDINC} ${INCLMAGIC} ${CFLAGS:M-I*} 129.if defined(KERNBUILDDIR) 130CFLAGS+= -DHAVE_KERNEL_OPTION_HEADERS -include ${KERNBUILDDIR}/opt_global.h 131.else 132SRCS+= opt_global.h 133CFLAGS+= -include ${.OBJDIR}/opt_global.h 134.endif 135 136# Add -I paths for system headers. Individual module makefiles don't 137# need any -I paths for this. Similar defaults for .PATH can't be 138# set because there are no standard paths for non-headers. 139CFLAGS+= -I. -I${SYSDIR} -I${SYSDIR}/contrib/ck/include 140 141CFLAGS.gcc+= -finline-limit=${INLINE_LIMIT} 142CFLAGS.gcc+= -fms-extensions 143CFLAGS.gcc+= --param inline-unit-growth=100 144CFLAGS.gcc+= --param large-function-growth=1000 145 146# Disallow common variables, and if we end up with commons from 147# somewhere unexpected, allocate storage for them in the module itself. 148# 149# -fno-common is the default for src builds, but this should be left in place 150# until at least we catch up to GCC10/LLVM11 or otherwise enable -fno-common 151# in <bsd.sys.mk> instead. For now, we will have duplicate -fno-common in 152# CFLAGS for in-tree module builds as they will also pick it up from 153# share/mk/src.sys.mk, but the following is important for out-of-tree modules 154# (e.g. ports). 155CFLAGS+= -fno-common 156.if ${LINKER_TYPE} != "lld" || ${LINKER_VERSION} < 140000 157# lld >= 14 warns that -d is deprecated, and will be removed. 158LDFLAGS+= -d 159.endif 160LDFLAGS+= -warn-common 161 162.if defined(LINKER_FEATURES) && ${LINKER_FEATURES:Mbuild-id} 163LDFLAGS+= --build-id=sha1 164.endif 165 166CFLAGS+= ${DEBUG_FLAGS} 167.if ${MACHINE_CPUARCH} == aarch64 || ${MACHINE_CPUARCH} == amd64 || \ 168 ${MACHINE_CPUARCH} == riscv 169CFLAGS+= -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer 170.endif 171 172.if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "riscv" || \ 173 ${MACHINE_CPUARCH} == "powerpc" || ${MACHINE_CPUARCH} == "i386" 174CFLAGS+= -fPIC 175.endif 176 177.if ${MACHINE_CPUARCH} == "aarch64" 178# https://bugs.freebsd.org/264094 179# lld >= 14 and recent GNU ld can relax adrp+add and adrp+ldr instructions, 180# which breaks VNET. 181LDFLAGS+= --no-relax 182.endif 183 184# Temporary workaround for PR 196407, which contains the fascinating details. 185# Don't allow clang to use fpu instructions or registers in kernel modules. 186.if ${MACHINE_CPUARCH} == arm 187CFLAGS.clang+= -mno-movt 188CFLAGS.clang+= -mfpu=none 189CFLAGS+= -funwind-tables 190.endif 191 192.if ${MACHINE_CPUARCH} == powerpc 193CFLAGS+= -mlongcall -fno-omit-frame-pointer 194.if ${LINKER_TYPE} == "lld" 195# TOC optimization in LLD (9.0) currently breaks kernel modules, so disable it 196LDFLAGS+= --no-toc-optimize 197.endif 198.endif 199 200.if defined(DEBUG) || defined(DEBUG_FLAGS) 201CTFFLAGS+= -g 202.endif 203 204.if defined(FIRMWS) 205${KMOD:S/$/.c/}: ${SYSDIR}/tools/fw_stub.awk 206 ${AWK} -f ${SYSDIR}/tools/fw_stub.awk ${FIRMWS} -m${KMOD} -c${KMOD:S/$/.c/g} \ 207 ${FIRMWARE_LICENSE:C/.+/-l/}${FIRMWARE_LICENSE} 208 209SRCS+= ${KMOD:S/$/.c/} 210CLEANFILES+= ${KMOD:S/$/.c/} 211 212.for _firmw in ${FIRMWS} 213${_firmw:C/\:.*$/.fwo/:T}: ${_firmw:C/\:.*$//} ${SYSDIR}/kern/firmw.S 214 @${ECHO} ${_firmw:C/\:.*$//} ${.ALLSRC:M*${_firmw:C/\:.*$//}} 215 ${CC:N${CCACHE_BIN}} -c -x assembler-with-cpp -DLOCORE \ 216 ${CFLAGS} ${WERROR} \ 217 -DFIRMW_FILE=\""${.ALLSRC:M*${_firmw:C/\:.*$//}}"\" \ 218 -DFIRMW_SYMBOL="${_firmw:C/\:.*$//:C/[-.\/@]/_/g}" \ 219 ${SYSDIR}/kern/firmw.S -o ${.TARGET} 220 221OBJS+= ${_firmw:C/\:.*$/.fwo/:T} 222.endfor 223.endif 224 225# Conditionally include SRCS based on kernel config options. 226.for _o in ${KERN_OPTS} 227SRCS+=${SRCS.${_o}} 228.endfor 229 230OBJS+= ${SRCS:N*.h:R:S/$/.o/g} 231 232.if !defined(PROG) 233PROG= ${KMOD}.ko 234.endif 235 236.if !defined(DEBUG_FLAGS) || ${MK_SPLIT_KERNEL_DEBUG} == "no" 237FULLPROG= ${PROG} 238.else 239FULLPROG= ${PROG}.full 240${PROG}: ${FULLPROG} ${PROG}.debug 241 ${OBJCOPY} --strip-debug --add-gnu-debuglink=${PROG}.debug \ 242 ${FULLPROG} ${.TARGET} 243${PROG}.debug: ${FULLPROG} 244 ${OBJCOPY} --only-keep-debug ${FULLPROG} ${.TARGET} 245.endif 246 247.if ${__KLD_SHARED} == yes 248${FULLPROG}: ${KMOD}.kld 249 ${LD} -m ${LD_EMULATION} -Bshareable -znotext -znorelro ${_LDFLAGS} \ 250 -o ${.TARGET} ${KMOD}.kld 251.if !defined(DEBUG_FLAGS) 252 ${OBJCOPY} --strip-debug ${.TARGET} 253.endif 254.endif 255 256EXPORT_SYMS?= NO 257.if ${EXPORT_SYMS} != YES 258CLEANFILES+= export_syms 259.endif 260 261.if exists(${SYSDIR}/conf/ldscript.kmod.${MACHINE}) 262LDSCRIPT_FLAGS?= -T ${SYSDIR}/conf/ldscript.kmod.${MACHINE} 263.endif 264 265.if ${__KLD_SHARED} == yes 266${KMOD}.kld: ${OBJS} ${BLOB_OBJS} 267.else 268${FULLPROG}: ${OBJS} ${BLOB_OBJS} 269.endif 270 ${LD} -m ${LD_EMULATION} ${_LDFLAGS} ${LDSCRIPT_FLAGS} -r \ 271 -o ${.TARGET} ${OBJS} ${BLOB_OBJS} 272.if ${MK_CTF} != "no" 273 ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS} ${BLOB_OBJS} 274.endif 275.if defined(EXPORT_SYMS) 276.if ${EXPORT_SYMS} != YES 277.if ${EXPORT_SYMS} == NO 278 :> export_syms 279.elif !exists(${.CURDIR}/${EXPORT_SYMS}) 280 printf '%s' "${EXPORT_SYMS:@s@$s${.newline}@}" > export_syms 281.else 282 grep -v '^#' < ${EXPORT_SYMS} > export_syms 283.endif 284 ${AWK} -f ${SYSDIR}/conf/kmod_syms.awk ${.TARGET} \ 285 export_syms | ${XARGS} ${XARGS_J} % ${OBJCOPY} % ${.TARGET} 286.endif 287.endif # defined(EXPORT_SYMS) 288.if defined(PREFIX_SYMS) 289 ${AWK} -v prefix=${PREFIX_SYMS} -f ${SYSDIR}/conf/kmod_syms_prefix.awk \ 290 ${.TARGET} /dev/null | ${XARGS} ${XARGS_J} % ${OBJCOPY} % ${.TARGET} 291.endif 292.if !defined(DEBUG_FLAGS) && ${__KLD_SHARED} == no 293 ${OBJCOPY} --strip-debug ${.TARGET} 294.endif 295 296_ILINKS=machine 297.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64" 298_ILINKS+=x86 299.endif 300.if ${MACHINE_CPUARCH} == "amd64" 301_ILINKS+=i386 302.endif 303CLEANFILES+=${_ILINKS} 304 305all: ${PROG} 306 307beforedepend: ${_ILINKS} 308beforebuild: ${_ILINKS} 309 310.if ${MK_REPRODUCIBLE_PATHS} != "no" 311PREFIX_SYSDIR=/usr/src/sys 312CFLAGS+= -ffile-prefix-map=${SYSDIR}=${PREFIX_SYSDIR} 313.if defined(KERNBUILDDIR) 314PREFIX_KERNBUILDDIR=/usr/obj/usr/src/${MACHINE}.${MACHINE_CPUARCH}/sys/${KERNBUILDDIR:T} 315PREFIX_OBJDIR=${PREFIX_KERNBUILDDIR}/modules/usr/src/sys/modules/${.OBJDIR:T} 316CFLAGS+= -ffile-prefix-map=${KERNBUILDDIR}=${PREFIX_KERNBUILDDIR} 317.else 318PREFIX_OBJDIR=/usr/obj/usr/src/${MACHINE}.${MACHINE_CPUARCH}/sys/modules/${.OBJDIR:T} 319.endif 320CFLAGS+= -ffile-prefix-map=${.OBJDIR}=${PREFIX_OBJDIR} 321.if defined(SYSROOT) 322CFLAGS+= -ffile-prefix-map=${SYSROOT}=/sysroot 323.endif 324.else 325PREFIX_SYSDIR=${SYSDIR} 326PREFIX_OBJDIR=${.OBJDIR} 327.endif 328 329# Ensure that the links exist without depending on it when it exists which 330# causes all the modules to be rebuilt when the directory pointed to changes. 331# Ensure that debug info references the path in the source tree. 332.for _link in ${_ILINKS} 333.if !exists(${.OBJDIR}/${_link}) 334OBJS_DEPEND_GUESS+= ${_link} 335.endif 336.if ${_link} == "machine" 337CFLAGS+= -fdebug-prefix-map=./machine=${PREFIX_SYSDIR}/${MACHINE}/include 338.else 339CFLAGS+= -fdebug-prefix-map=./${_link}=${PREFIX_SYSDIR}/${_link}/include 340.endif 341.endfor 342 343.NOPATH: ${_ILINKS} 344 345${_ILINKS}: 346 @case ${.TARGET} in \ 347 machine) \ 348 path=${SYSDIR}/${MACHINE}/include ;; \ 349 *) \ 350 path=${SYSDIR}/${.TARGET:T}/include ;; \ 351 esac ; \ 352 path=`realpath $$path`; \ 353 ${ECHO} ${.TARGET:T} "->" $$path ; \ 354 ln -fns $$path ${.TARGET:T} 355 356CLEANFILES+= ${PROG} ${KMOD}.kld ${OBJS} 357 358.if defined(DEBUG_FLAGS) && ${MK_SPLIT_KERNEL_DEBUG} != "no" 359CLEANFILES+= ${FULLPROG} ${PROG}.debug 360.endif 361 362.if !target(install) 363 364_INSTALLFLAGS:= ${INSTALLFLAGS} 365.for ie in ${INSTALLFLAGS_EDIT} 366_INSTALLFLAGS:= ${_INSTALLFLAGS${ie}} 367.endfor 368 369.if !target(realinstall) 370KERN_DEBUGDIR?= ${DEBUGDIR} 371realinstall: _kmodinstall 372.ORDER: beforeinstall _kmodinstall 373_kmodinstall: .PHONY 374 ${INSTALL} -T release -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \ 375 ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${KMODDIR}/ 376.if defined(DEBUG_FLAGS) && !defined(INSTALL_NODEBUG) && ${MK_KERNEL_SYMBOLS} != "no" 377 ${INSTALL} -T dbg -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \ 378 ${_INSTALLFLAGS} ${PROG}.debug ${DESTDIR}${KERN_DEBUGDIR}${KMODDIR}/ 379.endif 380 381.include <bsd.links.mk> 382 383.if !defined(NO_XREF) 384afterinstall: _kldxref 385.ORDER: realinstall _kldxref 386.ORDER: _installlinks _kldxref 387_kldxref: .PHONY 388 ${KLDXREF_CMD} ${DESTDIR}${KMODDIR} 389.if defined(NO_ROOT) && defined(METALOG) 390 echo ".${DISTBASE}${KMODDIR}/linker.hints type=file uname=root gname=wheel mode=0644" | \ 391 cat -l >> ${METALOG} 392.endif 393.endif 394.endif # !target(realinstall) 395 396.endif # !target(install) 397 398.if !target(load) 399load: ${PROG} .PHONY 400 ${KMODLOAD} -v ${.OBJDIR}/${PROG} 401.endif 402 403.if !target(unload) 404unload: .PHONY 405 if ${KMODISLOADED} ${PROG} ; then ${KMODUNLOAD} -v ${PROG} ; fi 406.endif 407 408.if !target(reload) 409reload: unload load .PHONY 410.endif 411 412.if defined(KERNBUILDDIR) 413.PATH: ${KERNBUILDDIR} 414CFLAGS+= -I${KERNBUILDDIR} 415.for _src in ${SRCS:Mopt_*.h} 416CLEANFILES+= ${_src} 417.if !target(${_src}) 418${_src}: 419 ln -sf ${KERNBUILDDIR}/${_src} ${.TARGET} 420.endif 421.endfor 422.else 423.for _src in ${SRCS:Mopt_*.h} 424CLEANFILES+= ${_src} 425.if !target(${_src}) 426${_src}: 427 :> ${.TARGET} 428.endif 429.endfor 430.endif 431 432KASAN_ENABLED= ${KERN_OPTS:MKASAN} 433KCSAN_ENABLED= ${KERN_OPTS:MKCSAN} 434KMSAN_ENABLED= ${KERN_OPTS:MKMSAN} 435KUBSAN_ENABLED= ${KERN_OPTS:MKUBSAN} 436 437# Add the gcov flags 438CFLAGS+= ${GCOV_CFLAGS} 439 440# Respect configuration-specific C flags. 441CFLAGS+= ${ARCH_FLAGS} ${CONF_CFLAGS} 442 443.if !empty(SRCS:Mvnode_if.c) 444CLEANFILES+= vnode_if.c 445vnode_if.c: ${SYSDIR}/tools/vnode_if.awk ${SYSDIR}/kern/vnode_if.src 446 ${AWK} -f ${SYSDIR}/tools/vnode_if.awk ${SYSDIR}/kern/vnode_if.src -c 447.endif 448 449.if !empty(SRCS:Mvnode_if.h) 450CLEANFILES+= vnode_if.h vnode_if_newproto.h vnode_if_typedef.h 451vnode_if.h vnode_if_newproto.h vnode_if_typedef.h: ${SYSDIR}/tools/vnode_if.awk \ 452 ${SYSDIR}/kern/vnode_if.src 453vnode_if.h: vnode_if_newproto.h vnode_if_typedef.h 454 ${AWK} -f ${SYSDIR}/tools/vnode_if.awk ${SYSDIR}/kern/vnode_if.src -h 455vnode_if_newproto.h: 456 ${AWK} -f ${SYSDIR}/tools/vnode_if.awk ${SYSDIR}/kern/vnode_if.src -p 457vnode_if_typedef.h: 458 ${AWK} -f ${SYSDIR}/tools/vnode_if.awk ${SYSDIR}/kern/vnode_if.src -q 459.endif 460 461# Build _if.[ch] from _if.m, and clean them when we're done. 462# __MPATH defined in config.mk 463_MFILES=${__MPATH:T:O} 464_MPATH=${__MPATH:H:O:u} 465.PATH.m: ${_MPATH} 466.for _i in ${SRCS:M*_if.[ch]} 467_MATCH=M${_i:R:S/$/.m/} 468_MATCHES=${_MFILES:${_MATCH}} 469.if !empty(_MATCHES) 470CLEANFILES+= ${_i} 471.endif 472.endfor # _i 473.m.c: ${SYSDIR}/tools/makeobjops.awk 474 ${AWK} -f ${SYSDIR}/tools/makeobjops.awk ${.IMPSRC} -c 475 476.m.h: ${SYSDIR}/tools/makeobjops.awk 477 ${AWK} -f ${SYSDIR}/tools/makeobjops.awk ${.IMPSRC} -h 478 479.for _i in mii 480.if !empty(SRCS:M${_i}devs.h) 481CLEANFILES+= ${_i}devs.h 482${_i}devs.h: ${SYSDIR}/tools/${_i}devs2h.awk ${SYSDIR}/dev/${_i}/${_i}devs 483 ${AWK} -f ${SYSDIR}/tools/${_i}devs2h.awk ${SYSDIR}/dev/${_i}/${_i}devs 484.endif 485.endfor # _i 486 487.if !empty(SRCS:Mbhnd_nvram_map.h) 488CLEANFILES+= bhnd_nvram_map.h 489bhnd_nvram_map.h: ${SYSDIR}/dev/bhnd/tools/nvram_map_gen.awk \ 490 ${SYSDIR}/dev/bhnd/tools/nvram_map_gen.sh \ 491 ${SYSDIR}/dev/bhnd/nvram/nvram_map 492bhnd_nvram_map.h: 493 sh ${SYSDIR}/dev/bhnd/tools/nvram_map_gen.sh \ 494 ${SYSDIR}/dev/bhnd/nvram/nvram_map -h 495.endif 496 497.if !empty(SRCS:Mbhnd_nvram_map_data.h) 498CLEANFILES+= bhnd_nvram_map_data.h 499bhnd_nvram_map_data.h: ${SYSDIR}/dev/bhnd/tools/nvram_map_gen.awk \ 500 ${SYSDIR}/dev/bhnd/tools/nvram_map_gen.sh \ 501 ${SYSDIR}/dev/bhnd/nvram/nvram_map 502bhnd_nvram_map_data.h: 503 sh ${SYSDIR}/dev/bhnd/tools/nvram_map_gen.sh \ 504 ${SYSDIR}/dev/bhnd/nvram/nvram_map -d 505.endif 506 507.if !empty(SRCS:Musbdevs.h) 508CLEANFILES+= usbdevs.h 509usbdevs.h: ${SYSDIR}/tools/usbdevs2h.awk ${SYSDIR}/dev/usb/usbdevs 510 ${AWK} -f ${SYSDIR}/tools/usbdevs2h.awk ${SYSDIR}/dev/usb/usbdevs -h 511.endif 512 513.if !empty(SRCS:Musbdevs_data.h) 514CLEANFILES+= usbdevs_data.h 515usbdevs_data.h: ${SYSDIR}/tools/usbdevs2h.awk ${SYSDIR}/dev/usb/usbdevs 516 ${AWK} -f ${SYSDIR}/tools/usbdevs2h.awk ${SYSDIR}/dev/usb/usbdevs -d 517.endif 518 519.if !empty(SRCS:Msdiodevs.h) 520CLEANFILES+= sdiodevs.h 521sdiodevs.h: ${SYSDIR}/tools/sdiodevs2h.awk ${SYSDIR}/dev/sdio/sdiodevs 522 ${AWK} -f ${SYSDIR}/tools/sdiodevs2h.awk ${SYSDIR}/dev/sdio/sdiodevs -h 523.endif 524 525.if !empty(SRCS:Msdiodevs_data.h) 526CLEANFILES+= sdiodevs_data.h 527sdiodevs_data.h: ${SYSDIR}/tools/sdiodevs2h.awk ${SYSDIR}/dev/sdio/sdiodevs 528 ${AWK} -f ${SYSDIR}/tools/sdiodevs2h.awk ${SYSDIR}/dev/sdio/sdiodevs -d 529.endif 530 531.if !empty(SRCS:Macpi_quirks.h) 532CLEANFILES+= acpi_quirks.h 533acpi_quirks.h: ${SYSDIR}/tools/acpi_quirks2h.awk ${SYSDIR}/dev/acpica/acpi_quirks 534 ${AWK} -f ${SYSDIR}/tools/acpi_quirks2h.awk ${SYSDIR}/dev/acpica/acpi_quirks 535.endif 536 537.if !empty(SRCS:Massym.inc) || !empty(DPSRCS:Massym.inc) 538CLEANFILES+= assym.inc genassym.o 539DEPENDOBJS+= genassym.o 540DPSRCS+= offset.inc 541.endif 542.if defined(MODULE_TIED) 543DPSRCS+= offset.inc 544.endif 545.if !empty(SRCS:Moffset.inc) || !empty(DPSRCS:Moffset.inc) 546CLEANFILES+= offset.inc genoffset.o 547DEPENDOBJS+= genoffset.o 548.endif 549assym.inc: genassym.o 550offset.inc: genoffset.o 551assym.inc: ${SYSDIR}/kern/genassym.sh 552 sh ${SYSDIR}/kern/genassym.sh genassym.o > ${.TARGET} 553genassym.o: ${SYSDIR}/${MACHINE}/${MACHINE}/genassym.c offset.inc 554genassym.o: ${SRCS:Mopt_*.h} 555 ${CC} -c ${NOSAN_CFLAGS:N-flto*:N-fno-common} -fcommon \ 556 ${SYSDIR}/${MACHINE}/${MACHINE}/genassym.c 557offset.inc: ${SYSDIR}/kern/genoffset.sh genoffset.o 558 sh ${SYSDIR}/kern/genoffset.sh genoffset.o > ${.TARGET} 559genoffset.o: ${SYSDIR}/kern/genoffset.c 560genoffset.o: ${SRCS:Mopt_*.h} 561 ${CC} -c ${NOSAN_CFLAGS:N-flto*:N-fno-common} -fcommon \ 562 ${SYSDIR}/kern/genoffset.c 563 564CLEANDEPENDFILES+= ${_ILINKS} 565# .depend needs include links so we remove them only together. 566cleanilinks: 567 rm -f ${_ILINKS} 568 569OBJS_DEPEND_GUESS+= ${SRCS:M*.h} 570.if defined(KERNBUILDDIR) 571OBJS_DEPEND_GUESS+= opt_global.h 572.endif 573 574ZINCDIR=${SYSDIR}/contrib/openzfs/include 575OPENZFS_CFLAGS= \ 576 -D_SYS_VMEM_H_ \ 577 -D__KERNEL__ \ 578 -nostdinc \ 579 -DSMP \ 580 -I${ZINCDIR} \ 581 -I${ZINCDIR}/os/freebsd \ 582 -I${ZINCDIR}/os/freebsd/spl \ 583 -I${ZINCDIR}/os/freebsd/zfs \ 584 -I${SYSDIR}/cddl/compat/opensolaris \ 585 -I${SYSDIR}/cddl/contrib/opensolaris/uts/common \ 586 -include ${ZINCDIR}/os/freebsd/spl/sys/ccompile.h 587 588.include <bsd.dep.mk> 589.include <bsd.clang-analyze.mk> 590.include <bsd.obj.mk> 591.include "kern.mk" 592