xref: /freebsd/share/mk/local.sys.mk (revision 4fd0d10e0fe684211328bc148edf89a792425b39)
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
66MACHINE_ARCH:= ${TARGET_ARCH:U${MACHINE_ARCH.${MACHINE}}}
67
68.if !defined(_TARGETS)
69# some things we do only once
70_TARGETS := ${.TARGETS}
71.-include <sys.env.mk>
72.if !empty(OBJROOT)
73.if ${OBJROOT:M*/} != ""
74OBJROOT:= ${OBJROOT:tA}/
75.else
76OBJROOT:= ${OBJROOT:H:tA}/${OBJROOT:T}
77.endif
78.export OBJROOT
79.endif
80.endif
81
82# now because for universe we want to potentially
83# build for multiple MACHINE_ARCH per MACHINE
84# we need more than MACHINE in TARGET_SPEC
85TARGET_SPEC_VARS= MACHINE MACHINE_ARCH
86# see dirdeps.mk
87.if ${TARGET_SPEC:Uno:M*,*} != ""
88_tspec := ${TARGET_SPEC:S/,/ /g}
89MACHINE := ${_tspec:[1]}
90MACHINE_ARCH := ${_tspec:[2]}
91# etc.
92# We need to stop that TARGET_SPEC affecting any submakes
93# and deal with MACHINE=${TARGET_SPEC} in the environment.
94TARGET_SPEC=
95# export but do not track
96.export-env TARGET_SPEC
97.export ${TARGET_SPEC_VARS}
98.for v in ${TARGET_SPEC_VARS:O:u}
99.if empty($v)
100.undef $v
101.endif
102.endfor
103.endif
104# make sure we know what TARGET_SPEC is
105# as we may need it to find Makefile.depend*
106TARGET_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts,}
107
108# to be consistent with src/Makefile just concatenate with '.'s
109TARGET_OBJ_SPEC:= ${TARGET_SPEC:S;,;.;g}
110OBJTOP:= ${OBJROOT}${TARGET_OBJ_SPEC}
111
112.if !empty(SRCTOP)
113.if ${.CURDIR} == ${SRCTOP}
114RELDIR = .
115.elif ${.CURDIR:M${SRCTOP}/*}
116RELDIR := ${.CURDIR:S,${SRCTOP}/,,}
117.endif
118.endif
119
120HOST_OBJTOP ?= ${OBJROOT}${HOST_TARGET}
121
122.if ${OBJTOP} == ${HOST_OBJTOP} || ${REQUESTED_MACHINE:U${MACHINE}} == "host"
123MACHINE= host
124.if ${TARGET_MACHINE:Uno} == ${HOST_TARGET}
125# not what we want
126TARGET_MACHINE= host
127.endif
128.endif
129.if ${MACHINE} == "host"
130OBJTOP := ${HOST_OBJTOP}
131.endif
132
133# if you want objdirs make them automatic
134# we need .OBJDIR made before we start populating .PATH
135.if ${MKOBJDIRS:Uno} == "auto" || defined(WITH_AUTO_OBJ)
136WITH_AUTO_OBJ= yes
137MKOBJDIRS=auto
138.include <auto.obj.mk>
139.endif
140
141# the logic in bsd.own.mk forces this dance
142.ifndef WITHOUT_META_MODE
143WITH_META_MODE= yes
144
145.ifndef WITHOUT_STAGING
146WITH_STAGING= yes
147.ifndef WITHOUT_STAGING_PROG
148WITH_STAGING_PROG= yes
149.endif
150.endif
151
152PYTHON ?= /usr/local/bin/python
153
154.if ${.MAKE.LEVEL} == 0
155.if ${MAKESYSPATH:Uno:M*.../*} != ""
156# make sure this is resolved
157MAKESYSPATH:= ${MAKESYSPATH:S,:, ,g:C,\.\.\./.*,${_this:H},:ts:}
158.export MAKESYSPATH
159.endif
160# this works best if share/mk is ready for it.
161BUILD_AT_LEVEL0= no
162# By default only MACHINE0 updates dependencies
163# see local.autodep.mk
164MACHINE0 := ${MACHINE}
165.export MACHINE0
166.export PYTHON
167.endif
168
169# we want to end up with a singe stage tree for all machines
170.ifndef WITHOUT_STAGING
171.if empty(STAGE_ROOT)
172STAGE_ROOT?= ${OBJROOT}stage
173.export STAGE_ROOT
174.endif
175.endif
176
177.if !empty(STAGE_ROOT)
178.if ${MACHINE} == "host"
179STAGE_MACHINE= ${HOST_TARGET}
180.else
181STAGE_MACHINE:= ${TARGET_OBJ_SPEC}
182.endif
183STAGE_OBJTOP:= ${STAGE_ROOT}/${STAGE_MACHINE}
184STAGE_COMMON_OBJTOP:= ${STAGE_ROOT}/common
185STAGE_HOST_OBJTOP:= ${STAGE_ROOT}/${HOST_TARGET}
186
187STAGE_LIBDIR= ${STAGE_OBJTOP}${LIBDIR:U/lib}
188# this is not the same as INCLUDEDIR
189STAGE_INCSDIR= ${STAGE_OBJTOP}${INCSDIR:U/include}
190# the target is usually an absolute path
191STAGE_SYMLINKS_DIR= ${STAGE_OBJTOP}
192
193.ifndef WITH_SYSROOT
194.if ${MACHINE} != "host"
195CFLAGS_LAST+= -nostdinc
196.endif
197CFLAGS_LAST+= -isystem ${STAGE_OBJTOP}/usr/include
198CFLAGS_LAST += ${CFLAGS_LAST.${COMPILER_TYPE}}
199LDFLAGS_LAST+= -B${STAGE_LIBDIR} -L${STAGE_LIBDIR}
200CXXFLAGS_LAST += -isystem ${STAGE_OBJTOP}/usr/include/c++/${GCCVER:U4.2}
201# backward doesn't get searched if -nostdinc
202CXXFLAGS_LAST += -isystem ${STAGE_OBJTOP}/usr/include/c++/${GCCVER:U4.2}/backward
203CFLAGS_LAST.clang += -isystem ${STAGE_OBJTOP}/usr/include/clang/${CLANGVER:U3.3}
204CXXFLAGS_LAST += ${CFLAGS_LAST.${COMPILER_TYPE}}
205.else
206# if ld suppored sysroot, this would suffice
207CFLAGS_LAST+= --sysroot=${STAGE_OBJTOP}
208.endif
209.endif
210LDFLAGS_LAST+= -Wl,-rpath-link,${STAGE_LIBDIR}
211STAGED_INCLUDE_DIR= ${STAGE_OBJTOP}/usr/include
212.if ${USE_META:Uyes} == "yes"
213.include "meta.sys.mk"
214.endif
215
216# this is sufficient for most of the tree.
217.MAKE.DEPENDFILE_DEFAULT = ${.MAKE.DEPENDFILE_PREFIX}
218
219# but if we have a machine qualified file it should be used in preference
220.MAKE.DEPENDFILE_PREFERENCE = \
221	${.MAKE.DEPENDFILE_PREFIX}.${MACHINE} \
222	${.MAKE.DEPENDFILE_PREFIX}
223
224.undef .MAKE.DEPENDFILE
225
226.include "sys.dependfile.mk"
227
228.if ${.MAKE.LEVEL} > 0 && ${MACHINE} == "host" && ${.MAKE.DEPENDFILE:E} != "host"
229# we can use this but should not update it.
230UPDATE_DEPENDFILE= NO
231.endif
232
233.MAKE.META.BAILIWICK = ${SB} ${OBJROOT} ${STAGE_ROOT}
234
235CSU_DIR.i386 = csu/i386-elf
236CSU_DIR.${MACHINE_ARCH} ?= csu/${MACHINE_ARCH}
237CSU_DIR := ${CSU_DIR.${MACHINE_ARCH}}
238
239.endif				# meta mode
240
241# ensure we have a value
242.MAKE.MODE ?= normal
243
244MAKE_PRINT_VAR_ON_ERROR+= \
245	.CURDIR \
246	.MAKE \
247	.OBJDIR \
248	.TARGETS \
249	DESTDIR \
250	LD_LIBRARY_PATH \
251	MACHINE \
252	MACHINE_ARCH \
253	MAKEOBJDIRPREFIX \
254	MAKESYSPATH \
255	MAKE_VERSION\
256	OBJTOP \
257	${MAKE_PRINT_VAR_ON_ERROR_XTRAS}
258
259.if ${.MAKE.LEVEL} > 0
260MAKE_PRINT_VAR_ON_ERROR += .MAKE.MAKEFILES .PATH
261.endif
262
263
264# these are handy
265# we can use this for a cheap timestamp at the start of a target's script,
266# but not at the end - since make will expand both at the same time.
267TIME_STAMP_FMT = @ %s [%Y-%m-%d %T]
268TIME_STAMP = ${TIME_STAMP_FMT:localtime}
269# this will produce the same output but as of when date(1) is run.
270TIME_STAMP_DATE = `date '+${TIME_STAMP_FMT}'`
271TIME_STAMP_END?= ${TIME_STAMP_DATE}
272
273.endif				# bmake
274