Ich möchte Folgendes tun: Wenn CCache in PATH vorhanden ist, verwenden Sie "ccache g ++" zum Kompilieren, andernfalls verwenden Sie g ++. Ich habe versucht, ein kleines my-cmake-Skript zu schreiben, das Folgendes enthält
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 aktiviert).
Aktualisieren:
Über diesen Link habe ich versucht, mein Skript in 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 klagt jedoch darüber, dass ein Test bei Verwendung des Compiler-Ccaches fehlgeschlagen ist (was zu erwarten ist).
Antworten:
Ich persönlich habe
/usr/lib/ccache
in meinem$PATH
. Dieses Verzeichnis enthält viele Symlinks für jeden möglichen Namen, von dem aus der Compiler aufgerufen werden kann (wiegcc
undgcc-4.3
), die alle auf ccache verweisen.Und ich habe nicht einmal die Symlinks erstellt. Dieses Verzeichnis wird vorgefüllt, wenn ich ccache auf Debian installiere.
quelle
$PATH
damit er funktioniert. So etwas wieexport PATH = /usr/lib/ccache:$PATH
brew install ccache
ich/usr/local/Cellar/ccache/3.2.1/libexec/
.Es ist jetzt möglich, ccache als Starter für Kompilierungsbefehle und Verknüpfungsbefehle anzugeben (seit cmake 2.8.0). Das funktioniert für Makefile und Ninja Generator. Legen Sie dazu einfach die folgenden Eigenschaften fest:
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 eine Problemumgehung in seiner Antwort.
Bearbeiten: Dank des Kommentars von uprego und Lekensteyn habe ich die Antwort bearbeitet, um zu überprüfen, ob ccache verfügbar ist, bevor ich ihn als Launcher verwende, und für welche Generatoren ein Compile-Launcher verwendet werden kann.
Edit2: @Emilio Cobos hat empfohlen, dies für den Verknüpfungsteil zu vermeiden, da der Ccache die Verknüpfungsgeschwindigkeit nicht verbessert und mit anderen Cache-Typen wie sccache in Konflikt geraten kann
quelle
find_program(CCACHE_FOUND "ccache")
. Ich weiß nicht, welches tragbarer ist. Mein Kilometerstand war ohne die Notwendigkeit von Doppelzitaten einwandfrei.cmake-properties
.endif()
) . Die Verbesserungen sind: 1. Es gibt eine Konfigurationsoption, um es zu deaktivieren, und 2. Es stellt sich heraus, dass Farben aus GCC / Clang im Make-Backend verschwinden, wenn sie auf diese Weise verwendet werden. Dasninja
Backend umgeht es, indem es eine-fdiagnostics-color
Option hinzufügt. Daher ist es ratsam, dies auch für dasmake
Backend zu tun .Ab CMAKE 3.4 können Sie:
quelle
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
. Diese funktionieren wunderbar! Ich weiß nicht, warum cmake darauf besteht,clang
von zu finden/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
(der Symlink-Trick funktioniert also nicht) und nicht von$PATH
, aber Ihre Antwort funktioniert trotzdem.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
genau wie der Unix Makefiles-Generator ehren (also bringt Sie die Antwort von @ Babcool auch für Ninja dorthin), aber Ccache für den Xcode-Generator zum Laufen zu bringen, erfordert etwas mehr Arbeit. Der folgende Artikel erläutert die Methode im Detail, wobei der Schwerpunkt auf einer allgemeinen Implementierung liegt, die für alle drei CMake-Generatoren funktioniert, und keine Annahmen zum Einrichten von Ccache-Symlinks oder des verwendeten zugrunde liegenden Compilers getroffen werden (CMake kann weiterhin den Compiler bestimmen):https://crascit.com/2016/04/09/using-ccache-with-cmake/
Der allgemeine Kern des Artikels lautet wie folgt. Der Anfang Ihrer
CMakeLists.txt
Datei sollte ungefähr so eingerichtet sein:Die beiden Skriptvorlage Dateien
launch-c.in
undlaunch-cxx.in
sieht wie folgt aus (sie im selben Verzeichnis wie das sein sollteCMakeLists.txt
Datei):launch-c.in:
launch-cxx.in:
Das Obige wird
RULE_LAUNCH_COMPILE
allein für Unix Makefiles und Ninja verwendet, aber für den Xcode-Generator ist es auf die Hilfe der CMake-CMAKE_XCODE_ATTRIBUTE_...
Variablenunterstützung angewiesen . Die Einstellung derCC
undCXX
benutzerdefinierten Xcode Attribute den Compiler - Befehl und steuernLD
undLDPLUSPLUS
für den Linker - Befehl nicht, soweit ich das beurteilen kann, ein dokumentiertes Merkmal von Xcode - Projekten, aber es zu funktionieren scheint. Wenn jemand bestätigen kann, dass es offiziell von Apple unterstützt wird, werde ich den verlinkten Artikel und diese Antwort entsprechend aktualisieren.quelle
set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}") set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")
aus dem genannten Artikel.Ich wollte keinen Symlink von
g++
bis setzenccache
. UndCXX="ccache g++"
hat bei mir nicht funktioniert, da einige cmake-Testfälle nur das Compiler-Programm ohne Attribute haben wollten.Also habe ich stattdessen ein kleines Bash-Skript verwendet:
und speicherte es als ausführbare Datei in
/usr/bin/ccache-g++
.Anschließend hat C cmake für die Verwendung
/usr/bin/ccache-g++
als C ++ - Compiler konfiguriert . Auf diese Weise besteht es die cmake-Testfälle und ich fühle mich wohler als Symlinks, die ich in 2 oder 3 Wochen vergessen könnte, und frage mich dann vielleicht, ob etwas nicht funktioniert ...quelle
Meiner Meinung nach ist es am besten, gcc, g ++ mit ccache zu verknüpfen. Wenn Sie es jedoch in cmake verwenden möchten, versuchen Sie Folgendes:
quelle
Ich habe folgende Arbeiten überprüft (Quelle: dieser Link ):
Update : Ich habe später festgestellt, dass auch das nicht funktioniert. Seltsamerweise funktioniert es jedes zweite Mal (das andere Mal beschwert sich cmake).
quelle
Lassen Sie mich einen wichtigen Punkt hinzufügen, der hier zuvor nicht erwähnt wurde.
Beim Bootstrapping eines minimalistischen Build-Systems vom Docker-Image ubunutu: 18.04 habe ich festgestellt, dass die Reihenfolge der Installation einen Unterschied macht.
In meinem Fall funktionierte ccache beim Aufrufen einwandfrei
gcc
, konnte jedoch Aufrufe desselben Compilers mit den anderen Namen nicht abfangen:cc
undc++
. Um Ccache vollständig zu installieren, müssen Sie sicherstellen, dass alle Compiler zuerst installiert sind, oder einen Aufruf für die Update-Ccache-Symlinks hinzufügen, um die Sicherheit zu gewährleisten.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) werden auch Aufrufe von cc und c ++ abgefangen!
quelle
update-ccache-symlinks
, ich habe einenc++
Link mit einem Skript für ein Projekt erstellt und es hat funktioniert, aber nicht für ein anderes Projekt (ich weiß immer noch nicht warum, der Link war in Ordnung),update-ccache-symlinks
gelöst.