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


108

আমি ক্লিওনে একটি সহজ প্রকল্প তৈরি করার চেষ্টা করছি। এটি প্রকল্প তৈরির জন্য মেকফিলগুলি তৈরি করতে সিএমকে (আমি এখানে নতুন) ব্যবহার করি (বা এটির কোনওরকম)

আমি যখনই আমার কোডটি চালাচ্ছি তখন প্রতিবার বাইনারি ডিরেক্টরিতে কিছু অ-প্রকল্প ফাইল (কিছু সংস্থানীয় ফাইলের ফাইল) বাইনারি ডিরেক্টরিতে স্থানান্তর করা দরকার।

এই ফাইলটিতে পরীক্ষার ডেটা রয়েছে এবং এগুলি পড়ার জন্য অ্যাপ্লিকেশনটি এটি খুলুন। আমি এটি করার বিভিন্ন উপায় চেষ্টা করেছি:

  • ভায়া file(COPY ...

    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt
            DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt
    

    দেখতে ভাল তবে এটি একবারে কাজ করে এবং পরবর্তী রানের পরে ফাইলটি পুনরায় কিনে ফেলবে না।

  • ভায়া add_custom_command

    • OUTPUT সংস্করণ

      add_custom_command(
              OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt
              COMMAND ${CMAKE_COMMAND} -E copy
                      ${CMAKE_CURRENT_SOURCE_DIR}/input.txt
                      ${CMAKE_CURRENT_BINARY_DIR}/input.txt)
      
    • TARGET সংস্করণ

      add_custom_target(foo)
      add_custom_command(
              TARGET foo
              COMMAND ${CMAKE_COMMAND} copy
                      ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt
                      ${CMAKE_SOURCE_DIR})
      

    তবে এর কোনওটিই কাজ করে না।

আমি কি ভুল করছি?

উত্তর:


137

ব্যবহার করে আপনি বিবেচনা করতে পারে configure_file সঙ্গে COPYONLYবিকল্প:

configure_file(<input> <output> COPYONLY)

file(COPY ...)এটির বিপরীতে ইনপুট এবং আউটপুটগুলির মধ্যে একটি ফাইল-স্তর নির্ভরতা তৈরি করে, তা হ'ল:

যদি ইনপুট ফাইলটি পরিবর্তন করা হয় তবে বিল্ড সিস্টেম সিএমকে ফাইলটি পুনরায় কনফিগার করতে আবার বিল্ড সিস্টেম জেনারেট করবে।


14
দয়া করে নোট করুন যে configure_fileসাব-ডিরেক্টরিগুলির সাথে কাজ করছে না, এমনকি আপনি ফাইলের একটি তালিকা তৈরি করতে জিএলওবি ব্যবহার করেন।
তারানতুলা

এছাড়াও নোট করুন যে এটি ইনপুট এবং আউটপুটটির মধ্যে "ফাইল-স্তর নির্ভরতা" নয়: এটি ইনপুট এবং cmake কনফিগার পদক্ষেপের মধ্যে নির্ভরতা । সুতরাং নিয়মিত বিল্ড নির্ভরতা পরিবর্তনের পরিবর্তে যেখানে একটি উত্স ফাইল পরিবর্তন করে কেবলমাত্র সম্পর্কিত বস্তু ফাইলটি পুনর্নির্মাণ করা হয়, এর ফলে পুরো সিমেকে পুনরায় কনফিগার করা যায়, যার অন্যান্য পার্শ্ব প্রতিক্রিয়া থাকতে পারে।
শেঠ জনসন

67

উভয় বিকল্প বৈধ এবং আপনার বিল্ডের দুটি পৃথক ধাপ লক্ষ্য করে:

  1. file(COPY ...কনফিগারেশন পদক্ষেপে এবং শুধুমাত্র এই পদক্ষেপে ফাইল অনুলিপি করে। আপনি যখন নিজের প্রকল্পটি পুনরায় নির্মাণ করেন আপনার চ্যামেক কনফিগারেশন পরিবর্তন না করে, এই আদেশটি কার্যকর করা হবে না।
  2. add_custom_command আপনি প্রতিটি বিল্ড স্টেপে চারপাশে ফাইলটি অনুলিপি করতে চান এমন পছন্দসই পছন্দ।

আপনার কাজের সঠিক সংস্করণটি হ'ল:

add_custom_command(
        TARGET foo POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
                ${CMAKE_SOURCE_DIR}/test/input.txt
                ${CMAKE_CURRENT_BINARY_DIR}/input.txt)

আপনার মধ্যে নির্বাচন করতে পারবেন PRE_BUILD, PRE_LINK, POST_BUILD সেরা আপনি ডকুমেন্টেশন পড়া হয় add_custom_command

প্রথম সংস্করণটি কীভাবে ব্যবহার করবেন তার একটি উদাহরণ এখানে পাওয়া যাবে: অন্য টার্গেটের উত্স তৈরি করতে সিএমকে অ্যাড_কাস্টম_কম্যান্ড ব্যবহার করুন


4
এটি কি CMAKE_SOURCE_DIR বা CMAKE_CURRENT_SOURCE_DIR?
সায়ফুল নিজাম ইয়াহইয়া

4
ফাইলটি বর্তমান ফাইলের সাথে সম্পর্কিত CMAKE_CURRENT_SOURCE_DIRহলে সাইফুলনিজামায়াহিয়া ব্যবহার করুন। এটি যদি মূলের সাথে সম্পর্কিত হয় তবে ব্যবহার করুন । test/input.txtCMakeLists.txtCMakeLists.txtCMAKE_SOURCE_DIR
মার্ক

ক্যামকেতে লক্ষ্যগুলি ফাইলের নাম পাওয়ার কোনও উপায় আছে কি? ফাইল নাম হার্ডকডিং ছাড়াই? উদাহরণস্বরূপ, আমি একটি lib ফাইল তৈরি করছি, cmake তারগেট ফাইল নাম পেতে একটি পরিবর্তনশীল আছে? পছন্দ libSomething.so?
রিকা

16

আপনি যে বিকল্পটির প্রথম চেষ্টা করেছেন সেটি দুটি কারণে কাজ করে না।

প্রথমত, আপনি বন্ধনী বন্ধ করতে ভুলে গেছেন।

দ্বিতীয়ত, DESTINATIONডিরেক্টরিগুলি ফাইলের নাম নয় should ধরে নেওয়া যে আপনি বন্ধনী বন্ধ করেছেন, ফাইলটি একটি ফোল্ডারে কল হবে input.txt

এটিকে কাজ করতে, কেবল এটিকে পরিবর্তন করুন

file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt
     DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

4

আমি আপনাকে পরামর্শ দিচ্ছি TARGET_FILE_DIRযদি আপনি ফাইলটি আপনার .exe ফাইলের মতো একই ফোল্ডারে অনুলিপি করতে চান।

Main মূল ফাইলের ডিরেক্টরি (.exe, .so.1.2, .a)।

add_custom_command(
  TARGET ${PROJECT_NAME} POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy 
    ${CMAKE_CURRENT_SOURCE_DIR}/input.txt 
    $<TARGET_FILE_DIR:${PROJECT_NAME}>)

ভিএস-তে, এই কমল স্ক্রিপ্টটি ইনপুট.টেক্সটকে আপনার চূড়ান্ত এক্সের মতো একই ফাইলটিতে অনুলিপি করবে, তা ডিবাগ বা প্রকাশের বিষয় নয়।


3

এটি আমি কিছু সংস্থানীয় ফাইল অনুলিপি করতে ব্যবহার করেছি: অনুলিপি উপেক্ষা করার জন্য অনুলিপি করা ফাইলগুলি অনুলিপি files

 add_custom_target(copy-files ALL
    COMMAND ${CMAKE_COMMAND} -E copy_directory
    ${CMAKE_BINARY_DIR}/SOURCEDIRECTORY
    ${CMAKE_BINARY_DIR}/DESTINATIONDIRECTORY
    )

আমি add_dependencies(MainTarget copy-files)মেইন টার্গেটটি তৈরি করার সময় এটিকে স্বয়ংক্রিয়ভাবে চালিত করার জন্য যুক্ত করব
হেরগোট

এটি সর্বোত্তম উত্তরের মতো (+ হার্গোটের মন্তব্য) বলে মনে হচ্ছে কারণ এটি সত্যই নিশ্চিত করে যে উত্সের বর্তমান সংস্করণটি সর্বদা গন্তব্য পোস্ট বিল্ডে থাকে। ছোট অনুলিপি কাজের জন্য এটি ভাল কাজ করে, ধন্যবাদ। ফেলে add_dependencies(MainTarget copy-files)root- র মধ্যে CMakeLists.txtফাইল এর মানে হল যে এই প্রকল্পের সর্বত্র ব্যবহার করা যাবে।
সাত্নাক

2

আপনি যদি কার্টেন্ট ডিরেক্টরি থেকে বাইনারি (বিল্ড ফোল্ডার) ফোল্ডারে ফোল্ডারটি অনুলিপি করতে চান

file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/yourFolder/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/yourFolder/)

তারপরে সিনটেক্সটি হ'ল:

file(COPY pathSource DESTINATION pathDistination)

0

প্রস্তাবিত কনফিগার ফাইলটি সম্ভবত সবচেয়ে সহজ সমাধান। তবে, আপনি যদি বিল্ড ডিরেক্টরি থেকে ম্যানুয়ালি ফাইলটি মুছে ফেলেন তবে এটি অনুলিপি কমান্ডটি পুনরায় চালু করবে না। এই কেসটি পরিচালনা করতে, নিম্নলিখিতটি আমার পক্ষে কাজ করে:

add_custom_target(copy-test-makefile ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/input.txt)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt
                   COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt
                                                    ${CMAKE_CURRENT_BINARY_DIR}/input.txt
                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/input.txt)

0

আপনি বিষয়বস্তু লাগাতে চান তাহলে exampleমধ্যে installবিল্ড পর ফোল্ডার:

code/
  src/
  example/
  CMakeLists.txt

আপনার সাথে নিম্নলিখিতগুলি যুক্ত করার চেষ্টা করুন CMakeLists.txt:

install(DIRECTORY example/ DESTINATION example)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.