2010-06-28 16 views
24

मैं वर्तमान में कुछ परियोजनाओं के निर्माण के लिए सेमेक का उपयोग करने पर काम कर रहा हूं, मुख्य प्लेटफार्म विजुअल सी ++, मिनजीडब्ल्यू जीसीसी और लिनक्स जीसीसी के साथ। जीसीसी के साथ निर्माण करते समय, मुझे -Wno-invalid-offsetof कंपाइलर विकल्प निर्दिष्ट करने की आवश्यकता है।cmake में विभिन्न कंपाइलर्स के लिए विभिन्न कंपाइलर विकल्पों को कैसे लागू करें?

मेरे वर्तमान को ठीक करने के रूप में इस

if ( "${CMAKE_GENERATOR}" MATCHES "^Visual Studio" 
    OR "${CMAKE_GENERATOR}" MATCHES "^NMake" 
    ) 
    set (CPPLIB_COMPILER_OPTS "") 
else() 
    set (CPPLIB_COMPILER_OPTS "-Wno-invalid-offsetof") 
endif() 

... 

set_target_properties(sh_core PROPERTIES COMPILE_FLAGS "${CPPLIB_COMPILER_OPTS}") 
# repeated for all targets 

यह काम करता है, लेकिन यह सोचते हैं कि दृश्य स्टूडियो लोगों के अलावा अन्य सभी जनरेटर जीसीसी के साथ निर्माण करेगा स्पष्ट रूप से असुरक्षित है है ...। शुरुआत के लिए, बोर्लैंड कंपाइलर्स के लिए आईआईआरसी जेनरेटर हैं। सबसे महत्वपूर्ण बात यह है कि बनाने का उपयोग हमेशा जीसीसी का उपयोग नहीं करना है।

अन्य कंपाइलर्स जिन्हें मैं उपयोग करने की संभावना है, वे llvm-gcc और clang हैं। सौभाग्य से, मुझे लगता है कि यहां तक ​​कि क्लैंग जीसीसी-संगत विकल्पों का समर्थन करता है। लेकिन यह तर्क तब तक अच्छा है जब तक प्रासंगिक कोड कभी जारी नहीं किया जाता है।

सीमेक उपलब्ध कंपाइलरों के लिए जांच करने के लिए प्रतीत होता है और विशेष रूप से उस कंपाइलर के लिए मेकफ़ाइल उत्पन्न करता है (सवाल उठाना - कम से कम प्रोजेक्ट को सीधे बनाने का विकल्प क्यों नहीं है, बिना किसी मध्य-व्यक्ति की आवश्यकता के?)।

यह मामला होने के नाते, मैं उम्मीद कर रहा था कि मैं सीधे अपने सीएमके लिस्ट.txt फ़ाइलों में जीसीसी के लिए परीक्षण कर पाऊंगा। अभी तक, हालांकि, मुझे परीक्षण या किसी अन्य स्पष्ट समाधान के लिए उचित चर नहीं मिल रहा है।

क्या यह संभव है?

उत्तर

35

पोर्टेबल बिल्ड सिस्टम बनाने के लिए, प्लेटफ़ॉर्म के लिए परीक्षण नहीं करना सर्वोत्तम है, लेकिन सुविधाओं के परीक्षण के लिए सबसे अच्छा है।

"यदि विंडोज़ ऐसा करते हैं तो" परीक्षण करने के बजाय, "अगर -अन-अमान्य-ऑफसेट फ्लैग काम करता है तो इसका उपयोग करें"।

include(CheckCCompilerFlag) 
check_c_compiler_flag(-Wno-invalid-offsetof HAS_NO_INVALID_OFFSETOF) 
if (HAS_NO_INVALID_OFFSETOF) 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-invalid-offsetof") 
endif() 

सी के लिए ++ एक check_cxx_compiler_flag(flag var) आदेश के साथ एक समान CheckCXXCompilerFlag है: आप CheckCCompilerFlag मॉड्यूल, उदाहरण के लिए के साथ ऐसा कर सकते हैं।

+1

यह सही है! एक अप्रासंगिक बात, यद्यपि ... सी के लिए विकल्प की जांच करने के लिए बहुत अधिक बिंदु नहीं है, क्योंकि सी में अमान्य ऑफसेट के रूप में ऐसी कोई चीज़ नहीं है - यह केवल सी ++ में होती है। – Steve314

+0

मुझे यह नहीं पता था। असल में मुझे नहीं पता था कि विकल्प क्या था, लेकिन यह सही समझ में आता है, क्योंकि सी में केवल पीओडी प्रकार हैं http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html। और सीएमके अपने परीक्षण के दौरान संकलक चेतावनी को अनदेखा करता है - "अगर यह संकलित करता है तो यह काम करता है"। – richq

+0

क्या विकल्पों के संयोजन की जांच करने का कोई तरीका है? इसके अलावा मैं कोई संकलन-समय चेतावनी सुनिश्चित करना चाहता था इसलिए चेतावनियों की जांच करने का एक तरीका तलाश रहा था। – thoni56

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