Bagaimana Cara Menggunakan CCache dengan CMake?

91

Saya ingin melakukan hal berikut: Jika CCache ada di PATH, gunakan "ccache g ++" untuk kompilasi, jika tidak gunakan g ++. Saya mencoba menulis naskah kecil saya-cmake yang berisi

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

tetapi tampaknya tidak berhasil (menjalankan make masih tidak menggunakan ccache; saya memeriksa ini menggunakan CMAKE_VERBOSE_MAKEFILE di).

Memperbarui:

Sesuai tautan ini saya mencoba mengubah skrip saya menjadi

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

tapi cmake keluar dengan mengeluh bahwa tes gagal menggunakan compiler ccache (yang bisa diharapkan).

amit
sumber
4
Mengapa Anda tidak menghubungkan gcc ke ccache saja? Dan jika Anda mendistribusikan ini, saya pikir pengguna itu sendiri akan melakukan symlink jika dia menginstal ccache dan ingin menggunakannya ..
int3
1
@ int3 Ya mungkin itu akan berhasil (saya tidak tahu bahwa ccache memiliki kompilator sebagai argumen opsional). Namun akan lebih bersih jika lebih eksplisit.
amit

Jawaban:

67

Saya pribadi ada /usr/lib/ccachedi saya $PATH. Direktori ini berisi banyak symlink untuk setiap nama yang memungkinkan kompiler dapat dipanggil (seperti gccdan gcc-4.3), semuanya menunjuk ke ccache.

Dan saya bahkan tidak membuat symlink. Direktori itu sudah terisi sebelumnya ketika saya menginstal ccache di Debian.

Nicolás
sumber
11
Perhatikan bahwa jalur ccache ini harus ditempatkan sebelum jalur tempat compiler Anda yang sebenarnya berada $PATHagar dapat berfungsi. Sesuatu sepertiexport PATH = /usr/lib/ccache:$PATH
Gui13
6
@ Gui13: Lebih baik daripada memperbarui PATH adalah memberi tahu cmake secara eksplisit di mana gcc yang harus digunakan, misalnya cmake -DCMAKE_CXX_COMPILER = / usr / lib / ccache / bin / g ++
cib
3
Setelah brew install ccache, saya punya /usr/local/Cellar/ccache/3.2.1/libexec/.
cdunn2001
96

Sekarang dimungkinkan untuk menentukan ccache sebagai peluncur untuk perintah kompilasi dan perintah tautan (sejak cmake 2.8.0). Itu berfungsi untuk generator Makefile dan Ninja. Untuk melakukan ini, cukup setel properti berikut:

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)

Juga dimungkinkan untuk menyetel properti ini hanya untuk direktori atau target tertentu.

Untuk Ninja, ini dimungkinkan sejak versi 3.4. Untuk XCode, Craig Scott memberikan solusi untuk jawabannya.

Sunting: Berkat komentar uprego dan Lekensteyn, saya mengedit jawabannya untuk memeriksa apakah ccache tersedia sebelum menggunakannya sebagai peluncur dan untuk generator mana dimungkinkan untuk menggunakan peluncur kompilasi.

Sunting2: @Emilio Cobos merekomendasikan untuk menghindari melakukan itu untuk bagian penautan karena ccache tidak meningkatkan kecepatan penautan dan dapat mengacaukan jenis cache lain seperti sccache

Babcool
sumber
Banyak situs yang secara implisit menyarankan penggunaan kutipan ganda seperti di find_program(CCACHE_FOUND "ccache"), saya tidak tahu mana yang lebih portabel, jarak tempuh saya berjalan dengan baik tanpa perlu tanda kutip ganda.
1737973
5
Perlu dicatat bahwa ini saat ini hanya berfungsi untuk generator Makefile (pada cmake 3.3.2). Lihat halaman manual cmake-properties.
Lekensteyn
1
Perlu dicatat bahwa ini bertentangan dengan pengaturan CTEST_USE_LAUNCHERS. Properti tersebut juga disetel di sini: github.com/Kitware/CMake/blob/master/Modules/…
purpleKarrot
Saya pikir Anda mungkin ingin mengubah kode ini (kecuali, hapus teks dari dalamendif() ) . Perbaikannya adalah: 1. Ada opsi konfigurasi untuk menonaktifkannya, dan 2. Ternyata, warna hilang dari GCC / Clang di Make backend jika digunakan dengan cara ini. The ninjabackend bekerja di sekitarnya dengan menambahkan -fdiagnostics-colorpilihan, jadi disarankan untuk melakukannya untuk makebackend juga.
Hi-Angel
95

Mulai CMAKE 3.4 Anda dapat melakukan:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
Yakub
sumber
1
Dan -DCMAKE_CXX_COMPILER_LAUNCHER=ccache. Ini bekerja dengan indah! Saya tidak tahu mengapa cmake bersikeras mencari clangdari /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc(jadi trik symlink tidak berfungsi), daripada dari $PATH, tetapi jawaban Anda tetap berfungsi.
cdunn2001
2
Ini harus menjadi jawaban terbaik. Tidak perlu lagi mengotak-atik variabel path dan symlink compiler!
ilya b.
1
Saya mencoba ini, tetapi hanya memberi saya kesalahan "ccache: error: Pemanggilan berulang (nama biner ccache harus" ccache ")". Melihat jejak verbose, itu mencoba menjalankan "/ usr / local / bin / ccache ccache / usr / bin / c ++" ...
Chris Dodd
3
Bagaimana cara berinteraksi dengan RULE_LAUNCH_COMPILE?
Trass3r
10

