c-如何使用带有Make的ccache



我有一个源目录,它使用makefile来编译代码。此makefile/configure文件不是为了与ccache兼容而编写的。所以我想用ccache。我在.bashrc中创建了别名alias gcc='ccache gcc',但Makefile仍然没有考虑gcc的这个定义。那么,在不接触Makefile/configure文件的情况下,我能做些什么吗?这样它就占用了ccache gcc而不是gcc。也称为CC="缓存gcc"/配置不是一个选项,因为它不要求CC.

如果我写Makefile,那么我可以提供$(gcc),但这不是一个选项,因为我不是在写Makefile。有没有什么方法可以让我们不需要更改源文件中的任何内容,但仍然启用ccache编译。

别名是在其中创建的shell的本地别名;与环境变量不同,它们不会传递给shell调用的任何程序(包括make)。Make调用/bin/sh,而不是/bin/bash,并且/bin/sh不读取~/.bashrc等,所以在那里定义的别名对您没有帮助。

我不太清楚你为什么对自己施加一些你提到的限制:这些事情很好,你没有给出我理解的避免它们的理由。例如,如果autoconf的版本不是真正古老的,那么为不同的CC提供configure将起作用。你可以这样做:

./configure CC='ccache gcc'

例如,这将把makefile中CC的默认值设置为ccache gcc。我不知道你说的"它不要求CC"是什么意思。

如果您愿意,也可以在make命令行上覆盖CC的设置,如下所示:

make CC='ccache gcc'

这也很好用。

如精细手册所述:在PATH中列出的目录中创建一个名为"gcc"的符号链接,该目录位于包含实际gcc的目录之前。这将导致透明地使用ccache,而不需要对makefile进行任何更改。

将打包的ccache添加到PATH

PATH="/usr/lib/ccache:${PATH}" make

这是一种通用的方法,即:

  • 同时适用于所有编译器:C、C++等
  • CC一样,较少依赖于实际的Makefile设置
  • 如果您正在自动化某些内容,并且目标用户没有安装ccache,则不会破坏用户的构建

man ccache中提到:

要在Debian系统上使用第二种方法,最简单的方法是将/usr/lib/ccche预先添加到PATH中/usr/lib/ccche包含当前作为Debian安装的所有编译器的符号链接包裹。

你可以用来确认

ls -l /usr/lib/ccache

其中包含大量可能的GCC名称,包括已安装的交叉编译器:

total 0
lrwxrwxrwx 1 root root 16 May  6 13:51 aarch64-linux-gnu-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 aarch64-linux-gnu-gcc-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 Jun 23 18:25 arm-linux-gnueabi-g++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 Jun 23 18:25 arm-linux-gnueabi-g++-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 arm-linux-gnueabi-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 arm-linux-gnueabi-gcc-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May 28 22:11 arm-linux-gnueabihf-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May 28 22:11 arm-linux-gnueabihf-gcc-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 arm-none-eabi-g++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 arm-none-eabi-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 arm-none-eabi-gcc-6.3.1 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 c++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 c89-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 c99-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 cc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 clang -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 clang++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 g++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 g++-5 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 g++-6 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 g++-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 gcc-5 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 gcc-6 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 gcc-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-g++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-g++-5 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-g++-6 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-g++-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-gcc-5 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-gcc-6 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-gcc-7 -> ../../bin/ccache

在Ubuntu 16.04上测试。

相关内容

  • 没有找到相关文章

最新更新