2015-09-24 2 views
6

के साथ कंपाइलर उपसर्ग कमांड का उपयोग करना ऐसी सुविधाएं हैं जो एक उपसर्ग के रूप में कमांड जोड़कर मौजूदा कंपाइलर का उपयोग करती हैं (इसलिए cc -c file.c पर कॉल करने के बजाय आप distcc cc -c file.c पर कॉल कर सकते हैं)।सीएमके (distcc, ccache)

सीएमके का उपयोग करते समय संकलक कमांड को बदला जा सकता है, हालांकि मैं distcc का उपयोग करने की समस्याओं में भाग गया, हालांकि यह संकलक (ccache भी) के किसी भी कमांड उपसर्ग पर लागू होगा।

/usr/bin/distcc /usr/bin/cc is not a full path to an existing compiler tool.

  • /usr/bin/distcc और
    CMAKE_C_COMPILER_ARG1 या CMAKE_C_FLAGS को संकलक की स्थापना शुरू करने के लिए:

    • CMake उम्मीद संकलक एक निरपेक्ष पथ होने के लिए,
      तो /usr/bin/distcc /usr/bin/cc को CMAKE_C_COMPILER की स्थापना, एक त्रुटि देता है /usr/bin/cc कुछ मामलों में काम करता है, लेकिन CHECK_C_SOURCE_COMPILES
      के साथ विफल रहता है (यदि चेक किया गया है इस का समर्थन करने का कोई तरीका था, यहां तक ​​कि CMAKE_REQUIRED_FLAGS उपसर्ग भी काम नहीं कर रहा था)


    एक ही तरीका है मैं यह करने के लिए मिला एक खोल स्क्रिप्ट में कमांड रैप करने के लिए है।

    #!/bin/sh 
    exec /usr/bin/distcc /usr/bin/cc "[email protected]" 
    

    हालांकि यह काम करता है, यह CMake साथ संकलक सहायकों उपयोग करने के लिए हालांकि शेल स्क्रिप्ट जाना (कुछ छोटे भूमि के ऊपर दे रही है जब निर्माण प्रणाली सिर्फ एक आदेश उपसर्ग इस्तेमाल कर सकते हैं) बिना सक्षम होने के लिए अच्छा होगा।


    तो मेरे सवाल है:

    CMake (जैसे distcc के रूप में) संकलक उपसर्ग आदेशों का उपयोग कर सकते हैं सीधे ?, खोल स्क्रिप्ट रैपर के बिना?

  • +1

    अपने 'CC' /' CXX' वातावरण चर सेट कर रहा है जब cmake बुला (जैसे 'सीसी =" distcc जीसीसी " cmake ..') किसी कारण से अपर्याप्त? –

    +0

    @ इस्कार जराक, यह काम करता है! (इसलिए मुझे लगता है कि यह जवाब हो सकता है)। दिलचस्प बात यह है कि आंतरिक रूप से पहले कमांड के लिए 'CMAKE_C_COMPILER' और दूसरे के लिए' CMAKE_C_COMPILER_ARG1' का उपयोग किया जाता है। मुझे यकीन नहीं है कि क्या चल रहा है - क्योंकि मैंने पहले से ही cmake-gui में इसे सेट करने का प्रयास किया था और 'CHAKK_C_SOURCE_COMPILES'' के साथ 'CMAKE_C_COMPILER_ARG1' को अनदेखा किया जा रहा था। – ideasman42

    +0

    खुशी है कि यह काम करता है। पर्यावरण परिवर्तक को सेट करना शायद कुछ अन्य चीजों को भी सेट करता है, जो चीजें 'CHECK_C_SOURCE_COMPILES' उपयोग करती हैं ... हालांकि मैं 100% नहीं हूं ... यही कारण है कि सीएमके में व्यक्तिगत चर के साथ गड़बड़ करना गर्दन में इतना दर्द है। –

    उत्तर

    8

    CMake 3.4.0 के बाद से CMAKE_<LANG>_COMPILER_LAUNCHER परिवर्तनीय और संबंधित लक्ष्य संपत्ति <LANG>_COMPILER_LAUNCHER है। इसलिए यदि आपके परियोजना सी ही आप की तरह कुछ करना होगा है:

    cmake -DCMAKE_C_COMPILER_LAUNCHER=ccache /path/to/source 
    CCACHE_PREFIX=distcc make -j`distcc -j` 
    

    आप एक सी ++ परियोजना है, तो -DCMAKE_CXX_COMPILER_LAUNCHER=ccache का उपयोग करें।

    या, अपने CMakeLists.txt स्मार्ट बनाने के लिए और स्वचालित रूप से ccache का उपयोग करता है, तो यह पाया जा सकता है:

    #----------------------------------------------------------------------------- 
    # Enable ccache if not already enabled by symlink masquerading and if no other 
    # CMake compiler launchers are already defined 
    #----------------------------------------------------------------------------- 
    find_program(CCACHE_EXECUTABLE ccache) 
    mark_as_advanced(CCACHE_EXECUTABLE) 
    if(CCACHE_EXECUTABLE) 
        foreach(LANG C CXX) 
        if(NOT DEFINED CMAKE_${LANG}_COMPILER_LAUNCHER AND NOT CMAKE_${LANG}_COMPILER MATCHES ".*/ccache$") 
         message(STATUS "Enabling ccache for ${LANG}") 
         set(CMAKE_${LANG}_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE} CACHE STRING "") 
        endif() 
        endforeach() 
    endif() 
    
    +0

    सीएमके दस्तावेज़ों के अनुसार, ' _COMPILER_LAUNCHER' लक्ष्य संपत्ति केवल मेकफ़ाइल और निंजा जेनरेटर द्वारा सम्मानित की जाएगी। लॉन्चर का उपयोग करने के लिए आपको एक्सकोड प्राप्त करने के लिए और अधिक काम करना होगा। [यह उत्तर] देखें (http://stackoverflow.com/a/36515503/1938798) एक और सामान्य विधि के लिए जो पुराने RULE_LAUNCH_COMPILE चर और CMAKE_XCODE_ATTRIBUTE _.. का उपयोग करता है, लेकिन आपके दृष्टिकोण के समानताएं हैं। –

    +0

    अफसोस की बात है, सीएमएचक्यू _COMPILER_LAUNCHER को नवीनतम cmake (3.10.1) के साथ भी CHECK_ _SOURCE_COMPILES में अनदेखा किया गया है। इसका मतलब है कि परीक्षण परिणाम अभी भी आवश्यक है यदि परीक्षण परिणाम लॉन्चर पर निर्भर करता है। – proski