[ccache] [PATCH] CCACHE_BASEDIR and dependency file creation (-MD/-MMD)
Lalit Chhabra
lchhabra at linuxmail.org
Fri Jul 27 00:58:19 MDT 2012
Hi,
I am creating dependency files with my gcc compile, with
something like:
gxx -c -MMD -MF _dep_file.d -o _out_file.o ....
and am using CCACHE_BASEDIR to share the cache across
different work boxes. Both _dep_file.d and _out_file.o
are absolute paths and start with CCACHE_BASEDIR.
Looking at the code, my understanding is that if ccache
determines that dependencies are being created it does
the following:
- If -MF is not specified, ccache add "-MF _out_file.d"
to the preprocessor args.
- Similarly if -MQ is not specified, it adds "-MQ _out_file.o"
to the preprocessor args.
These arguments are also used in the hash calculation. I
see that ccache does not seem to strip out CCACHE_BASEDIR
from them. This seems to be the reason I am not getting any
hits in the subsequent compiles in other work spaces.
I have appended a patch against ccache version 3.1.7 that
fixes this. I would appreciate if it could be reviewed (and
hopefully incorporated into ccache).
Thanks,
Lalit Chhabra
------------------------------------------------------------------------------------
--- ccache-3.1.7/ccache.c 2012-01-08 06:40:55.000000000 -0800
+++ ccache-3.1.7.mod/ccache.c 2012-07-26 18:40:04.268732000 -0700
@@ -1414,7 +1414,6 @@
char *arg;
dependency_filename_specified = true;
free(output_dep);
- args_add(dep_args, argv[i]);
if (strlen(argv[i]) == 3) {
/* -MF arg */
if (i >= argc - 1) {
@@ -1424,13 +1423,14 @@
goto out;
}
arg = argv[i + 1];
- args_add(dep_args, argv[i + 1]);
i++;
} else {
/* -MFarg */
arg = &argv[i][3];
}
output_dep = make_relative_path(x_strdup(arg));
+ args_add(dep_args, "-MF");
+ args_add(dep_args, output_dep);
continue;
}
if (str_startswith(argv[i], "-MQ") || str_startswith(argv[i], "-MT")) {
@@ -1726,11 +1726,13 @@
* Add flags for dependency generation only to the preprocessor command line.
*/
if (generating_dependencies) {
+ char *stripped_output_obj;
+ stripped_output_obj = make_relative_path(x_strdup(output_obj));
if (!dependency_filename_specified) {
char *default_depfile_name;
char *base_name;
- base_name = remove_extension(output_obj);
+ base_name = remove_extension(stripped_output_obj);
default_depfile_name = format("%s.d", base_name);
free(base_name);
args_add(dep_args, "-MF");
@@ -1740,8 +1742,9 @@
if (!dependency_target_specified) {
args_add(dep_args, "-MQ");
- args_add(dep_args, output_obj);
+ args_add(dep_args, stripped_output_obj);
}
+ free(stripped_output_obj);
}
if (compile_preprocessed_source_code) {
------------------------------------------------------------------------------------
More information about the ccache
mailing list