सेमीक को कॉल करने से पहले अधिलेखित न करें CMAKE_C_COMPILER, लेकिन निर्यात CC(और CXX) करें:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
निर्यात केवल एक बार किया जाना चाहिए, पहली बार जब आप परियोजना को कॉन्फ़िगर करते हैं, तो उन मूल्यों को सीएमके कैश से पढ़ा जाएगा।
अद्यतन : अब CMAKE_C(XX)_COMPILERजेक की टिप्पणी के बाद ओवरराइडिंग क्यों नहीं पर स्पष्टीकरण
मैं CMAKE_C(XX)_COMPILERदो मुख्य कारणों के लिए मूल्य को ओवरराइड करने के खिलाफ सलाह देता हूं : क्योंकि यह सीएमके कैश के साथ अच्छा नहीं खेलेगा और क्योंकि यह कंपाइलर चेक और टूलिंग डिटेक्शन को तोड़ता है।
setकमांड का उपयोग करते समय , आपके पास तीन विकल्प हैं:
- कैश के बिना, एक सामान्य चर बनाने के लिए
- कैश के साथ, कैश्ड वैरिएबल बनाने के लिए
- कैश को बल दें, कॉन्फ़िगर करते समय हमेशा कैश मान को मजबूर करने के लिए
आइए देखें कि तीन संभावित कॉल के लिए क्या होता है set:
बिना कैश के
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
ऐसा करते समय, आप एक "सामान्य" चर बनाते CMAKE_C(XX)_COMPILERहैं जो उसी नाम के कैश चर को छुपाता है। इसका मतलब है कि आपका कंपाइलर अब आपकी बिल्ड स्क्रिप्ट में हार्ड-कोडेड है और आप इसे कस्टम वैल्यू नहीं दे सकते। यदि आपके पास अलग-अलग संकलक के साथ कई बिल्ड वातावरण हैं तो यह एक समस्या होगी। जब भी आप एक अलग संकलक का उपयोग करना चाहते हैं तो आप हर बार अपनी स्क्रिप्ट को अपडेट कर सकते हैं, लेकिन यह पहली बार में सीएमके का उपयोग करने के मूल्य को हटा देता है।
ठीक है, तो, चलो कैश अद्यतन करें ...
कैश के साथ
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
यह संस्करण सिर्फ "काम नहीं करेगा"। CMAKE_C(XX)_COMPILERचर जब तक आप इसे मजबूर तो यह अपडेट नहीं होगा कैश में पहले से ही है।
आह ... चलो बल का उपयोग करें, फिर ...
फोर्स कैश
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
यह लगभग "सामान्य" चर संस्करण के समान है, एकमात्र अंतर यह है कि आपके मूल्य को कैश में सेट किया जाएगा, ताकि उपयोगकर्ता इसे देख सकें। लेकिन किसी भी परिवर्तन को setकमांड द्वारा अधिलेखित किया जाएगा ।
संकलक जांच और टूलींग को तोड़ना
कॉन्फ़िगरेशन प्रक्रिया के प्रारंभ में, CMake संकलक पर जाँच करता है: क्या यह काम करता है? क्या यह निष्पादन योग्य वस्तुओं का उत्पादन करने में सक्षम है? आदि यह संकलक का उपयोग संबंधित उपकरणों, जैसे arऔर का पता लगाने के लिए भी करता है ranlib। जब आप एक स्क्रिप्ट में कंपाइलर मान को ओवरराइड करते हैं, तो यह "बहुत देर हो चुकी है", सभी चेक और डिटेल्स पहले ही हो चुके हैं।
उदाहरण के लिए, डिफ़ॉल्ट कंपाइलर के रूप में gcc के साथ मेरी मशीन पर, setकमांड का उपयोग करते समय /usr/bin/clang, arपर सेट किया गया है /usr/bin/gcc-ar-7। CMake चलाने से पहले निर्यात का उपयोग करते समय इसे सेट किया जाता है /usr/lib/llvm-3.8/bin/llvm-ar।
/optबजाय वैकल्पिक gcc संस्करण को स्थापित करना एक अच्छा अभ्यास है/usr/local। अधिमानतः/opt/gcc-x.y.z। इस तरह, यदि आपको एक और भी नए संस्करण की आवश्यकता है, तो आपको पहले वाले को अनइंस्टॉल करने में कोई परेशानी नहीं होगी।