[ccache] Making ccache and clang compatible

Volodymyr Kostyrko c.kworr at gmail.com
Tue Jul 24 06:59:10 MDT 2012


Lubos Lunak wrote:
> On Wednesday 11 of J>>> but I think the bug originally described in<
>>> https://bugzilla.samba.org/show_bug.cgi?id=8460>  could possibly be valid.
>>> If you are compiling from a .i or .ii file, the -D and -I options can't
>>> have any effect.  It's reasonable for clang to emit a warning about it,
>>> and it would be reasonable for ccache to strip those options when
>>> compiling a preprocessed file.
>>
>> Aye, if that would be acceptable for the ccache authors, that would be the
>> best solution I think.
>
>   The best option is to use CCACHE_CPP2 with Clang. Giving Clang preprocessed
> source causes a number of small problems, such as some warnings not being
> suppressed or error/warning messages quoting modified source code. As a
> side-effect, this problem with preprocessor options will not exist with
> CCACHE_CPP2 either. It is a question how much not using CCACHE_CPP2 with
> Clang would improve performance anyway.

This is a good point. Showing errors coming from monolithic preprocessed 
file and not from actual location is a bad thing to do. Yet there are 
cases where CCACHE_CPP2 will cause havoc. I found at least one of them 
when building virtualbox 4.1.18 with gcc 4.2:

cc1plus: error: to generate dependencies you must specify either -M or -MM
kmk: *** 
[/tmp/ports/.amd_mnt/faz/host/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.18/out/freebsd.amd64/release/obj/RuntimeBldProg/common/checksum/RTSha1Digest.o] 
Error 1
The failing command:
@c++ -c -O2 -g -pipe -pedantic -Wshadow -Wall -Wextra 
-Wno-missing-field-initializers -Wno-unused -Wno-trigraphs 
-fdiagnostics-show-option -Wno-long-long -Wno-variadic-macros -O2 
-fno-omit-frame-pointer -fno-strict-aliasing -m64 
-I/tmp/ports/.amd_mnt/faz/host/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.18/src/VBox/Runtime/include 
-I/tmp/ports/.amd_mnt/faz/host/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.18/src/libs/liblzf-3.4 
-I/usr/include -I/usr/X11R6/include -I/usr/local/include 
-I/usr/local/include/libxml2 -I/usr/local/include 
-I/tmp/ports/.amd_mnt/faz/host/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.18/src/libs/boost-1.37.0 
-I/tmp/ports/.amd_mnt/faz/host/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.18/include 
-I/tmp/ports/.amd_mnt/faz/host/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.18/out/freebsd.amd64/release 
-DVBOX -DVBOX_WITH_DEBUGGER -DVBOX_OSE -DVBOX_WITH_64_BITS_GUESTS 
-DVBOX_WITH_HARDENING 
-DRTPATH_APP_PRIVATE=\"/usr/local/share/virtualbox-ose\" 
-DRTPATH_APP_PRIVATE_ARCH=\"/usr/local/lib/virtualbox\" 
-DRTPATH_SHARED_LIBS=\"/usr/local/lib/virtualbox\" 
-DRTPATH_APP_DOCS=\"/usr/local/share/doc/virtualbox-ose\" 
-DRT_OS_FREEBSD -D__FREEBSD__ -DRT_ARCH_AMD64 -D__AMD64__ -D_REENTRANT 
-DBOOST_DISABLE_ASSERTS -DIN_RING3 -DLOG_DISABLED -DIN_RT_R3 -DIN_SUP_R3 
-DLDR_WITH_NATIVE -DLDR_WITH_ELF32 -DLDR_WITH_PE -DRT_WITH_VBOX 
-DRT_NO_GIP -DRT_WITH_ICONV_CACHE 
-Wp,-MD,/tmp/ports/.amd_mnt/faz/host/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.18/out/freebsd.amd64/release/obj/RuntimeBldProg/common/checksum/RTSha1Digest.o.dep 
-Wp,-MT,/tmp/ports/.amd_mnt/faz/host/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.18/out/freebsd.amd64/release/obj/RuntimeBldProg/common/checksum/RTSha1Digest.o 
-Wp,-MP -o 
/tmp/ports/.amd_mnt/faz/host/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.18/out/freebsd.amd64/release/obj/RuntimeBldProg/common/checksum/RTSha1Digest.o 
/tmp/ports/.amd_mnt/faz/host/usr/ports/emulators/virtualbox-ose/work/VirtualBox-4.1.18/src/VBox/Runtime/common/checksum/RTSha1Digest.cpp

On the other hand preprocessing can be simplified with clang by adding 
-frewrite-includes flag starting with clang 3.2. This will make clang 
only rewrite includes and do nothing more than that. 
(http://llvm.org/bugs/show_bug.cgi?id=13282#c3)

-- 
Sphinx of black quartz judge my vow.


More information about the ccache mailing list