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