2012-03-03 5 views
18

ऐसा लगता है कि सीएमके अपने विचार में काफी हद तक फैला हुआ है कि सभी सी ++ स्रोत फ़ाइलों के लिए एक और केवल एक, CMAKE_CXX_COMPILER होना चाहिए। मुझे प्रति-लक्षित आधार पर इसे ओवरराइड करने का कोई तरीका नहीं मिल रहा है। यह अंतर्निहित सीएमके सुविधाओं के साथ एक ही CMakeLists.txt में होस्ट-एंड-क्रॉस संकलन का मिश्रण बनाता है।उसी भाषा के लिए एकाधिक कंपाइलर्स के साथ सीएमके का उपयोग

तो, मेरा प्रश्न है: एक ही भाषा के लिए एकाधिक कंपाइलर्स का उपयोग करने का सबसे अच्छा तरीका क्या है (यानी सी ++)?

उत्तर

12

यह CMake के साथ ऐसा करना असंभव है।

सीएमके केवल संकलक गुणों का एक सेट रखता है जिसे CMakeLists.txt फ़ाइल में सभी लक्ष्यों द्वारा साझा किया जाता है। यदि आप दो कंपाइलर्स का उपयोग करना चाहते हैं, तो आपको दो बार सीएमके चलाने की जरूरत है। यह भी उदाहरण के लिए सच है एक ही कंपाइलर टूलचेन से 32 बिट और 64 बिट बाइनरी का निर्माण।

इस के आसपास त्वरित और गंदा तरीका कस्टम आदेशों का उपयोग करते है। लेकिन फिर आप मूल रूप से गौरवशाली शैल-स्क्रिप्ट्स के साथ समाप्त होते हैं, जो शायद आप नहीं चाहते हैं।

स्वच्छ समाधान है: उन्हें उसी CMakeLists.txt में न रखें! आप वैसे भी विभिन्न आर्किटेक्चर के बीच लिंक नहीं कर सकते हैं, इसलिए उन्हें एक ही फाइल में होने की आवश्यकता नहीं है। आप अलग-अलग फाइलों और include() में सीएमके स्क्रिप्ट के सामान्य हिस्सों को पुन: सक्रिय करके अनावश्यकता को कम कर सकते हैं।

यहां मुख्य नुकसान यह है कि आप एक ही कमांड के साथ निर्माण करने की क्षमता खो देते हैं, लेकिन आप इसे अपनी पसंदीदा स्क्रिप्टिंग भाषा में एक रैपर लिखकर हल कर सकते हैं जो विभिन्न सीएमके-मेकफ़ाइल को कॉल करने का ख्याल रखता है।

+2

ऐसा लगता है कि add_directory (other_build_kind_folder) एक कस्टम रैपर बनाने के विरोध में एक संभावना है, क्योंकि मैं यही कर रहा हूं और ऐसा लगता है। :-) – cdleary

+2

@cdleary क्या आप यह स्पष्ट कर सकते हैं कि यह कैसे काम करता है? 'Add_subdirectory' (या आप वास्तव में 'add_directory'' का अर्थ कैसे रखते हैं?) आपको टूलचेन्स स्विच करने की अनुमति देता है? –

+1

वाह, यह वास्तव में सच में कुछ बुरा डिजाइन ... –

3

आप ExternalProject को देखने के लिए चाहते हो सकता है: यहाँ https://github.com/Sarcasm/cmake-superbuild जो कॉन्फ़िगर कर देगा की तरह टेम्पलेट किसी तरह का उपयोग करके एक सुपर निर्माण के रूप में अपनी परियोजना के निर्माण,: http://www.kitware.com/media/html/BuildingExternalProjectsWithCMake2.8.html

0

@Bill हॉफमैन जवाब विस्तार करने के लिए दोनों निर्भरताओं और आपकी परियोजना को बाहरी प्रोजेक्ट के रूप में (स्टैंडअलोन सेमेक कॉन्फ़िगर/बिल्ड/इंस्टॉलेशन पर्यावरण)।

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