local.meta.sys.mk revision 284650
1# $FreeBSD: head/share/mk/local.meta.sys.mk 284650 2015-06-20 21:48:07Z sjg $
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.if empty(OBJROOT) || ${.MAKE.LEVEL} == 0
11.if defined(MAKEOBJDIRPREFIX) && exists(${MAKEOBJDIRPREFIX})
12.warning MAKEOBJDIRPREFIX not supported; setting MAKEOBJDIR...
13# put things approximately where they want
14OBJROOT:=${MAKEOBJDIRPREFIX}${SRCTOP:S,/src,,}/
15# OBJTOP set below
16MAKEOBJDIR=$${.CURDIR:S,$${SRCTOP},$${OBJTOP},}
17MAKEOBJDIRPREFIX=
18# export but do not track
19.export-env MAKEOBJDIRPREFIX MAKEOBJDIR
20# now for our own use
21MAKEOBJDIR= ${.CURDIR:S,${SRCTOP},${OBJTOP},}
22.endif
23.if !empty(SB)
24SB_OBJROOT ?= ${SB}/obj/
25# this is what we use below
26OBJROOT ?= ${SB_OBJROOT}
27.endif
28OBJROOT ?= ${SRCTOP:H}/obj/
29.if ${OBJROOT:M*/} != ""
30OBJROOT:= ${OBJROOT:tA}/
31.else
32OBJROOT:= ${OBJROOT:H:tA}/${OBJROOT:T}
33.endif
34.export OBJROOT SRCTOP
35
36# we need HOST_TARGET etc below.
37.include <host-target.mk>
38.export HOST_TARGET
39.endif
40
41# from src/Makefile (for universe)
42TARGET_ARCHES_arm?=     arm armeb armv6 armv6eb
43TARGET_ARCHES_mips?=    mipsel mips mips64el mips64 mipsn32
44TARGET_ARCHES_powerpc?= powerpc powerpc64
45TARGET_ARCHES_pc98?=    i386
46
47# some corner cases
48BOOT_MACHINE_DIR.amd64 = boot/i386
49MACHINE_ARCH.host = ${_HOST_ARCH}
50
51# the list of machines we support
52ALL_MACHINE_LIST?= amd64 arm i386 ia64 mips pc98 powerpc sparc64
53.for m in ${ALL_MACHINE_LIST:O:u}
54MACHINE_ARCH_LIST.$m?= ${TARGET_ARCHES_${m}:U$m}
55MACHINE_ARCH.$m?= ${MACHINE_ARCH_LIST.$m:[1]}
56BOOT_MACHINE_DIR.$m ?= boot/$m
57.endfor
58
59.ifndef _TARGET_SPEC
60.if empty(MACHINE_ARCH)
61.if !empty(TARGET_ARCH)
62MACHINE_ARCH= ${TARGET_ARCH}
63.else
64MACHINE_ARCH= ${MACHINE_ARCH.${MACHINE}}
65.endif
66.endif
67MACHINE_ARCH?= ${MACHINE_ARCH.${MACHINE}}
68MACHINE_ARCH:= ${MACHINE_ARCH}
69.else
70# we got here via dirdeps
71MACHINE_ARCH:= ${MACHINE_ARCH.${MACHINE}}
72.endif
73
74# now because for universe we want to potentially
75# build for multiple MACHINE_ARCH per MACHINE
76# we need more than MACHINE in TARGET_SPEC
77TARGET_SPEC_VARS= MACHINE MACHINE_ARCH
78# see dirdeps.mk
79.if ${TARGET_SPEC:Uno:M*,*} != ""
80_tspec := ${TARGET_SPEC:S/,/ /g}
81MACHINE := ${_tspec:[1]}
82MACHINE_ARCH := ${_tspec:[2]}
83# etc.
84# We need to stop that TARGET_SPEC affecting any submakes
85# and deal with MACHINE=${TARGET_SPEC} in the environment.
86TARGET_SPEC=
87# export but do not track
88.export-env TARGET_SPEC 
89.export ${TARGET_SPEC_VARS}
90.for v in ${TARGET_SPEC_VARS:O:u}
91.if empty($v)
92.undef $v
93.endif
94.endfor
95.endif
96# make sure we know what TARGET_SPEC is
97# as we may need it to find Makefile.depend*
98TARGET_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts,}
99
100# to be consistent with src/Makefile just concatenate with '.'s
101TARGET_OBJ_SPEC:= ${TARGET_SPEC:S;,;.;g}
102OBJTOP:= ${OBJROOT}${TARGET_OBJ_SPEC}
103
104.if ${.CURDIR} == ${SRCTOP}
105RELDIR = .
106.elif ${.CURDIR:M${SRCTOP}/*}
107RELDIR := ${.CURDIR:S,${SRCTOP}/,,}
108.endif
109
110HOST_OBJTOP ?= ${OBJROOT}${HOST_TARGET}
111
112.if ${OBJTOP} == ${HOST_OBJTOP} || ${REQUESTED_MACHINE:U${MACHINE}} == "host"
113MACHINE= host
114.if ${TARGET_MACHINE:Uno} == ${HOST_TARGET}
115# not what we want
116TARGET_MACHINE= host
117.endif
118.endif
119.if ${MACHINE} == "host"
120OBJTOP := ${HOST_OBJTOP}
121.endif
122
123.if ${.MAKE.LEVEL} == 0
124PYTHON ?= /usr/local/bin/python
125.export PYTHON
126# this works best if share/mk is ready for it.
127BUILD_AT_LEVEL0= no
128
129# we want to end up with a singe stage tree for all machines
130.if ${MK_STAGING} == "yes"
131.if empty(STAGE_ROOT)
132STAGE_ROOT?= ${OBJROOT}stage
133.export STAGE_ROOT
134.endif
135.endif
136.endif
137
138.if ${MK_STAGING} == "yes"
139.if ${MACHINE} == "host"
140STAGE_MACHINE= ${HOST_TARGET}
141.else
142STAGE_MACHINE:= ${TARGET_OBJ_SPEC}
143.endif
144STAGE_OBJTOP:= ${STAGE_ROOT}/${STAGE_MACHINE}
145STAGE_COMMON_OBJTOP:= ${STAGE_ROOT}/common
146STAGE_HOST_OBJTOP:= ${STAGE_ROOT}/${HOST_TARGET}
147
148STAGE_LIBDIR= ${STAGE_OBJTOP}${_LIBDIR:U${LIBDIR:U/lib}}
149STAGE_INCLUDEDIR= ${STAGE_OBJTOP}${INCLUDEDIR:U/usr/include}
150# this is not the same as INCLUDEDIR
151STAGE_INCSDIR= ${STAGE_OBJTOP}${INCSDIR:U/include}
152# the target is usually an absolute path
153STAGE_SYMLINKS_DIR= ${STAGE_OBJTOP}
154
155LDFLAGS_LAST+= -Wl,-rpath-link -Wl,${STAGE_LIBDIR}
156.if ${MK_SYSROOT} == "yes"
157SYSROOT?= ${STAGE_OBJTOP}/
158.else
159LDFLAGS_LAST+= -L${STAGE_LIBDIR}
160.endif
161
162.endif				# MK_STAGING
163
164# this is sufficient for most of the tree.
165.MAKE.DEPENDFILE_DEFAULT = ${.MAKE.DEPENDFILE_PREFIX}
166
167# but if we have a machine qualified file it should be used in preference
168.MAKE.DEPENDFILE_PREFERENCE = \
169	${.MAKE.DEPENDFILE_PREFIX}.${MACHINE} \
170	${.MAKE.DEPENDFILE_PREFIX}
171
172.undef .MAKE.DEPENDFILE
173
174.include "sys.dependfile.mk"
175
176.if ${.MAKE.LEVEL} > 0 && ${MACHINE} == "host" && ${.MAKE.DEPENDFILE:E} != "host"
177# we can use this but should not update it.
178UPDATE_DEPENDFILE= NO
179.endif
180
181# define the list of places that contain files we are responsible for
182.MAKE.META.BAILIWICK = ${SB} ${OBJROOT} ${STAGE_ROOT}
183
184CSU_DIR.${MACHINE_ARCH} ?= csu/${MACHINE_ARCH}
185CSU_DIR := ${CSU_DIR.${MACHINE_ARCH}}
186
187.if !empty(TIME_STAMP)
188TRACER= ${TIME_STAMP} ${:U}
189.endif
190
191# toolchains can be a pain - especially bootstrappping them
192.if ${MACHINE} == "host"
193MK_SHARED_TOOLCHAIN= no
194.endif
195.ifdef WITH_TOOLSDIR
196TOOLSDIR?= ${HOST_OBJTOP}/tools
197.elif defined(STAGE_HOST_OBJTOP) && exists(${STAGE_HOST_OBJTOP}/usr/bin)
198TOOLSDIR?= ${STAGE_HOST_OBJTOP}
199.endif
200.if ${.MAKE.LEVEL} == 0 && exists(${TOOLSDIR}/usr/bin)
201PATH:= ${PATH:S,:, ,g:@d@${exists(${TOOLSDIR}$d):?${TOOLSDIR}$d:}@:ts:}:${PATH}
202.export PATH
203.if exists(${TOOLSDIR}/usr/bin/cc)
204HOST_CC?= ${TOOLSDIR}/usr/bin/cc
205CC?= ${TOOLSDIR}/usr/bin/cc
206CXX?= ${TOOLSDIR}/usr/bin/c++
207.export HOST_CC CC CXX
208.endif
209.endif
210
211.if ${MACHINE:Nhost:Ncommon} != "" && ${MACHINE} != ${HOST_MACHINE}
212# cross-building
213.if !defined(FREEBSD_REVISION)
214FREEBSD_REVISION!= sed -n '/^REVISION=/{s,.*=,,;s,",,g;p; }' ${SRCTOP}/sys/conf/newvers.sh
215.export FREEBSD_REVISION
216.endif
217CROSS_TARGET_FLAGS= -target ${MACHINE_ARCH}-unknown-freebsd${FREEBSD_REVISION}
218CFLAGS+= ${CROSS_TARGET_FLAGS}
219ACFLAGS+= ${CROSS_TARGET_FLAGS}
220LDFLAGS+= -Wl,-m -Wl,elf_${MACHINE_ARCH}_fbsd
221.endif
222