检测编译器是不是正在使用 ccache

Posted

技术标签:

【中文标题】检测编译器是不是正在使用 ccache【英文标题】:Detect if a compiler is using ccache检测编译器是否正在使用 ccache 【发布时间】:2014-02-25 14:42:24 【问题描述】:

ccache 不支持某些编译器选项(例如 --coverage)。如果存在不受支持的编译器选项,它会编译但不使用缓存。

启用 ccache 的方法不止一种(修改 PATH,使用 CC/CXX 环境变量)。

我想检测编译器是否使用 ccache,如果是,则禁用不受支持的编译器选项。

我想出的最好的是这样的:

CC = $(shell which $(CC))
ifeq (,$(findstring ccache,$(CC)))

有什么改进的方法吗?

【问题讨论】:

【参考方案1】:

这可能是一个更优雅的解决方案:

ifeq ($(shell readlink -f `which $(CC)`),$(shell which ccache))
    echo "Using ccache"
else
    echo "Not using ccache"
endif

【讨论】:

【参考方案2】:

Smani 的解决方案可能不起作用,具体取决于 ccache 的配置方式(例如,在 RedHat Linux 的 ccache 3.3.4 中,/usr/lib64/ccache/ 中的编译器符号链接指向 /usr/bin/ccache 但 which ccache 返回/bin/ccache)。

此解决方案不关心 ccache 的位置,即使使用 ccache 作为前缀也可以工作:

ifeq ($(shell $(CC) -xc -c - --ccache-skip </dev/null 2>&1),)
    echo "Using ccache"
else
    echo "Not using ccache"
endif

这通过编译一个空文件并检查编译器是否知道 ccache --ccache-skip 标志来工作。

请注意,一旦您知道 ccache 已启用,您可以在其前面加上 --ccache-skip,而不是省略 --coverage 标志。

还要注意,即使 ccache 在路径中,它也可能被 CCACHE_DISABLE 环境变量或 ccache.conf 文件禁用。

【讨论】:

以上是关于检测编译器是不是正在使用 ccache的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 是不是有“ccache”? [关闭]

如果编译器绝对路径在makefile中被硬编码,我应该如何使用ccache?

如果编译 AOSP/CM 被中断会发生啥

清除 ccache 或使用多个 ccache 目录的原因

ccache 的“要求链接”是啥意思

使用 ccache / clang 编译 Qt 代码时避免多余的警告