1*956e45f6SSimon J. Gerraty# $NetBSD: posix1.mk,v 1.6 2020/10/24 08:50:17 rillig Exp $ 2db29cad8SSimon J. Gerraty 3db29cad8SSimon J. Gerraty# Keep the default suffixes from interfering, just in case. 4db29cad8SSimon J. Gerraty.SUFFIXES: 5db29cad8SSimon J. Gerraty 6db29cad8SSimon J. Gerratyall: line-continuations suffix-substitution localvars 7db29cad8SSimon J. Gerraty 8db29cad8SSimon J. Gerraty# we need to clean for repeatable results 9db29cad8SSimon J. Gerraty.BEGIN: clean 10db29cad8SSimon J. Gerratyclean: 11db29cad8SSimon J. Gerraty @rm -f lib.a dir/* dummy obj* 122c3632d1SSimon J. Gerraty.END: 132c3632d1SSimon J. Gerraty @rm -f lib.a dir/* dummy obj* 14db29cad8SSimon J. Gerraty 15db29cad8SSimon J. Gerraty# 16db29cad8SSimon J. Gerraty# Line continuations 17db29cad8SSimon J. Gerraty# 18db29cad8SSimon J. Gerraty 19db29cad8SSimon J. Gerraty# Escaped newlines and leading whitespace from the next line are replaced 20db29cad8SSimon J. Gerraty# with single space, except in commands, where the escape and the newline 21db29cad8SSimon J. Gerraty# are retained, but a single leading tab (if any) from the next line is 22db29cad8SSimon J. Gerraty# removed. (PR 49085) 23db29cad8SSimon J. Gerraty# Expect: 24db29cad8SSimon J. Gerraty# ${VAR} = "foo bar baz" 25db29cad8SSimon J. Gerraty# a 26db29cad8SSimon J. Gerraty# b 27db29cad8SSimon J. Gerraty# c 28db29cad8SSimon J. GerratyVAR = foo\ 29db29cad8SSimon J. Gerraty\ 30db29cad8SSimon J. Gerraty bar\ 31db29cad8SSimon J. Gerraty baz 32db29cad8SSimon J. Gerraty 33db29cad8SSimon J. Gerratyline-continuations: 34db29cad8SSimon J. Gerraty @echo '$${VAR} = "${VAR}"' 35db29cad8SSimon J. Gerraty @echo 'aXbXc' | sed -e 's/X/\ 36db29cad8SSimon J. Gerraty /g' 37db29cad8SSimon J. Gerraty 38db29cad8SSimon J. Gerraty 39db29cad8SSimon J. Gerraty# 40db29cad8SSimon J. Gerraty# Suffix substitution 41db29cad8SSimon J. Gerraty# 42db29cad8SSimon J. Gerraty 43db29cad8SSimon J. Gerraty# The only variable modifier accepted by POSIX. 44db29cad8SSimon J. Gerraty# ${VAR:s1=s2}: replace s1, if found, with s2 at end of each word in 45db29cad8SSimon J. Gerraty# ${VAR}. s1 and s2 may contain macro expansions. 46db29cad8SSimon J. Gerraty# Expect: foo baR baz, bar baz, foo bar baz, fooadd baradd bazadd 47db29cad8SSimon J. Gerratysuffix-substitution: 48db29cad8SSimon J. Gerraty @echo '${VAR:r=R}, ${VAR:foo=}, ${VAR:not_there=wrong}, ${VAR:=add}' 49db29cad8SSimon J. Gerraty 50db29cad8SSimon J. Gerraty 51db29cad8SSimon J. Gerraty# 52db29cad8SSimon J. Gerraty# Local variables: regular forms, D/F forms and suffix substitution. 53db29cad8SSimon J. Gerraty# 54db29cad8SSimon J. Gerraty 55db29cad8SSimon J. Gerraty# In the past substitutions did not work with the D/F forms and those 56db29cad8SSimon J. Gerraty# forms were not available for $?. (PR 49085) 57db29cad8SSimon J. Gerraty 58db29cad8SSimon J. GerratyARFLAGS= -rcv 59db29cad8SSimon J. Gerraty 60db29cad8SSimon J. Gerratylocalvars: lib.a 61db29cad8SSimon J. Gerraty 62db29cad8SSimon J. Gerraty# $@ = target or archive name $< = implied source 63db29cad8SSimon J. Gerraty# $* = target without suffix $? = sources newer than target 64db29cad8SSimon J. Gerraty# $% = archive member name 65db29cad8SSimon J. GerratyLOCALS= \ 66db29cad8SSimon J. Gerraty "Local variables\n\ 67db29cad8SSimon J. Gerraty \$${@}=\"${@}\" \$${<}=\"${<}\"\n\ 68db29cad8SSimon J. Gerraty \$${*}=\"${*}\" \$${?}=\"${?}\"\n\ 69db29cad8SSimon J. Gerraty \$${%%}=\"${%}\"\n\n" 70db29cad8SSimon J. Gerraty 71db29cad8SSimon J. Gerraty# $XD = directory part of X $XF = file part of X 72db29cad8SSimon J. Gerraty# X is one of the local variables. 73db29cad8SSimon J. GerratyLOCAL_ALTERNATIVES= \ 74db29cad8SSimon J. Gerraty "Directory and filename parts of local variables\n\ 75db29cad8SSimon J. Gerraty \$${@D}=\"${@D}\" \$${@F}=\"${@F}\"\n\ 76db29cad8SSimon J. Gerraty \$${<D}=\"${<D}\" \$${<F}=\"${<F}\"\n\ 77db29cad8SSimon J. Gerraty \$${*D}=\"${*D}\" \$${*F}=\"${*F}\"\n\ 78db29cad8SSimon J. Gerraty \$${?D}=\"${?D}\" \$${?F}=\"${?F}\"\n\ 79db29cad8SSimon J. Gerraty \$${%%D}=\"${%D}\" \$${%%F}=\"${%F}\"\n\n" 80db29cad8SSimon J. Gerraty 81db29cad8SSimon J. Gerraty# Do all kinds of meaningless substitutions on local variables to see 82db29cad8SSimon J. Gerraty# if they work. Add, remove and replace things. 83db29cad8SSimon J. GerratyVAR2= .o 84db29cad8SSimon J. GerratyVAR3= foo 85db29cad8SSimon J. GerratyLOCAL_SUBSTITUTIONS= \ 86db29cad8SSimon J. Gerraty "Local variable substitutions\n\ 87db29cad8SSimon J. Gerraty \$${@:.o=}=\"${@:.o=}\" \$${<:.c=.C}=\"${<:.c=.C}\"\n\ 88db29cad8SSimon J. Gerraty \$${*:=.h}=\"${*:=.h}\" \$${?:.h=.H}=\"${?:.h=.H}\"\n\ 89db29cad8SSimon J. Gerraty \$${%%:=}=\"${%:=}\"\n\n" 90db29cad8SSimon J. Gerraty 91db29cad8SSimon J. GerratyLOCAL_ALTERNATIVE_SUBSTITUTIONS= \ 92db29cad8SSimon J. Gerraty "Target with suffix transformations\n\ 93db29cad8SSimon J. Gerraty \$${@D:=append}=\"${@D:=append}\"\n\ 94db29cad8SSimon J. Gerraty \$${@F:.o=.O}=\"${@F:.o=.O}\"\n\ 95db29cad8SSimon J. Gerraty \n\ 96db29cad8SSimon J. Gerraty Implied source with suffix transformations\n\ 97db29cad8SSimon J. Gerraty \$${<D:r=rr}=\"${<D:r=rr}\"\n\ 98db29cad8SSimon J. Gerraty \$${<F:.c=.C}=\"${<F:.c=.C}\"\n\ 99db29cad8SSimon J. Gerraty \n\ 100db29cad8SSimon J. Gerraty Suffixless target with suffix transformations\n\ 101db29cad8SSimon J. Gerraty \$${*D:.=dot}=\"${*D:.=dot}\"\n\ 102db29cad8SSimon J. Gerraty \$${*F:.a=}=\"${*F:.a=}\"\n\ 103db29cad8SSimon J. Gerraty \n\ 104db29cad8SSimon J. Gerraty Out-of-date dependencies with suffix transformations\n\ 105db29cad8SSimon J. Gerraty \$${?D:ir=}=\"${?D:ir=}\"\n\ 106db29cad8SSimon J. Gerraty \$${?F:.h=.H}=\"${?F:.h=.H}\"\n\ 107db29cad8SSimon J. Gerraty \n\ 108db29cad8SSimon J. Gerraty Member with suffix transformations\n\ 109db29cad8SSimon J. Gerraty \$${%%D:.=}=\"${%D:.=}\"\n\ 110db29cad8SSimon J. Gerraty \$${%%F:\$${VAR2}=\$${VAR}}=\"${%F:${VAR2}=${VAR}}\"\n\n" 111db29cad8SSimon J. Gerraty 112db29cad8SSimon J. Gerraty.SUFFIXES: .c .o .a 113db29cad8SSimon J. Gerraty 114db29cad8SSimon J. Gerraty# The system makefiles make the .c.a rule .PRECIOUS with a special source, 115db29cad8SSimon J. Gerraty# but such a thing is not POSIX compatible. It's also somewhat useless 116db29cad8SSimon J. Gerraty# in a test makefile. 117db29cad8SSimon J. Gerraty.c.a: 118db29cad8SSimon J. Gerraty @printf ${LOCALS} 119db29cad8SSimon J. Gerraty @printf ${LOCAL_ALTERNATIVES} 120db29cad8SSimon J. Gerraty @printf ${LOCAL_SUBSTITUTIONS} 121db29cad8SSimon J. Gerraty @printf ${LOCAL_ALTERNATIVE_SUBSTITUTIONS} 122db29cad8SSimon J. Gerraty cc -c -o '${%}' '${<}' 123db29cad8SSimon J. Gerraty ar ${ARFLAGS} '${@}' '${%}' 124db29cad8SSimon J. Gerraty rm -f '${%}' 125db29cad8SSimon J. Gerraty 126db29cad8SSimon J. Gerraty.c.o: 127db29cad8SSimon J. Gerraty @printf ${LOCALS} 128db29cad8SSimon J. Gerraty @printf ${LOCAL_ALTERNATIVES} 129db29cad8SSimon J. Gerraty @printf ${LOCAL_SUBSTITUTIONS} 130db29cad8SSimon J. Gerraty @printf ${LOCAL_ALTERNATIVE_SUBSTITUTIONS} 131db29cad8SSimon J. Gerraty cc -c -o '${@}' '${<}' 132db29cad8SSimon J. Gerraty 133db29cad8SSimon J. Gerraty# Some of these rules are padded with useless extra dependencies just so 134db29cad8SSimon J. Gerraty# that ${?} has more than one file. 135db29cad8SSimon J. Gerraty 136db29cad8SSimon J. Gerratylib.a: lib.a(obj1.o) lib.a(obj2.o) lib.a(obj3.o) 137db29cad8SSimon J. Gerraty @ar -s '${@}' 138db29cad8SSimon J. Gerraty 139db29cad8SSimon J. Gerraty# Explicit rule where the dependency is an inferred file. The dependency 140db29cad8SSimon J. Gerraty# object's name differs from the member's because there was a bug which 141db29cad8SSimon J. Gerraty# forced a dependency on member even when no such dependency was specified 142db29cad8SSimon J. Gerraty# (PR 49086). 143db29cad8SSimon J. Gerratylib.a(obj1.o): dir/obj_1.o dummy 144db29cad8SSimon J. Gerraty @printf ${LOCALS} 145db29cad8SSimon J. Gerraty @printf ${LOCAL_ALTERNATIVES} 146db29cad8SSimon J. Gerraty @printf ${LOCAL_SUBSTITUTIONS} 147db29cad8SSimon J. Gerraty @printf ${LOCAL_ALTERNATIVE_SUBSTITUTIONS} 148db29cad8SSimon J. Gerraty cp 'dir/obj_1.o' '$%' 149db29cad8SSimon J. Gerraty ar ${ARFLAGS} '${@}' '$%' 150db29cad8SSimon J. Gerraty rm -f '$%' 151db29cad8SSimon J. Gerraty 152db29cad8SSimon J. Gerraty# Excplicit rule where the dependency also has an explicit rule. 153db29cad8SSimon J. Gerratylib.a(obj2.o): obj2.o 154db29cad8SSimon J. Gerraty ar ${ARFLAGS} '${@}' '${%}' 155db29cad8SSimon J. Gerraty 156db29cad8SSimon J. Gerraty# Use .c.a inference with an extra dependency. 157db29cad8SSimon J. Gerratylib.a(obj3.o): obj3.h dir/dummy 158db29cad8SSimon J. Gerraty 159db29cad8SSimon J. Gerraty# Use .c.o inference with an extra dependency. 160db29cad8SSimon J. Gerratydir/obj_1.o: dir/obj_1.h 161db29cad8SSimon J. Gerraty 162db29cad8SSimon J. Gerraty# According to POSIX, $* is only required for inference rules and $<'s 163db29cad8SSimon J. Gerraty# value is unspecified outside of inference rules. Strictly speaking 164db29cad8SSimon J. Gerraty# we shouldn't be expanding them here but who cares. At least we get 165db29cad8SSimon J. Gerraty# to check that the program does nothing stupid (like crash) with them. 166db29cad8SSimon J. Gerraty# The C file is named differently from the object file because there 167db29cad8SSimon J. Gerraty# was a bug which forced dependencies based on inference rules on all 168db29cad8SSimon J. Gerraty# applicable targets (PR 49086). 169db29cad8SSimon J. Gerratyobj2.o: obj_2.c obj_2.h dir/obj_1.h 170db29cad8SSimon J. Gerraty @printf ${LOCALS} 171db29cad8SSimon J. Gerraty @printf ${LOCAL_ALTERNATIVES} 172db29cad8SSimon J. Gerraty @printf ${LOCAL_SUBSTITUTIONS} 173db29cad8SSimon J. Gerraty @printf ${LOCAL_ALTERNATIVE_SUBSTITUTIONS} 174db29cad8SSimon J. Gerraty cc -c -o '${@}' 'obj_2.c' 175db29cad8SSimon J. Gerraty 176db29cad8SSimon J. Gerraty# Hey, this is make, we can make our own test data setup! obj1.c 177db29cad8SSimon J. Gerraty# and obj2.c are not used, so they should not get created. They're here 178db29cad8SSimon J. Gerraty# as a bait for a regression into the forced dependencies discussed earlier. 179db29cad8SSimon J. Gerratyobj1.c dir/obj_1.c obj2.c obj_2.c obj3.c: 180db29cad8SSimon J. Gerraty mkdir -p '${@D}' 181db29cad8SSimon J. Gerraty printf '#include "${@F:.c=.h}"\nconst char* ${@F:.c=} = "${@}";\n' \ 182db29cad8SSimon J. Gerraty >'${@}' 183db29cad8SSimon J. Gerraty 184db29cad8SSimon J. Gerratydir/obj_1.h obj_2.h obj3.h dummy dir/dummy: 185db29cad8SSimon J. Gerraty mkdir -p '${@D}' 186db29cad8SSimon J. Gerraty touch '${@}' 187