Home | History | Annotate | Line # | Download | only in unit-tests
escape.mk revision 1.2
      1  1.2  apb # $Id: escape.mk,v 1.2 2014/08/24 13:07:25 apb Exp $
      2  1.1  apb #
      3  1.1  apb # Test backslash escaping.
      4  1.1  apb 
      5  1.1  apb # Extracts from the POSIX 2008 specification
      6  1.1  apb # <http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html>:
      7  1.1  apb #
      8  1.1  apb #     Comments start with a <number-sign> ( '#' ) and continue until an
      9  1.1  apb #     unescaped <newline> is reached.
     10  1.1  apb #
     11  1.1  apb #     When an escaped <newline> (one preceded by a <backslash>) is found
     12  1.1  apb #     anywhere in the makefile except in a command line, an include
     13  1.1  apb #     line, or a line immediately preceding an include line, it shall
     14  1.1  apb #     be replaced, along with any leading white space on the following
     15  1.1  apb #     line, with a single <space>.
     16  1.1  apb #
     17  1.1  apb #     When an escaped <newline> is found in a command line in a
     18  1.1  apb #     makefile, the command line shall contain the <backslash>, the
     19  1.1  apb #     <newline>, and the next line, except that the first character of
     20  1.1  apb #     the next line shall not be included if it is a <tab>.
     21  1.1  apb #
     22  1.1  apb #     When an escaped <newline> is found in an include line or in a
     23  1.1  apb #     line immediately preceding an include line, the behavior is
     24  1.1  apb #     unspecified.
     25  1.1  apb #
     26  1.1  apb # Notice that the behaviour of <backslash><backslash> or
     27  1.2  apb # <backslash><anything other than newline> is not mentioned.  I think
     28  1.1  apb # this implies that <backslash> should be taken literally everywhere
     29  1.1  apb # except before <newline>.
     30  1.1  apb 
     31  1.1  apb all: .PHONY
     32  1.1  apb # We will add dependencies like "all: yet-another-test" later.
     33  1.1  apb 
     34  1.1  apb # Some variables to be expanded in tests
     35  1.1  apb #
     36  1.1  apb a = aaa
     37  1.1  apb A = ${a}
     38  1.1  apb 
     39  1.1  apb # Backslash at end of line in a comment\
     40  1.1  apb should continue the comment. \
     41  1.1  apb # This is also tested in comment.mk.
     42  1.1  apb 
     43  1.1  apb # Embedded backslash in variable should be taken literally.
     44  1.1  apb #
     45  1.1  apb VAR1BS = 111\111
     46  1.1  apb VAR1BSa = 111\${a}
     47  1.1  apb VAR1BSA = 111\${A}
     48  1.1  apb VAR1BSda = 111\$${a}
     49  1.1  apb VAR1BSdA = 111\$${A}
     50  1.1  apb 
     51  1.1  apb all: var-1bs
     52  1.1  apb var-1bs:	.PHONY
     53  1.1  apb 	@echo ${.TARGET}
     54  1.1  apb 	@echo VAR1BS=:${VAR1BS:Q}:
     55  1.1  apb 	@echo VAR1BSa=:${VAR1BSa:Q}:
     56  1.1  apb 	@echo VAR1BSA=:${VAR1BSA:Q}:
     57  1.2  apb 	@echo VAR1BSda=:${VAR1BSda:Q}:
     58  1.2  apb 	@echo VAR1BSdA=:${VAR1BSdA:Q}:
     59  1.1  apb 
     60  1.1  apb # Double backslash in variable should be taken as two literal backslashes.
     61  1.1  apb #
     62  1.1  apb VAR2BS = 222\\222
     63  1.1  apb VAR2BSa = 222\\${a}
     64  1.1  apb VAR2BSA = 222\\${A}
     65  1.1  apb VAR2BSda = 222\\$${a}
     66  1.1  apb VAR2BSdA = 222\\$${A}
     67  1.1  apb 
     68  1.1  apb all: var-2bs
     69  1.1  apb var-2bs:	.PHONY
     70  1.1  apb 	@echo ${.TARGET}
     71  1.1  apb 	@echo VAR2BS=:${VAR2BS:Q}:
     72  1.1  apb 	@echo VAR2BSa=:${VAR2BSa:Q}:
     73  1.1  apb 	@echo VAR2BSA=:${VAR2BSA:Q}:
     74  1.2  apb 	@echo VAR2BSda=:${VAR2BSda:Q}:
     75  1.2  apb 	@echo VAR2BSdA=:${VAR2BSdA:Q}:
     76  1.1  apb 
     77  1.1  apb # Backslash-newline in a variable setting is replaced by a single space.
     78  1.1  apb #
     79  1.1  apb VAR1BSNL = 111\
     80  1.1  apb 111
     81  1.1  apb VAR1BSNLa = 111\
     82  1.1  apb ${a}
     83  1.1  apb VAR1BSNLA = 111\
     84  1.1  apb ${A}
     85  1.1  apb VAR1BSNLda = 111\
     86  1.1  apb $${a}
     87  1.1  apb VAR1BSNLdA = 111\
     88  1.1  apb $${A}
     89  1.1  apb VAR1BSNLc = 111\
     90  1.1  apb # this should not be a comment, it should be part of the value
     91  1.1  apb 
     92  1.1  apb all: var-1bsnl
     93  1.1  apb var-1bsnl:	.PHONY
     94  1.1  apb 	@echo ${.TARGET}
     95  1.1  apb 	@echo VAR1BSNL=:${VAR1BSNL:Q}:
     96  1.1  apb 	@echo VAR1BSNLa=:${VAR1BSNLa:Q}:
     97  1.1  apb 	@echo VAR1BSNLA=:${VAR1BSNLA:Q}:
     98  1.1  apb 	@echo VAR1BSNLda=:${VAR1BSNLa:Q}:
     99  1.1  apb 	@echo VAR1BSNLdA=:${VAR1BSNLA:Q}:
    100  1.1  apb 	@echo VAR1BSNLc=:${VAR1BSNLc:Q}:
    101  1.1  apb 
    102  1.1  apb # Double-backslash-newline in a variable setting.
    103  1.1  apb # First one should be taken literally, and last should escape the newline.
    104  1.1  apb # XXX: Is the expected behaviour well defined?
    105  1.1  apb #
    106  1.1  apb # The second lines below start with '#' so they should not generate
    107  1.1  apb # syntax errors regardless of whether or not they are treated as
    108  1.1  apb # part of the value.
    109  1.1  apb #
    110  1.1  apb VAR2BSNL = 222\\
    111  1.1  apb #222
    112  1.1  apb VAR2BSNLa = 222\\
    113  1.1  apb #${a}
    114  1.1  apb VAR2BSNLA = 222\\
    115  1.1  apb #${A}
    116  1.1  apb VAR2BSNLda = 222\\
    117  1.1  apb #$${a}
    118  1.1  apb VAR2BSNLdA = 222\\
    119  1.1  apb #$${A}
    120  1.1  apb VAR2BSNLc = 222\\
    121  1.1  apb # this should not be a comment, it should be part of the value
    122  1.1  apb 
    123  1.1  apb all: var-2bsnl
    124  1.1  apb var-2bsnl:	.PHONY
    125  1.1  apb 	@echo ${.TARGET}
    126  1.1  apb 	@echo VAR2BSNL=:${VAR2BSNL:Q}:
    127  1.1  apb 	@echo VAR2BSNLa=:${VAR2BSNLa:Q}:
    128  1.1  apb 	@echo VAR2BSNLA=:${VAR2BSNLA:Q}:
    129  1.1  apb 	@echo VAR2BSNLda=:${VAR2BSNLa:Q}:
    130  1.1  apb 	@echo VAR2BSNLdA=:${VAR2BSNLA:Q}:
    131  1.1  apb 	@echo VAR2BSNLc=:${VAR2BSNLc:Q}:
    132  1.1  apb 
    133  1.1  apb # Triple-backslash-newline in a variable setting.
    134  1.1  apb # First two should be taken literally, and last should escape the newline.
    135  1.1  apb # XXX: Is the expected behaviour well defined?
    136  1.1  apb #
    137  1.1  apb # The second lines below start with '#' so they should not generate
    138  1.1  apb # syntax errors regardless of whether or not they ar treated as
    139  1.1  apb # part of the value.
    140  1.1  apb #
    141  1.1  apb VAR3BSNL = 333\\\
    142  1.1  apb #333
    143  1.1  apb VAR3BSNLa = 333\\\
    144  1.1  apb #${a}
    145  1.1  apb VAR3BSNLA = 333\\\
    146  1.1  apb #${A}
    147  1.1  apb VAR3BSNLda = 333\\\
    148  1.1  apb #$${a}
    149  1.1  apb VAR3BSNLdA = 333\\\
    150  1.1  apb #$${A}
    151  1.1  apb VAR3BSNLc = 333\\\
    152  1.1  apb # this should not be a comment, it should be part of the value
    153  1.1  apb 
    154  1.1  apb all: var-3bsnl
    155  1.1  apb var-3bsnl:	.PHONY
    156  1.1  apb 	@echo ${.TARGET}
    157  1.1  apb 	@echo VAR3BSNL=:${VAR3BSNL:Q}:
    158  1.1  apb 	@echo VAR3BSNLa=:${VAR3BSNLa:Q}:
    159  1.1  apb 	@echo VAR3BSNLA=:${VAR3BSNLA:Q}:
    160  1.1  apb 	@echo VAR3BSNLda=:${VAR3BSNLa:Q}:
    161  1.1  apb 	@echo VAR3BSNLdA=:${VAR3BSNLA:Q}:
    162  1.1  apb 	@echo VAR3BSNLc=:${VAR3BSNLc:Q}:
    163  1.1  apb 
    164  1.1  apb # Backslash-newline in a variable setting, plus any amount of white space
    165  1.1  apb # on the next line, is replaced by a single space.
    166  1.1  apb #
    167  1.1  apb VAR1BSNL00= first line\
    168  1.1  apb 
    169  1.1  apb # above line is entirely empty, and this is a comment
    170  1.1  apb VAR1BSNL0= first line\
    171  1.1  apb no space on second line
    172  1.1  apb VAR1BSNLs= first line\
    173  1.1  apb  one space on second line
    174  1.1  apb VAR1BSNLss= first line\
    175  1.1  apb   two spaces on second line
    176  1.1  apb VAR1BSNLt= first line\
    177  1.1  apb 	one tab on second line
    178  1.1  apb VAR1BSNLtt= first line\
    179  1.1  apb 		two tabs on second line
    180  1.1  apb VAR1BSNLxx= first line\
    181  1.1  apb   	 	 	 many spaces and tabs [  	 ] on second line
    182  1.1  apb 
    183  1.1  apb all: var-1bsnl-space
    184  1.1  apb var-1bsnl-space:	.PHONY
    185  1.1  apb 	@echo ${.TARGET}
    186  1.1  apb 	@echo VAR1BSNL00=:${VAR1BSNL00:Q}:
    187  1.1  apb 	@echo VAR1BSNL0=:${VAR1BSNL0:Q}:
    188  1.1  apb 	@echo VAR1BSNLs=:${VAR1BSNLs:Q}:
    189  1.1  apb 	@echo VAR1BSNLss=:${VAR1BSNLss:Q}:
    190  1.1  apb 	@echo VAR1BSNLt=:${VAR1BSNLt:Q}:
    191  1.1  apb 	@echo VAR1BSNLtt=:${VAR1BSNLtt:Q}:
    192  1.1  apb 	@echo VAR1BSNLxx=:${VAR1BSNLxx:Q}:
    193  1.1  apb 
    194  1.1  apb # Backslash-newline in a command is retained.
    195  1.1  apb #
    196  1.1  apb # The "#" in "# second line without space" makes it a comment instead
    197  1.1  apb # of a syntax error if the preceding line is parsed incorretly.
    198  1.1  apb # The ":" in "third line':" makes it look like the start of a
    199  1.1  apb # target instead of a syntax error if the first line is parsed incorrectly.
    200  1.1  apb #
    201  1.1  apb all: cmd-1bsnl
    202  1.1  apb cmd-1bsnl: .PHONY
    203  1.1  apb 	@echo ${.TARGET}
    204  1.1  apb 	@echo :'first line\
    205  1.1  apb #second line without space\
    206  1.1  apb third line':
    207  1.1  apb 	@echo :'first line\
    208  1.1  apb      second line spaces should be retained':
    209  1.1  apb 	@echo :'first line\
    210  1.1  apb 	second line tab should be elided':
    211  1.1  apb 	@echo :'first line\
    212  1.1  apb 		only one tab should be elided, second tab remains'
    213  1.1  apb 
    214  1.1  apb # Double-backslash-newline in a command is retained.
    215  1.1  apb #
    216  1.1  apb all: cmd-2bsnl
    217  1.1  apb cmd-2bsnl: .PHONY
    218  1.1  apb 	@echo ${.TARGET}
    219  1.1  apb 	@echo :'first line\\
    220  1.1  apb #second line without space\\
    221  1.1  apb third line':
    222  1.1  apb 	@echo :'first line\\
    223  1.1  apb      second line spaces should be retained':
    224  1.1  apb 	@echo :'first line\\
    225  1.1  apb 	second line tab should be elided':
    226  1.1  apb 	@echo :'first line\\
    227  1.1  apb 		only one tab should be elided, second tab remains'
    228  1.1  apb 
    229  1.1  apb # Triple-backslash-newline in a command is retained.
    230  1.1  apb #
    231  1.1  apb all: cmd-3bsnl
    232  1.1  apb cmd-3bsnl: .PHONY
    233  1.1  apb 	@echo ${.TARGET}
    234  1.1  apb 	@echo :'first line\\\
    235  1.1  apb #second line without space\\\
    236  1.1  apb third line':
    237  1.1  apb 	@echo :'first line\\\
    238  1.1  apb      second line spaces should be retained':
    239  1.1  apb 	@echo :'first line\\\
    240  1.1  apb 	second line tab should be elided':
    241  1.1  apb 	@echo :'first line\\\
    242  1.1  apb 		only one tab should be elided, second tab remains'
    243