CMAKE_C_COMPILER
अधिलेखित न करें, लेकिन निर्यात CC
(और CXX
) बुला cmake से पहले:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
निर्यात केवल एक बार किया जाना है, पहली बार जब आप कॉन्फ़िगर की जरूरत है प्रोजेक्ट, फिर उन मानों को सीएमके कैश से पढ़ा जाएगा।
अद्यतन: क्योंकि यह CMake का कैश के साथ और क्योंकि यह अच्छी तरह से नहीं खेलेंगे: क्यों जेक की टिप्पणी
मैं दो मुख्य कारणों से 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
जैसे संबंधित उपकरणों का पता लगाने के लिए कंपाइलर का भी उपयोग करता है। जब आप किसी स्क्रिप्ट में कंपाइलर मान को ओवरराइड करते हैं, तो यह "बहुत देर हो चुकी है", सभी चेक और डिटेक्शन पहले से ही किए जा चुके हैं।
उदाहरण के लिए, डिफ़ॉल्ट संकलक के रूप में जीसीसी के साथ अपने मशीन पर, जब /usr/bin/clang
को set
आदेश का उपयोग, ar
/usr/bin/gcc-ar-7
को तैयार है। सीएमके चलाने से पहले निर्यात का उपयोग करते समय इसे /usr/lib/llvm-3.8/bin/llvm-ar
पर सेट किया गया है।
हाँ के लिए सही पथ चुनने की संभावना है, यह काम करता है! धन्यवाद @ गुइल्यूम! – tidy
आलसी के लिए समतुल्य, यदि उचित कंपाइलर आपके $ पाथ में सेट हैं: > निर्यात सीसी = 'जीसीसी > निर्यात सीXX =' जी ++ ' – gerardw
आलसी के लिए समतुल्य, यदि उचित कंपेलर आपके $ में सेट हैं पथ: 'निर्यात सीसी = \ 'जो जीसीसी \' निर्यात CXX = \ 'कौन सा g ++ \' ' – gerardw