1# $Id: sys.vars.mk,v 1.6 2020/10/28 20:50:04 sjg Exp $ 2# 3# @(#) Copyright (c) 2003-2009, Simon J. Gerraty 4# 5# This file is provided in the hope that it will 6# be of use. There is absolutely NO WARRANTY. 7# Permission to copy, redistribute or otherwise 8# use this file is hereby granted provided that 9# the above copyright notice and this notice are 10# left intact. 11# 12# Please send copies of changes and bug-fixes to: 13# sjg@crufty.net 14# 15 16# We use the following paradigm for preventing multiple inclusion. 17# It relies on the fact that conditionals and dependencies are resolved 18# at the time they are read. 19# 20# _this ?= ${.PARSEFILE} 21# .if !target(__${_this}__) 22# __${_this}__: 23# 24.if ${MAKE_VERSION:U0} > 20100408 25_this = ${.PARSEDIR:tA}/${.PARSEFILE} 26.else 27_this = ${.PARSEDIR}/${.PARSEFILE} 28.endif 29 30# if this is an ancient version of bmake 31MAKE_VERSION ?= 0 32.if ${MAKE_VERSION:M*make-*} 33# turn it into what we want - just the date 34MAKE_VERSION := ${MAKE_VERSION:[1]:C,.*-,,} 35.endif 36 37# some useful modifiers 38 39# A useful trick for testing multiple :M's against something 40# :L says to use the variable's name as its value - ie. literal 41# got = ${clean* destroy:${M_ListToMatch:S,V,.TARGETS,}} 42M_ListToMatch = L:@m@$${V:M$$m}@ 43# match against our initial targets (see above) 44M_L_TARGETS = ${M_ListToMatch:S,V,_TARGETS,} 45 46# turn a list into a set of :N modifiers 47# NskipFoo = ${Foo:${M_ListToSkip}} 48M_ListToSkip= O:u:S,^,N,:ts: 49 50# type should be a builtin in any sh since about 1980, 51# but sadly there are exceptions! 52.if ${.MAKE.OS:Unknown:NBSD/OS} == "" 53_type_sh = which 54.endif 55 56# AUTOCONF := ${autoconf:L:${M_whence}} 57M_type = @x@(${_type_sh:Utype} $$x) 2> /dev/null; echo;@:sh:[0]:N* found*:[@]:C,[()],,g 58M_whence = ${M_type}:M/*:[1] 59 60# produce similar output to jot(1) 61# eg. ${LIST:[#]:${M_JOT}} 62# would be 1 2 3 4 5 if LIST has 5 words 63# ${9:L:${M_JOT}} 64# would be 1 2 3 4 5 6 7 8 9 65M_JOT = @x@i=1;while [ $$$$i -le $$x ]; do echo $$$$i; i=$$$$((i + 1)); done;@:sh 66 67# ${LIST:${M_RANGE}} is 1 2 3 4 5 if LIST has 5 words 68.if ${MAKE_VERSION} >= 20170130 69M_RANGE = range 70.else 71M_RANGE = [#]:${M_JOT} 72.endif 73 74# convert a path to a valid shell variable 75M_P2V = tu:C,[./-],_,g 76 77# convert path to absolute 78.if ${MAKE_VERSION:U0} > 20100408 79M_tA = tA 80.else 81M_tA = C,.*,('cd' & \&\& 'pwd') 2> /dev/null || echo &,:sh 82.endif 83 84.if ${MAKE_VERSION:U0} >= 20170130 85# M_cmpv allows comparing dotted versions like 3.1.2 86# ${3.1.2:L:${M_cmpv}} -> 3001002 87# we use big jumps to handle 3 digits per dot: 88# ${123.456.789:L:${M_cmpv}} -> 123456789 89M_cmpv.units = 1 1000 1000000 90M_cmpv = S,., ,g:_:range:@i@+ $${_:[-$$i]} \* $${M_cmpv.units:[$$i]}@:S,^,expr 0 ,1:sh 91.endif 92 93# absoulte path to what we are reading. 94_PARSEDIR = ${.PARSEDIR:${M_tA}} 95 96# many projects use MAJOR MINOR PATCH versioning 97# ${OPENSSL:${M_M.M.P_VERSION}} is equivalent to 98# ${OPENSSL_MAJOR_VERSION}.${OPENSSL_MINOR_VERSION}.${OPENSSL_PATCH_VERSION} 99M_M.M.P_VERSION = L:@v@$${MAJOR MINOR PATCH:L:@t@$${$$v_$$t_VERSION:U0}@}@:ts. 100