CMake ile CCache Nasıl Kullanılır?


92

Aşağıdakileri yapmak istiyorum: PATH'de CCache varsa, derleme için "ccache g ++" kullanın, yoksa g ++ kullanın. Küçük bir my-cmake betiği yazmayı denedim

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

ancak çalışmıyor gibi görünüyor (make çalıştırmak hala ccache kullanmıyor; bunu CMAKE_VERBOSE_MAKEFILE üzerinde kullanarak kontrol ettim).

Güncelleme:

Gereğince bu bağlantı Ben benim komut değiştirme çalıştı

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

ancak cmake, derleyici ccache'yi kullanarak bir testin başarısız olmasından şikayet ederek kurtarır (beklenebilir).


4
Neden gcc'yi ccache'ye sembolik bağlamıyorsunuz? Ve eğer bunu dağıtıyorsanız, eğer ccache kurulu olsaydı ve kullanılmasını isteseydi, kullanıcının sembolik bağlantıyı kendisinin yapacağını düşünürdüm ..
int3

1
@ int3 Evet, muhtemelen işe yarar (ccache'nin derleyicinin isteğe bağlı bir argüman olarak bulunduğunun farkında değildim). Ancak daha açık olmak daha temiz olur.
amit

Yanıtlar:


68

Ben şahsen /usr/lib/ccachebenim $PATH. Bu dizin, derleyicinin çağrılabileceği her olası ad için ( gccve gibi gcc-4.3), tümü ccache'yi işaret eden bir sürü sembolik bağ içerir .

Ve sembolik bağları bile yaratmadım. Debian'a ccache kurduğumda bu dizin önceden doldurulmuş olarak geliyor.


11
Bu ccache yolunun çalışması için gerçek derleyicinizin bulunduğu yoldan önce yerleştirilmesi gerektiğini unutmayın $PATH. Gibi bir şeyexport PATH = /usr/lib/ccache:$PATH
Gui13

6
@ Gui13: PATH'i güncellemekten daha iyidir, cmake'ye kullanması gereken gcc'nin nerede olduğunu açıkça söylemektir, örneğin cmake -DCMAKE_CXX_COMPILER = / usr / lib / ccache / bin / g ++
cib

3
Sonra brew install ccachevar /usr/local/Cellar/ccache/3.2.1/libexec/.
cdunn2001

98

CMAKE 3.4'ten itibaren şunları yapabilirsiniz:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache

1
Ve -DCMAKE_CXX_COMPILER_LAUNCHER=ccache. Bunlar çok güzel çalışıyor! Cmake'ın neden değil de clangburadan bulmakta ısrar ettiğini bilmiyorum /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc(bu yüzden sembolik bağlantı hilesi işe yaramaz) $PATH, ama cevabınız yine de işe yarıyor.
cdunn2001

3
Bu en iyi cevap olmalı. Artık yol değişkeni ve derleyici sembolik bağlantılarıyla uğraşmak yok!
ilya b.

1
Bunu denedim, ancak bana "ccache: error: Recursive invocation (ccache ikili dosyasının adı" ccache "olmalıdır)" hatası veriyor. Ayrıntılı ize bakıldığında, "/ usr / local / bin / ccache ccache / usr / bin / c ++" çalıştırmaya çalışıyor ...
Chris Dodd

3
RULE_LAUNCH_COMPILE ile nasıl etkileşim kurar?
Trass3r

98

Artık ccache'yi derleme komutları ve bağlantı komutları için bir başlatıcı olarak belirtmek mümkündür (cmake 2.8.0'dan beri). Bu Makefile ve Ninja oluşturucu için çalışıyor. Bunu yapmak için aşağıdaki özellikleri ayarlamanız yeterlidir:

find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) # Less useful to do it for linking, see edit2
endif(CCACHE_FOUND)

Bu özellikleri yalnızca belirli dizinler veya hedefler için ayarlamak da mümkündür.

Ninja için bu 3.4 sürümünden beri mümkündür. Craig Scott, XCode için cevabında bir geçici çözüm sunuyor.

Düzenleme: Uprego ve Lekensteyn'in yorumu sayesinde, başlatıcı olarak kullanmadan önce ccache'nin kullanılabilir olup olmadığını ve hangi üreticiler için bir derleme başlatıcısı kullanmanın mümkün olduğunu kontrol etmek için cevabı düzenledim.

Edit2: @Emilio Cobos, ccache bağlantı hızını artırmadığı ve sccache gibi diğer önbellek türleriyle uğraşabileceğinden, bağlantı parçası için bunu yapmaktan kaçınmayı önerdi


Birçok site find_program(CCACHE_FOUND "ccache"), içinde olduğu gibi çift tırnak kullanarak örtük olarak tavsiyede bulunur , hangisinin daha taşınabilir olduğunu bilmiyorum, kilometrelerim çift tırnağa gerek kalmadan mükemmel bir şekilde sonuçlandı.
1737973

