xref: /freebsd/share/mk/local.sys.mk (revision 09127a36371d5f5ac109ad1063e7fe53ee9bf356)
1WITH_INSTALL_AS_USER= yes
2
3.if defined(.PARSEDIR)		# bmake
4
5# some handy macros
6_this = ${.PARSEDIR:tA}/${.PARSEFILE}
7# some useful modifiers
8
9# A useful trick for testing multiple :M's against something
10# :L says to use the variable's name as its value - ie. literal
11# got = ${clean* destroy:${M_ListToMatch:S,V,.TARGETS,}}
12M_ListToMatch = L:@m@$${V:M$$m}@
13# match against our initial targets (see above)
14M_L_TARGETS = ${M_ListToMatch:S,V,_TARGETS,}
15
16# turn a list into a set of :N modifiers
17# NskipFoo = ${Foo:${M_ListToSkip}}
18M_ListToSkip= O:u:ts::S,:,:N,g:S,^,N,
19
20# type should be a builtin in any sh since about 1980,
21# AUTOCONF := ${autoconf:L:${M_whence}}
22M_type = @x@(type $$x 2> /dev/null); echo;@:sh:[0]:N* found*:[@]:C,[()],,g
23M_whence = ${M_type}:M/*
24
25# convert a path to a valid shell variable
26M_P2V = tu:C,[./-],_,g
27
28# absoulte path to what we are reading.
29_PARSEDIR = ${.PARSEDIR:tA}
30
31.if !empty(SB)
32SB_SRC ?= ${SB}/src
33SB_OBJROOT ?= ${SB}/obj/
34# this is what we use below
35SRCTOP ?= ${SB_SRC}
36OBJROOT ?= ${SB_OBJROOT}
37.endif
38
39.if empty(SRCTOP)
40SRCTOP := ${_PARSEDIR:H:H}
41.export SRCTOP
42OBJROOT ?= ${SRCTOP:H}/obj/
43.endif
44
45# we need HOST_TARGET etc below.
46.include <host-target.mk>
47
48# from src/Makefile (for universe)
49TARGET_ARCHES_arm?=     arm armeb armv6 armv6eb
50TARGET_ARCHES_mips?=    mipsel mips mips64el mips64 mipsn32
51TARGET_ARCHES_powerpc?= powerpc powerpc64
52TARGET_ARCHES_pc98?=    i386
53
54# some corner cases
55CSU_DIR.i386 = csu/i386-elf
56BOOT_MACHINE_DIR.amd64 = boot/i386
57MACHINE_ARCH.host = ${_HOST_ARCH}
58
59# the list of machines we support
60ALL_MACHINE_LIST?= amd64 arm i386 ia64 mips pc98 powerpc sparc64
61.for m in ${ALL_MACHINE_LIST:O:u}
62MACHINE_ARCH_LIST.$m?= ${TARGET_ARCHES_${m}:U$m}
63MACHINE_ARCH.$m?= ${MACHINE_ARCH_LIST.$m:[1]}
64BOOT_MACHINE_DIR.$m ?= boot/$m
65.endfor
66.ifndef _TARGET_SPEC
67.if empty(MACHINE_ARCH)
68.if !empty(TARGET_ARCH)
69MACHINE_ARCH= ${TARGET_ARCH}
70.else
71MACHINE_ARCH= ${MACHINE_ARCH.${MACHINE}}
72.endif
73.endif
74MACHINE_ARCH?= ${MACHINE_ARCH.${MACHINE}}
75MACHINE_ARCH:= ${MACHINE_ARCH}
76.else
77# we got here via dirdeps
78MACHINE_ARCH:= ${MACHINE_ARCH.${MACHINE}}
79.endif
80
81.if !defined(_TARGETS)
82# some things we do only once
83_TARGETS := ${.TARGETS}
84.-include <sys.env.mk>
85.if !empty(OBJROOT)
86.if ${OBJROOT:M*/} != ""
87OBJROOT:= ${OBJROOT:tA}/
88.else
89OBJROOT:= ${OBJROOT:H:tA}/${OBJROOT:T}
90.endif
91.export OBJROOT
92.endif
93.endif
94
95# now because for universe we want to potentially
96# build for multiple MACHINE_ARCH per MACHINE
97# we need more than MACHINE in TARGET_SPEC
98TARGET_SPEC_VARS= MACHINE MACHINE_ARCH
99# see dirdeps.mk
100.if ${TARGET_SPEC:Uno:M*,*} != ""
101_tspec := ${TARGET_SPEC:S/,/ /g}
102MACHINE := ${_tspec:[1]}
103MACHINE_ARCH := ${_tspec:[2]}
104# etc.
105# We need to stop that TARGET_SPEC affecting any submakes
106# and deal with MACHINE=${TARGET_SPEC} in the environment.
107TARGET_SPEC=
108# export but do not track
109.export-env TARGET_SPEC
110.export ${TARGET_SPEC_VARS}
111.for v in ${TARGET_SPEC_VARS:O:u}
112.if empty($v)
113.undef $v
114.endif
115.endfor
116.endif
117# make sure we know what TARGET_SPEC is
118# as we may need it to find Makefile.depend*
119TARGET_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts,}
120
121# to be consistent with src/Makefile just concatenate with '.'s
122TARGET_OBJ_SPEC:= ${TARGET_SPEC:S;,;.;g}
123OBJTOP:= ${OBJROOT}${TARGET_OBJ_SPEC}
124
125.if !empty(SRCTOP)
126.if ${.CURDIR} == ${SRCTOP}
127RELDIR = .
128.elif ${.CURDIR:M${SRCTOP}/*}
129RELDIR := ${.CURDIR:S,${SRCTOP}/,,}
130.endif
131.endif
132
133HOST_OBJTOP ?= ${OBJROOT}${HOST_TARGET}
134
135.if ${OBJTOP} == ${HOST_OBJTOP} || ${REQUESTED_MACHINE:U${MACHINE}} == "host"
136MACHINE= host
137.if ${TARGET_MACHINE:Uno} == ${HOST_TARGET}
138# not what we want
139TARGET_MACHINE= host
140.endif
141.endif
142.if ${MACHINE} == "host"
143OBJTOP := ${HOST_OBJTOP}
144.endif
145
146# if you want objdirs make them automatic
147# we need .OBJDIR made before we start populating .PATH
148.if ${MKOBJDIRS:Uno} == "auto" || defined(WITH_AUTO_OBJ)
149WITH_AUTO_OBJ= yes
150MKOBJDIRS=auto
151.include <auto.obj.mk>
152.endif
153
154# the logic in bsd.own.mk forces this dance
155.ifndef WITHOUT_META_MODE
156WITH_META_MODE= yes
157
158.ifndef WITHOUT_STAGING
159WITH_STAGING= yes
160.ifndef WITHOUT_STAGING_PROG
161WITH_STAGING_PROG= yes
162.endif
163.endif
164
165PYTHON ?= /usr/local/bin/python
166
167.if ${.MAKE.LEVEL} == 0
168.if ${MAKESYSPATH:Uno:M*.../*} != ""
169# make sure this is resolved
170MAKESYSPATH:= ${MAKESYSPATH:S,:, ,g:C,\.\.\./.*,${_this:H},:ts:}
171.export MAKESYSPATH
172.endif
173# this works best if share/mk is ready for it.
174BUILD_AT_LEVEL0= no
175# By default only MACHINE0 updates dependencies
176# see local.autodep.mk
177MACHINE0 := ${MACHINE}
178.export MACHINE0
179.export PYTHON
180.endif
181
182# we want to end up with a singe stage tree for all machines
183.ifndef WITHOUT_STAGING
184.if empty(STAGE_ROOT)
185STAGE_ROOT?= ${OBJROOT}stage
186.export STAGE_ROOT
187.endif
188.endif
189
190.if !empty(STAGE_ROOT)
191.if ${MACHINE} == "host"
192STAGE_MACHINE= ${HOST_TARGET}
193.else
194STAGE_MACHINE:= ${TARGET_OBJ_SPEC}
195.endif
196STAGE_OBJTOP:= ${STAGE_ROOT}/${STAGE_MACHINE}
197STAGE_COMMON_OBJTOP:= ${STAGE_ROOT}/common
198STAGE_HOST_OBJTOP:= ${STAGE_ROOT}/${HOST_TARGET}
199
200STAGE_LIBDIR= ${STAGE_OBJTOP}${LIBDIR:U/lib}
201# this is not the same as INCLUDEDIR
202STAGE_INCSDIR= ${STAGE_OBJTOP}${INCSDIR:U/include}
203# the target is usually an absolute path
204STAGE_SYMLINKS_DIR= ${STAGE_OBJTOP}
205
206.ifndef WITH_SYSROOT
207.if ${MACHINE} != "host"
208CFLAGS_LAST+= -nostdinc
209.endif
210CFLAGS_LAST+= -isystem ${STAGE_OBJTOP}/usr/include
211CFLAGS_LAST += ${CFLAGS_LAST.${COMPILER_TYPE}}
212LDFLAGS_LAST+= -B${STAGE_LIBDIR} -L${STAGE_LIBDIR}
213CXXFLAGS_LAST += -isystem ${STAGE_OBJTOP}/usr/include/c++/${GCCVER:U4.2}
214# backward doesn't get searched if -nostdinc
215CXXFLAGS_LAST += -isystem ${STAGE_OBJTOP}/usr/include/c++/${GCCVER:U4.2}/backward
216CFLAGS_LAST.clang += -isystem ${STAGE_OBJTOP}/usr/include/clang/${CLANGVER:U3.3}
217CXXFLAGS_LAST += ${CFLAGS_LAST.${COMPILER_TYPE}}
218.else
219# if ld suppored sysroot, this would suffice
220CFLAGS_LAST+= --sysroot=${STAGE_OBJTOP}
221.endif
222LDFLAGS_LAST+= -Wl,-rpath-link,${STAGE_LIBDIR}
223STAGED_INCLUDE_DIR= ${STAGE_OBJTOP}/usr/include
224.endif
225
226.if ${USE_META:Uyes} == "yes"
227.include "meta.sys.mk"
228.endif
229
230# this is sufficient for most of the tree.
231.MAKE.DEPENDFILE_DEFAULT = ${.MAKE.DEPENDFILE_PREFIX}
232
233# but if we have a machine qualified file it should be used in preference
234.MAKE.DEPENDFILE_PREFERENCE = \
235	${.MAKE.DEPENDFILE_PREFIX}.${MACHINE} \
236	${.MAKE.DEPENDFILE_PREFIX}
237
238.undef .MAKE.DEPENDFILE
239
240.include "sys.dependfile.mk"
241
242.if ${.MAKE.LEVEL} > 0 && ${MACHINE} == "host" && ${.MAKE.DEPENDFILE:E} != "host"
243# we can use this but should not update it.
244UPDATE_DEPENDFILE= NO
245.endif
246
247.MAKE.META.BAILIWICK = ${SB} ${OBJROOT} ${STAGE_ROOT}
248
249CSU_DIR.i386 = csu/i386-elf
250CSU_DIR.${MACHINE_ARCH} ?= csu/${MACHINE_ARCH}
251CSU_DIR := ${CSU_DIR.${MACHINE_ARCH}}
252
253.endif				# meta mode
254
255# ensure we have a value
256.MAKE.MODE ?= normal
257
258MAKE_PRINT_VAR_ON_ERROR+= \
259	.CURDIR \
260	.MAKE \
261	.OBJDIR \
262	.TARGETS \
263	DESTDIR \
264	LD_LIBRARY_PATH \
265	MACHINE \
266	MACHINE_ARCH \
267	MAKEOBJDIRPREFIX \
268	MAKESYSPATH \
269	MAKE_VERSION\
270	OBJTOP \
271	${MAKE_PRINT_VAR_ON_ERROR_XTRAS}
272
273.if ${.MAKE.LEVEL} > 0
274MAKE_PRINT_VAR_ON_ERROR += .MAKE.MAKEFILES .PATH
275.endif
276
277
278# these are handy
279# we can use this for a cheap timestamp at the start of a target's script,
280# but not at the end - since make will expand both at the same time.
281TIME_STAMP_FMT = @ %s [%Y-%m-%d %T]
282TIME_STAMP = ${TIME_STAMP_FMT:localtime}
283# this will produce the same output but as of when date(1) is run.
284TIME_STAMP_DATE = `date '+${TIME_STAMP_FMT}'`
285TIME_STAMP_END?= ${TIME_STAMP_DATE}
286
287.endif				# bmake
288