Home | History | Annotate | Download | only in variables
      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