### SPAR <http://www.cpan.org/scripts/>
### 1 644 1329052295 1329052295 is_relevant.pl
have_cc
### 34 644 1356724506 1366573638 makepp_test_script.pl
# Tests several things about C compilation:
# 1) Correctly parsing command lines to scan for include files.
# 2) Correctly calculating checksums so if files change we do not
# rebuild, but we always rebuild when necessary.
# 3) Iteration 13 does not recompile even though signature would be
# different, because file did not change, so it was not recalculated.
# 4) The builtin rules work.
#
# Replace the .c file multiple times and see which replacements trigger a rebuild.
my $obj;
my @args = ('makepp_signature_C_flat=0', is_windows ? '--no-path-exe-dep' : ());
my $compiled;
$Mpp::mod_answer = sub { $_[2] =~ s/ 0 / 1 / } if is_windows;
for $iter ( 0..3, 13, 10 ) { # 13 & 10 repeat 3 & 0, but with flat option
if( $iter == 13 ) { $args[0] =~ tr/0/1/ }
else { c_cp 'compilation_test_'.($iter%10).'.c', 'compilation_test.c' }
# This is slow and low-tech, but we need to guarantee that the .o timestamp changes
# between runs, even if the files are on NFS (so that we cannot rely on calls to time).
wait_timestamp "compilation_test.$obj" if $compiled;
print "**** Iteration $iter\n";
makepp @args, 'CPPFLAGS=-I subdir1 -Isubdir2', 'compilation_test';
# We test both the "-I subdir" and "-Isubdir"
# syntax.
system '.' . (0 < is_windows ? '\\' : '/') . "compilation_test > iteration_$iter";
$obj ||= is_windows && -f 'compilation_test.obj' ? 'obj' : 'o';
c_grep 'm@subdir1/x2\.h@', ".makepp/compilation_test.$obj.mk" unless $iter;
# Make sure makepp found x2 in subdir1, not in the
# main directory. Always same, so just on 1st round.
$compiled = "0 0 0\n" ne n_files "n_files_$iter",
!$iter && sub { die if /warning: can't locate file/ }; # Make sure makepp found all include files.
}
1;
### 10 644 1067451873 1055627995 compilation_test_0.c
#include <stdio.h>
#include "x.h"
#include "y.h"
int main()
{
printf("%d %d %d %d\n", __LINE__, X, X2, Y);
return 0;
}
### 10 644 1067451873 1055628000 compilation_test_1.c
#include <stdio.h>
#include "x.h"
#include "y.h"
/* Same except that a comment was added. */
int main()
{
printf("%d %d %d %d\n", __LINE__, X, X2, Y);
return 0;
}
### 11 644 1067451873 1055628006 compilation_test_2.c
#include <stdio.h>
#include "x.h"
#include "y.h"
/* Line count has changed! Should recompile if not flat option. */
int main()
{
printf("%d %d %d %d\n", __LINE__, X, X2, Y);
return 0;
}
### 11 644 1067451873 1055628020 compilation_test_3.c
#include <stdio.h>
#include "x.h"
#include "y.h"
/* Only whitespace has changed. No recompilation. */
// This is a C++ comment
int main()
{
printf("%d %d %d %d\n", __LINE__, X, X2, Y);
/* another comment that is ignored */ return 0;
}
### D 755 1067451873 1056139580 subdir1
### 6 644 1067451873 1055626466 subdir1/Makeppfile
x.h:
&echo '#define X 1' -o $(output)
&echo '#include "x2.h"' -o >>$(output)
x2.h:
&echo '#define X2 2' -o $(output)
### D 755 1067451873 1056139580 subdir2
### 8 644 1067451873 1055626463 subdir2/Makeppfile
x.h:
&echo '#define X 99' -o $(output)
x2.h:
&echo '#define X2 100' -o $(output)
y.h:
&echo '#define Y 4' -o $(output)
### 2 644 1067451873 1055551960 x2.h
/* This file should be ignored. */
#define X2 3
### D 755 1067451873 1055628127 answers
### 1 644 1067451873 1055628033 answers/iteration_0
8 1 2 4
### 1 644 1067451873 1055628036 answers/iteration_1
8 1 2 4
### 1 644 1067451873 1055628038 answers/iteration_2
9 1 2 4
### 1 644 1067451873 1055628041 answers/iteration_3
9 1 2 4
### 1 644 1356724506 1356724506 answers/iteration_13
9 1 2 4
### 1 644 1356724506 1356724506 answers/iteration_10
8 1 2 4
### 1 644 1067451873 1190053877 answers/n_files_0
5 0 0
### 1 644 1067451873 1190053880 answers/n_files_1
0 0 0
### 1 644 1067451873 1190053884 answers/n_files_2
2 0 0
### 1 644 1067451873 1190053887 answers/n_files_3
0 0 0
### 1 644 1356724506 1356724506 answers/n_files_13
0 0 0
### 1 644 1356724506 1356724506 answers/n_files_10
2 0 0