Source files for ccache-2.4 and Android patches
[android/toolchain/ccache.git] / patches / ccache-2.4-dependency-output.patch
1 diff -urbN ccache-2.4-org/ccache.c ccache-2.4/ccache.c
2 --- ccache-2.4-org/ccache.c     2006-12-05 10:46:11.000000000 +0100
3 +++ ccache-2.4/ccache.c 2006-12-14 00:50:00.000000000 +0100
4 @@ -65,6 +65,9 @@
5  /* can we safely use the unification hashing backend? */
6  static int enable_unify;
7  
8 +/* the name of the dependency file to output when -MD is used */
9 +static char  *dependency_file;
10 +
11  /* a list of supported file extensions, and the equivalent
12     extension for code that has been through the pre-processor
13  */
14 @@ -364,10 +367,17 @@
15  
16         if (!direct_i_file) {
17                 /* run cpp on the input file to obtain the .i */
18 +               if (dependency_file) {
19 +                       args_add(args, "-MD" );
20 +                       args_add(args, "-MF" );
21 +                       args_add(args, dependency_file);
22 +                       args_add(args, "-MQ" );
23 +                       args_add(args, output_file);
24 +               }
25                 args_add(args, "-E");
26                 args_add(args, input_file);
27                 status = execute(args->argv, path_stdout, path_stderr);
28 -               args_pop(args, 2);
29 +               args_pop(args, dependency_file ? 7 : 2);
30         } else {
31                 /* we are compiling a .i or .ii file - that means we
32                    can skip the cpp stage and directly form the
33 @@ -625,10 +635,12 @@
34         int i;
35         int found_c_opt = 0;
36         int found_S_opt = 0;
37 +       int found_MD_opt = 0;
38         struct stat st;
39         char *e;
40  
41         stripped_args = args_init(0, NULL);
42 +       dependency_file = NULL;
43  
44         args_add(stripped_args, argv[0]);
45  
46 @@ -663,6 +675,11 @@
47                         continue;
48                 }
49                 
50 +               if (strcmp(argv[i], "-MD") == 0) {
51 +                       found_MD_opt = 1;
52 +                       continue;
53 +               }
54 +
55                 /* we need to work out where the output was meant to go */
56                 if (strcmp(argv[i], "-o") == 0) {
57                         if (i == argc-1) {
58 @@ -814,6 +831,21 @@
59                 p[2] = 0;
60         }
61  
62 +       /* the -MD option is used to generate dependency output alongside the compilation */
63 +       if (found_MD_opt) {
64 +               char *p;
65 +
66 +               dependency_file = x_strdup(output_file);
67 +               p = strrchr( dependency_file, '.' );
68 +               if (!p || !p[1]) {
69 +                       cc_log("badly formed dependency_file %s\n", dependency_file);
70 +                       stats_update(STATS_ARGS);
71 +                       failed();
72 +               }
73 +               p[1] = 'd';
74 +               p[2] = 0;
75 +       }
76 +
77         /* cope with -o /dev/null */
78         if (strcmp(output_file,"/dev/null") != 0 && stat(output_file, &st) == 0 && !S_ISREG(st.st_mode)) {
79                 cc_log("Not a regular file %s\n", output_file);