Re: CCACHE_BASEDIR sometimes result in unnecessary recompilation

Joel Rosdahl <[email protected]>
Newsgroups gmane.comp.compilers.ccache
Message-ID <CAK8D=pjqVsvCARXgiPKiYDV3sR5f+hu8inXB7=fVD-4d7939VQ@mail.gmail.com>
Hi Douglas,

Thanks for the patch! I've applied a very similar fix along with a test
case.

Regards,
-- Joel


On 14 March 2014 00:59, Douglas Graham <[email protected]> wrote:

> Hello,
>
> There is a bug in get_relative_path() in util.c where it will sometimes
> return an incorrect path. This results in some unnecessary compilation when
> CCACHE_BASEDIR is set.  This happens when one component of one of
> the paths is a prefix of the corresponding component in the other.
> For example,
>
> get_relative_path("/func/lrciras/capabilities/src", "/func/lrci/if/RAS")
>
> returns "../../if/RAS" when it should return "../../../lric/if/RAS".
>
> This happens because "/func/lrci" is a prefix of "/func/lrciras".
> The opposite direction is no better:
>
> get_relative_path("/func/lrci/if/RAS", "/func/lrciras/capabilities/src")
>
> returns "../../as/capabilities/src"
>
> The bug is in common_dir_prefix_length().  Here's a patch:
>
> diff -c -r1.1 util.c
> *** util.c      2014/03/13 23:19:30     1.1
> --- util.c      2014/03/13 23:57:30
> ***************
> *** 984,1007 ****
>                 ++p1;
>                 ++p2;
>         }
> !       if (*p2 == '/') {
> !               /* s2 starts with "s1/". */
> !               return p1 - s1;
> !       }
> !       if (!*p2) {
> !               /* s2 is equal to s1. */
> !               if (p2 == s2 + 1) {
> !                       /* Special case for s1 and s2 both being "/". */
> !                       return 0;
> !               } else {
> !                       return p1 - s1;
> !               }
> !       }
> !       /* Compute the common directory prefix */
> !       while (p1 > s1 && *p1 != '/') {
>                 p1--;
>                 p2--;
>         }
>         return p1 - s1;
>   }
>
> --- 984,1000 ----
>                 ++p1;
>                 ++p2;
>         }
> ! #define ISPATHSEP(c) ((c) == '/' || (c) == '\0')
> !       while (!ISPATHSEP(*p1) || !ISPATHSEP(*p2)) {
>                 p1--;
>                 p2--;
>         }
> + #undef ISPATHSEP
> +       if (*p1 == '\0' && *p2 == '\0' && p2 == s2 + 1) {
> +               /* Special case for s1 and s2 both being "/". */
> +               return 0;
> +       }
> +
>         return p1 - s1;
>   }
>
> --Doug
>
> _______________________________________________
> ccache mailing list
> [email protected]
> https://lists.samba.org/mailman/listinfo/ccache
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.