CMake के साथ CCache का उपयोग कैसे करें?


90

मैं निम्नलिखित कार्य करना चाहूंगा: यदि पेटीटी में CCache मौजूद है, तो संकलन के लिए "ccache g ++" का उपयोग करें, अन्यथा g ++ का उपयोग करें। मैंने एक छोटी-सी मेरी-सीमक स्क्रिप्ट लिखने की कोशिश की

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

लेकिन यह काम नहीं करता है (रन मेक अभी भी ccache का उपयोग नहीं करता है; मैंने इसे CMAKE_VERBOSE_MAKEFILE का उपयोग करके चेक किया है)।

अपडेट करें:

इस लिंक के अनुसार मैंने अपनी स्क्रिप्ट को बदलने की कोशिश की

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

लेकिन cmake ने शिकायत करते हुए कहा कि कंपाइलर ccache (जिसकी उम्मीद की जा सकती है) का उपयोग करने पर एक परीक्षण विफल हो गया।


4
आप सिर्फ़ ccache करने के लिए सीक्लिंक क्यों नहीं करते? और यदि आप इसे वितरित कर रहे हैं, तो मुझे लगता है कि उपयोगकर्ता स्वयं सिम्कलिन कर सकता है यदि उसने ccache स्थापित किया है और वह इसका उपयोग करना चाहता है ..
int3

1
@ int3 हाँ शायद यह काम करेगा (मुझे नहीं पता था कि ccache में कंपाइलर एक वैकल्पिक तर्क के रूप में है)। हालांकि यह अधिक स्पष्ट होने के लिए क्लीनर होगा।
दोपहर

जवाबों:


67

मैं व्यक्तिगत रूप /usr/lib/ccacheसे अपने में है $PATH। इस निर्देशिका में हर संभव नाम के लिए सिमिलिंक का भार शामिल है जिसे संकलक (जैसे gccऔर gcc-4.3) से बुलाया जा सकता है , सभी ccache की ओर इशारा करता है।

और मैंने सिम्बल भी नहीं बनाया। जब मैं डेबियन पर ccache स्थापित करता हूं तो वह निर्देशिका पहले से भर जाती है।


11
ध्यान दें कि इस ccache पथ को उस पथ से पहले रखा जाना है जहाँ आपका वास्तविक संकलक $PATHकाम करने के लिए है। कुछ इस तरहexport PATH = /usr/lib/ccache:$PATH
Gui13

6
@ गुइ 13: पेटीएम को अपडेट करने से बेहतर यह होगा कि सेमीके को स्पष्ट रूप से बताएं कि जीसीसी को इसका उपयोग कहां करना चाहिए, जैसे कि सेमीके -डीसीएमएकेई_केएक्स_कामपिलर = / usr / lib / ccache / 'g + +
cib

3
के बाद brew install ccache, मेरे पास है /usr/local/Cellar/ccache/3.2.1/libexec/
cdunn2001

96

अब संकलित कमांड और लिंक कमांड के लिए एक लांचर के रूप में ccache को निर्दिष्ट करना संभव है (सेमीकेयर 2.8.0 के बाद से)। जो मेकफाइल और निंजा जनरेटर के लिए काम करता है। ऐसा करने के लिए, बस निम्नलिखित गुण सेट करें:

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)

केवल विशिष्ट निर्देशिका या लक्ष्य के लिए इन गुणों को सेट करना संभव है।

निंजा के लिए, यह संस्करण 3.4 के बाद से संभव है। XCode के लिए, क्रेग स्कॉट अपने जवाब में एक समाधान देता है।

संपादित करें: uprego और Lekensteyn की टिप्पणी के लिए धन्यवाद, मैंने यह जांचने के लिए जवाब दिया कि क्या लांचर के रूप में उपयोग करने से पहले ccache उपलब्ध है और जिसके लिए जनरेटर एक संकलित लांचर का उपयोग करना संभव है।

Edit2: @ ईमिलियो कोबोस ने लिंकिंग पार्ट के लिए ऐसा करने से बचने की सिफारिश की क्योंकि ccache लिंकिंग स्पीड में सुधार नहीं करता है और अन्य प्रकार के कैश के साथ गड़बड़ी कर सकता है।


कई साइटें जैसे डबलकॉट्स का उपयोग करते हुए अंतर्निहित सलाह देती हैं find_program(CCACHE_FOUND "ccache"), मुझे नहीं पता कि कौन सा अधिक पोर्टेबल है, मेरे माइलेज ने डबलकोट्स की आवश्यकता के बिना पूरी तरह से ठीक किया।
1737973

