xref: /freebsd/contrib/bmake/mk/sys.mk (revision 3cbdda60ff509264469d6894d4e838b0d2ccea5c)
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