সিএমকেতে, সংকলকটি বাজে থাকলে আমি কীভাবে পরীক্ষা করতে পারি?


151

আমাদের ক্রস-প্ল্যাটফর্ম সিএমকে বিল্ড স্ক্রিপ্টগুলির একটি সেট রয়েছে এবং আমরা ভিজ্যুয়াল সি ++ এবং জিসিসি সহ বিল্ডিং সমর্থন করি ।

আমরা খুঁজে চেষ্টা করছেন ঝনঝন , কিন্তু আমি কিভাবে পরীক্ষা চিন্তা করতে পারে না থাকুক বা না থাকুক কম্পাইলার আমাদের CMake স্ক্রিপ্ট ঝনঝন হয়।

সংকলকটি বাজে বা না তা দেখার জন্য আমার কী পরীক্ষা করা উচিত? আমরা বর্তমানে যথাক্রমে ভিজ্যুয়াল সি ++ এবং জিসিসির জন্য MSVCএবং ব্যবহারের CMAKE_COMPILER_IS_GNU<LANG>জন্য ব্যবহার করছি ।


আপনি CMAKE_C_COMPILER এবং CMAKE_CXX_COMPILER কে ঝাঁকুনি বা ঝাঁকুনির পথে ++ সেট করে সংকলক সেট করতে পারেন। ঝাঁকুনির জন্য +1
জাফি 19

কেন আপনার যত্ন করা উচিত?
সংঘাতের

2
@ বেসাইলস্টারিঙ্কেভিচ যেহেতু আমরা এমএসভিসিকে সমর্থন করেছি, তাই আমাদের কলং সনাক্তকরণ প্রয়োজন ছিল যাতে আমরা জিসিসির মতো বিকল্পগুলি, বা এমএসভিসির মতো বিকল্পগুলি চালু করতে পারি কিনা তা জানতাম। আমার মনে রাখার জন্য এটি অনেক দীর্ঘ হয়েছে, তবে এটি অবশ্যই সম্ভব যে আমরা ঝুঁকির দ্বারা সমর্থিত বিকল্পগুলিও ব্যবহার করছিলাম।
leedm777

1
@BasileStarynkevitch - ঝনঝন ছলে উভয় হতে __GNUC__এবং _MSC_VER, কিন্তু এটা হয় কম্পাইলার হিসাবে একই প্রোগ্রাম গ্রাস করতে পারবে না। কোড সংকলন এবং প্রত্যাশা অনুযায়ী সম্পাদন করা নিশ্চিত করার জন্য এলএলভিএম কলং এবং অ্যাপল কলং সনাক্তকরণ অত্যন্ত গুরুত্বপূর্ণ is আমি ক্ল্যাংয়ের বিএস মোকাবেলা করে খুব ক্লান্ত হয়ে পড়েছি আমরা উইন্ডোজের কম্পাইলটি কেবল ভেঙে ফেলেছি । আমরা ব্যবহারকারীদের এলএলভিএম-তে অভিযোগ করার নীতি গ্রহণ করেছি যাতে কলং ডেভস তাদের আচরণ পরিবর্তন করে change এছাড়াও দেখুন কীভাবে অন্যান্য সংকলক হওয়ার ভান করা বন্ধ করতে ক্ল্যাংকে বলবেন?
jww

উত্তর:


242

একটি নির্ভরযোগ্য চেক হল CMAKE_<LANG>_COMPILER_IDভেরিয়েবলগুলি ব্যবহার করা । যেমন, সি ++ সংকলকটি পরীক্ষা করতে:

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()

এগুলি সঠিকভাবে কাজ করে যদি সিসিচের মতো সংকলক মোড়ক ব্যবহার করা হয়।

সিএমকে ৩.০.০ হিসাবে CMAKE_<LANG>_COMPILER_IDঅ্যাপল-সরবরাহিত ঝাঁকুনির মান এখন AppleClang। অ্যাপল-সরবরাহিত কলং এবং নিয়মিত কলং উভয়ের জন্য পরীক্ষা করতে যদি শর্ত থাকে তবে:

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

আরো দেখুন AppleClang নীতি বর্ণনা

সিএমকে ৩.১৫ ক্ল্যাং- ক্লা এবং নিয়মিত ঝাঁকুনির সামনের প্রান্তের জন্য সমর্থন যোগ করেছে । আপনি ভেরিয়েবলটি পরীক্ষা করে সামনের প্রান্তের বৈকল্পটি নির্ধারণ করতে পারেন 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
সিএমকে ২.৮.১০ হিসাবে, এই পরিবর্তনশীলটি (অবশেষে!) নথিভুক্ত। দেখুন: 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পড়েছেন কেন আপনি বিশেষভাবে সনাক্ত করতে পারেন না , @ সাকরা ইঙ্গিত করেছেন যে এটি cmake 3.0.0মুক্তিAppleClang পেয়েছে । তবে, কেবলমাত্র cmake --versionসমান বা উচ্চতর প্রতিবেদনগুলি পর্যাপ্ত নয় - আপনার মানগুলি ব্যবহার cmake_minimum_required(VERSION 3.0.0)করার জন্য ক্রম 3.0.0করতে হবে!
svenevs

2

OGRE 3D ইঞ্জিন উত্স কোড নিম্নলিখিত চেক ব্যবহার করে :

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

3
এটি নিকটবর্তী, তবে আপনি যখন সিসিচি ব্যবহার করবেন না (যেমন, export CXX="ccache clang++")
leedm777

4
যথেষ্ট বন্ধ, আমি এটি আপনাকে দেব। আমি if ("${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" MATCHES ".*clang")সিসি কেস পরিচালনা করতাম।
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

-2

এটি সাকের উত্তর থেকে পরিবর্তিত চ্যামেক নতুনদের জন্য কিছুটা বিস্তারিত উত্তর, কেবল নিম্নলিখিত লাইনগুলিকে এতে যুক্ত করুন 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 .সিএমকেলিস্ট.টেক্সট যে ফোল্ডারে রয়েছে সেখানে চালান। তারপরে আপনি নিজের উত্তর সহ একগুচ্ছ আউটপুট দেখতে পাবেন।

...
-- Detecting CXX compile features
-- Detecting CXX compile features - done
GNU
-- Configuring done
-- Generating done
...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.