kern.pre.mk revision 330420
185909Simp# $FreeBSD: stable/11/sys/conf/kern.pre.mk 330420 2018-03-04 23:25:26Z bdrewery $
285909Simp
3122116Sbde# Part of a unified Makefile for building kernels.  This part contains all
4122116Sbde# of the definitions that need to be before %BEFORE_DEPEND.
5122116Sbde
6180012Sru# Allow user to configure things that only effect src tree builds.
7240468Sbrooks# Note: This is duplicated from src.sys.mk to ensure that we include
8160440Sobrien# /etc/src.conf when building the kernel. Kernels can be built without
9210151Simp# the rest of /usr/src, but they still always process SRCCONF even though
10239272Sgonzo# the normal mechanisms to prevent that (compiling out of tree) won't
11210151Simp# work. To ensure they do work, we have to duplicate thee few lines here.
1285909SimpSRCCONF?=	/etc/src.conf
1385909Simp.if (exists(${SRCCONF}) || ${SRCCONF} != "/etc/src.conf") && !target(_srcconf_included_)
1485909Simp.include "${SRCCONF}"
1585909Simp_srcconf_included_:
16175888Simp.endif
17175888Simp
1885909Simp.include <bsd.own.mk>
19218538Simp.include <bsd.compiler.mk>
2085909Simp.include "kern.opts.mk"
2191512Sobrien
22240451Snp# The kernel build always occurs in the object directory which is .CURDIR.
23116341Smarkm.if ${.MAKE.MODE:Unormal:Mmeta}
2485909Simp.MAKE.MODE+=	curdirOk=yes
2585909Simp.endif
2685909Simp
2785909Simp# The kernel build always expects .OBJDIR=.CURDIR.
28220863Sdim.OBJDIR: ${.CURDIR}
29140606Sobrien
30187103Sgnn# Can be overridden by makeoptions or /etc/make.conf
31220863SdimKERNEL_KO?=	kernel
32224882SnwhitehornKERNEL?=	kernel
33224882SnwhitehornKODIR?=		/boot/${KERNEL}
34224882SnwhitehornLDSCRIPT_NAME?=	ldscript.$M
35140606SobrienLDSCRIPT?=	$S/conf/${LDSCRIPT_NAME}
36220863Sdim
37224882SnwhitehornM=		${MACHINE}
38220863Sdim
39240468SbrooksAWK?=		awk
40127204SobrienCP?=		cp
41220863SdimLINT?=		lint
42228868SdimNM?=		nm
43228868SdimOBJCOPY?=	objcopy
44228868SdimSIZE?=		size
45140606Sobrien
46220863Sdim.if defined(DEBUG)
47220863Sdim_MINUS_O=	-O
48124834SruCTFFLAGS+=	-g
49124834Sru.else
5085909Simp.if ${MACHINE_CPUARCH} == "powerpc"
5185909Simp_MINUS_O=	-O	# gcc miscompiles some code at -O2
5285909Simp.else
53160043Sobrien_MINUS_O=	-O2
54126890Strhodes.endif
5585909Simp.endif
56192901Sthompsa.if ${MACHINE_CPUARCH} == "amd64"
57126890Strhodes.if ${COMPILER_TYPE} == "clang"
58151605SobrienCOPTFLAGS?=-O2 -pipe
59151605Sobrien.else
60130416SmlaierCOPTFLAGS?=-O2 -frename-registers -pipe
61130416Smlaier.endif
62149978Sobrien.else
63149978SobrienCOPTFLAGS?=${_MINUS_O} -pipe
64149978Sobrien.endif
65149978Sobrien.if !empty(COPTFLAGS:M-O[23s]) && empty(COPTFLAGS:M-fno-strict-aliasing)
66149978SobrienCOPTFLAGS+= -fno-strict-aliasing
67185522Ssam.endif
68185522Ssam.if !defined(NO_CPU_COPTFLAGS)
69149978SobrienCOPTFLAGS+= ${_CPUCFLAGS}
70149978Sobrien.endif
71149978SobrienNOSTDINC= -nostdinc
72149978Sobrien
73229353SgjbINCLUDES= ${NOSTDINC} ${INCLMAGIC} -I. -I$S
74149978Sobrien
75149978SobrienCFLAGS=	${COPTFLAGS} ${DEBUG}
76218792SnpCFLAGS+= ${INCLUDES} -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include opt_global.h
77218792SnpCFLAGS_PARAM_INLINE_UNIT_GROWTH?=100
78183292SkmacyCFLAGS_PARAM_LARGE_FUNCTION_GROWTH?=1000
79149978Sobrien.if ${MACHINE_CPUARCH} == "mips"
80149978SobrienCFLAGS_ARCH_PARAMS?=--param max-inline-insns-single=1000
81160043Sobrien.endif
82150966SglebiusCFLAGS.gcc+= -fno-common -fms-extensions -finline-limit=${INLINE_LIMIT}
83240468SbrooksCFLAGS.gcc+= --param inline-unit-growth=${CFLAGS_PARAM_INLINE_UNIT_GROWTH}
84124834SruCFLAGS.gcc+= --param large-function-growth=${CFLAGS_PARAM_LARGE_FUNCTION_GROWTH}
85210311Sjmallett.if defined(CFLAGS_ARCH_PARAMS)
86132766SkanCFLAGS.gcc+=${CFLAGS_ARCH_PARAMS}
87132766Skan.endif
88210311SjmallettWERROR?= -Werror
89210311Sjmallett
90215988Sjmallett# XXX LOCORE means "don't declare C stuff" not "for locore.s".
91210311SjmallettASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${CFLAGS} ${ASM_CFLAGS.${.IMPSRC:T}} 
92215988Sjmallett
93210311Sjmallett.if defined(PROFLEVEL) && ${PROFLEVEL} >= 1
94210394SrpauloCFLAGS+=	-DGPROF
95171239SpeterCFLAGS.gcc+=	-falign-functions=16
9685909Simp.if ${PROFLEVEL} >= 2
9785909SimpCFLAGS+=	-DGPROF4 -DGUPROF
9885909SimpPROF=		-pg
9985909Simp.if ${COMPILER_TYPE} == "gcc"
100240468SbrooksPROF+=		-mprofiler-epilogue
101232263Sdim.endif
102232263Sdim.else
103232263SdimPROF=		-pg
10499923Sbde.endif
105242715Sdim.endif
106242715SdimDEFINED_PROF=	${PROF}
107242715Sdim
108242715Sdim# Put configuration-specific C flags last (except for ${PROF}) so that they
10999932Sbde# can override the others.
11099932SbdeCFLAGS+=	${CONF_CFLAGS}
111242717Sdim
112242717Sdim# Optional linting. This can be overridden in /etc/make.conf.
113242717SdimLINTFLAGS=	${LINTOBJKERNFLAGS}
114242717Sdim
11599932SbdeNORMAL_C= ${CC} -c ${CFLAGS} ${WERROR} ${PROF} ${.IMPSRC}
116242717SdimNORMAL_S= ${CC:N${CCACHE_BIN}} -c ${ASM_CFLAGS} ${WERROR} ${.IMPSRC}
11799923SbdePROFILE_C= ${CC} -c ${CFLAGS} ${WERROR} ${.IMPSRC}
11899932SbdeNORMAL_C_NOWERROR= ${CC} -c ${CFLAGS} ${PROF} ${.IMPSRC}
11985909Simp
12091002SpeterNORMAL_M= ${AWK} -f $S/tools/makeobjops.awk ${.IMPSRC} -c ; \
12185909Simp	  ${CC} -c ${CFLAGS} ${WERROR} ${PROF} ${.PREFIX}.c
12285909Simp
12385909SimpNORMAL_FW= uudecode -o ${.TARGET} ${.ALLSRC}
12485909SimpNORMAL_FWO= ${LD} -b binary --no-warn-mismatch -d -warn-common -r \
125116341Smarkm	-m ${LD_EMULATION} -o ${.TARGET} ${.ALLSRC:M*.fw}
126116341Smarkm
127116341Smarkm# Common for dtrace / zfs
12891002SpeterCDDL_CFLAGS=	-DFREEBSD_NAMECACHE -nostdinc -I$S/cddl/compat/opensolaris -I$S/cddl/contrib/opensolaris/uts/common -I$S -I$S/cddl/contrib/opensolaris/common ${CFLAGS} -Wno-unknown-pragmas -Wno-missing-prototypes -Wno-undef -Wno-strict-prototypes -Wno-cast-qual -Wno-parentheses -Wno-redundant-decls -Wno-missing-braces -Wno-uninitialized -Wno-unused -Wno-inline -Wno-switch -Wno-pointer-arith -Wno-unknown-pragmas
12991002SpeterCDDL_CFLAGS+=	-include $S/cddl/compat/opensolaris/sys/debug_compat.h
13091002SpeterCDDL_C=		${CC} -c ${CDDL_CFLAGS} ${WERROR} ${PROF} ${.IMPSRC}
131105489Smux
13285909Simp# Special flags for managing the compat compiles for ZFS
133105462SmuxZFS_CFLAGS=	-DBUILDING_ZFS -I$S/cddl/contrib/opensolaris/uts/common/fs/zfs
134105462SmuxZFS_CFLAGS+=	-I$S/cddl/contrib/opensolaris/uts/common/fs/zfs/lua
13585909SimpZFS_CFLAGS+=	-I$S/cddl/contrib/opensolaris/uts/common/zmod
136239956SjhbZFS_CFLAGS+=	-I$S/cddl/contrib/opensolaris/common/zfs
137239957SjhbZFS_CFLAGS+=	${CDDL_CFLAGS}
138239957SjhbZFS_ASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${ZFS_CFLAGS}
139239955SjhbZFS_C=		${CC} -c ${ZFS_CFLAGS} ${WERROR} ${PROF} ${.IMPSRC}
140233578SpeterZFS_S=		${CC} -c ${ZFS_ASM_CFLAGS} ${WERROR} ${.IMPSRC}
141233578Speter
142233578Speter# Special flags for managing the compat compiles for DTrace
143233578SpeterDTRACE_CFLAGS=	-DBUILDING_DTRACE ${CDDL_CFLAGS} -I$S/cddl/dev/dtrace -I$S/cddl/dev/dtrace/${MACHINE_CPUARCH}
144233578Speter.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
145233578SpeterDTRACE_CFLAGS+=	-I$S/cddl/contrib/opensolaris/uts/intel -I$S/cddl/dev/dtrace/x86
146228158Sfjoe.endif
147228140SfjoeDTRACE_CFLAGS+=	-I$S/cddl/contrib/opensolaris/common/util -I$S -DDIS_MEM -DSMP
148228158SfjoeDTRACE_ASM_CFLAGS=	-x assembler-with-cpp -DLOCORE ${DTRACE_CFLAGS}
149228158SfjoeDTRACE_C=	${CC} -c ${DTRACE_CFLAGS}	${WERROR} ${PROF} ${.IMPSRC}
150228124SfjoeDTRACE_S=	${CC} -c ${DTRACE_ASM_CFLAGS}	${WERROR} ${.IMPSRC}
151228158Sfjoe
152228124Sfjoe# Special flags for managing the compat compiles for DTrace/FBT
153179226SjbFBT_CFLAGS=	-DBUILDING_DTRACE -nostdinc -I$S/cddl/dev/fbt/${MACHINE_CPUARCH} -I$S/cddl/dev/fbt -I$S/cddl/compat/opensolaris -I$S/cddl/contrib/opensolaris/uts/common -I$S ${CDDL_CFLAGS}
154116341Smarkm.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
155116341SmarkmFBT_CFLAGS+=	-I$S/cddl/dev/fbt/x86
156219819Sjeff.endif
157219819SjeffFBT_C=		${CC} -c ${FBT_CFLAGS}		${WERROR} ${PROF} ${.IMPSRC}
158219819Sjeff
159219819Sjeff.if ${MK_CTF} != "no"
160219819SjeffNORMAL_CTFCONVERT=	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
161219819Sjeff.elif ${MAKE_VERSION} >= 5201111300
162219819SjeffNORMAL_CTFCONVERT=
163219819Sjeff.else
164131210SimpNORMAL_CTFCONVERT=	@:
165144293Sphk.endif
16685909Simp
167111684SruNORMAL_LINT=	${LINT} ${LINTFLAGS} ${CFLAGS:M-[DIU]*} ${.IMPSRC}
168111684Sru
169111684Sru# Linux Kernel Programming Interface C-flags
170239957SjhbLINUXKPI_INCLUDES=	-I$S/compat/linuxkpi/common/include
17189180SmsmithLINUXKPI_C=		${NORMAL_C} ${LINUXKPI_INCLUDES}
17285909Simp
17385909Simp# Infiniband C flags.  Correct include paths and omit errors that linux
174123966Sbde# does not honor.
175175888SimpOFEDINCLUDES=	-I$S/ofed/include ${LINUXKPI_INCLUDES}
17685909SimpOFEDNOERR=	-Wno-cast-qual -Wno-pointer-arith
17788893SimpOFEDCFLAGS=	${CFLAGS:N-I*} ${OFEDINCLUDES} ${CFLAGS:M-I*} ${OFEDNOERR}
17888893SimpOFED_C_NOIMP=	${CC} -c -o ${.TARGET} ${OFEDCFLAGS} ${WERROR} ${PROF}
17988893SimpOFED_C=		${OFED_C_NOIMP} ${.IMPSRC}
180221265Sbz
181210151SimpGEN_CFILES= $S/$M/$M/genassym.c ${MFILES:T:S/.m$/.c/}
18290789SphkSYSTEM_CFILES= config.c env.c hints.c vnode_if.c
18390789SphkSYSTEM_DEP= Makefile ${SYSTEM_OBJS}
18490789SphkSYSTEM_OBJS= locore.o ${MDOBJS} ${OBJS}
18588893SimpSYSTEM_OBJS+= ${SYSTEM_CFILES:.c=.o}
18688893SimpSYSTEM_OBJS+= hack.pico
18788893Simp
188216746ScpercivaMD_ROOT_SIZE_CONFIGURED!=	grep MD_ROOT_SIZE opt_md.h || true ; echo
189216746Scperciva.if ${MFS_IMAGE:Uno} != "no"
190216746Scperciva.if empty(MD_ROOT_SIZE_CONFIGURED)
19188893SimpSYSTEM_OBJS+= embedfs_${MFS_IMAGE:T:R}.o
192125772Sru.endif
19388893Simp.endif
194240402SobrienSYSTEM_LD= @${LD} -Bdynamic -T ${LDSCRIPT} ${_LDFLAGS} --no-warn-mismatch \
195240402Sobrien	--warn-common --export-dynamic --dynamic-linker /red/herring \
196240402Sobrien	-o ${.TARGET} -X ${SYSTEM_OBJS} vers.o
197240402SobrienSYSTEM_LD_TAIL= @${OBJCOPY} --strip-symbol gcc2_compiled. ${.TARGET} ; \
198240402Sobrien	${SIZE} ${.TARGET} ; chmod 755 ${.TARGET}
199SYSTEM_DEP+= ${LDSCRIPT}
200
201# Calculate path for .m files early, if needed.
202.if !defined(NO_MODULES) && !defined(__MPATH)
203__MPATH!=find ${S:tA}/ -name \*_if.m
204.endif
205
206# MKMODULESENV is set here so that port makefiles can augment
207# them.
208
209MKMODULESENV+=	MAKEOBJDIRPREFIX=${.OBJDIR}/modules KMODDIR=${KODIR}
210MKMODULESENV+=	MACHINE_CPUARCH=${MACHINE_CPUARCH}
211MKMODULESENV+=	MACHINE=${MACHINE} MACHINE_ARCH=${MACHINE_ARCH}
212MKMODULESENV+=	MODULES_EXTRA="${MODULES_EXTRA}" WITHOUT_MODULES="${WITHOUT_MODULES}"
213MKMODULESENV+=	ARCH_FLAGS="${ARCH_FLAGS}"
214.if (${KERN_IDENT} == LINT)
215MKMODULESENV+=	ALL_MODULES=LINT
216.endif
217.if defined(MODULES_OVERRIDE)
218MKMODULESENV+=	MODULES_OVERRIDE="${MODULES_OVERRIDE}"
219.endif
220.if defined(DEBUG)
221MKMODULESENV+=	DEBUG_FLAGS="${DEBUG}"
222.endif
223.if !defined(NO_MODULES)
224MKMODULESENV+=	__MPATH="${__MPATH}"
225.endif
226
227# Architecture and output format arguments for objdump to convert image to
228# object file
229
230.if ${MFS_IMAGE:Uno} != "no"
231.if empty(MD_ROOT_SIZE_CONFIGURED)
232.if !defined(EMBEDFS_FORMAT.${MACHINE_ARCH})
233EMBEDFS_FORMAT.${MACHINE_ARCH}!= awk -F'"' '/OUTPUT_FORMAT/ {print $$2}' ${LDSCRIPT}
234.if empty(EMBEDFS_FORMAT.${MACHINE_ARCH})
235.undef EMBEDFS_FORMAT.${MACHINE_ARCH}
236.endif
237.endif
238
239.if !defined(EMBEDFS_ARCH.${MACHINE_ARCH})
240EMBEDFS_ARCH.${MACHINE_ARCH}!= sed -n '/OUTPUT_ARCH/s/.*(\(.*\)).*/\1/p' ${LDSCRIPT}
241.if empty(EMBEDFS_ARCH.${MACHINE_ARCH})
242.undef EMBEDFS_ARCH.${MACHINE_ARCH}
243.endif
244.endif
245
246EMBEDFS_FORMAT.arm?=		elf32-littlearm
247EMBEDFS_FORMAT.armv6?=		elf32-littlearm
248EMBEDFS_FORMAT.aarch64?=	elf64-littleaarch64
249EMBEDFS_FORMAT.mips?=		elf32-tradbigmips
250EMBEDFS_FORMAT.mipsel?=		elf32-tradlittlemips
251EMBEDFS_FORMAT.mips64?=		elf64-tradbigmips
252EMBEDFS_FORMAT.mips64el?=	elf64-tradlittlemips
253EMBEDFS_FORMAT.riscv?=		elf64-littleriscv
254.endif
255.endif
256
257# Detect kernel config options that force stack frames to be turned on.
258DDB_ENABLED!=	grep DDB opt_ddb.h || true ; echo
259DTR_ENABLED!=	grep KDTRACE_FRAME opt_kdtrace.h || true ; echo
260HWPMC_ENABLED!=	grep HWPMC opt_hwpmc_hooks.h || true ; echo
261