5
यह ध्यान देने योग्य है कि यह वर्तमान में केवल मेकफाइल जनरेटर के लिए काम करता है (सेमीकेप 3.3.2 के रूप में)। का मैनुअल पेज देखें cmake-properties
लेकेनस्टाइन

1
यह ध्यान देने योग्य है कि यह CTEST_USE_LAUNCHERS सेटिंग के साथ संघर्ष करता है। वे गुण यहां भी सेट किए गए हैं: github.com/Kitware/CMake/blob/master/Modules/…
पर्पलकरोट

मुझे लगता है कि आप के लिए कोड को बदलने के लिए चाहते हो सकता है यह एक (छोड़कर, के अंदर से निकालने के पाठendif() ) । सुधार हैं: 1. इसे अक्षम करने के लिए एक कॉन्फ़िगरेशन विकल्प है, और 2. बाहर मुड़ता है, इस तरह से उपयोग किए जाने पर मेक बैकेंड में जीसीसी / क्लैंग से रंग गायब हो जाते हैं। ninjaबैकएंड जोड़कर उसके चारों ओर काम करता है -fdiagnostics-color, विकल्प तो यह के लिए ऐसा करने के लिए सलाह दी जाती है makeभी बैकएंड।
हाय-एंजेल

94

CMAKE 3.4 के अनुसार आप कर सकते हैं:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache

1
और -DCMAKE_CXX_COMPILER_LAUNCHER=ccache। ये खूबसूरती से काम करते हैं! मुझे नहीं पता कि क्यों सीमेकclang से खोजने पर जोर दिया जाता है /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc(इसलिए सिमलिंक ट्रिक काम नहीं करती है), बजाय से $PATH, लेकिन आपका जवाब वैसे भी काम करता है।
cdunn2001

2
यह सबसे अच्छा जवाब होना चाहिए। पथ चर और संकलक सहानुभूति के साथ और अधिक खिलवाड़ नहीं!
एलिया बी।

1
मैंने यह कोशिश की, लेकिन यह सिर्फ मुझे "ccache: त्रुटि: त्रुटि देता है: पुनरावर्ती मंगलाचरण (ccache बाइनरी का नाम" ccache ") होना चाहिए"। वर्बोज़ ट्रेस को देखते हुए, यह "/ usr / स्थानीय / बिन / ccache ccache / usr / bin / c ++" चलाने की कोशिश कर रहा है ...
Chris Dodd

3
यह RULE_LAUNCH_COMPILE के साथ कैसे इंटरैक्ट करता है?
त्रास 3

10

CMake 3.1 से, Xcode जनरेटर के साथ ccache का उपयोग करना संभव है और निंजा CMake 3.4 पर से समर्थित है। निंजा RULE_LAUNCH_COMPILEयूनिक्स मेकफाइल्स जनरेटर की तरह ही सम्मान करेगा (इसलिए @ बाबूल का जवाब आपको निंजा के लिए भी मिलता है), लेकिन एक्सकोड जनरेटर के लिए ccache काम करना थोड़ा अधिक काम करता है। निम्नलिखित लेख विस्तार से विधि की व्याख्या करता है, एक सामान्य कार्यान्वयन पर ध्यान केंद्रित करना जो सभी तीन सीएमके जनरेटर के लिए काम करता है और ccache symlinks या उपयोग किए गए अंतर्निहित संकलक को स्थापित करने के बारे में कोई धारणा नहीं बनाता है (यह अभी भी CMake संकलक तय करने देता है:

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

लेख का सामान्य सार इस प्रकार है। आपकी CMakeLists.txtफ़ाइल की शुरुआत कुछ इस तरह से होनी चाहिए:

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

दो स्क्रिप्ट टेम्पलेट फ़ाइलें launch-c.inऔर launch-cxx.inइस तरह दिखती हैं (वे CMakeLists.txtफ़ाइल के समान निर्देशिका में होनी चाहिए ):

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

उपरोक्त RULE_LAUNCH_COMPILEयूनिक्स मेकफाइल्स और निंजा के लिए अकेले उपयोग करता है , लेकिन Xcode जनरेटर के लिए यह CMake के CMAKE_XCODE_ATTRIBUTE_...चर समर्थन से मदद पर निर्भर करता है । की स्थापना CCऔर CXXउपयोगकर्ता परिभाषित Xcode संकलक कमान और नियंत्रण करने के लिए जिम्मेदार बताते हैं LDऔर LDPLUSPLUSलिंकर आदेश के लिए, जहाँ तक मैं बता सकता हूँ, Xcode परियोजनाओं की एक दस्तावेज सुविधा है, लेकिन यह काम करने के लिए प्रतीत होता है नहीं है। यदि कोई पुष्टि कर सकता है कि यह आधिकारिक तौर पर Apple द्वारा समर्थित है, तो मैं लिंक किए गए लेख और इस उत्तर को उसी के अनुसार अपडेट करूंगा।


मुझे set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}") set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")उल्लिखित लेख से भी आवश्यकता थी ।
जॉर्न रीमरेड्स

