1324651Simp# $FreeBSD: stable/11/stand/defs.mk 360614 2020-05-03 18:46:03Z dim $
2324651Simp
3324651Simp.if !defined(__BOOT_DEFS_MK__)
4324651Simp__BOOT_DEFS_MK__=${MFILE}
5324651Simp
6346482Skevans# We need to define all the MK_ options before including src.opts.mk
7346482Skevans# because it includes bsd.own.mk which needs the right MK_ values,
8346482Skevans# espeically MK_CTF.
9346482Skevans
10329183SkevansMK_CTF=		no
11329183SkevansMK_SSP=		no
12329183SkevansMK_PROFILE=	no
13329183SkevansMAN=
14329183Skevans.if !defined(PIC)
15329183SkevansNO_PIC=
16329183SkevansINTERNALLIB=
17329183Skevans.endif
18329183Skevans
19346482Skevans.include <src.opts.mk>
20346482Skevans
21346482SkevansWARNS?=		1
22346482Skevans
23329145SkevansBOOTSRC=	${SRCTOP}/stand
24329140SkevansEFISRC=		${BOOTSRC}/efi
25329140SkevansEFIINC=		${EFISRC}/include
26329140SkevansEFIINCMD=	${EFIINC}/${MACHINE}
27329140SkevansFDTSRC=		${BOOTSRC}/fdt
28329140SkevansFICLSRC=	${BOOTSRC}/ficl
29329140SkevansLDRSRC=		${BOOTSRC}/common
30344220SkevansLIBLUASRC=	${BOOTSRC}/liblua
31344220SkevansLUASRC=		${SRCTOP}/contrib/lua/src
32329140SkevansSASRC=		${BOOTSRC}/libsa
33324651SimpSYSDIR=		${SRCTOP}/sys
34329140SkevansUBOOTSRC=	${BOOTSRC}/uboot
35344377SkevansZFSSRC=		${SASRC}/zfs
36351515SkevansLIBCSRC=	${SRCTOP}/lib/libc
37324651Simp
38329145SkevansBOOTOBJ=	${OBJTOP}/stand
39329140Skevans
40329140Skevans# BINDIR is where we install
41329140SkevansBINDIR?=	/boot
42329140Skevans
43355345Skevans# LUAPATH is where we search for and install lua scripts.
44355345SkevansLUAPATH?=	/boot/lua
45355345SkevansFLUASRC?=	${SRCTOP}/libexec/flua
46355345Skevans
47329140SkevansLIBSA=		${BOOTOBJ}/libsa/libsa.a
48329140Skevans.if ${MACHINE} == "i386"
49329140SkevansLIBSA32=	${LIBSA}
50329140Skevans.else
51329140SkevansLIBSA32=	${BOOTOBJ}/libsa32/libsa32.a
52329140Skevans.endif
53324651Simp
54324653Simp# Standard options:
55329175SkevansCFLAGS+=	-nostdinc
56329175Skevans.if ${MACHINE_ARCH} == "amd64" && ${DO32:U0} == 1
57329175SkevansCFLAGS+=	-I${BOOTOBJ}/libsa32
58329175Skevans.else
59329175SkevansCFLAGS+=	-I${BOOTOBJ}/libsa
60324653Simp.endif
61329175SkevansCFLAGS+=	-I${SASRC} -D_STANDALONE
62329175SkevansCFLAGS+=	-I${SYSDIR}
63332135Skevans# Spike the floating point interfaces
64332135SkevansCFLAGS+=	-Ddouble=jagged-little-pill -Dfloat=floaty-mcfloatface
65344413Skevans.if ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "amd64"
66344413Skevans# Slim down the image. This saves about 15% in size with clang 6 on x86
67344413Skevans# Our most constrained /boot/loader env is BIOS booting on x86, where
68344413Skevans# our text + data + BTX have to fit into 640k below the ISA hole.
69344413Skevans# Experience has shown that problems arise between ~520k to ~530k.
70344413SkevansCFLAGS.clang+=	-Oz
71344413SkevansCFLAGS.gcc+=	-Os
72344413Skevans.endif
73324653Simp
74329175Skevans# GELI Support, with backward compat hooks (mostly)
75329140Skevans.if defined(LOADER_NO_GELI_SUPPORT)
76329140SkevansMK_LOADER_GELI=no
77329140Skevans.warning "Please move from LOADER_NO_GELI_SUPPORT to WITHOUT_LOADER_GELI"
78324653Simp.endif
79329140Skevans.if defined(LOADER_GELI_SUPPORT)
80329140SkevansMK_LOADER_GELI=yes
81329140Skevans.warning "Please move from LOADER_GELI_SUPPORT to WITH_LOADER_GELI"
82324653Simp.endif
83329140Skevans.if ${MK_LOADER_GELI} == "yes"
84329140SkevansCFLAGS+=	-DLOADER_GELI_SUPPORT
85344373SkevansCFLAGS+=	-I${SASRC}/geli
86329175Skevans.endif # MK_LOADER_GELI
87329175Skevans
88329175Skevans# These should be confined to loader.mk, but can't because uboot/lib
89329175Skevans# also uses it. It's part of loader, but isn't a loader so we can't
90329175Skevans# just include loader.mk
91329175Skevans.if ${LOADER_DISK_SUPPORT:Uyes} == "yes"
92329175SkevansCFLAGS+= -DLOADER_DISK_SUPPORT
93329140Skevans.endif
94324653Simp
95329175Skevans# Machine specific flags for all builds here
96329140Skevans
97329140Skevans# All PowerPC builds are 32 bit. We have no 64-bit loaders on powerpc
98329140Skevans# or powerpc64.
99329140Skevans.if ${MACHINE_ARCH} == "powerpc64"
100329140SkevansCFLAGS+=	-m32 -mcpu=powerpc
101329140Skevans.endif
102329140Skevans
103329140Skevans# For amd64, there's a bit of mixed bag. Some of the tree (i386, lib*32) is
104329140Skevans# build 32-bit and some 64-bit (lib*, efi). Centralize all the 32-bit magic here
105329140Skevans# and activate it when DO32 is explicitly defined to be 1.
106329140Skevans.if ${MACHINE_ARCH} == "amd64" && ${DO32:U0} == 1
107334572SdimCFLAGS+=	-m32
108329140Skevans# LD_FLAGS is passed directly to ${LD}, not via ${CC}:
109329140SkevansLD_FLAGS+=	-m elf_i386_fbsd
110329140SkevansAFLAGS+=	--32
111329140Skevans.endif
112329140Skevans
113329175SkevansSSP_CFLAGS=
114329175Skevans
115329175Skevans# Add in the no float / no SIMD stuff and announce we're freestanding
116329175Skevans# aarch64 and riscv don't have -msoft-float, but all others do. riscv
117329175Skevans# currently has no /boot/loader, but may soon.
118329175SkevansCFLAGS+=	-ffreestanding ${CFLAGS_NO_SIMD}
119329175Skevans.if ${MACHINE_CPUARCH} == "aarch64"
120332131SkevansCFLAGS+=	-mgeneral-regs-only -fPIC
121332131Skevans.elif ${MACHINE_CPUARCH} == "riscv"
122332131SkevansCFLAGS+=	-march=rv64imac -mabi=lp64
123332131Skevans.else
124329175SkevansCFLAGS+=	-msoft-float
125329175Skevans.endif
126329175Skevans
127346482Skevans# -msoft-float seems to be insufficient for powerpcspe
128346482Skevans.if ${MACHINE_ARCH} == "powerpcspe"
129346482SkevansCFLAGS+=	-mno-spe
130346482Skevans.endif
131346482Skevans
132329175Skevans.if ${MACHINE_CPUARCH} == "i386" || (${MACHINE_CPUARCH} == "amd64" && ${DO32:U0} == 1)
133329175SkevansCFLAGS+=	-march=i386
134329175SkevansCFLAGS.gcc+=	-mpreferred-stack-boundary=2
135329175Skevans.endif
136332131Skevans.if ${MACHINE_CPUARCH} == "amd64" && ${DO32:U0} == 0
137332131SkevansCFLAGS+=	-fPIC -mno-red-zone
138332131Skevans.endif
139329175Skevans
140329175Skevans.if ${MACHINE_CPUARCH} == "arm"
141329175Skevans# Do not generate movt/movw, because the relocation fixup for them does not
142329175Skevans# translate to the -Bsymbolic -pie format required by self_reloc() in loader(8).
143329175Skevans# Also, the fpu is not available in a standalone environment.
144329175Skevans.if ${COMPILER_VERSION} < 30800
145329175SkevansCFLAGS.clang+=	-mllvm -arm-use-movt=0
146329175Skevans.else
147329175SkevansCFLAGS.clang+=	-mno-movt
148329175Skevans.endif
149329175SkevansCFLAGS.clang+=  -mfpu=none
150332131SkevansCFLAGS+=	-fPIC
151329175Skevans.endif
152329175Skevans
153329175Skevans# The boot loader build uses dd status=none, where possible, for reproducible
154329175Skevans# build output (since performance varies from run to run). Trouble is that
155329175Skevans# option was recently (10.3) added to FreeBSD and is non-standard. Only use it
156329175Skevans# when this test succeeds rather than require dd to be a bootstrap tool.
157329175SkevansDD_NOSTATUS!=(dd status=none count=0 2> /dev/null && echo status=none) || true
158329175SkevansDD=dd ${DD_NOSTATUS}
159329175Skevans
160332131Skevans.if ${MACHINE_CPUARCH} == "mips"
161332131SkevansCFLAGS+=	-G0 -fno-pic -mno-abicalls
162332131Skevans.endif
163332131Skevans
164329175Skevans.if ${MK_LOADER_FORCE_LE} != "no"
165329175Skevans.if ${MACHINE_ARCH} == "powerpc64"
166329175SkevansCFLAGS+=	-mlittle-endian
167329175Skevans.endif
168329175Skevans.endif
169329175Skevans
170344413Skevans#
171344413Skevans# Have a sensible default
172344413Skevans#
173344455Skevans# XXX Do not change the ordering of this chain in this branch.  4th must remain
174344455Skevans# the default for the lifetime of stable/11.
175344413Skevans.if ${MK_FORTH} == "yes"
176344413SkevansLOADER_DEFAULT_INTERP?=4th
177344413Skevans.elif ${MK_LOADER_LUA} == "yes"
178344413SkevansLOADER_DEFAULT_INTERP?=lua
179344413Skevans.else
180344413SkevansLOADER_DEFAULT_INTERP?=simp
181344413Skevans.endif
182344413SkevansLOADER_INTERP?=${LOADER_DEFAULT_INTERP}
183344413Skevans
184329140Skevans# Make sure we use the machine link we're about to create
185329140SkevansCFLAGS+=-I.
186329140Skevans
187331143Simpall: ${PROG}
188331143Simp
189331143Simp.if !defined(NO_OBJ)
190360611Sdim_ILINKS=machine
191329140Skevans.if ${MACHINE} != ${MACHINE_CPUARCH} && ${MACHINE} != "arm64"
192360611Sdim_ILINKS+=${MACHINE_CPUARCH}
193329140Skevans.endif
194329140Skevans.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
195360611Sdim_ILINKS+=x86
196329140Skevans.endif
197360611SdimCLEANFILES+=${_ILINKS}
198329140Skevans
199329140Skevansbeforedepend: ${_ILINKS}
200329140Skevansbeforebuild: ${_ILINKS}
201329140Skevans
202329140Skevans# Ensure that the links exist without depending on it when it exists which
203329140Skevans# causes all the modules to be rebuilt when the directory pointed to changes.
204329140Skevans.for _link in ${_ILINKS}
205329140Skevans.if !exists(${.OBJDIR}/${_link})
206329140Skevans${OBJS}:       ${_link}
207331143Simp.endif # _link exists
208329140Skevans.endfor
209329140Skevans
210329140Skevans.NOPATH: ${_ILINKS}
211329140Skevans
212360611Sdim${_ILINKS}:
213360611Sdim	@case ${.TARGET} in \
214329140Skevans	machine) \
215329140Skevans		if [ ${DO32:U0} -eq 0 ]; then \
216329140Skevans			path=${SYSDIR}/${MACHINE}/include ; \
217329140Skevans		else \
218329140Skevans			path=${SYSDIR}/${MACHINE:C/amd64/i386/}/include ; \
219329140Skevans		fi ;; \
220329140Skevans	*) \
221329140Skevans		path=${SYSDIR}/${.TARGET:T}/include ;; \
222329140Skevans	esac ; \
223329140Skevans	path=`(cd $$path && /bin/pwd)` ; \
224360611Sdim	${ECHO} ${.TARGET:T} "->" $$path ; \
225360611Sdim	ln -fhs $$path ${.TARGET:T}
226331143Simp.endif # !NO_OBJ
227324651Simp.endif # __BOOT_DEFS_MK__
228