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