सीएमके में, संकलक क्लेंग है तो मैं कैसे परीक्षण कर सकता हूं?


151

हमारे पास क्रॉस-प्लेटफ़ॉर्म सीएमके बिल्ड स्क्रिप्ट्स का एक सेट है , और हम विज़ुअल सी ++ और जीसीसी के साथ बिल्डिंग का समर्थन करते हैं ।

हम क्लैंग को आज़मा रहे हैं , लेकिन मैं यह पता नहीं लगा सकता कि कैसे कंपाइलर हमारे CMake स्क्रिप्ट के साथ क्लैंग का परीक्षण कर रहा है या नहीं।

मुझे यह देखने के लिए परीक्षण करना चाहिए कि संकलक क्लैंग है या नहीं? हम वर्तमान में क्रमशः Visual C ++ और GCC के लिए उपयोग कर रहे हैं MSVCऔर CMAKE_COMPILER_IS_GNU<LANG>परीक्षण कर रहे हैं।


आप क्लेक या क्लैंग ++ के पथ पर CMAKE_C_COMPILER और CMAKE_CXX_COMPILER सेट करके कंपाइलर सेट कर सकते हैं। क्लेंग के लिए +1।
ज़फी

आपको क्यों परवाह करनी चाहिए? क्लैंग बहुत जीसीसी है, जैसे स्वीकृत संकलक विकल्पों के मामले में ...
बेसिल स्टायरनेविच

2
@BasileStarynkevitch चूंकि हमने MSVC का समर्थन किया है, इसलिए हमें क्लैंग का पता लगाने की आवश्यकता थी ताकि हम जान सकें कि क्या GCC- जैसे विकल्पों को चालू करना है, या MSVC जैसे विकल्पों को। यह मुझे याद करने के लिए बहुत लंबा है, लेकिन यह भी निश्चित रूप से संभव है कि हम क्लैंग द्वारा समर्थित विकल्पों का उपयोग नहीं कर रहे थे।
leedm777

1
@BasileStarynkevitch - बजना दिखावा दोनों होने के लिए __GNUC__और _MSC_VERहै, लेकिन यह या तो संकलक के रूप में ही कार्यक्रमों का उपभोग नहीं कर सकते हैं। एलएलवीएम क्लैंग और एप्पल क्लेंग का पता लगाना कोड संकलन और उम्मीद के अनुसार निष्पादित करने के लिए महत्वपूर्ण है। मैं क्लैंग के बीएस से निपटने के लिए बहुत थक गया हूँ हम सिर्फ विंडोज पर संकलन तोड़ते हैं । हमने उपयोगकर्ताओं को LLVM से शिकायत करने की नीति अपनाई है ताकि क्लैंग देव अपने व्यवहार को बदल दें। यह भी देखें कि अन्य संकलक होने के बहाने क्लैंग को कैसे रोकें?
jww

जवाबों:


242

एक विश्वसनीय जाँच CMAKE_<LANG>_COMPILER_IDचर का उपयोग करना है। जैसे, C ++ कंपाइलर की जांच करना:

if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  # using Clang
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  # using GCC
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
  # using Intel C++
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
  # using Visual Studio C++
endif()

ये भी सही ढंग से काम करते हैं अगर एक संकलक आवरण जैसे ccache का उपयोग किया जाता है।

CMake 3.0.0 के रूप में Apple- CMAKE_<LANG>_COMPILER_IDप्रदान किए गए क्लैंग के लिए मान अब है AppleClang। Apple प्रदान की गई क्लैंग और नियमित क्लैंग दोनों के लिए परीक्षण करने के लिए निम्नलिखित दशा का उपयोग करें:

if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  # using regular Clang or AppleClang
endif()

AppleClang नीति विवरण भी देखें

CMake 3.15 ने क्लैंग-क्ल और नियमित क्लैंग फ्रंट एंड दोनों के लिए समर्थन जोड़ा है । आप चर का निरीक्षण करके फ्रंट एंड वेरिएंट का निर्धारण कर सकते हैं CMAKE_CXX_COMPILER_FRONTEND_VARIANT:

