2009-11-29 8 views
68

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

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

युक्त स्क्रिप्ट लिखने की कोशिश की, लेकिन यह काम करने के लिए प्रतीत नहीं होता है (कर चल अभी भी ccache का उपयोग नहीं करता है, मैं इस का उपयोग कर CMAKE_VERBOSE_MAKEFILE पर जाँच)।

अद्यतन:

प्रति this link जैसा कि मैंने मेरी स्क्रिप्ट को बदलने की कोशिश की

 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 (जो उम्मीद की जा सकती) के प्रयोग पर विफल रही है बाहर bails।

+4

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

+1

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

उत्तर

51

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

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

+0

वाह, यह लगभग सही है। –

+8

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

+2

@ Gui13: PATH को अपडेट करने से बेहतर होगा cmake को स्पष्ट रूप से बताएं कि जीसीसी का उपयोग करना चाहिए, उदाहरण के लिए cmake -DCMAKE_CXX_COMPILER =/usr/lib/ccache/bin/g ++ – cib

6

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

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

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

3

मेरी राय में सबसे अच्छा तरीका है जीसीसी सिमलिंक के लिए, जी ++ ccache है, लेकिन अगर आप cmake भीतर उपयोग करना चाहते हैं, इस प्रयास करें:

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

मैं g++ से ccache से एक सिम्लिंक सेट करना पसंद नहीं करता था। और CXX="ccache g++" मेरे लिए काम नहीं किया क्योंकि कुछ सेमेक टेस्ट केस केवल गुणों के बिना कंपाइलर प्रोग्राम रखना चाहते थे।

तो मैं बजाय एक छोटे से बैश स्क्रिप्ट का प्रयोग किया:

#!/bin/bash 
ccache g++ "[email protected]" 

और /usr/bin/ccache-g++ में एक निष्पादन योग्य के रूप में यह बचा लिया।

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

70

अब निर्दिष्ट करना संभव है संकलन आदेश और लिंक कमांड के लिए लॉन्चर के रूप में ccache (cmake 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) 
endif(CCACHE_FOUND) 

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

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

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

+0

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

+4

यह ध्यान देने योग्य है कि यह वर्तमान में केवल मेकफ़ाइल जनरेटर के लिए काम करता है (cmake 3.3.2 के रूप में)। 'Cmake-Properties' का मैन्युअल पृष्ठ देखें। – Lekensteyn

7

सीएमके 3.1 से, एक्सकोड जनरेटर के साथ सीसीएच का उपयोग करना संभव है और निंजा को सीएमके 3.4 से आगे समर्थित है। निंजा RULE_LAUNCH_COMPILE का सम्मान करेगा, जैसे यूनिक्स मेकफ़ाइल जनरेटर (इसलिए @ बाबाकोल का जवाब आपको निंजा के लिए भी ले जाता है), लेकिन एक्सकोड जनरेटर के लिए काम कर रहे सीसीएसी को थोड़ा और काम करना पड़ता है। निम्न आलेख विस्तार से विधि बताते हैं, एक सामान्य कार्यान्वयन जो सभी तीन CMake जनरेटर के लिए काम करता है पर ध्यान केंद्रित और ccache सिमलिंक स्थापित करने के बारे में कोई धारणा बनाने या अंतर्निहित इस्तेमाल किया संकलक (यह अभी भी 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 और (वे CMakeLists.txt फ़ाइल के रूप में एक ही निर्देशिका में होना चाहिए) launch-cxx.in देखो इस तरह:

launch-c.in:

#!/bin/sh 
export CCACHE_CPP2=true 
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "[email protected]" 

launch-cxx.in:

#!/bin/sh 
export CCACHE_CPP2=true 
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "[email protected]" 

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

+0

मुझे उल्लिखित आलेख से 'सेट (CMAKE_XCODE_ATTRIBUTE_LD "$ {CMAKE_C_COMPILER}") सेट (CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "$ {CMAKE_CXX_COMPILER}") की भी आवश्यकता है। –

+0

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

28

CMake 3.4 के रूप में आप कर सकते हैं:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache 
+0

और '-DCMAKE_CXX_COMPILER_LAUNCHER = ccache'। ये खूबसूरती से काम करते हैं! मुझे नहीं पता कि क्यों ** सेमेक ** '/ अनुप्रयोग/एक्सकोड/ऐप/सामग्री/डेवलपर/टूलचेन्स/एक्सकोडडिफॉल्ट.एक्सक्टूलचेन/यूएसआर/बिन/सीसी' से 'क्लैंग' ढूंढने पर जोर देता है (इसलिए सिम्लिंक चाल काम नहीं करती है) , '$ पाथ 'की बजाय, लेकिन आपका उत्तर वैसे भी काम करता है। – cdunn2001

संबंधित मुद्दे