1*3cbdda60SSimon J. Gerraty# $Id: sys.mk,v 1.35 2012/11/12 06:27:51 sjg Exp $ 2*3cbdda60SSimon J. Gerraty# 3*3cbdda60SSimon J. Gerraty# @(#) Copyright (c) 2003-2009, Simon J. Gerraty 4*3cbdda60SSimon J. Gerraty# 5*3cbdda60SSimon J. Gerraty# This file is provided in the hope that it will 6*3cbdda60SSimon J. Gerraty# be of use. There is absolutely NO WARRANTY. 7*3cbdda60SSimon J. Gerraty# Permission to copy, redistribute or otherwise 8*3cbdda60SSimon J. Gerraty# use this file is hereby granted provided that 9*3cbdda60SSimon J. Gerraty# the above copyright notice and this notice are 10*3cbdda60SSimon J. Gerraty# left intact. 11*3cbdda60SSimon J. Gerraty# 12*3cbdda60SSimon J. Gerraty# Please send copies of changes and bug-fixes to: 13*3cbdda60SSimon J. Gerraty# sjg@crufty.net 14*3cbdda60SSimon J. Gerraty# 15*3cbdda60SSimon J. Gerraty 16*3cbdda60SSimon J. Gerraty# Avoid putting anything platform specific in here. 17*3cbdda60SSimon J. Gerraty 18*3cbdda60SSimon J. Gerraty# We use the following paradigm for preventing multiple inclusion. 19*3cbdda60SSimon J. Gerraty# It relies on the fact that conditionals and dependencies are resolved 20*3cbdda60SSimon J. Gerraty# at the time they are read. 21*3cbdda60SSimon J. Gerraty# 22*3cbdda60SSimon J. Gerraty# _this ?= ${.PARSEFILE} 23*3cbdda60SSimon J. Gerraty# .if !target(__${_this}__) 24*3cbdda60SSimon J. Gerraty# __${_this}__: 25*3cbdda60SSimon J. Gerraty# 26*3cbdda60SSimon J. Gerraty.if ${MAKE_VERSION:U0} > 20100408 27*3cbdda60SSimon J. Gerraty_this = ${.PARSEDIR:tA}/${.PARSEFILE} 28*3cbdda60SSimon J. Gerraty.else 29*3cbdda60SSimon J. Gerraty_this = ${.PARSEDIR}/${.PARSEFILE} 30*3cbdda60SSimon J. Gerraty.endif 31*3cbdda60SSimon J. Gerraty 32*3cbdda60SSimon J. Gerraty# Sometimes we want to turn on debugging in just one or two places 33*3cbdda60SSimon J. Gerraty# if .CURDIR is matched by any entry in DEBUG_MAKE_SYS_DIRS we 34*3cbdda60SSimon J. Gerraty# will apply DEBUG_MAKE_FLAGS now. 35*3cbdda60SSimon J. Gerraty# if an entry in DEBUG_MAKE_DIRS matches, we at the end of sys.mk 36*3cbdda60SSimon J. Gerraty# eg. DEBUG_MAKE_FLAGS=-dv DEBUG_MAKE_SYS_DIRS="*lib/sjg" 37*3cbdda60SSimon J. Gerraty# use DEBUG_MAKE_FLAGS0 to apply only to .MAKE.LEVEL 0 38*3cbdda60SSimon J. Gerraty# 39*3cbdda60SSimon J. Gerraty.if ${.MAKE.LEVEL:U1} == 0 40*3cbdda60SSimon J. Gerraty# we use indirection, to simplify the tests below, and incase 41*3cbdda60SSimon J. Gerraty# DEBUG_* were given on our command line. 42*3cbdda60SSimon J. Gerraty_DEBUG_MAKE_FLAGS = ${DEBUG_MAKE_FLAGS0} 43*3cbdda60SSimon J. Gerraty_DEBUG_MAKE_SYS_DIRS = ${DEBUG_MAKE_SYS_DIRS0:U${DEBUG_MAKE_SYS_DIRS}} 44*3cbdda60SSimon J. Gerraty_DEBUG_MAKE_DIRS = ${DEBUG_MAKE_DIRS0:U${DEBUG_MAKE_DIRS}} 45*3cbdda60SSimon J. Gerraty.else 46*3cbdda60SSimon J. Gerraty_DEBUG_MAKE_FLAGS = ${DEBUG_MAKE_FLAGS} 47*3cbdda60SSimon J. Gerraty_DEBUG_MAKE_SYS_DIRS = ${DEBUG_MAKE_SYS_DIRS} 48*3cbdda60SSimon J. Gerraty_DEBUG_MAKE_DIRS = ${DEBUG_MAKE_DIRS} 49*3cbdda60SSimon J. Gerraty.endif 50*3cbdda60SSimon J. Gerraty 51*3cbdda60SSimon J. Gerraty.if !empty(_DEBUG_MAKE_FLAGS) 52*3cbdda60SSimon J. Gerraty.if ${_DEBUG_MAKE_SYS_DIRS:Uno:@x@${.CURDIR:M$x}@} != "" 53*3cbdda60SSimon J. Gerraty.MAKEFLAGS: ${_DEBUG_MAKE_FLAGS} 54*3cbdda60SSimon J. Gerraty.endif 55*3cbdda60SSimon J. Gerraty.endif 56*3cbdda60SSimon J. Gerraty 57*3cbdda60SSimon J. Gerraty# if this is an ancient version of bmake 58*3cbdda60SSimon J. GerratyMAKE_VERSION ?= 0 59*3cbdda60SSimon J. Gerraty.if ${MAKE_VERSION:M*make-*} 60*3cbdda60SSimon J. Gerraty# turn it into what we want - just the date 61*3cbdda60SSimon J. GerratyMAKE_VERSION := ${MAKE_VERSION:[1]:C,.*-,,} 62*3cbdda60SSimon J. Gerraty.endif 63*3cbdda60SSimon J. Gerraty 64*3cbdda60SSimon J. Gerraty# some useful modifiers 65*3cbdda60SSimon J. Gerraty 66*3cbdda60SSimon J. Gerraty# A useful trick for testing multiple :M's against something 67*3cbdda60SSimon J. Gerraty# :L says to use the variable's name as its value - ie. literal 68*3cbdda60SSimon J. Gerraty# got = ${clean* destroy:${M_ListToMatch:S,V,.TARGETS,}} 69*3cbdda60SSimon J. GerratyM_ListToMatch = L:@m@$${V:M$$m}@ 70*3cbdda60SSimon J. Gerraty# match against our initial targets (see above) 71*3cbdda60SSimon J. GerratyM_L_TARGETS = ${M_ListToMatch:S,V,_TARGETS,} 72*3cbdda60SSimon J. Gerraty 73*3cbdda60SSimon J. Gerraty# turn a list into a set of :N modifiers 74*3cbdda60SSimon J. Gerraty# NskipFoo = ${Foo:${M_ListToSkip}} 75*3cbdda60SSimon J. GerratyM_ListToSkip= O:u:ts::S,:,:N,g:S,^,N, 76*3cbdda60SSimon J. Gerraty 77*3cbdda60SSimon J. Gerraty# type should be a builtin in any sh since about 1980, 78*3cbdda60SSimon J. Gerraty# AUTOCONF := ${autoconf:L:${M_whence}} 79*3cbdda60SSimon J. GerratyM_type = @x@(type $$x 2> /dev/null); echo;@:sh:[0]:N* found*:[@]:C,[()],,g 80*3cbdda60SSimon J. GerratyM_whence = ${M_type}:M/* 81*3cbdda60SSimon J. Gerraty 82*3cbdda60SSimon J. Gerraty# convert a path to a valid shell variable 83*3cbdda60SSimon J. GerratyM_P2V = tu:C,[./-],_,g 84*3cbdda60SSimon J. Gerraty 85*3cbdda60SSimon J. Gerraty# convert path to absolute 86*3cbdda60SSimon J. Gerraty.if ${MAKE_VERSION:U0} > 20100408 87*3cbdda60SSimon J. GerratyM_tA = tA 88*3cbdda60SSimon J. Gerraty.else 89*3cbdda60SSimon J. GerratyM_tA = C,.*,('cd' & \&\& 'pwd') 2> /dev/null || echo &,:sh 90*3cbdda60SSimon J. Gerraty.endif 91*3cbdda60SSimon J. Gerraty 92*3cbdda60SSimon J. Gerraty# absoulte path to what we are reading. 93*3cbdda60SSimon J. Gerraty_PARSEDIR = ${.PARSEDIR:${M_tA}} 94*3cbdda60SSimon J. Gerraty 95*3cbdda60SSimon J. Gerraty# we expect a recent bmake 96*3cbdda60SSimon J. Gerraty.if !defined(_TARGETS) 97*3cbdda60SSimon J. Gerraty# some things we do only once 98*3cbdda60SSimon J. Gerraty_TARGETS := ${.TARGETS} 99*3cbdda60SSimon J. Gerraty.-include <sys.env.mk> 100*3cbdda60SSimon J. Gerraty.endif 101*3cbdda60SSimon J. Gerraty 102*3cbdda60SSimon J. Gerraty# we need HOST_TARGET etc below. 103*3cbdda60SSimon J. Gerraty.include <host-target.mk> 104*3cbdda60SSimon J. Gerraty 105*3cbdda60SSimon J. Gerraty# find the OS specifics 106*3cbdda60SSimon J. Gerraty.if defined(SYS_OS_MK) 107*3cbdda60SSimon J. Gerraty.include <${SYS_OS_MK}> 108*3cbdda60SSimon J. Gerraty.else 109*3cbdda60SSimon J. Gerraty_sys_mk = 110*3cbdda60SSimon J. Gerraty.for x in ${HOST_OSTYPE} ${HOST_TARGET} ${HOST_OS} ${MACHINE} Generic 111*3cbdda60SSimon J. Gerraty.if empty(_sys_mk) 112*3cbdda60SSimon J. Gerraty.-include <sys/$x.mk> 113*3cbdda60SSimon J. Gerraty_sys_mk := ${.MAKE.MAKEFILES:M*/$x.mk} 114*3cbdda60SSimon J. Gerraty.if !empty(_sys_mk) 115*3cbdda60SSimon J. Gerraty_sys_mk := sys/${_sys_mk:T} 116*3cbdda60SSimon J. Gerraty.endif 117*3cbdda60SSimon J. Gerraty.endif 118*3cbdda60SSimon J. Gerraty.if empty(_sys_mk) 119*3cbdda60SSimon J. Gerraty# might be an old style 120*3cbdda60SSimon J. Gerraty.-include <$x.sys.mk> 121*3cbdda60SSimon J. Gerraty_sys_mk := ${.MAKE.MAKEFILES:M*/$x.sys.mk:T} 122*3cbdda60SSimon J. Gerraty.endif 123*3cbdda60SSimon J. Gerraty.endfor 124*3cbdda60SSimon J. Gerraty 125*3cbdda60SSimon J. GerratySYS_OS_MK := ${_sys_mk} 126*3cbdda60SSimon J. Gerraty.export SYS_OS_MK 127*3cbdda60SSimon J. Gerraty.endif 128*3cbdda60SSimon J. Gerraty 129*3cbdda60SSimon J. Gerraty# allow customization without editing. 130*3cbdda60SSimon J. Gerraty.-include <local.sys.mk> 131*3cbdda60SSimon J. Gerraty 132*3cbdda60SSimon J. Gerraty# if you want objdirs make them automatic 133*3cbdda60SSimon J. Gerraty.if ${MKOBJDIRS:Uno} == "auto" 134*3cbdda60SSimon J. Gerraty.include <auto.obj.mk> 135*3cbdda60SSimon J. Gerraty.endif 136*3cbdda60SSimon J. Gerraty 137*3cbdda60SSimon J. Gerraty.if !empty(SRCTOP) 138*3cbdda60SSimon J. Gerraty.if ${.CURDIR} == ${SRCTOP} 139*3cbdda60SSimon J. GerratyRELDIR = . 140*3cbdda60SSimon J. Gerraty.elif ${.CURDIR:M${SRCTOP}/*} 141*3cbdda60SSimon J. GerratyRELDIR := ${.CURDIR:S,${SRCTOP}/,,} 142*3cbdda60SSimon J. Gerraty.endif 143*3cbdda60SSimon J. Gerraty.endif 144*3cbdda60SSimon J. Gerraty 145*3cbdda60SSimon J. GerratyMACHINE_ARCH.host ?= ${_HOST_ARCH} 146*3cbdda60SSimon J. GerratyMACHINE_ARCH.${MACHINE} ?= ${MACHINE} 147*3cbdda60SSimon J. Gerraty.if empty(MACHINE_ARCH) 148*3cbdda60SSimon J. GerratyMACHINE_ARCH = ${MACHINE_ARCH.${MACHINE}} 149*3cbdda60SSimon J. Gerraty.endif 150*3cbdda60SSimon J. Gerraty 151*3cbdda60SSimon J. Gerraty.ifndef ROOT_GROUP 152*3cbdda60SSimon J. GerratyROOT_GROUP != sed -n /:0:/s/:.*//p /etc/group 153*3cbdda60SSimon J. Gerraty.export ROOT_GROUP 154*3cbdda60SSimon J. Gerraty.endif 155*3cbdda60SSimon J. Gerraty 156*3cbdda60SSimon J. Gerratyunix ?= We run ${_HOST_OSNAME}. 157*3cbdda60SSimon J. Gerraty 158*3cbdda60SSimon J. Gerraty# A race condition in mkdir, means that it can bail if another 159*3cbdda60SSimon J. Gerraty# process made a dir that mkdir expected to. 160*3cbdda60SSimon J. Gerraty# We repeat the mkdir -p a number of times to try and work around this. 161*3cbdda60SSimon J. Gerraty# We stop looping as soon as the dir exists. 162*3cbdda60SSimon J. Gerraty# If we get to the end of the loop, a plain mkdir will issue an error. 163*3cbdda60SSimon J. GerratyMkdirs= Mkdirs() { \ 164*3cbdda60SSimon J. Gerraty for d in $$*; do \ 165*3cbdda60SSimon J. Gerraty for i in 1 2 3 4 5 6; do \ 166*3cbdda60SSimon J. Gerraty mkdir -p $$d; \ 167*3cbdda60SSimon J. Gerraty test -d $$d && return 0; \ 168*3cbdda60SSimon J. Gerraty done; \ 169*3cbdda60SSimon J. Gerraty mkdir $$d || exit $$?; \ 170*3cbdda60SSimon J. Gerraty done; } 171*3cbdda60SSimon J. Gerraty 172*3cbdda60SSimon J. Gerraty# this often helps with debugging 173*3cbdda60SSimon J. Gerraty.SUFFIXES: .cpp-out 174*3cbdda60SSimon J. Gerraty 175*3cbdda60SSimon J. Gerraty.c.cpp-out: 176*3cbdda60SSimon J. Gerraty @${COMPILE.c:N-c} -E ${.IMPSRC} | grep -v '^[ ]*$$' 177*3cbdda60SSimon J. Gerraty 178*3cbdda60SSimon J. Gerraty.cc.cpp-out: 179*3cbdda60SSimon J. Gerraty @${COMPILE.cc:N-c} -E ${.IMPSRC} | grep -v '^[ ]*$$' 180*3cbdda60SSimon J. Gerraty 181*3cbdda60SSimon J. Gerraty# we don't include own.mk but user can expect -DWITH_META_MODE to work 182*3cbdda60SSimon J. Gerraty.if defined(WITHOUT_META_MODE) 183*3cbdda60SSimon J. GerratyUSE_META= no 184*3cbdda60SSimon J. Gerraty.elif defined(WITH_META_MODE) 185*3cbdda60SSimon J. GerratyUSE_META= yes 186*3cbdda60SSimon J. Gerraty.endif 187*3cbdda60SSimon J. Gerraty.if ${USE_META:Uno} == "yes" 188*3cbdda60SSimon J. Gerraty.-include <meta.sys.mk> 189*3cbdda60SSimon J. Gerraty.endif 190*3cbdda60SSimon J. Gerraty# make sure we have a harmless value 191*3cbdda60SSimon J. Gerraty.MAKE.MODE ?= normal 192*3cbdda60SSimon J. Gerraty 193*3cbdda60SSimon J. Gerraty# if .CURDIR is matched by any entry in DEBUG_MAKE_DIRS we 194*3cbdda60SSimon J. Gerraty# will apply DEBUG_MAKE_FLAGS, now. 195*3cbdda60SSimon J. Gerraty.if !empty(_DEBUG_MAKE_FLAGS) 196*3cbdda60SSimon J. Gerraty.if ${_DEBUG_MAKE_DIRS:Uno:@x@${.CURDIR:M$x}@} != "" 197*3cbdda60SSimon J. Gerraty.MAKEFLAGS: ${_DEBUG_MAKE_FLAGS} 198*3cbdda60SSimon J. Gerraty.endif 199*3cbdda60SSimon J. Gerraty.endif 200