সিএমকে ব্যবহার করে জিসিসি এবং কলং / এলএলভিএমের মধ্যে স্যুইচিং


269

আমার কাছে সিএমকে ব্যবহার করে বেশ কয়েকটি প্রকল্প নির্মিত হয়েছে এবং আমি তাদের সংকলন করতে খুব সহজেই জিসিসি বা কলং / এলএলভিএম ব্যবহারের মধ্যে স্যুইচ করতে সক্ষম হতে চাই। আমি বিশ্বাস করি (দয়া করে আমার ভুল হয়ে থাকলে আমাকে সংশোধন করুন!) যে ক্ল্যাংটি ব্যবহার করতে আমাকে নিম্নলিখিতগুলি সেট করতে হবে:

    SET (CMAKE_C_COMPILER             "/usr/bin/clang")
    SET (CMAKE_C_FLAGS                "-Wall -std=c99")
    SET (CMAKE_C_FLAGS_DEBUG          "-g")
    SET (CMAKE_C_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
    SET (CMAKE_C_FLAGS_RELEASE        "-O4 -DNDEBUG")
    SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")

    SET (CMAKE_CXX_COMPILER             "/usr/bin/clang++")
    SET (CMAKE_CXX_FLAGS                "-Wall")
    SET (CMAKE_CXX_FLAGS_DEBUG          "-g")
    SET (CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
    SET (CMAKE_CXX_FLAGS_RELEASE        "-O4 -DNDEBUG")
    SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")

    SET (CMAKE_AR      "/usr/bin/llvm-ar")
    SET (CMAKE_LINKER  "/usr/bin/llvm-ld")
    SET (CMAKE_NM      "/usr/bin/llvm-nm")
    SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
    SET (CMAKE_RANLIB  "/usr/bin/llvm-ranlib")

এগুলি এবং ডিফল্ট জিসিসি ভেরিয়েবলগুলির মধ্যে স্যুইচ করার কোনও সহজ উপায় কি પ્રાધાનিকভাবে প্রকল্প নির্দিষ্টের পরিবর্তে সিস্টেম-ভিত্তিক পরিবর্তন হিসাবে (যেমন কেবল সেগুলি প্রকল্পের সিএমকেলিস্ট.টেক্সটগুলিতে যুক্ত করা যায় না)?

এছাড়াও, llvm-*সিসিটির পরিবর্তে ক্ল্যাং ব্যবহার করে সংকলন করার সময় সিস্টেমের ডিফল্টগুলির চেয়ে প্রোগ্রামগুলি ব্যবহার করা কি প্রয়োজনীয় ? পার্থক্য কি?

উত্তর:


342

CMake সম্মান এনভায়রনমেন্ট ভেরিয়েবল CCএবং CXXব্যবহারের সি এবং সি ++ কম্পাইলার সনাক্ত উপর:

$ export CC=/usr/bin/clang
$ export CXX=/usr/bin/clang++
$ cmake ..
-- The C compiler identification is Clang
-- The CXX compiler identification is Clang

সংকলক নির্দিষ্ট পতাকাগুলি একটি সিস্টেমের প্রশস্ত সিএমকে ফাইলগুলিতে রেখে এবং CMAKE_USER_MAKE_RULES_OVERRIDEভেরিয়েবলটি নির্দেশ করে ওভাররাইড করা যায়। ~/ClangOverrides.txtনিম্নলিখিত বিষয়বস্তু সহ একটি ফাইল তৈরি করুন :

SET (CMAKE_C_FLAGS_INIT                "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG_INIT          "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL_INIT     "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE_INIT        "-O3 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")

SET (CMAKE_CXX_FLAGS_INIT                "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG_INIT          "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL_INIT     "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE_INIT        "-O3 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")

প্রত্যয়টি _INITসিএমকে *_FLAGSপ্রদত্ত মানের সাথে সম্পর্কিত ভেরিয়েবলকে আরম্ভ করতে দেবে । তারপরে cmakeনিম্নলিখিত উপায়ে প্রার্থনা করুন :

$ cmake -DCMAKE_USER_MAKE_RULES_OVERRIDE=~/ClangOverrides.txt ..

অবশেষে এলএলভিএম বাইনুটিলের ব্যবহারকে জোর করার জন্য, অভ্যন্তরীণ ভেরিয়েবলটি সেট করুন _CMAKE_TOOLCHAIN_PREFIX। এই পরিবর্তনশীল CMakeFindBinUtilsমডিউল দ্বারা সম্মানিত হয় :

$ cmake -D_CMAKE_TOOLCHAIN_PREFIX=llvm- ..

এই সব একসঙ্গে নির্বাণ আপনি যদি একটি শেল মোড়কের যা বিভিন্ন পরিবেশের সেট আপ লিখতে পারেন CCএবং CXXএবং তারপর পূজা cmakeউল্লিখিত পরিবর্তনশীল ওভাররাইড সঙ্গে।


1
আমি আপনার উত্তর এবং CMAKE_USER_MAKE_RULES_OVERRIDEকাজগুলি বাদে সমস্ত কিছু অনুসরণ করেছি । দেখে মনে হচ্ছে ফাইলটি উপেক্ষা করা হচ্ছে (অর্থাত্ ওভাররাইড ফাইলে CMAKE_C_FLAGS_RELEASEসেট থাকা সত্ত্বেও -O4, এটি -O3 -DNDEBUGসিমেকে ডিফল্ট মান দেখাচ্ছে )।
রেজি

18
নোট করুন যে এই তথ্যটির বেশিরভাগ অংশ আপনার বিল্ড ট্রি এর শীর্ষ স্তরের সিএমকেকচে। টেক্সট ফাইলটিতে ক্যাশে করা হয়েছে। জিসিসি এবং ঝনঝন মধ্যে পরিবর্তন করতে, আপনার দুটি সম্পূর্ণ পৃথক বিল্ড ট্রি থাকা উচিত এবং "স্যুইচ" সংকলকগুলির জন্য সিডি পিছনে পিছনে থাকা উচিত। একবার কোনও প্রদত্ত সংকলক দিয়ে একটি বিল্ড ট্রি তৈরি করা হলে আপনি সেই বিল্ড ট্রিটির জন্য সংকলকটি স্যুইচ করতে পারবেন না।
DLRdave

@ ডিএলআরডেভ দুটি পৃথক বিল্ড ট্রি ব্যবহার করা একটি বুদ্ধিমান ধারণা; এক আমি বিবেচনা করি নি। ওফস :) তবে এটি এমনকি একটি নতুন src/build-clangডিরেক্টরিতে করা ওভাররাইডগুলি উপেক্ষা করা হচ্ছে।
রেজি

1
@ রেজি ক্ল্যাংওভারাইডস.টিএসটিএক্স-এর পতাকাগুলি প্রত্যয় _INIT সহ সংজ্ঞায়িত করতে হবে। আপডেট উত্তর দেখুন।
সাকরা

8
পাঠকদের জন্য নোট। আপনি যদি সিএমকে CCএবং CXXভেরিয়েবলগুলিকে সম্মান না জানাতে সমস্যা বোধ করছেন তবে এটি হতে পারে কারণ আপনাকে প্রথমে বিল্ড ডিরেক্টরি থেকে সমস্ত ফাইল মুছতে হবে। rm CMakeCache.txtচঞ্চল নাও হতে পারে।
জন ডিবলিং

127

উবুন্টুতে সিস্টেম ওয়াইড সি ++ পরিবর্তন:

sudo apt-get install clang
sudo update-alternatives --config c++

এর মতো কিছু মুদ্রণ করবে:

  Selection    Path              Priority   Status
------------------------------------------------------------
* 0            /usr/bin/g++       20        auto mode
  1            /usr/bin/clang++   10        manual mode
  2            /usr/bin/g++       20        manual mode

তারপরে কেবল ঝাঁকুনি ++ নির্বাচন করুন।


3
ধন্যবাদ, আমি এই সম্পর্কে জানতাম না! যদিও আমি অনুমান করি এটি নির্ভর করে যেখানে cmake একটি সংকলক খুঁজছেন, ঠিক আছে?
ইব্রাহিম

1
@ ইব্রাহিম এই কনফিগারেশনটি আপনার নির্বাচিত সংকলকটিতে "সি ++" সিমিলিংক সেট করে এবং "জি ++" নয়, ডিফল্টরূপে "সি ++" চেক করে। সুতরাং চতুর কনফিগারেশনটি সুনির্দিষ্ট না হলে, এটি কাজ করা উচিত (এবং এটি আমার পক্ষে হয়)।
জুমুলেটর

2
আমি একটি উত্তর পেয়েছি যে "লিঙ্ক গ্রুপ সি ++ এ কেবল একটি বিকল্প আছে"। কীভাবে এই তালিকায়
ঝাঁকুনি

3
এই বিকল্পটি সম্পর্কে সতর্ক থাকুন কারণ এটি আপনার সিস্টেমে পার্শ্ব প্রতিক্রিয়া হতে পারে। এনভিডিয়া ড্রাইভারের মতো প্যাকেজগুলির সাথে ইতিমধ্যে সমস্যা ছিল যা ইনস্টল করার সময় কিছু কার্নেল মডিউল পুনরায় সংযুক্ত করে এবং ঝনঝনির সাথে সামঞ্জস্য করে না।
ফ্যালকো

2
যদি আপনি ক্ল্যাং There is only one alternative in link group cc (providing /usr/bin/cc): /usr/bin/gcc
-৩.৫, ক্ল্যাং -৩.6

23

আপনি বিকল্প কমান্ডটি ব্যবহার করতে পারেন:

option(USE_CLANG "build application with clang" OFF) # OFF is the default

এবং তারপরে () এর মধ্যে ক্ল্যাং-সংকলক সেটিংস মোড়ানো:

if(USE_CLANG)
    SET (...)
    ....
endif(USE_CLANG)

এইভাবে এটি গি-কনফিগারেশন সরঞ্জামগুলিতে চেক বিকল্প হিসাবে প্রদর্শিত হয়।

এটি সিস্টেমভিত্তিক করতে আপনি অবশ্যই একটি পরিবেশের পরিবর্তনশীল ডিফল্ট মান হিসাবে ব্যবহার করতে পারেন বা ফের্রুসিওর উত্তর সহ থাকতে পারেন।


আমি বর্তমানে এটি সেট আপ করেছি, তবে স্পষ্টতই এটি প্রতি প্রকল্পের ভিত্তিতে করা দরকার। আমি আশা করছিলাম যে এখানে একটি কমান্ড হবে cmake -DCMAKE_COMPILER_DEFINITIONS=MyLlvmDefinitions.cmake
রেজি

1
এখন আমি বুঝতে পারছি আপনি কী অর্জন করার চেষ্টা করছেন। জানি না যে আচরণটি চতুর দ্বারা সরবরাহ করা হয়েছে কিনা তবে আপনি সি-সি বিকল্পগুলি চেষ্টা করতে পারেন যা সিএমকেলিস্ট.টেক্সট চালানো শুরু করার আগে কোনও স্ক্রিপ্ট লোড করছে বলে মনে হচ্ছে। যদিও চেষ্টা করে দেখেনি।
টোবিয়াস শ্লেগেল

18

উবুন্টুতে সিস্টেম ওয়াইড সি পরিবর্তন:

sudo update-alternatives --config cc

উবুন্টুতে সিস্টেম ওয়াইড সি ++ পরিবর্তন:

sudo update-alternatives --config c++

উপরের প্রত্যেকটির জন্য, বাছাই করতে নির্বাচন নম্বর (1) টিপুন এবং এন্টার টিপুন:

  Selection    Path            Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc     20        auto mode
  1            /usr/bin/clang   10        manual mode
  2            /usr/bin/gcc     20        manual mode
Press enter to keep the current choice[*], or type selection number:

7
আপনি যদি নিজের ঝনঝনটি ম্যানুয়ালি ইনস্টল করে থাকেন এবং এটি কোনও মানহীন জায়গায় রেখে দেন তবে এটি --config দিয়ে প্রদর্শিত নাও হতে পারে। উদাহরণস্বরূপ যদি এটি থাকে /opt/clang-llvm-3.5/তবে প্রথমে একটি নতুন বিকল্প ইনস্টল করুন: sudo update-alternatives --install /usr/bin/c++ c++ /opt/clang-llvm-3.5/bin/clang++ 30
কোডকিড

16

আপনি এই উদ্দেশ্যে সিমেকের সরঞ্জামচেন ফাইল প্রক্রিয়াটি ব্যবহার করতে পারেন, উদাহরণস্বরূপ এখানে দেখুন । সংশ্লিষ্ট সংজ্ঞা সংবলিত প্রতিটি সংকলকের জন্য আপনি একটি সরঞ্জামচেন ফাইল লিখুন। কনফিগার করার সময় আপনি যেমন চালান

 cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/clang-toolchain.cmake ..

এবং সমস্ত সংকলক তথ্য প্রকল্পের সময় সেট করা হবে () সরঞ্জামচেন ফাইল থেকে কল। যদিও ডকুমেন্টেশনে কেবল ক্রস-সংকলনের প্রসঙ্গে উল্লেখ করা হয়েছে, এটি একই সিস্টেমে বিভিন্ন সংকলকগুলির জন্য পাশাপাশি কাজ করে।


4
আমি এখনও অবাক হয়েছি কীভাবে সঠিক উত্তরগুলি এখানে কেবল সুতোর নীচে পাওয়া যেতে পারে এসওতে।
স্লাভা

10

আপনার অবশ্যই বিভিন্ন বিভিন্ন llvm-ar ইত্যাদি প্রোগ্রাম ব্যবহার করার দরকার নেই:

SET (CMAKE_AR      "/usr/bin/llvm-ar")
SET (CMAKE_LINKER  "/usr/bin/llvm-ld")
SET (CMAKE_NM      "/usr/bin/llvm-nm")
SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
SET (CMAKE_RANLIB  "/usr/bin/llvm-ranlib")

এগুলি llvm অভ্যন্তরীণ ফর্ম্যাটে কাজ করার জন্য তৈরি করা হয় এবং এগুলি আপনার অ্যাপ্লিকেশন তৈরিতে কার্যকর নয়।

একটি নোট হিসাবে -O4 আপনার প্রোগ্রামে এলটিওকে আহ্বান করবে যা আপনি না চাইতে পারেন (এটি প্রচুর পরিমাণে সংকলন সময় বাড়িয়ে তুলবে) এবং সি 99 মোডে ডিফল্ট ডিঙিয়ে দেয় যাতে পতাকাটির প্রয়োজন হয় না।


7

যদি নির্বাচিত ডিফল্ট সংকলক cmakeহয় gccএবং আপনি ইনস্টল করেছেন তবে clangআপনি আপনার প্রকল্পটি এর সাথে সংকলনের সহজ উপায়টি ব্যবহার করতে পারেন clang:

$ mkdir build && cd build
$ CXX=clang++ CC=clang cmake ..
$ make -j2

5

সাহায্য অনুযায়ী cmake:

-C <initial-cache>
     Pre-load a script to populate the cache.

     When cmake is first run in an empty build tree, it creates a CMakeCache.txt file and populates it with customizable settings for the project.  This option may be used to specify a  file  from
     which to load cache entries before the first pass through the project's cmake listfiles.  The loaded entries take priority over the project's default values.  The given file should be a CMake
     script containing SET commands that use the CACHE option, not a cache-format file.

তোমার মত ফাইল তৈরি করতে সক্ষম হবেন করা gcc_compiler.txtএবং clang_compiler.txtCMake সিনট্যাক্স সমস্ত আপেক্ষিক কনফিগারেশন অন্তর্ভুক্ত করা হয়।

ঝাঁকুনির উদাহরণ (clang_compiler.txt):

 set(CMAKE_C_COMPILER "/usr/bin/clang" CACHE string "clang compiler" FORCE)

তারপরে এটি চালান

জিসিসি:

cmake -C gcc_compiler.txt XXXXXXXX

ঝনঝন:

cmake -C clang_compiler.txt XXXXXXXX

3

আপনি বাক্য গঠন ব্যবহার করতে পারেন: $ENV{environment-variable}আপনার CMakeLists.txtঅ্যাক্সেস এনভায়রনমেন্ট ভেরিয়েবল। আপনি এমন স্ক্রিপ্ট তৈরি করতে পারেন যা পরিবেশের ভেরিয়েবলগুলির একটি সেট যথাযথভাবে শুরু করতে পারে এবং কেবল আপনার CMakeLists.txtফাইলগুলিতে সেই ভেরিয়েবলের রেফারেন্স থাকতে পারে ।


দয়া করে আপনি আরও কিছুদুর বিস্তারিত বলতে পারেন? চ্যামেক চালু করার আগে আপনার পরিবেশের পরিবর্তনশীলগুলি রফতানি করার শেল স্ক্রিপ্ট বলতে কী বোঝায়? কোন চলক সেট করা প্রয়োজন? বা আপনি কি কোনও স্ক্রিপ্ট / ওরফে অর্থ বোঝাতে চাইছেন যা কেবলমাত্র ইমাকে কল দিয়ে থাকে -DCMAKE_C_COMPILER ...?
রেজি

আমার অর্থ এমন একটি স্ক্রিপ্ট যা কেবল উপযুক্ত পরিবেশের ভেরিয়েবলগুলি রফতানি করে। আপনি আপনার নিজের পরিবেশের ভেরিয়েবলগুলি তৈরি করবেন এবং সেগুলি CMakeLists.txt ফাইলটিতে উল্লেখ করুন।
ফেরুরসিও

আহা; আমি বুঝছি তুমি কি বলতে চাও. কেবলমাত্র এটি হ'ল CMakeLists.txtপ্রতিটি প্রকল্পের মধ্য দিয়ে যাওয়া দরকার এবং এটিতে নতুন ভেরিয়েবলগুলি অনুসন্ধান করা উচিত। আমি আশা করছিলাম যে কোনও প্রজেক্ট ফাইল সংশোধন না করে এটি সিস্টেম-ব্যাপী করার সুবিধাজনক উপায় হবে। পাস করার অনুরূপ a CMAKE_TOOLCHAIN_FILE
রেজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.