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).
Jawaban:
Saya pribadi ada
/usr/lib/ccache
di saya$PATH
. Direktori ini berisi banyak symlink untuk setiap nama yang memungkinkan kompiler dapat dipanggil (sepertigcc
dangcc-4.3
), semuanya menunjuk ke ccache.Dan saya bahkan tidak membuat symlink. Direktori itu sudah terisi sebelumnya ketika saya menginstal ccache di Debian.
sumber
$PATH
agar dapat berfungsi. Sesuatu sepertiexport PATH = /usr/lib/ccache:$PATH
brew install ccache
, saya punya/usr/local/Cellar/ccache/3.2.1/libexec/
.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
sumber
find_program(CCACHE_FOUND "ccache")
, saya tidak tahu mana yang lebih portabel, jarak tempuh saya berjalan dengan baik tanpa perlu tanda kutip ganda.cmake-properties
.endif()
) . Perbaikannya adalah: 1. Ada opsi konfigurasi untuk menonaktifkannya, dan 2. Ternyata, warna hilang dari GCC / Clang di Make backend jika digunakan dengan cara ini. Theninja
backend bekerja di sekitarnya dengan menambahkan-fdiagnostics-color
pilihan, jadi disarankan untuk melakukannya untukmake
backend juga.Mulai CMAKE 3.4 Anda dapat melakukan:
sumber
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
. Ini bekerja dengan indah! Saya tidak tahu mengapa cmake bersikeras mencariclang
dari/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
(jadi trik symlink tidak berfungsi), daripada dari$PATH
, tetapi jawaban Anda tetap berfungsi.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_COMPILE
seperti 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.txt
file 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.in
danlaunch-cxx.in
terlihat seperti ini (harus berada di direktori yang sama denganCMakeLists.txt
file):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_COMPILE
sendiri untuk Unix Makefiles dan Ninja, tetapi untuk generator Xcode bergantung pada bantuan dariCMAKE_XCODE_ATTRIBUTE_...
dukungan variabel CMake . Pengaturan dariCC
danCXX
atribut Xcode yang ditentukan pengguna untuk mengontrol perintah compiler danLD
danLDPLUSPLUS
untuk 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.sumber
set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}") set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")
dari artikel yang disebutkan.Saya tidak suka menyetel symlink dari
g++
keccache
. DanCXX="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 ...sumber
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 ...
sumber
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).
sumber
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:cc
danc++
. 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!
sumber
update-ccache-symlinks
, saya membuatc++
tautan dengan skrip untuk sebuah proyek dan itu berfungsi tetapi tidak untuk proyek lain (masih tidak tahu mengapa, tautannya baik-baik saja),update-ccache-symlinks
terselesaikan.