1 # -*-perl-*- 2 3 $description = "Test various flavors of make variable setting."; 4 5 $details = ""; 6 7 open(MAKEFILE, "> $makefile"); 8 9 # The Contents of the MAKEFILE ... 10 11 print MAKEFILE <<'EOF'; 12 foo = $(bar) 13 bar = ${ugh} 14 ugh = Hello 15 16 all: multi ; @echo $(foo) 17 18 multi: ; $(multi) 19 20 x := foo 21 y := $(x) bar 22 x := later 23 24 nullstring := 25 space := $(nullstring) $(nullstring) 26 27 next: ; @echo $x$(space)$y 28 29 define multi 30 @echo hi 31 echo there 32 endef 33 34 ifdef BOGUS 35 define 36 @echo error 37 endef 38 endif 39 40 define outer 41 define inner 42 A = B 43 endef 44 endef 45 46 $(eval $(outer)) 47 48 outer: ; @echo $(inner) 49 50 EOF 51 52 # END of Contents of MAKEFILE 53 54 close(MAKEFILE); 55 56 # TEST #1 57 # ------- 58 59 &run_make_with_options($makefile, "", &get_logfile); 60 $answer = "hi\necho there\nthere\nHello\n"; 61 &compare_output($answer, &get_logfile(1)); 62 63 # TEST #2 64 # ------- 65 66 &run_make_with_options($makefile, "next", &get_logfile); 67 $answer = "later foo bar\n"; 68 &compare_output($answer, &get_logfile(1)); 69 70 # TEST #3 71 # ------- 72 73 &run_make_with_options($makefile, "BOGUS=true", &get_logfile, 512); 74 $answer = "$makefile:24: *** empty variable name. Stop.\n"; 75 &compare_output($answer, &get_logfile(1)); 76 77 # TEST #4 78 # ------- 79 80 &run_make_with_options($makefile, "outer", &get_logfile); 81 $answer = "A = B\n"; 82 &compare_output($answer, &get_logfile(1)); 83 84 # Clean up from "old style" testing. If all the above tests are converted to 85 # run_make_test() syntax than this line can be removed. 86 $makefile = undef; 87 88 # ------------------------- 89 # Make sure that prefix characters apply properly to define/endef values. 90 # 91 # There's a bit of oddness here if you try to use a variable to hold the 92 # prefix character for a define. Even though something like this: 93 # 94 # define foo 95 # echo bar 96 # endef 97 # 98 # all: ; $(V)$(foo) 99 # 100 # (where V=@) can be seen by the user to be obviously different than this: 101 # 102 # define foo 103 # $(V)echo bar 104 # endef 105 # 106 # all: ; $(foo) 107 # 108 # and the user thinks it should behave the same as when the "@" is literal 109 # instead of in a variable, that can't happen because by the time make 110 # expands the variables for the command line and sees it begins with a "@" it 111 # can't know anymore whether the prefix character came before the variable 112 # reference or was included in the first line of the variable reference. 113 114 # TEST #5 115 # ------- 116 117 run_make_test(' 118 define FOO 119 $(V1)echo hello 120 $(V2)echo world 121 endef 122 all: ; @$(FOO) 123 ', '', 'hello 124 world'); 125 126 # TEST #6 127 # ------- 128 129 run_make_test(undef, 'V1=@ V2=@', 'hello 130 world'); 131 132 # TEST #7 133 # ------- 134 135 run_make_test(' 136 define FOO 137 $(V1)echo hello 138 $(V2)echo world 139 endef 140 all: ; $(FOO) 141 ', 'V1=@', 'hello 142 echo world 143 world'); 144 145 # TEST #8 146 # ------- 147 148 run_make_test(undef, 'V2=@', 'echo hello 149 hello 150 world'); 151 152 # TEST #9 153 # ------- 154 155 run_make_test(undef, 'V1=@ V2=@', 'hello 156 world'); 157 158 # TEST #10 159 # ------- 160 # Test the basics; a "@" internally to the variable applies to only one line. 161 # A "@" before the variable applies to the entire variable. 162 163 run_make_test(' 164 define FOO 165 @echo hello 166 echo world 167 endef 168 define BAR 169 echo hello 170 echo world 171 endef 172 173 all: foo bar 174 foo: ; $(FOO) 175 bar: ; @$(BAR) 176 ', '', 'hello 177 echo world 178 world 179 hello 180 world 181 '); 182 183 1; 184