আধুনিক সিএমকে জন্য (সংস্করণ ২.৮.১২ এবং তার বেশি) আপনার ব্যবহার করা উচিত target_compile_options
, যা অভ্যন্তরীণভাবে লক্ষ্যযুক্ত বৈশিষ্ট্যগুলি ব্যবহার করে।
CMAKE_<LANG>_FLAGS
এটি একটি গ্লোবাল ভেরিয়েবল এবং ব্যবহারে সর্বাধিক ত্রুটি-প্রবণ। এটি জেনারেটর এক্সপ্রেশনগুলি সমর্থন করে না , যা খুব কাজে আসে।
add_compile_options
ডিরেক্টরি বৈশিষ্ট্যের উপর ভিত্তি করে তৈরি করা হয়, যা কিছু পরিস্থিতিতে জরিমানা হয় তবে সাধারণত বিকল্পগুলি নির্দিষ্ট করার সবচেয়ে প্রাকৃতিক উপায় নয়।
target_compile_options
প্রতি লক্ষ্য ভিত্তিতে (কাজ করে COMPILE_OPTIONS
এবং INTERFACE_COMPILE_OPTIONS
লক্ষ্য বৈশিষ্ট্যগুলি নির্ধারণের মাধ্যমে ) কাজ করে যা সাধারণত সিএমকেড কোডের ফলাফল হিসাবে উত্স ফাইলের সংকলন বিকল্পগুলি ফাইলটি কোন প্রকল্পের অন্তর্ভুক্ত তা নির্ধারণ করা হয় (পরিবর্তে এটি কোনও ডিরেক্টরি স্থাপন করা হয়) হার্ড ডিস্কে)। এটির অতিরিক্ত সুবিধা রয়েছে যা যদি অনুরোধ করা হয় তবে নির্ভরশীল টার্গেটগুলিতে বিকল্পগুলি পাস করার ক্ষেত্রে এটি স্বয়ংক্রিয়ভাবে যত্ন নেয় ।
যদিও তারা সামান্য কিছুটা ভার্বোস, প্রতি লক্ষ্য-নির্দেশ কমান্ডগুলি বিভিন্ন বিল্ড বিকল্পগুলির উপর যুক্তিসঙ্গতভাবে সূক্ষ্ম-নিয়ন্ত্রণযুক্ত নিয়ন্ত্রণের অনুমতি দেয় এবং (আমার ব্যক্তিগত অভিজ্ঞতায়) দীর্ঘমেয়াদে মাথাব্যথার কারণ সম্ভবত।
তত্ত্ব অনুসারে, আপনি সরাসরি ব্যবহার করে সংশ্লিষ্ট বৈশিষ্ট্যগুলি সেট করতে পারেন set_target_properties
তবে target_compile_options
সাধারণত আরও পাঠযোগ্য read
উদাহরণস্বরূপ, আপনি foo
লিখতে পারেন এমন জেনারেটর এক্সপ্রেশন ব্যবহার করে কনফিগারেশনের উপর ভিত্তি করে একটি লক্ষ্য সংকলনের বিকল্পগুলি সেট করতে:
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")
PUBLIC
, PRIVATE
, এবং INTERFACE
কিওয়ার্ড নির্ধারণ অপশন পরিধি । যেমন, আমরা লিঙ্ক করেন foo
মধ্যে bar
দিয়ে target_link_libraries(bar foo)
:
PRIVATE
বিকল্পগুলি কেবলমাত্র লক্ষ্যমাত্রায় প্রয়োগ করা হবে ( foo
এবং এটির সাথে লিঙ্ক করা অন্যান্য গ্রন্থাগারগুলিতে (গ্রাহকরা নয়)।
INTERFACE
বিকল্পগুলি কেবল গ্রাসকারী লক্ষ্যমাত্রায় প্রয়োগ করা হবে bar
PUBLIC
মূল লক্ষ্য foo
এবং গ্রাহক লক্ষ্য উভয় ক্ষেত্রে বিকল্প প্রয়োগ করা হবেbar