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