webentwicklung-frage-antwort-db.com.de

Wie verwende ich CCache mit CMake?

Ich möchte Folgendes tun: Wenn CCache in PATH vorhanden ist, verwenden Sie zum Kompilieren "ccache g ++", andernfalls verwenden Sie g ++. Ich habe versucht, ein kleines my-cmake-Skript zu schreiben 

    CC="ccache gcc" CXX="ccache g++" cmake $*

aber es scheint nicht zu funktionieren (das Ausführen von make verwendet immer noch keinen ccache; ich habe dies mit CMAKE_VERBOSE_MAKEFILE überprüft). 

Update:

Wie unter diesem Link habe ich versucht, mein Skript zu ändern

     cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*

cmake macht jedoch geltend, dass ein Test bei der Verwendung des Compiler-Cache fehlgeschlagen ist (was zu erwarten ist).

77
amit

Ich persönlich habe /usr/lib/ccache in meinem $PATH. Dieses Verzeichnis enthält zahlreiche Symlinks für jeden möglichen Namen, aus dem der Compiler aufgerufen werden könnte (wie gcc und gcc-4.3), wobei alle auf ccache verweisen.

Und ich habe nicht einmal die Symlinks erstellt. Dieses Verzeichnis ist bereits ausgefüllt, wenn ich ccache unter Debian installiere.

58
Nicolás

Es ist jetzt möglich, ccache als Startprogramm für Kompilierungsbefehle und Verbindungsbefehle anzugeben (seit cmake 2.8.0). Das funktioniert für Makefile und Ninja Generator. Legen Sie dazu die folgenden Eigenschaften fest: 

find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)

Es ist auch möglich, diese Eigenschaften nur für bestimmte Verzeichnisse oder Ziele festzulegen. 

Für Ninja ist dies seit Version 3.4 ..__ möglich. Für XCode gibt Craig Scott in seiner Antwort einen Workaround an.

Edit: Dank uprego und Lekensteyns Kommentar habe ich die Antwort bearbeitet, um zu prüfen, ob der Ccache verfügbar ist, bevor er als Launcher verwendet wird und für welche Generatoren ein Compile Launcher verwendet werden kann.

80
Babcool

Ab CMAKE 3.4 können Sie Folgendes tun: 

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
59
Jacob

Ich habe keinen Symlink von g++ zu ccache gesetzt. Und CXX="ccache g++" hat für mich nicht funktioniert, da ein Testfall von cmake nur das Compilerprogramm ohne Attribute haben wollte.

Also habe ich stattdessen ein kleines Bash-Skript verwendet:

#!/bin/bash
ccache g++ "[email protected]"

und speicherte es als ausführbare Datei in /usr/bin/ccache-g++.

Dann hat C Cake konfiguriert, um /usr/bin/ccache-g++ als C++ - Compiler zu verwenden. Auf diese Weise besteht er die Testfälle von cmake, und ich fühle mich wohler als Symlinks, die ich in 2 oder 3 Wochen vergessen könnte, und frage mich dann, ob etwas nicht funktioniert ...

8
jonas

Ab CMake 3.1 ist es möglich, ccache mit dem Xcode-Generator zu verwenden, und Ninja wird ab CMake 3.4 unterstützt. Ninja wird RULE_LAUNCH_COMPILE ebenso wie den Unix Makefiles-Generator würdigen (die Antwort von @ Babcool bringt Sie auch für Ninja), aber dafür, dass der Ccache für den Xcode-Generator funktioniert, erfordert etwas mehr Arbeit. Im folgenden Artikel wird die Methode im Detail erläutert. Sie konzentriert sich auf eine allgemeine Implementierung, die für alle drei CMake-Generatoren geeignet ist, und macht keine Annahmen über das Einrichten von Ccache-Symlinks oder den zugrunde liegenden Compiler (damit kann CMake den Compiler trotzdem entscheiden):

https://crascit.com/2016/04/09/using-ccache-with-cmake/

