xref: /freebsd/contrib/bmake/unit-tests/posix1.mk (revision 956e45f6fb3e18b8e89b1341708db60c30bb9f27)
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