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 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.if !defined(_TARGETS) 82# some things we do only once 83_TARGETS := ${.TARGETS} 84.-include <sys.env.mk> 85.if !empty(OBJROOT) 86.if ${OBJROOT:M*/} != "" 87OBJROOT:= ${OBJROOT:tA}/ 88.else 89OBJROOT:= ${OBJROOT:H:tA}/${OBJROOT:T} 90.endif 91.export OBJROOT 92.endif 93.endif 94 95# now because for universe we want to potentially 96# build for multiple MACHINE_ARCH per MACHINE 97# we need more than MACHINE in TARGET_SPEC 98TARGET_SPEC_VARS= MACHINE MACHINE_ARCH 99# see dirdeps.mk 100.if ${TARGET_SPEC:Uno:M*,*} != "" 101_tspec := ${TARGET_SPEC:S/,/ /g} 102MACHINE := ${_tspec:[1]} 103MACHINE_ARCH := ${_tspec:[2]} 104# etc. 105# We need to stop that TARGET_SPEC affecting any submakes 106# and deal with MACHINE=${TARGET_SPEC} in the environment. 107TARGET_SPEC= 108# export but do not track 109.export-env TARGET_SPEC 110.export ${TARGET_SPEC_VARS} 111.for v in ${TARGET_SPEC_VARS:O:u} 112.if empty($v) 113.undef $v 114.endif 115.endfor 116.endif 117# make sure we know what TARGET_SPEC is 118# as we may need it to find Makefile.depend* 119TARGET_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts,} 120 121# to be consistent with src/Makefile just concatenate with '.'s 122TARGET_OBJ_SPEC:= ${TARGET_SPEC:S;,;.;g} 123OBJTOP:= ${OBJROOT}${TARGET_OBJ_SPEC} 124 125.if !empty(SRCTOP) 126.if ${.CURDIR} == ${SRCTOP} 127RELDIR = . 128.elif ${.CURDIR:M${SRCTOP}/*} 129RELDIR := ${.CURDIR:S,${SRCTOP}/,,} 130.endif 131.endif 132 133HOST_OBJTOP ?= ${OBJROOT}${HOST_TARGET} 134 135.if ${OBJTOP} == ${HOST_OBJTOP} || ${REQUESTED_MACHINE:U${MACHINE}} == "host" 136MACHINE= host 137.if ${TARGET_MACHINE:Uno} == ${HOST_TARGET} 138# not what we want 139TARGET_MACHINE= host 140.endif 141.endif 142.if ${MACHINE} == "host" 143OBJTOP := ${HOST_OBJTOP} 144.endif 145 146# if you want objdirs make them automatic 147# we need .OBJDIR made before we start populating .PATH 148.if ${MKOBJDIRS:Uno} == "auto" || defined(WITH_AUTO_OBJ) 149WITH_AUTO_OBJ= yes 150MKOBJDIRS=auto 151.include <auto.obj.mk> 152.endif 153 154# the logic in bsd.own.mk forces this dance 155.ifndef WITHOUT_META_MODE 156WITH_META_MODE= yes 157 158.ifndef WITHOUT_STAGING 159WITH_STAGING= yes 160.ifndef WITHOUT_STAGING_PROG 161WITH_STAGING_PROG= yes 162.endif 163.endif 164 165PYTHON ?= /usr/local/bin/python 166 167.if ${.MAKE.LEVEL} == 0 168.if ${MAKESYSPATH:Uno:M*.../*} != "" 169# make sure this is resolved 170MAKESYSPATH:= ${MAKESYSPATH:S,:, ,g:C,\.\.\./.*,${_this:H},:ts:} 171.export MAKESYSPATH 172.endif 173# this works best if share/mk is ready for it. 174BUILD_AT_LEVEL0= no 175# By default only MACHINE0 updates dependencies 176# see local.autodep.mk 177MACHINE0 := ${MACHINE} 178.export MACHINE0 179.export PYTHON 180.endif 181 182# we want to end up with a singe stage tree for all machines 183.ifndef WITHOUT_STAGING 184.if empty(STAGE_ROOT) 185STAGE_ROOT?= ${OBJROOT}stage 186.export STAGE_ROOT 187.endif 188.endif 189 190.if !empty(STAGE_ROOT) 191.if ${MACHINE} == "host" 192STAGE_MACHINE= ${HOST_TARGET} 193.else 194STAGE_MACHINE:= ${TARGET_OBJ_SPEC} 195.endif 196STAGE_OBJTOP:= ${STAGE_ROOT}/${STAGE_MACHINE} 197STAGE_COMMON_OBJTOP:= ${STAGE_ROOT}/common 198STAGE_HOST_OBJTOP:= ${STAGE_ROOT}/${HOST_TARGET} 199 200STAGE_LIBDIR= ${STAGE_OBJTOP}${LIBDIR:U/lib} 201# this is not the same as INCLUDEDIR 202STAGE_INCSDIR= ${STAGE_OBJTOP}${INCSDIR:U/include} 203# the target is usually an absolute path 204STAGE_SYMLINKS_DIR= ${STAGE_OBJTOP} 205 206.ifndef WITH_SYSROOT 207.if ${MACHINE} != "host" 208CFLAGS_LAST+= -nostdinc 209.endif 210CFLAGS_LAST+= -isystem ${STAGE_OBJTOP}/usr/include 211CFLAGS_LAST += ${CFLAGS_LAST.${COMPILER_TYPE}} 212LDFLAGS_LAST+= -B${STAGE_LIBDIR} -L${STAGE_LIBDIR} 213CXXFLAGS_LAST += -isystem ${STAGE_OBJTOP}/usr/include/c++/${GCCVER:U4.2} 214# backward doesn't get searched if -nostdinc 215CXXFLAGS_LAST += -isystem ${STAGE_OBJTOP}/usr/include/c++/${GCCVER:U4.2}/backward 216CFLAGS_LAST.clang += -isystem ${STAGE_OBJTOP}/usr/include/clang/${CLANGVER:U3.3} 217CXXFLAGS_LAST += ${CFLAGS_LAST.${COMPILER_TYPE}} 218.else 219# if ld suppored sysroot, this would suffice 220CFLAGS_LAST+= --sysroot=${STAGE_OBJTOP} 221.endif 222LDFLAGS_LAST+= -Wl,-rpath-link,${STAGE_LIBDIR} 223STAGED_INCLUDE_DIR= ${STAGE_OBJTOP}/usr/include 224.endif 225 226.if ${USE_META:Uyes} == "yes" 227.include "meta.sys.mk" 228.endif 229 230# this is sufficient for most of the tree. 231.MAKE.DEPENDFILE_DEFAULT = ${.MAKE.DEPENDFILE_PREFIX} 232 233# but if we have a machine qualified file it should be used in preference 234.MAKE.DEPENDFILE_PREFERENCE = \ 235 ${.MAKE.DEPENDFILE_PREFIX}.${MACHINE} \ 236 ${.MAKE.DEPENDFILE_PREFIX} 237 238.undef .MAKE.DEPENDFILE 239 240.include "sys.dependfile.mk" 241 242.if ${.MAKE.LEVEL} > 0 && ${MACHINE} == "host" && ${.MAKE.DEPENDFILE:E} != "host" 243# we can use this but should not update it. 244UPDATE_DEPENDFILE= NO 245.endif 246 247.MAKE.META.BAILIWICK = ${SB} ${OBJROOT} ${STAGE_ROOT} 248 249CSU_DIR.i386 = csu/i386-elf 250CSU_DIR.${MACHINE_ARCH} ?= csu/${MACHINE_ARCH} 251CSU_DIR := ${CSU_DIR.${MACHINE_ARCH}} 252 253.endif # meta mode 254 255# ensure we have a value 256.MAKE.MODE ?= normal 257 258MAKE_PRINT_VAR_ON_ERROR+= \ 259 .CURDIR \ 260 .MAKE \ 261 .OBJDIR \ 262 .TARGETS \ 263 DESTDIR \ 264 LD_LIBRARY_PATH \ 265 MACHINE \ 266 MACHINE_ARCH \ 267 MAKEOBJDIRPREFIX \ 268 MAKESYSPATH \ 269 MAKE_VERSION\ 270 OBJTOP \ 271 ${MAKE_PRINT_VAR_ON_ERROR_XTRAS} 272 273.if ${.MAKE.LEVEL} > 0 274MAKE_PRINT_VAR_ON_ERROR += .MAKE.MAKEFILES .PATH 275.endif 276 277 278# these are handy 279# we can use this for a cheap timestamp at the start of a target's script, 280# but not at the end - since make will expand both at the same time. 281TIME_STAMP_FMT = @ %s [%Y-%m-%d %T] 282TIME_STAMP = ${TIME_STAMP_FMT:localtime} 283# this will produce the same output but as of when date(1) is run. 284TIME_STAMP_DATE = `date '+${TIME_STAMP_FMT}'` 285TIME_STAMP_END?= ${TIME_STAMP_DATE} 286 287.endif # bmake 288