ওভাররাইট করবেন না CMAKE_C_COMPILER, তবে সিএমকে কল করার আগে রফতানি করুন CC(এবং CXX):
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
রফতানি কেবল একবারই করা দরকার, আপনি যখন প্রথমবার প্রকল্পটি কনফিগার করেন, তারপরে সেই মানগুলি সিএমকে ক্যাশে থেকে পঠিত হবে।
আপডেট : CMAKE_C(XX)_COMPILERজ্যাকের মন্তব্যের পরে কেন ওভাররাইড হচ্ছে না সে সম্পর্কে দীর্ঘতর ব্যাখ্যা
আমি CMAKE_C(XX)_COMPILERমূলত দুটি মূল কারণে ওভাররাইডিংয়ের বিরুদ্ধে সুপারিশ করছি : কারণ এটি সিএমকের ক্যাশে ভালভাবে খেলবে না এবং কারণ এটি সংকলক চেক এবং সরঞ্জাম আবিষ্কার সনাক্ত করে break
setকমান্ডটি ব্যবহার করার সময় , আপনার কাছে তিনটি বিকল্প রয়েছে:
- একটি সাধারণ পরিবর্তনশীল তৈরি করতে, ক্যাশে ছাড়াই
- ক্যাশে সহ, একটি ক্যাশেড ভেরিয়েবল তৈরি করতে
- কনফিগার করার সময় সর্বদা ক্যাশে মান প্রয়োগ করতে বাধ্য করুন
আসুন দেখুন তিনটি সম্ভাব্য কলের জন্য কী ঘটে set:
ক্যাশে ছাড়া
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
এটি করার সময়, আপনি একটি "সাধারণ" ভেরিয়েবল তৈরি করেন CMAKE_C(XX)_COMPILERযা একই নামের ক্যাশে ভেরিয়েবলটি আড়াল করে। তার মানে আপনার সংকলকটি এখন আপনার বিল্ড স্ক্রিপ্টে হার্ড-কোডড এবং আপনি এটিকে একটি কাস্টম মান দিতে পারবেন না। আপনার যদি বিভিন্ন সংকলক সহ একাধিক বিল্ড এনভায়রনমেন্ট থাকে তবে এটি একটি সমস্যা হবে। আপনি যখনই আলাদা আলাদা সংকলক ব্যবহার করতে চান প্রতিবার আপনি নিজের স্ক্রিপ্টটি আপডেট করতে পারেন তবে এটি সিএমকে ব্যবহারের মানটিকে প্রথম স্থানে সরিয়ে দেয়।
ঠিক আছে, তাহলে, ক্যাশে আপডেট করা যাক ...
ক্যাশে দিয়ে
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
এই সংস্করণটি কেবল "কাজ করবে না"। CMAKE_C(XX)_COMPILERপরিবর্তনশীল যদি না আপনি এটা জোর তাই এটি আপডেট হবে না ক্যাশের মধ্যে ইতিমধ্যে হয়।
আহ ... আসুন শক্তিটি ব্যবহার করা যাক, ...
জোর করে ক্যাশে
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
এটি প্রায় "সাধারণ" ভেরিয়েবল সংস্করণ হিসাবে একই, একমাত্র পার্থক্য হ'ল আপনার মানটি ক্যাশে সেট করা হবে, যাতে ব্যবহারকারীরা এটি দেখতে পারেন। তবে যে কোনও পরিবর্তন setকমান্ড দ্বারা ওভাররাইট করা হবে ।
সংকলক চেক এবং টুলিং ব্রেকিং
কনফিগারেশন প্রক্রিয়া শুরুর দিকে, সিএমকে সংকলকটিতে চেক সঞ্চালন করে: এটি কি কাজ করে? এটি কি এক্সিকিউটেবল উত্পাদন করতে সক্ষম? ইত্যাদি। এটি সম্পর্কিত সরঞ্জামগুলি সনাক্ত করতে arএবং পছন্দ করতে সংকলকটিও ব্যবহার করে ranlib। আপনি যখন কোনও স্ক্রিপ্টে সংকলক মানটি ওভাররাইড করেন, তখন "চূড়ান্ত দেরি" হয়, সমস্ত চেক এবং সনাক্তকরণ ইতিমধ্যে সম্পন্ন হয়েছে।
উদাহরণস্বরূপ, ডিফল্ট কম্পাইলার হিসেবে জিসিসি সঙ্গে আমার মেশিনে যখন ব্যবহার setকমান্ড /usr/bin/clang, arসেট করা হয় /usr/bin/gcc-ar-7। সিএমকে চালানোর আগে রফতানি ব্যবহার করার সময় এটি সেট করা আছে /usr/lib/llvm-3.8/bin/llvm-ar।
/optপরিবর্তে বিকল্প জিসিসি সংস্করণটি ইনস্টল করা ভাল অভ্যাস/usr/local। সাধারণত/opt/gcc-x.y.z। এইভাবে, আপনার যদি আরও নতুন সংস্করণ প্রয়োজন হয় তবে আগের সংস্করণটি আনইনস্টল করতে আপনার কোনও সমস্যা হবে না।