if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
    # using clang with clang-cl front end
  elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
    # using clang with regular front end
  endif()
endif()

Cmake प्रलेखन राज्यों "यह संकलक निर्धारित करने में इस्तेमाल किया है और परिवर्तन के अधीन है"। अन्यथा, यह एकदम सही होगा :-(
leedm777

17
सीएमके 2.8.10 के रूप में, यह चर (अंत में) प्रलेखित है। देखें: cmake.org/cmake/help/v2.8.10/…
निक हचिंसन

9
ध्यान दें कि CMAKE_CXX_COMPILER_IDचर केवल कमांड के बाद उपलब्ध है project(Foo CXX)
वाल्ड्रियस

5
और झंडे के लिए जो दोनों जीसीसी और क्लैंग स्वीकार करते हैं, मैं उपयोग करता हूंif (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()
फ्रेड शॉन

4
यदि आप भ्रमित हैं कि आप AppleClangविशेष रूप से क्यों नहीं पता लगा सकते हैं , तो @sakra यह दर्शाता है कि cmake 3.0.0जारी किया गयाAppleClang । हालाँकि, सिर्फ इसलिए कि इसके cmake --versionबराबर या अधिक की रिपोर्ट पर्याप्त नहीं है - आपको उपयोग किए जाने cmake_minimum_required(VERSION 3.0.0)वाले 3.0.0मानकों के लिए आदेश देना होगा!
स्वेवल्स

2

OGRE 3D इंजन स्रोत कोड निम्नलिखित जांच का उपयोग करता है :

if (CMAKE_CXX_COMPILER MATCHES ".*clang")
    set(CMAKE_COMPILER_IS_CLANGXX 1)
endif ()

3
यह करीब है, लेकिन जब आप ccache (यानी, export CXX="ccache clang++") का उपयोग नहीं करते हैं
leedm777

4
पर्याप्त बंद करो, मैं तुम्हें दे दूंगा। मैं if ("${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" MATCHES ".*clang")ccache केस को हैंडल करता था।
leedm777

1
यह मेरे लिए काम नहीं करता है ${CMAKE_CXX_COMPILER} == /Library/Developer/CommandLineTools/usr/bin/c++। स्वीकृत उत्तर काम करता है।
फ्रेड स्कोन

1

बस किसी भी गलत वर्तनी की समस्या से बचने के लिए, मैं केस-असंवेदनशील तुलना का उपयोग कर रहा हूं, जैसे:

string( TOLOWER "${CMAKE_CXX_COMPILER_ID}" COMPILER_ID )
if (COMPILER_ID STREQUAL "clang")
    set(IS_CLANG_BUILD true)
else ()
    set(IS_CLANG_BUILD false)
endif ()

MATCHESकेस-असंवेदनशील बनाने के लिए , मैंने सफलता के बिना यहाँ सब कुछ करने की कोशिश की (सीएमके में समर्थन नहीं लगता)।


वास्तव में, आज की स्थिति में, यह असंवेदनशील मिलान संभव नहीं है cmake.org/pipermail/cmake/2017-May/065432.html
fferri

-2

यह cmake newbies के लिए थोड़ा अधिक विस्तृत उत्तर है, जिसे sakra के उत्तर से संशोधित किया गया है, बस निम्नलिखित पंक्तियों को निम्नलिखित में जोड़ें CMakeLists.txt:

if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
  MESSAGE("Clang")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  MESSAGE("GNU")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
  MESSAGE("Intel")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  MESSAGE("MSVC")
endif()

फिर cmake .उस फ़ोल्डर में चलाएँ जहाँ CMakeLists.txt झूठ है। फिर आपको अपने उत्तर के साथ आउटपुट का एक गुच्छा दिखाई देगा।

...
-- Detecting CXX compile features
-- Detecting CXX compile features - done
GNU
-- Configuring done
-- Generating done
...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.