Home | History | Annotate | Download | only in features
      1 #                                                                    -*-perl-*-
      2 $description = "Tests the new VPATH+ functionality added in 3.76.";
      3 
      4 $details = "";
      5 
      6 $VP = "$workdir$pathsep";
      7 
      8 open(MAKEFILE,"> $makefile");
      9 
     10 # The Contents of the MAKEFILE ...
     11 
     12 print MAKEFILE "VPATH = $VP\n";
     13 
     14 print MAKEFILE <<'EOMAKE';
     15 
     16 SHELL = /bin/sh
     17 
     18 .SUFFIXES: .a .b .c .d
     19 .PHONY: general rename notarget intermediate
     20 
     21 %.a:
     22 %.b:
     23 %.c:
     24 %.d:
     25 
     26 %.a : %.b
     27 	cat $^ > $@
     28 %.b : %.c
     29 	cat $^ > $@ 2>/dev/null || exit 1
     30 %.c :: %.d
     31 	cat $^ > $@
     32 
     33 # General testing info:
     34 
     35 general: foo.b
     36 foo.b: foo.c bar.c
     37 
     38 # Rename testing info:
     39 
     40 rename: $(VPATH)/foo.c foo.d
     41 
     42 # Target not made testing info:
     43 
     44 notarget: notarget.b
     45 notarget.c: notarget.d
     46 	-@echo "not creating $@ from $^"
     47 
     48 # Intermediate files:
     49 
     50 intermediate: inter.a
     51 
     52 EOMAKE
     53 
     54 close(MAKEFILE);
     55 
     56 @touchedfiles = ();
     57 
     58 $off = -500;
     59 
     60 sub touchfiles {
     61   foreach (@_) {
     62     &utouch($off, $_);
     63     $off += 10;
     64     push(@touchedfiles, $_);
     65   }
     66 }
     67 
     68 # Run the general-case test
     69 
     70 &touchfiles("$VP/foo.d", "$VP/bar.d", "$VP/foo.c", "$VP/bar.c", "foo.b", "bar.d");
     71 
     72 &run_make_with_options($makefile,"general",&get_logfile);
     73 
     74 push(@touchedfiles, "bar.c");
     75 
     76 $answer = "cat bar.d > bar.c
     77 cat ${VP}foo.c bar.c > foo.b 2>/dev/null || exit 1
     78 ";
     79 &compare_output($answer,&get_logfile(1));
     80 
     81 # Test rules that don't make the target correctly
     82 
     83 &touchfiles("$VP/notarget.c", "notarget.b", "notarget.d");
     84 
     85 &run_make_with_options($makefile,"notarget",&get_logfile,512);
     86 
     87 $answer = "not creating notarget.c from notarget.d
     88 cat notarget.c > notarget.b 2>/dev/null || exit 1
     89 $make_name: *** [notarget.b] Error 1
     90 ";
     91 
     92 &compare_output($answer,&get_logfile(1));
     93 
     94 # Test intermediate file handling (part 1)
     95 
     96 &touchfiles("$VP/inter.d");
     97 
     98 &run_make_with_options($makefile,"intermediate",&get_logfile);
     99 
    100 push(@touchedfiles, "inter.a", "inter.b");
    101 
    102 $answer = "cat ${VP}inter.d > inter.c
    103 cat inter.c > inter.b 2>/dev/null || exit 1
    104 cat inter.b > inter.a
    105 rm inter.b inter.c
    106 ";
    107 &compare_output($answer,&get_logfile(1));
    108 
    109 # Test intermediate file handling (part 2)
    110 
    111 &utouch(-20, "inter.a");
    112 &utouch(-10, "$VP/inter.b");
    113 &touch("$VP/inter.d");
    114 
    115 push(@touchedfiles, "$VP/inter.b", "$VP/inter.d");
    116 
    117 &run_make_with_options($makefile,"intermediate",&get_logfile);
    118 
    119 $answer = "cat ${VP}inter.d > inter.c
    120 cat inter.c > inter.b 2>/dev/null || exit 1
    121 cat inter.b > inter.a
    122 rm inter.c
    123 ";
    124 &compare_output($answer,&get_logfile(1));
    125 
    126 unlink @touchedfiles unless $keep;
    127 
    128 1;
    129