Module Name:    src
Committed By:   christos
Date:           Sat Aug 23 15:02:04 UTC 2014

Modified Files:
        src/usr.bin/make/unit-tests: Makefile
Added Files:
        src/usr.bin/make/unit-tests: posix1.exp posix1.mk

Log Message:
Convert test in PR/49085


To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/usr.bin/make/unit-tests/Makefile
cvs rdiff -u -r0 -r1.1 src/usr.bin/make/unit-tests/posix1.exp \
    src/usr.bin/make/unit-tests/posix1.mk

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/make/unit-tests/Makefile
diff -u src/usr.bin/make/unit-tests/Makefile:1.44 src/usr.bin/make/unit-tests/Makefile:1.45
--- src/usr.bin/make/unit-tests/Makefile:1.44	Thu Aug 21 18:00:30 2014
+++ src/usr.bin/make/unit-tests/Makefile	Sat Aug 23 11:02:04 2014
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.44 2014/08/21 22:00:30 apb Exp $
+# $NetBSD: Makefile,v 1.45 2014/08/23 15:02:04 christos Exp $
 #
 # Unit tests for make(1)
 # The main targets are:
@@ -32,6 +32,7 @@ TESTNAMES= \
 	forloop \
 	forsubst \
 	hash \
+	impsrc \
 	misc \
 	moderrs \
 	modmatch \
@@ -43,6 +44,7 @@ TESTNAMES= \
 	phony-end \
 	posix \
 	qequals \
+	suffixes \
 	sunshcmd \
 	sysv \
 	ternary \

Added files:

Index: src/usr.bin/make/unit-tests/posix1.exp
diff -u /dev/null src/usr.bin/make/unit-tests/posix1.exp:1.1
--- /dev/null	Sat Aug 23 11:02:04 2014
+++ src/usr.bin/make/unit-tests/posix1.exp	Sat Aug 23 11:02:04 2014
@@ -0,0 +1,185 @@
+$(VAR) = "foo  bar baz"
+a
+b
+c
+foo baR baz,  bar baz, foo bar baz, fooadd baradd bazadd
+mkdir -p 'dir'
+touch 'dir/obj_1.h'
+mkdir -p 'dir'
+printf '#include "obj_1.h"\nconst char* obj_1 = "dir/obj_1.c";' \
+    >'dir/obj_1.c'
+Local variables
+ $(@)="dir/obj_1.o" $(<)="dir/obj_1.c"
+ $(*)="dir/obj_1" $(?)="dir/obj_1.h dir/obj_1.c"
+ $(%)=""
+
+Directory and filename parts of local variables
+ $(@D)="dir" $(@F)="obj_1.o"
+ $(<D)="dir" $(<F)="obj_1.c"
+ $(*D)="dir" $(*F)="obj_1"
+ $(?D)="dir dir" $(?F)="obj_1.h obj_1.c"
+ $(%D)="" $(%F)=""
+
+Local variable substitutions
+ $(@:.o=)="dir/obj_1" $(<:.c=.C)="dir/obj_1.C"
+ $(*:=.h)="dir/obj_1.h" $(?:.h=.H)="dir/obj_1.H dir/obj_1.c"
+ $(%:=)=""
+
+Target with suffix transformations
+ $(@D:=append)="dirappend"
+ $(@F:.o=.O)="obj_1.O"
+ 
+ Implied source with suffix transformations
+ $(<D:r=rr)="dirr"
+ $(<F:.c=.C)="obj_1.C"
+ 
+ Suffixless target with suffix transformations
+ $(*D:.=dot)="dir"
+ $(*F:.a=)="obj_1"
+ 
+ Out-of-date dependencies with suffix transformations
+ $(?D:ir=)="d d"
+ $(?F:.h=.H)="obj_1.H obj_1.c"
+ 
+ Member with suffix transformations
+ $(%D:.=)=""
+ $(%F:$(VAR2)=$(VAR))=""
+
+cc -c -o 'dir/obj_1.o' 'dir/obj_1.c'
+mkdir -p '.'
+touch 'dummy'
+Local variables
+ $(@)="lib.a" $(<)="dir/obj_1.o"
+ $(*)="obj1" $(?)="dir/obj_1.o dummy"
+ $(%)="obj1.o"
+
+Directory and filename parts of local variables
+ $(@D)="." $(@F)="lib.a"
+ $(<D)="dir" $(<F)="obj_1.o"
+ $(*D)="." $(*F)="obj1"
+ $(?D)="dir ." $(?F)="obj_1.o dummy"
+ $(%D)="." $(%F)="obj1.o"
+
+Local variable substitutions
+ $(@:.o=)="lib.a" $(<:.c=.C)="dir/obj_1.o"
+ $(*:=.h)="obj1.h" $(?:.h=.H)="dir/obj_1.o dummy"
+ $(%:=)="obj1.o"
+
+Target with suffix transformations
+ $(@D:=append)=".append"
+ $(@F:.o=.O)="lib.a"
+ 
+ Implied source with suffix transformations
+ $(<D:r=rr)="dirr"
+ $(<F:.c=.C)="obj_1.o"
+ 
+ Suffixless target with suffix transformations
+ $(*D:.=dot)="dot"
+ $(*F:.a=)="obj1"
+ 
+ Out-of-date dependencies with suffix transformations
+ $(?D:ir=)="d ."
+ $(?F:.h=.H)="obj_1.o dummy"
+ 
+ Member with suffix transformations
+ $(%D:.=)=""
+ $(%F:$(VAR2)=$(VAR))="obj1foo  bar baz"
+
+cp 'dir/obj_1.o' 'obj1.o'
+ar -rcv 'lib.a' 'obj1.o'
+a - obj1.o
+rm -f 'obj1.o'
+mkdir -p '.'
+printf '#include "obj_2.h"\nconst char* obj_2 = "obj_2.c";' \
+    >'obj_2.c'
+mkdir -p '.'
+touch 'obj_2.h'
+Local variables
+ $(@)="obj2.o" $(<)="obj_2.c"
+ $(*)="obj2" $(?)="obj_2.c obj_2.h dir/obj_1.h"
+ $(%)=""
+
+Directory and filename parts of local variables
+ $(@D)="." $(@F)="obj2.o"
+ $(<D)="." $(<F)="obj_2.c"
+ $(*D)="." $(*F)="obj2"
+ $(?D)=". . dir" $(?F)="obj_2.c obj_2.h obj_1.h"
+ $(%D)="" $(%F)=""
+
+Local variable substitutions
+ $(@:.o=)="obj2" $(<:.c=.C)="obj_2.C"
+ $(*:=.h)="obj2.h" $(?:.h=.H)="obj_2.c obj_2.H dir/obj_1.H"
+ $(%:=)=""
+
+Target with suffix transformations
+ $(@D:=append)=".append"
+ $(@F:.o=.O)="obj2.O"
+ 
+ Implied source with suffix transformations
+ $(<D:r=rr)="."
+ $(<F:.c=.C)="obj_2.C"
+ 
+ Suffixless target with suffix transformations
+ $(*D:.=dot)="dot"
+ $(*F:.a=)="obj2"
+ 
+ Out-of-date dependencies with suffix transformations
+ $(?D:ir=)=". . d"
+ $(?F:.h=.H)="obj_2.c obj_2.H obj_1.H"
+ 
+ Member with suffix transformations
+ $(%D:.=)=""
+ $(%F:$(VAR2)=$(VAR))=""
+
+cc -c -o 'obj2.o' 'obj_2.c'
+ar -rcv 'lib.a' 'obj2.o'
+a - obj2.o
+mkdir -p '.'
+touch 'obj3.h'
+mkdir -p 'dir'
+touch 'dir/dummy'
+mkdir -p '.'
+printf '#include "obj3.h"\nconst char* obj3 = "obj3.c";' \
+    >'obj3.c'
+Local variables
+ $(@)="lib.a" $(<)="obj3.c"
+ $(*)="obj3" $(?)="obj3.h dir/dummy obj3.c"
+ $(%)="obj3.o"
+
+Directory and filename parts of local variables
+ $(@D)="." $(@F)="lib.a"
+ $(<D)="." $(<F)="obj3.c"
+ $(*D)="." $(*F)="obj3"
+ $(?D)=". dir ." $(?F)="obj3.h dummy obj3.c"
+ $(%D)="." $(%F)="obj3.o"
+
+Local variable substitutions
+ $(@:.o=)="lib.a" $(<:.c=.C)="obj3.C"
+ $(*:=.h)="obj3.h" $(?:.h=.H)="obj3.H dir/dummy obj3.c"
+ $(%:=)="obj3.o"
+
+Target with suffix transformations
+ $(@D:=append)=".append"
+ $(@F:.o=.O)="lib.a"
+ 
+ Implied source with suffix transformations
+ $(<D:r=rr)="."
+ $(<F:.c=.C)="obj3.C"
+ 
+ Suffixless target with suffix transformations
+ $(*D:.=dot)="dot"
+ $(*F:.a=)="obj3"
+ 
+ Out-of-date dependencies with suffix transformations
+ $(?D:ir=)=". d ."
+ $(?F:.h=.H)="obj3.H dummy obj3.c"
+ 
+ Member with suffix transformations
+ $(%D:.=)=""
+ $(%F:$(VAR2)=$(VAR))="obj3foo  bar baz"
+
+cc -c -o 'obj3.o' 'obj3.c'
+ar -rcv 'lib.a' 'obj3.o'
+a - obj3.o
+rm -f 'obj3.o'
+exit status 0
Index: src/usr.bin/make/unit-tests/posix1.mk
diff -u /dev/null src/usr.bin/make/unit-tests/posix1.mk:1.1
--- /dev/null	Sat Aug 23 11:02:04 2014
+++ src/usr.bin/make/unit-tests/posix1.mk	Sat Aug 23 11:02:04 2014
@@ -0,0 +1,179 @@
+# $NetBSD: posix1.mk,v 1.1 2014/08/23 15:02:04 christos Exp $
+
+# Keep the default suffixes from interfering, just in case.
+.SUFFIXES:
+
+all:	line-continuations suffix-substitution localvars
+
+#
+# Line continuations
+#
+
+# Escaped newlines and leading whitespace from the next line are replaced
+# with single space, except in commands, where the escape and the newline
+# are retained, but a single leading tab (if any) from the next line is
+# removed. (PR 49085)
+# Expect:
+# $(VAR) = "foo  bar baz"
+# a
+# b
+# c
+VAR = foo\
+\
+	  bar\
+ baz
+
+line-continuations:
+	@echo '$$(VAR) = "$(VAR)"'
+	@echo 'aXbXc' | sed -e 's/X/\
+	/g'
+
+
+#
+# Suffix substitution
+#
+
+# The only variable modifier accepted by POSIX.
+# $(VAR:s1=s2): replace s1, if found, with s2 at end of each word in
+# $(VAR).  s1 and s2 may contain macro expansions.
+# Expect: foo baR baz, bar baz, foo bar baz, fooadd baradd bazadd
+suffix-substitution:
+	@echo '$(VAR:r=R), $(VAR:foo=), $(VAR:not_there=wrong), $(VAR:=add)'
+
+
+#
+# Local variables: regular forms, D/F forms and suffix substitution.
+#
+
+# In the past substitutions did not work with the D/F forms and those
+# forms were not available for $?.  (PR 49085)
+
+ARFLAGS = -rcv
+
+localvars: lib.a
+
+# $@ = target or archive name	$< = implied source
+# $* = target without suffix 	$? = sources newer than target
+# $% = archive member name
+LOCALS = \
+	"Local variables\n\
+	\$$(@)=\"$(@)\" \$$(<)=\"$(<)\"\n\
+	\$$(*)=\"$(*)\" \$$(?)=\"$(?)\"\n\
+	\$$(%%)=\"$(%)\"\n\n"
+
+# $XD = directory part of X	$XF = file part of X
+# X is one of the local variables.
+LOCAL_ALTERNATIVES = \
+	"Directory and filename parts of local variables\n\
+	\$$(@D)=\"$(@D)\" \$$(@F)=\"$(@F)\"\n\
+	\$$(<D)=\"$(<D)\" \$$(<F)=\"$(<F)\"\n\
+	\$$(*D)=\"$(*D)\" \$$(*F)=\"$(*F)\"\n\
+	\$$(?D)=\"$(?D)\" \$$(?F)=\"$(?F)\"\n\
+	\$$(%%D)=\"$(%D)\" \$$(%%F)=\"$(%F)\"\n\n"
+
+# Do all kinds of meaningless substitutions on local variables to see
+# if they work.  Add, remove and replace things.
+VAR2 = .o
+VAR3 = foo
+LOCAL_SUBSTITUTIONS = \
+	"Local variable substitutions\n\
+	\$$(@:.o=)=\"$(@:.o=)\" \$$(<:.c=.C)=\"$(<:.c=.C)\"\n\
+	\$$(*:=.h)=\"$(*:=.h)\" \$$(?:.h=.H)=\"$(?:.h=.H)\"\n\
+	\$$(%%:=)=\"$(%:=)\"\n\n"
+
+LOCAL_ALTERNATIVE_SUBSTITUTIONS = \
+	"Target with suffix transformations\n\
+	\$$(@D:=append)=\"$(@D:=append)\"\n\
+	\$$(@F:.o=.O)=\"$(@F:.o=.O)\"\n\
+	\n\
+	Implied source with suffix transformations\n\
+	\$$(<D:r=rr)=\"$(<D:r=rr)\"\n\
+	\$$(<F:.c=.C)=\"$(<F:.c=.C)\"\n\
+	\n\
+	Suffixless target with suffix transformations\n\
+	\$$(*D:.=dot)=\"$(*D:.=dot)\"\n\
+	\$$(*F:.a=)=\"$(*F:.a=)\"\n\
+	\n\
+	Out-of-date dependencies with suffix transformations\n\
+	\$$(?D:ir=)=\"$(?D:ir=)\"\n\
+	\$$(?F:.h=.H)=\"$(?F:.h=.H)\"\n\
+	\n\
+	Member with suffix transformations\n\
+	\$$(%%D:.=)=\"$(%D:.=)\"\n\
+	\$$(%%F:\$$(VAR2)=\$$(VAR))=\"$(%F:$(VAR2)=$(VAR))\"\n\n"
+
+.SUFFIXES: .c .o .a
+
+# The system makefiles make the .c.a rule .PRECIOUS with a special source,
+# but such a thing is not POSIX compatible.  It's also somewhat useless
+# in a test makefile.
+.c.a:
+	@printf $(LOCALS)
+	@printf $(LOCAL_ALTERNATIVES)
+	@printf $(LOCAL_SUBSTITUTIONS)
+	@printf $(LOCAL_ALTERNATIVE_SUBSTITUTIONS)
+	cc -c -o '$(%)' '$(<)'
+	ar $(ARFLAGS) '$(@)' '$(%)'
+	rm -f '$(%)'
+
+.c.o:
+	@printf $(LOCALS)
+	@printf $(LOCAL_ALTERNATIVES)
+	@printf $(LOCAL_SUBSTITUTIONS)
+	@printf $(LOCAL_ALTERNATIVE_SUBSTITUTIONS)
+	cc -c -o '$(@)' '$(<)'
+
+# Some of these rules are padded with useless extra dependencies just so
+# that $(?) has more than one file.
+
+lib.a: lib.a(obj1.o) lib.a(obj2.o) lib.a(obj3.o)
+	ar -s '$(@)'
+
+# Explicit rule where the dependency is an inferred file.  The dependency
+# object's name differs from the member's because there was a bug which
+# forced a dependency on member even when no such dependency was specified
+# (PR 49086).
+lib.a(obj1.o): dir/obj_1.o dummy
+	@printf $(LOCALS)
+	@printf $(LOCAL_ALTERNATIVES)
+	@printf $(LOCAL_SUBSTITUTIONS)
+	@printf $(LOCAL_ALTERNATIVE_SUBSTITUTIONS)
+	cp 'dir/obj_1.o' '$%'
+	ar $(ARFLAGS) '$(@)' '$%'
+	rm -f '$%'
+
+# Excplicit rule where the dependency also has an explicit rule.
+lib.a(obj2.o): obj2.o
+	ar $(ARFLAGS) '$(@)' '$(%)'
+
+# Use .c.a inference with an extra dependency.
+lib.a(obj3.o): obj3.h dir/dummy
+
+# Use .c.o inference with an extra dependency.
+dir/obj_1.o: dir/obj_1.h
+
+# According to POSIX, $* is only required for inference rules and $<'s
+# value is unspecified outside of inference rules.  Strictly speaking
+# we shouldn't be expanding them here but who cares.  At least we get
+# to check that the program does nothing stupid (like crash) with them.
+# The C file is named differently from the object file because there
+# was a bug which forced dependencies based on inference rules on all
+# applicable targets (PR 49086).
+obj2.o: obj_2.c obj_2.h dir/obj_1.h
+	@printf $(LOCALS)
+	@printf $(LOCAL_ALTERNATIVES)
+	@printf $(LOCAL_SUBSTITUTIONS)
+	@printf $(LOCAL_ALTERNATIVE_SUBSTITUTIONS)
+	cc -c -o '$(@)' 'obj_2.c'
+
+# Hey, this is make, we can make our own test data setup!  obj1.c
+# and obj2.c are not used, so they should not get created.  They're here
+# as a bait for a regression into the forced dependencies discussed earlier.
+obj1.c dir/obj_1.c obj2.c obj_2.c obj3.c:
+	mkdir -p '$(@D)'
+	printf '#include "$(@F:.c=.h)"\nconst char* $(@F:.c=) = "$(@)";' \
+	    >'$(@)'
+
+dir/obj_1.h obj_2.h obj3.h dummy dir/dummy:
+	mkdir -p '$(@D)'
+	touch '$(@)'

Reply via email to