Ist es möglich, Clang-Tidy mit Ccache oder ähnlichem zu beschleunigen?

Lesezeit: 3 Minuten

Seit der Beschäftigung ccache Auf unserem CI-Server stellen wir fest, dass der Engpass in Bezug auf die Build-Zeit jetzt unser statischer Analysepass ist, der verwendet wird clang-tidy, neben anderen Werkzeugen. Kennt jemand eine Beschleunigungsmöglichkeit clang-tidy ähnlich wie ccache geht das mit einem normalen Compiler?

Ich habe hier noch ein wichtiges Detail gefunden:

https://gitlab.kitware.com/cmake/cmake/-/merge_requests/1791/diffs

was hier verwendet wird:

https://reviews.bitcoinabc.org/D5150?id=15995

Um also die Ausgabe des Compilers beim Einbinden von clang-tidy mittels : set(CMAKE_CXX_CLANG_TIDY …

Methode müssen Sie die Methode COMPILER_LAUNCHER verwenden, um Ccache zu konfigurieren

find_program(CCACHE ccache)
if(CCACHE)
    set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
    set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
endif(CCACHE)

und NICHT die Launcher-Regelmethode:

find_program(CCACHE ccache)
if(CCACHE)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
endif(CCACHE)

Es gibt Clang-Tidy-Cache obwohl ich nicht weiß, wie das zusammen mit ccache funktioniert.

  • Das sieht vielversprechend aus … Ich werde es mir bei Gelegenheit ansehen.

    – Tim Angus

    10. Februar 2020 um 13:43 Uhr

Benutzer-Avatar
Fredrik Nordin

Ich konnte Clang-Tidy-Cache nicht zum Bauen bringen, weil ich nicht die richtige Go-Version hatte, also habe ich es gemacht cltcache stattdessen in Python. Es soll genau wie ccache verwendet werden und ist hoffentlich viel einfacher zu installieren als clang-tidy-cache.

Es hasht die Ausgabe des Präprozessors mit Kommentaren zusammen mit den aktivierten Überprüfungen und der Zeichenfolge „clang-tidy-version“ und verwendet diese als Schlüssel für den Cache. Bei einem Cache-Miss wird es den Clang-Tidy-Aufruf ausführen und die Standardausgabe, die Standardausgabe und den Rückgabecode komprimieren und im Cache speichern.

Ich bin mir nicht sicher, ob es für andere Projekte schnell genug ist, aber in meinem Projekt verbraucht Clang-Tidy etwa viermal so viel Zeit wie die eigentliche Kompilierung, sodass das Ausführen eines Präprozessors eine zusätzliche Zeit in Anspruch nimmt, die vergleichsweise vernachlässigbar ist.

  • Ihre Antwort könnte durch zusätzliche unterstützende Informationen verbessert werden. Bitte bearbeiten Sie, um weitere Details wie Zitate oder Dokumentation hinzuzufügen, damit andere bestätigen können, dass Ihre Antwort richtig ist. Weitere Informationen zum Verfassen guter Antworten finden Sie in der Hilfe.

    – Gemeinschaft
    bot

    17. April um 5:46 Uhr

Benutzer-Avatar
Christian Lederberger

Endlich habe ich eine Lösung dafür gefunden: Es wechselt das Build-System zu Bazel. Bazel ist ein Build-System, das sehr generisch ist und einen Aktionsgraphen definiert. Im Wesentlichen hat jede Aktion eine Reihe von Ein- und Ausgängen. Basierend auf den Eingaben können die Ausgaben zwischengespeichert werden. Daher löst Bazel das Problem an der Wurzel.

Die nötigen Regeln um clang-tidy cachebar einzubinden findet ihr hier: https://github.com/erenon/bazel_clang_tidy

Um Caching nutzen zu können, müssen Sie a Remote-Cache. Dies kann mit einem Docker-Compose-Skript erfolgen. Der notwendige Docker-Container ist bereits vorhanden. Den Befehl zum Ausführen finden Sie hier: https://github.com/buchgr/bazel-remote/

Schließlich löst Bazel auch das Problem des Zwischenspeicherns des Ergebnisses der Verknüpfungsphase.

Nicht nur das, Bazel erlaubt auch das Erstellen anderer Sprachen wie Java. Daher ermöglicht es in komplexen Projekten, alle anderen Build-Systeme durch ein einziges zu ersetzen.

Schließlich ermöglicht Bazel auch die Parallelisierung Ihres Builds auf einem Cluster.

Zu guter Letzt können Sie mehrere definieren Plattformen und Werkzeugketten. Alles in allem ermöglicht dies plattformübergreifende Builds.

1355410cookie-checkIst es möglich, Clang-Tidy mit Ccache oder ähnlichem zu beschleunigen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy