local.meta.sys.mk revision 287887
1# $FreeBSD: head/share/mk/local.meta.sys.mk 287887 2015-09-17 00:17:32Z bdrewery $
2
3# local configuration specific to meta mode
4# XXX some of this should be in meta.sys.mk
5# we assume that MK_META_MODE=yes
6
7# we need this until there is an alternative
8MK_INSTALL_AS_USER= yes
9
10_default_makeobjdir=$${.CURDIR:S,$${SRCTOP},$${OBJTOP},}
11
12.if empty(OBJROOT) || ${.MAKE.LEVEL} == 0
13.if !make(showconfig)
14.if defined(MAKEOBJDIRPREFIX) && exists(${MAKEOBJDIRPREFIX})
15.warning MAKEOBJDIRPREFIX not supported; setting MAKEOBJDIR...
16# put things approximately where they want
17OBJROOT:=${MAKEOBJDIRPREFIX}${SRCTOP:S,/src,,}/
18MAKEOBJDIRPREFIX=
19.export MAKEOBJDIRPREFIX
20.endif
21.if empty(MAKEOBJDIR)
22# OBJTOP set below
23MAKEOBJDIR=${_default_makeobjdir}
24# export but do not track
25.export-env MAKEOBJDIR
26# Expand for our own use
27MAKEOBJDIR:= ${MAKEOBJDIR}
28.endif
29.endif
30.if !empty(SB)
31SB_OBJROOT ?= ${SB}/obj/
32# this is what we use below
33OBJROOT ?= ${SB_OBJROOT}
34.endif
35OBJROOT ?= ${SRCTOP:H}/obj/
36.if ${OBJROOT:M*/} != ""
37OBJROOT:= ${OBJROOT:H:tA}/
38.else
39OBJROOT:= ${OBJROOT:H:tA}/${OBJROOT:T}
40.endif
41.export OBJROOT SRCTOP
42
43# we need HOST_TARGET etc below.
44.include <host-target.mk>
45.export HOST_TARGET
46.endif
47
48# from src/Makefile (for universe)
49TARGET_ARCHES_arm?=     arm armeb armv6 armv6hf
50TARGET_ARCHES_arm64?=   aarch64
51TARGET_ARCHES_mips?=    mipsel mips mips64el mips64 mipsn32 mipsn32el
52TARGET_ARCHES_powerpc?= powerpc powerpc64
53TARGET_ARCHES_pc98?=    i386
54
55# some corner cases
56BOOT_MACHINE_DIR.amd64 = boot/i386
57MACHINE_ARCH.host = ${_HOST_ARCH}
58
59# the list of machines we support
60ALL_MACHINE_LIST?= amd64 arm arm64 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
67.ifndef _TARGET_SPEC
68.if empty(MACHINE_ARCH)
69.if !empty(TARGET_ARCH)
70MACHINE_ARCH= ${TARGET_ARCH}
71.else
72MACHINE_ARCH= ${MACHINE_ARCH.${MACHINE}}
73.endif
74.endif
75MACHINE_ARCH?= ${MACHINE_ARCH.${MACHINE}}
76MACHINE_ARCH:= ${MACHINE_ARCH}
77.else
78# we got here via dirdeps
79MACHINE_ARCH:= ${MACHINE_ARCH.${MACHINE}}
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 defined(MAKEOBJDIR)
113.if ${MAKEOBJDIR:M*/*} == ""
114.error Cannot use MAKEOBJDIR=${MAKEOBJDIR}${.newline}Unset MAKEOBJDIR to get default:  MAKEOBJDIR='${_default_makeobjdir}'
115.endif
116.endif
117
118.if ${.CURDIR} == ${SRCTOP}
119RELDIR = .
120.elif ${.CURDIR:M${SRCTOP}/*}
121RELDIR := ${.CURDIR:S,${SRCTOP}/,,}
122.endif
123
124HOST_OBJTOP ?= ${OBJROOT}${HOST_TARGET}
125
126.if ${OBJTOP} == ${HOST_OBJTOP} || ${REQUESTED_MACHINE:U${MACHINE}} == "host"
127MACHINE= host
128.if ${TARGET_MACHINE:Uno} == ${HOST_TARGET}
129# not what we want
130TARGET_MACHINE= host
131.endif
132.endif
133.if ${MACHINE} == "host"
134OBJTOP := ${HOST_OBJTOP}
135.endif
136
137.if ${.MAKE.LEVEL} == 0
138PYTHON ?= /usr/local/bin/python
139.export PYTHON
140# this works best if share/mk is ready for it.
141BUILD_AT_LEVEL0= no
142
143# we want to end up with a singe stage tree for all machines
144.if ${MK_STAGING} == "yes"
145.if empty(STAGE_ROOT)
146STAGE_ROOT?= ${OBJROOT}stage
147.export STAGE_ROOT
148.endif
149.endif
150.endif
151
152.if ${MK_STAGING} == "yes"
153.if ${MACHINE} == "host"
154STAGE_MACHINE= ${HOST_TARGET}
155.else
156STAGE_MACHINE:= ${TARGET_OBJ_SPEC}
157.endif
158STAGE_OBJTOP:= ${STAGE_ROOT}/${STAGE_MACHINE}
159STAGE_COMMON_OBJTOP:= ${STAGE_ROOT}/common
160STAGE_HOST_OBJTOP:= ${STAGE_ROOT}/${HOST_TARGET}
161
162STAGE_LIBDIR= ${STAGE_OBJTOP}${_LIBDIR:U${LIBDIR:U/lib}}
163STAGE_INCLUDEDIR= ${STAGE_OBJTOP}${INCLUDEDIR:U/usr/include}
164# this is not the same as INCLUDEDIR
165STAGE_INCSDIR= ${STAGE_OBJTOP}${INCSDIR:U/include}
166# the target is usually an absolute path
167STAGE_SYMLINKS_DIR= ${STAGE_OBJTOP}
168
169LDFLAGS_LAST+= -Wl,-rpath-link -Wl,${STAGE_LIBDIR}
170.if ${MK_SYSROOT} == "yes"
171SYSROOT?= ${STAGE_OBJTOP}/
172.else
173LDFLAGS_LAST+= -L${STAGE_LIBDIR}
174.endif
175
176.endif				# MK_STAGING
177
178# this is sufficient for most of the tree.
179.MAKE.DEPENDFILE_DEFAULT = ${.MAKE.DEPENDFILE_PREFIX}
180
181# but if we have a machine qualified file it should be used in preference
182.MAKE.DEPENDFILE_PREFERENCE = \
183	${.MAKE.DEPENDFILE_PREFIX}.${MACHINE} \
184	${.MAKE.DEPENDFILE_PREFIX}
185
186.undef .MAKE.DEPENDFILE
187
188.include "sys.dependfile.mk"
189
190.if ${.MAKE.LEVEL} > 0 && ${MACHINE} == "host" && ${.MAKE.DEPENDFILE:E} != "host"
191# we can use this but should not update it.
192UPDATE_DEPENDFILE= NO
193.endif
194
195# define the list of places that contain files we are responsible for
196.MAKE.META.BAILIWICK = ${SB} ${OBJROOT} ${STAGE_ROOT}
197
198.if defined(CCACHE_DIR)
199.MAKE.META.IGNORE_PATHS += ${CCACHE_DIR}
200.endif
201
202CSU_DIR.${MACHINE_ARCH} ?= csu/${MACHINE_ARCH}
203CSU_DIR := ${CSU_DIR.${MACHINE_ARCH}}
204
205.if !empty(TIME_STAMP)
206TRACER= ${TIME_STAMP} ${:U}
207.endif
208
209# toolchains can be a pain - especially bootstrappping them
210.if ${MACHINE} == "host"
211MK_SHARED_TOOLCHAIN= no
212.endif
213.ifdef WITH_TOOLSDIR
214TOOLSDIR?= ${HOST_OBJTOP}/tools
215.elif defined(STAGE_HOST_OBJTOP) && exists(${STAGE_HOST_OBJTOP}/usr/bin)
216TOOLSDIR?= ${STAGE_HOST_OBJTOP}
217.endif
218.if ${.MAKE.LEVEL} == 0 && exists(${TOOLSDIR}/usr/bin)
219PATH:= ${PATH:S,:, ,g:@d@${exists(${TOOLSDIR}$d):?${TOOLSDIR}$d:}@:ts:}:${PATH}
220.export PATH
221.if exists(${TOOLSDIR}/usr/bin/cc)
222HOST_CC?= ${TOOLSDIR}/usr/bin/cc
223CC?= ${TOOLSDIR}/usr/bin/cc
224CXX?= ${TOOLSDIR}/usr/bin/c++
225.export HOST_CC CC CXX
226.endif
227.endif
228
229.if ${MACHINE:Nhost:Ncommon} != "" && ${MACHINE} != ${HOST_MACHINE}
230# cross-building
231.if !defined(FREEBSD_REVISION)
232FREEBSD_REVISION!= sed -n '/^REVISION=/{s,.*=,,;s,",,g;p; }' ${SRCTOP}/sys/conf/newvers.sh
233.export FREEBSD_REVISION
234.endif
235CROSS_TARGET_FLAGS= -target ${MACHINE_ARCH}-unknown-freebsd${FREEBSD_REVISION}
236CFLAGS+= ${CROSS_TARGET_FLAGS}
237ACFLAGS+= ${CROSS_TARGET_FLAGS}
238LDFLAGS+= -Wl,-m -Wl,elf_${MACHINE_ARCH}_fbsd
239.endif
240