5
Bunun şu anda yalnızca Makefile jeneratörleri için çalıştığını belirtmek gerekir (cmake 3.3.2'den itibaren). Kılavuz sayfasına bakın cmake-properties.
Lekensteyn

1
Bunun CTEST_USE_LAUNCHERS ayarı ile çeliştiğini belirtmekte fayda var. Bu özellikler burada da ayarlanmıştır: github.com/Kitware/CMake/blob/master/Modules/…
purpleKarrot

Ben size kodunu değiştirmek isteyebilirsiniz düşünüyorum bu bir (hariç içinden kaldır metniendif() ) . İyileştirmeler şunlardır: 1. Devre dışı bırakmak için bir yapılandırma seçeneği vardır ve 2. Bu şekilde kullanıldığında renkler GCC / Clang'dan arka uç oluştur'da kaybolur. Arka ninja-fdiagnostics-color, seçenek ekleyerek bunun etrafında çalışır , bu nedenle makearka uç için de bunu yapmanız önerilir .
Hi-Angel

9

CMake 3.1'den itibaren ccache'yi Xcode oluşturucu ile kullanmak mümkündür ve Ninja, CMake 3.4'ten itibaren desteklenir. Ninja onurlandıracakRULE_LAUNCH_COMPILE , Unix Makefiles oluşturucu gibi (bu nedenle @ Babcool'un cevabı sizi Ninja için de oraya götürür), ancak Xcode oluşturucu için ccache'yi çalıştırmak biraz daha fazla iş gerektirir. Aşağıdaki makale, yöntemi ayrıntılı olarak açıklar, üç CMake oluşturucunun tümü için çalışan genel bir uygulamaya odaklanır ve ccache sembolik bağlarının veya kullanılan temel derleyicinin ayarlanması hakkında hiçbir varsayımda bulunmaz (yine de CMake'nin derleyiciye karar vermesine izin verir):

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

Makalenin genel özü aşağıdaki gibidir. CMakeLists.txtDosyanızın başlangıcı şu şekilde ayarlanmalıdır:

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()

İki komut dosyası şablon dosyası launch-c.inve buna launch-cxx.inbenzer (bunlar,CMakeLists.txt dosya ile ):

launch-c.in:

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@"

launch-cxx.in:

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "$@"

Yukarıdakiler, RULE_LAUNCH_COMPILEUnix Makefiles ve Ninja için tek başına kullanır , ancak Xcode oluşturucu için CMake'nin CMAKE_XCODE_ATTRIBUTE_...değişken desteğinden gelen yardıma dayanır . Ayarı CCve CXXkullanıcı tanımlı Xcode derleyici komutu ve kontrol etmek niteliklerini LDve LDPLUSPLUS, bildiğim kadarıyla söyleyebilirim, Xcode projeleri belgelenmiş özelliği, ancak işe görünüyor değildir bağlayıcı komutu için. Apple tarafından resmi olarak desteklendiğini onaylayan biri varsa, bağlantılı makaleyi ve bu yanıtı buna göre güncelleyeceğim.


set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}") set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")Bahsedilen makaleden de ihtiyacım vardı .
Jörn Reimerdes

Hatırlatma için teşekkürler, yanıtı LD ve LDPLUSPLUS ayarını içerecek şekilde güncelledim.
Craig Scott

ccache, VS derleyicilerini desteklemez, bu nedenle bunun için kullanamazsınız. VS için aynı işlevselliği sağlamayı amaçlayan clcache adında bir proje var , ancak ne kadar iyi çalıştığı konusunda yorum yapamam.
Craig Scott

8

Bir sembolik ayarlamak gibi yapmadım g++için ccache. VeCXX="ccache g++" benim için işe yaramadı çünkü bazı cmake test durumları, öznitelikler olmadan sadece derleyici programına sahip olmak istedi.

Bunun yerine küçük bir bash betiği kullandım:

#!/bin/bash
ccache g++ "$@"

ve içinde yürütülebilir olarak kaydetti /usr/bin/ccache-g++.

Sonra C, cmake'yi /usr/bin/ccache-g++C ++ derleyicisi olarak kullanmak üzere yapılandırdı . Bu şekilde cmake test durumlarını geçer ve 2 veya 3 hafta içinde unutabileceğim sembolik bağlantılara sahip olmaktan daha rahat hissediyorum ve sonra belki bir şey işe yaramaz mı diye merak ediyorum ...


6

Aşağıdaki çalışmaları doğruladım (kaynak: bu bağlantı ):

        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" $*

Güncelleme : Daha sonra bunun bile işe yaramadığını anladım. Garip bir şekilde her seferinde çalışır (diğer zamanlarda şikayet eder).


5

Bence en iyi yol gcc, g ++ ile ccache'yi sembolize etmektir, ancak cmake içinde kullanmak istiyorsanız şunu deneyin:

export CC="ccache gcc" CXX="ccache g++" cmake ...

4

Burada daha önce bahsedilmeyen önemli bir maddeyi ekleyeyim.

Ubunutu: 18.04 docker görüntüsünden minimalist bir yapı sistemini önyüklerken, kurulum sırasının bir fark yarattığını gördüm.

Benim durumumda ccache arama sırasında iyi çalıştı gcc, ancak aynı derleyicinin çağrılarını diğer adlarla yakalayamadı: ccve c++. Ccache'yi tam olarak kurmak için, önce tüm derleyicilerin kurulduğundan emin olmanız veya güvenli olması için ccache sembolik bağlantılarını update çağrısı eklemeniz gerekir.

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

... ve sonra (güncellenmiş sembolik bağlantılar nedeniyle) cc ve c ++ çağrıları da yakalanır!


Teşekkürler bilmiyordum update-ccache-symlinks, c++bir proje için bir komut dosyasıyla bağlantı oluşturuyordum ve çalışıyordu ama başka bir proje için değildi (hala nedenini bilmiyorum, bağlantı iyi), update-ccache-symlinksçözüldü.
Alex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.