Der allgemeine Inhalt des Artikels ist wie folgt. Der Start Ihrer CMakeLists.txt-Datei sollte folgendermaßen aussehen:

cmake_minimum_required(VERSION 2.8)

find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
    # Support Unix Makefiles and Ninja
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
endif()

project(SomeProject)

get_property(RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
if(RULE_LAUNCH_COMPILE AND CMAKE_GENERATOR STREQUAL "Xcode")
    # Set up wrapper scripts
    configure_file(launch-c.in   launch-c)
    configure_file(launch-cxx.in launch-cxx)
    execute_process(COMMAND chmod a+rx
                            "${CMAKE_BINARY_DIR}/launch-c"
                            "${CMAKE_BINARY_DIR}/launch-cxx")

    # Set Xcode project attributes to route compilation through our scripts
    set(CMAKE_XCODE_ATTRIBUTE_CC         "${CMAKE_BINARY_DIR}/launch-c")
    set(CMAKE_XCODE_ATTRIBUTE_CXX        "${CMAKE_BINARY_DIR}/launch-cxx")
    set(CMAKE_XCODE_ATTRIBUTE_LD         "${CMAKE_BINARY_DIR}/launch-c")
    set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_BINARY_DIR}/launch-cxx")
endif()

Die beiden Skriptvorlagendateien launch-c.in und launch-cxx.in sehen folgendermaßen aus (sie sollten sich in demselben Verzeichnis befinden wie die CMakeLists.txt-Datei):

launch-c.in:

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "[email protected]"

launch-cxx.in:

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "[email protected]"

Das obige verwendet RULE_LAUNCH_COMPILE alleine für Unix-Makefiles und Ninja, aber für den Xcode-Generator ist er auf die Unterstützung der CMake-Unterstützung für CMAKE_XCODE_ATTRIBUTE_...-Variablen angewiesen. Die Einstellung der benutzerdefinierten Xcode-Attribute CC und CXX zur Steuerung des Compiler-Befehls und LD und LDPLUSPLUS für den Linker-Befehl ist meines Erachtens keine dokumentierte Funktion von Xcode-Projekten, scheint aber zu funktionieren. Wenn jemand bestätigen kann, dass es offiziell von Apple unterstützt wird, werde ich den verknüpften Artikel aktualisieren und diese Antwort entsprechend beantworten.

7
Craig Scott

Ich habe folgende Arbeiten überprüft (Quelle: dieser Link ):

        CC="gcc" CXX="g++" cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*

Update: Später erkannte ich, dass auch dies nicht funktioniert. Seltsamerweise funktioniert es zu jeder anderen Zeit (die anderen Male beschwert sich). 

6
amit

Meiner Meinung nach ist es am besten, gcc, g ++ mit ccache zu verknüpfen, aber wenn Sie cmake verwenden möchten, versuchen Sie Folgendes:

export CC="ccache gcc" CXX="ccache g++" cmake ...
4
Nadir SOUALEM

Lassen Sie mich einen wichtigen Punkt hinzufügen, der hier noch nicht erwähnt wurde.

Beim Bootstrapping eines minimalistischen Build-Systems aus dem Docker-Image ubunutu: 18.04 habe ich festgestellt, dass die Reihenfolge der Installation einen Unterschied macht.

In meinem Fall hat ccache beim Aufruf von gcc gut funktioniert, aber Aufrufe des gleichen Compilers mit den anderen Namen nicht abgefangen: cc und c++. Um ccache vollständig zu installieren, müssen Sie sicherstellen, dass alle Compiler zuerst installiert sind, oder füge einen Aufruf von update-ccache symlinks hinzu, um sicher zu sein.

Sudo apt-get install ccache build-essential # and everyhting ... Sudo /usr/sbin/update-ccache-symlinks export PATH="/usr/lib/ccache/:$PATH"

... und dann (aufgrund aktualisierter Symlinks) auch Aufrufe an cc und c ++ erwischt werden!

0
Jürgen Weigert