अनुस्मारक के लिए धन्यवाद, मैंने LD और LDPLUSPLUS को शामिल करने के लिए उत्तर अपडेट किया है।
क्रेग स्कॉट

ccache VS संकलक का समर्थन नहीं करता है, इसलिए आप इसके लिए इसका उपयोग नहीं कर सकते। क्लैचे नामक एक परियोजना है जिसका उद्देश्य वीएस के लिए समान कार्यक्षमता प्रदान करना है, लेकिन मैं इस पर टिप्पणी नहीं कर सकता कि यह कितनी अच्छी तरह काम करता है।
क्रेग स्कॉट

9

मैं से एक सिमलिंक स्थापित करने के लिए पसंद नहीं आया g++करने के लिए ccache। और CXX="ccache g++"मेरे लिए काम नहीं किया क्योंकि कुछ cmake परीक्षण के मामले में विशेषताओं के बिना बस संकलक कार्यक्रम करना चाहता था।

इसलिए मैंने इसके बजाय एक छोटी सी बैश स्क्रिप्ट का उपयोग किया:

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

और इसे एक निष्पादन योग्य के रूप में सहेजा गया /usr/bin/ccache-g++

फिर C /usr/bin/ccache-g++++ कंपाइलर के रूप में उपयोग करने के लिए C कॉन्फ़िगर किया गया cmake । इस तरह यह cmake परीक्षण के मामलों से गुजरता है और मैं सहानुभूति रखने से अधिक आरामदायक महसूस करता हूं कि मैं 2 या 3 सप्ताह में भूल सकता हूं और फिर शायद आश्चर्य हो कि कुछ काम नहीं करता है ...


5

मेरी राय में सबसे अच्छा तरीका है कि सीक्ले को gcc, g ++ को सीलिंक करें, लेकिन यदि आप cmake के भीतर उपयोग करना चाहते हैं, तो यह कोशिश करें:

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

5

मैंने निम्नलिखित कार्यों को सत्यापित किया (स्रोत: यह लिंक ):

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

अपडेट : मुझे बाद में एहसास हुआ कि यह भी काम नहीं करता है। अजीब तरह से यह हर वैकल्पिक समय पर काम करता है (अन्य समय सीमेक शिकायत करता है)।


4

मुझे एक महत्वपूर्ण वस्तु जोड़ने दें जिसका उल्लेख यहां पहले नहीं किया गया था।

Ubunutu: 18.04 docker छवि से एक न्यूनतर बिल्ड सिस्टम बूटस्ट्रैपिंग करते समय, मैंने पाया है कि इंस्टॉलेशन के आदेश से फर्क पड़ता है।

मेरे मामले में ccache ने कॉल करते समय ठीक काम किया gcc, लेकिन अन्य नामों से उसी कंपाइलर के इनवॉइस को पकड़ने में विफल रहा: ccऔर c++। Ccache को पूरी तरह से स्थापित करने के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि सभी संकलक पहले स्थापित हैं, या सुरक्षित होने के लिए अपडेट-ccache सिमिलिंक में कॉल जोड़ें।

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

... और फिर (अद्यतन सहानुभूति के कारण) भी cc और c ++ को कॉल करता है!


धन्यवाद मुझे पता नहीं था update-ccache-symlinks, मैं c++किसी प्रोजेक्ट के लिए स्क्रिप्ट के साथ लिंक बना रहा था और यह काम कर रहा था लेकिन किसी अन्य प्रोजेक्ट के लिए नहीं (फिर भी पता नहीं क्यों, लिंक ठीक था), update-ccache-symlinksहल किया।
एलेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.