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