[ccache] ccache problem with CCACHE_BASEDIR
Eric Blau
eric.blau at tekelec.com
Fri Jul 20 11:45:10 MDT 2012
On 2012-07-20 13:09, Joel Rosdahl wrote:
> Thanks. Two things:
>
> 1. The patch canonicalizes the "from" parameter, but I think that the
> "to" parameter should be canonicalized as well, for two reasons: a)
> realpath() expands symlinks, and comparing (see
> common_dir_prefix_length) an expanded path with an unexpanded path
> won't work well when symlinks are present. b) The "to" parameter
> (which for instance may be a path given on the command line) could
> also contain path elements that could benefit from canonicalization
> (to increase cache hits).
>
> 2. The patch canonicalizes the "from" parameter every time
> get_relative_path is called, which is unnecessary since it's always
> the same. Therefore, as mentioned earlier, I think that its' better to
> do the canonicalization in make_relative_path where
> current_working_dir can be canonicalized when created.
Thanks for the comments. Please discard the previous patch. This
attached version of the patch should be better. It canonicalizes the
current working directory once and canonicalizes the path each time
get_relative_path is called.
Thanks,
Eric
-------------- next part --------------
diff -uNr ccache-3.1.7/ccache.c ccache-3.1.7.patched/ccache.c
--- ccache-3.1.7/ccache.c 2012-01-08 09:40:55.000000000 -0500
+++ ccache-3.1.7.patched/ccache.c 2012-07-20 13:41:21.000000000 -0400
@@ -387,13 +387,31 @@
make_relative_path(char *path)
{
char *relpath;
+ char *canon_path;
+ char *canon_cwd;
+ bool cwd_canonicalized = false;
if (!base_dir || !str_startswith(path, base_dir)) {
return path;
}
- relpath = get_relative_path(current_working_dir, path);
+ /* Canonicalize the current working directory if it has not been
+ * canonicalized already.
+ */
+ if (!cwd_canonicalized) {
+ canon_cwd = x_realpath(current_working_dir);
+ free(current_working_dir);
+
+ current_working_dir = canon_cwd;
+
+ cwd_canonicalized = true;
+ }
+
+ canon_path = x_realpath(path);
+
+ relpath = get_relative_path(current_working_dir, canon_path);
free(path);
+ free(canon_path);
return relpath;
}
More information about the ccache
mailing list