Dari CMake 3.1, dimungkinkan untuk menggunakan ccache dengan generator Xcode dan Ninja didukung dari CMake 3.4 dan seterusnya. Ninja akan menghormati RULE_LAUNCH_COMPILEseperti generator Unix Makefiles (jadi jawaban @ Babcool membawa Anda ke sana untuk Ninja juga), tetapi mendapatkan ccache yang berfungsi untuk generator Xcode membutuhkan sedikit lebih banyak pekerjaan. Artikel berikut menjelaskan metode ini secara mendetail, dengan fokus pada implementasi umum yang berfungsi untuk ketiga generator CMake dan tidak membuat asumsi tentang penyiapan ccache symlink atau kompilator yang digunakan (masih memungkinkan CMake memutuskan kompilernya):

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

Inti umum dari artikel tersebut adalah sebagai berikut. Awal CMakeLists.txtfile Anda harus diatur seperti ini:

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

Kedua file template skrip launch-c.indan launch-cxx.interlihat seperti ini (harus berada di direktori yang sama dengan CMakeLists.txtfile):

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}" "$@"

Penggunaan di atas RULE_LAUNCH_COMPILEsendiri untuk Unix Makefiles dan Ninja, tetapi untuk generator Xcode bergantung pada bantuan dari CMAKE_XCODE_ATTRIBUTE_...dukungan variabel CMake . Pengaturan dari CCdan CXXatribut Xcode yang ditentukan pengguna untuk mengontrol perintah compiler dan LDdan LDPLUSPLUSuntuk perintah linker, sejauh yang saya tahu, bukanlah fitur yang didokumentasikan dari proyek Xcode, tetapi tampaknya berfungsi. Jika ada yang dapat mengonfirmasi bahwa itu secara resmi didukung oleh Apple, saya akan memperbarui artikel yang ditautkan dan jawaban ini sesuai.

Craig Scott
sumber
Saya juga membutuhkan set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}") set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")dari artikel yang disebutkan.
Jörn Reimerdes
Terima kasih atas pengingatnya, saya telah memperbarui jawabannya untuk menyertakan pengaturan LD dan LDPLUSPLUS.
Craig Scott
ccache tidak mendukung kompiler VS, jadi Anda tidak dapat menggunakannya untuk itu. Ada sebuah proyek bernama clcache yang bertujuan untuk menyediakan fungsionalitas yang sama untuk VS, tetapi saya tidak dapat berkomentar tentang seberapa baik kerjanya.
Craig Scott
9

Saya tidak suka menyetel symlink dari g++ke ccache. Dan CXX="ccache g++"tidak berhasil untuk saya karena beberapa test case cmake hanya ingin memiliki program compiler tanpa atribut.

Jadi saya menggunakan skrip bash kecil sebagai gantinya:

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

dan menyimpannya sebagai file yang dapat dieksekusi di /usr/bin/ccache-g++.

Kemudian C mengkonfigurasi cmake untuk digunakan /usr/bin/ccache-g++sebagai kompiler C ++. Dengan cara ini ia melewati kasus uji cmake dan saya merasa lebih nyaman daripada memiliki symlink yang mungkin saya lupakan dalam 2 atau 3 minggu dan kemudian mungkin bertanya-tanya apakah ada yang tidak berfungsi ...

jonas
sumber
5

Menurut saya cara terbaik adalah dengan menghubungkan gcc, g ++ ke ccache, tetapi jika Anda ingin menggunakan dalam cmake, coba ini:

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

Saya memverifikasi karya berikut (sumber: tautan ini ):

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

Pembaruan : Saya kemudian menyadari bahwa ini pun tidak berhasil. Anehnya itu bekerja setiap waktu alternatif (di waktu lain saya mengeluh).

amit
sumber
4

Izinkan saya menambahkan satu item penting yang tidak disebutkan di sini sebelumnya.

Saat melakukan bootstrap pada sistem build minimalis dari ubunutu: gambar buruh pelabuhan 18,04, saya telah menemukan bahwa urutan pemasangan membuat perbedaan.

Dalam kasus saya, ccache berfungsi dengan baik saat memanggil gcc, tetapi gagal menangkap pemanggilan dari kompilator yang sama dengan nama lain: ccdan c++. Untuk menginstal ccache sepenuhnya, Anda perlu memastikan semua kompiler diinstal terlebih dahulu, atau tambahkan panggilan ke symlink update-ccache agar aman.

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

... dan kemudian (karena symlink yang diperbarui) juga panggilan ke cc dan c ++ tertangkap!

Jürgen Weigert
sumber
Terima kasih, saya tidak tahu tentang update-ccache-symlinks, saya membuat c++tautan dengan skrip untuk sebuah proyek dan itu berfungsi tetapi tidak untuk proyek lain (masih tidak tahu mengapa, tautannya baik-baik saja), update-ccache-symlinksterselesaikan.
Alex