সিএমকে আউটপুট সাফ করার জন্য একটি 'সিএমকে ক্লিন' কমান্ড খুঁজছেন


419

make cleanকোনও মেকফাইল তৈরি করা সমস্ত ফাইল যেমন মুছে ফেলা হয়, তেমনি আমি সিএমকেকেও একই কাজ করতে চাই। সমস্ত খুব প্রায়ই আমি নিজেকে নিজে মত ফাইল মুছে ফেলার ডিরেক্টরি মধ্য দিয়ে যাচ্ছে এটি cmake_install.cmakeএবং CMakeCache.txt, এবং CMakeFilesফোল্ডার নেই।

cmake cleanএই সমস্ত ফাইল স্বয়ংক্রিয়ভাবে মুছে ফেলার মতো কোনও আদেশ আছে কি ? আদর্শভাবে এটি বর্তমান ডিরেক্টরি CMakeLists.txtফাইলের মধ্যে সংজ্ঞায়িত পুনরাবৃত্ত কাঠামো অনুসরণ করা উচিত ।

উত্তর:


487

নেই cmake clean

আমি সাধারণত "বিল্ড" এর মতো একক ফোল্ডারে প্রকল্পটি তৈরি করি। তাই যদি আমি চাই make clean, আমি ঠিক করতে পারি rm -rf build

রুট হিসাবে একই ডিরেক্টরিতে "বিল্ড" ফোল্ডার "সিএমকেলিস্ট.টেক্সট" সাধারণত ভাল পছন্দ। আপনার প্রকল্পটি তৈরি করতে, আপনি আর্গুমেন্ট হিসাবে সিএমকেলিস্ট.টেক্সট এর অবস্থানটি চটকে দেন। উদাহরণস্বরূপ: cd <location-of-cmakelists>/build && cmake ..। (@ComicSansMS থেকে)


101
এটিকে "আউট সোর্স বিল্ড" বলা হয় এবং যাওয়ার পছন্দসই উপায় হওয়া উচিত। এটা তোলে নাম সংঘর্ষে এড়াতে মত
Arne

17
বাহ্যিক উত্স বিল্ডগুলির জন্য +1। একাধিক আর্কিটেকচার তৈরি করার সময় এটি অত্যাবশ্যক হয়ে ওঠে। উদাহরণস্বরূপ, আপনি ইন-উত্স বিল্ড দিয়ে 64 বিট এবং 32 বিট উভয় বাইনারি তৈরি করতে পারবেন না, কারণ এর জন্য দুটি পৃথক সিএমকে ক্যাশে স্তরক্রম প্রয়োজন।
কমিকসান্সএসএমএস

9
আপনি যে কোনও স্থানে ফোল্ডারটি রাখতে পারেন, তবে একই ডিরেক্টরিতে একটি বিল্ড ফোল্ডার সিএমকেলিস্ট.টেক্সট মূল হিসাবে পছন্দ করতে পারেন। আপনি তৈরি করার জন্য আর্গুমেন্ট হিসাবে সিএমকেলিস্ট.টেক্সট এর অবস্থানটি cmake কে সহজভাবে দিতে। উদাহরণস্বরূপ:cd <location-of-cmakelists>/build && cmake ..
কমিকসান্স এসএমএস

64
সত্যিই একটি cmake পরিষ্কার হওয়া উচিত। সোর্স বিল্ড আউট করার অভ্যাসে থাকলেও যে কেউ চিরকুট ব্যবহার করেছে, দুর্ঘটনাক্রমে ভুল ডিরেক্টরিতে cmake চালিয়েছে এবং ম্যানুয়ালি পরিষ্কার করার জন্য এটি পাছার এক বিশাল ব্যথা।
প্যাভন

24
@ দেভসোলার তবে কনভার্সটি সত্য নয়; কেবলমাত্র কোনও ফাইল সংস্করণ নিয়ন্ত্রণের অধীনে নেই তার অর্থ এই নয় যে এটি cmake দ্বারা উত্পাদিত হয়েছে এবং এটি দূরে সরিয়ে নিরাপদ। আপনাকে কোন রুপান্তরিত ফাইলগুলি চলমান রয়েছে এবং যেগুলি ক্র্যাক ক্রাফ্ট রয়েছে তা অগ্রগতিতে কাজ করা বাছাই একটি ব্যথা, বিশেষত যখন cmake ফাইলগুলির বেশিরভাগ অনুলিপি / একইভাবে আপনার ফাইলগুলির নাম দেওয়া হয়।
প্যাভন

84

সিএমকে অফিসিয়াল এফএকিউতে বলা হয়েছে:

জিএনইউ অটোটুলগুলি দিয়ে তৈরি কিছু বিল্ড ট্রিগুলির একটি "মেক ডিস্কেল্যান" টার্গেট রয়েছে যা বিল্ডটি পরিষ্কার করে এবং মেকফাইলস এবং উত্পন্ন বিল্ড সিস্টেমের অন্যান্য অংশগুলি সরিয়ে দেয়। সিএমকে "মেক ডিস্টক্লান" টার্গেট উত্পন্ন করে না কারণ সিএমকেলিস্ট.টেক্সট ফাইলগুলি স্ক্রিপ্ট এবং স্বেচ্ছাসেবক কমান্ড চালাতে পারে; সিএমকে চলমান সিএমকে অংশ হিসাবে কোন ফাইলগুলি উত্পন্ন হয় তা ট্র্যাক করার কোনও উপায় নেই। একটি দ্বিধাগ্রস্থ লক্ষ্য সরবরাহ করা ব্যবহারকারীদেরকে এটি প্রত্যাশা অনুযায়ী কাজ করবে এমন মিথ্যা ধারণা দেয়। (সিএমেক কম্পাইলার এবং লিঙ্কারের মাধ্যমে উত্পন্ন ফাইলগুলি সরিয়ে দিতে "ক্লিন" লক্ষ্য তৈরি করে))

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


মূলত, জিএনইউ অটোটুলগুলি হিসাবে পরিচিত এবং ব্যবহৃত হিসাবে, 'ডিস্টক্লান' টার্গেটটি উত্স গাছটিকে ট্যারে আপ করার জন্য প্রস্তুত এবং একটি টার বিতরণ তৈরি করার উদ্দেশ্যে। এ জাতীয় ট্যারি ফাইল ব্যবহারকারীরা ডাউনলোড করতে এবং আনটারে অটোটুলগুলি (অ্যাকোকলাল, অটোমেক, অটোকনফ ইত্যাদি) প্রয়োজন ছাড়াই 'কনফিগার' এবং 'মেক' চালাতে পারে যদি আমরা সেই চক্রটি এক্সট্রোপোলেটেড করি তবে একটি 'মেক ডিস্ট্রিকান' আমাদের একটি পরিষ্কার রেখে দেয় উত্স যে cmake ইনস্টল না করে নির্মিত যেতে পারে। যাইহোক, জেনারেটর যখন একক-লক্ষ্য জেনারেটর ছিল (এটি 'মেক' টার্গেট হিসাবে রয়েছে) তখন কাজ করে না, কারণ সিমেকের সাথে কনফিগারেশনটি ঘটে যখন
কার্লো উড

... চালাচ্ছি এমন একটি বিতরণ করা যা কনফিগার করা যায় না, এমনকি প্ল্যাটফর্ম পরীক্ষাও করে না, অকেজো। সুতরাং চতুরের জন্য 'বিচ্ছিন্ন' লক্ষ্য বিদ্যমান নেই। চূড়ান্ত ব্যবহারকারীর মেশিনে সিএমকে থাকা প্রয়োজন
কার্লো উড

63

গীটের এই দিনগুলিতে সর্বত্র, আপনি সিএমকেকে ভুলে যেতে পারেন এবং ব্যবহার করতে পারেন git clean -d -f -x, যা উত্স নিয়ন্ত্রণে নয় এমন সমস্ত ফাইল সরিয়ে ফেলবে।


14
-xযদিও এই বিকল্প। এটি ব্যবসায়ের একটি দুর্দান্ত কৌশল git। যদিও আমি ব্যক্তিগতভাবে এখনও প্রথমে একটি শুকনো রান করতে হবে git clean -d -f -x -n,। প্রতি এক মুহুর্তের মধ্যে আমি কোনও প্রকল্পের জন্য যে প্রকল্পের ফোল্ডারটি gitনিয়ন্ত্রণে রাখি তার জন্য আমি একটি সুবিধাজনক ফাইল রাখি তবে এটি অন্যের সাথে ভাগ করে নিতে চাই এমন কিছু নয় যাতে আমি git addপ্রকল্পে না to যদি আমি কোনও -e <pattern>বিকল্প যুক্ত করতে সাবধান না হন তবে এটি এই ধরণের ফাইলটিকে দূরে সরিয়ে দেবে । এই নোটটিতে, gitএকটি .gitcleanignoreফাইল থাকলে এটি ভাল হবে । :)
সিভিফ্যান

1
@ সিভিফ্যান আপনি ব্যবহার করে চেষ্টা করতে পারেন chattr +i $filename(রুট অনুমতি প্রয়োজন, এর পরে ফাইলটি পরিবর্তন করার অনুমতি দেয় না)। এইভাবে গিট ফাইলটি পছন্দ করতে চেষ্টা করেও ফাইলটি সরাতে সক্ষম হবে না rm -f
Ruslan

3
এটি ইনসোর্স বিল্ডসগুলি ধরে নেয়, যা নিজে এড়ানো উচিত।
স্লাভা

এটি ছিল একটি সহজ সমাধান (এবং এই পতাকাগুলি কী বোঝায় তা আমার কোনও স্মরণ নেই, তবে এটি কেবল একটি দেব মেশিন লোল)।
ম্যাটানস্টার

1
উম তবে নতুন যুক্ত হওয়া ফাইলগুলির কী হবে যা ব্যবহারকারী ভুলে গিয়েছিল git add?
yugr

50

আমি আধা ঘন্টার মতো এটি গোগল করেছিলাম এবং একমাত্র দরকারী জিনিসটি নিয়ে এসেছিলাম যা findইউটিলিটিটি সম্পর্কে আহ্বান জানিয়েছিল :

# Find and then delete all files under current directory (.) that:
#  1. contains "cmake" (case-&insensitive) in its path (wholename)
#  2. name is not CMakeLists.txt
find . -iwholename '*cmake*' -not -name CMakeLists.txt -delete

এছাড়াও, নিশ্চিত করা ডাকা make clean(অথবা যাই হোক না কেন CMake জেনারেটরের আপনি ব্যবহার করছেন) সামনে যে।

:)


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

8
অন্য ফাইলগুলি চূড়ান্তভাবে মিলতে পারে তাই এটি সত্যিই সর্বজনীন পদ্ধতির নয়। এটি করা উচিত: rm -rf CMakeFiles; rm -rf CMakeCache.txt; rm -rf cmake_install.cmake;
হনজা_পি

1
আমি -exec rm -rf {} \ + মুছে ফেলতাম এবং কেবল-মোছা ব্যবহার করব।
এডগার আরুটিউনিয়ান

3
ডাউনভোটেড, যেহেতু এই কমান্ডটি কিছু ব্যবহারকারীর ফাইলগুলি মুছতে পারে। আমি Honza_p কমান্ডটি পছন্দ করি না, এটি আসলে আর দীর্ঘ, সহজ এবং ঝুঁকিপূর্ণ নয়।
অ্যাড্রিন ডেস্ক্যাম্পস

1
@ অ্যাড্রিয়েনডেস্ক্যাম্পস: এগুলি সাব-ডাইরেক্টরিগুলিতে এখনও চাক-সম্পর্কিত জঞ্জাল ছেড়ে দেয়। আমি করছিলাম rm -rf CMakeFiles ; rm -rf */CMakeFiles ; rm -rf */*/CMakeFiles ; rm -rf */*/*/CMakeFilesএবং এখনও করা হয়নি ...
এসএফ।

35

আপনি এর মতো কিছু ব্যবহার করতে পারেন:

add_custom_target(clean-cmake-files
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)

// clean-all.cmake
set(cmake_generated ${CMAKE_BINARY_DIR}/CMakeCache.txt
                    ${CMAKE_BINARY_DIR}/cmake_install.cmake
                    ${CMAKE_BINARY_DIR}/Makefile
                    ${CMAKE_BINARY_DIR}/CMakeFiles
)

foreach(file ${cmake_generated})

  if (EXISTS ${file})
     file(REMOVE_RECURSE ${file})
  endif()

endforeach(file)

আমি সাধারণত "মেক ক্লিন-অল" কমান্ড তৈরি করি যা পূর্ববর্তী উদাহরণটিতে "ক্লিন মেক" করার জন্য একটি কল যুক্ত করে:

add_custom_target(clean-all
   COMMAND ${CMAKE_BUILD_TOOL} clean
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)

"পরিষ্কার" লক্ষ্যটিকে নির্ভরতা হিসাবে যুক্ত করার চেষ্টা করবেন না:

add_custom_target(clean-all
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
   DEPENDS clean
)

কারণ "ক্লিন" সিএমকেতে আসল লক্ষ্য নয় এবং এটি কার্যকর হয় না।

তদুপরি, আপনার "ক্লিন-ক্ল্যাক-ফাইল" কোনও কিছুর নির্ভরতা হিসাবে ব্যবহার করা উচিত নয়:

add_custom_target(clean-all
   COMMAND ${CMAKE_BUILD_TOOL} clean
   DEPENDS clean-cmake-files
)

কারণ, আপনি যদি এটি করেন তবে ক্লিন-অল সম্পূর্ণ হওয়ার আগে সমস্ত সিএমকে ফাইল মুছে ফেলা হবে এবং "সিএমকেফাইলস / ক্লিন-অল.ডির / বিল্ড.মেক" অনুসন্ধানে আপনাকে একটি ত্রুটি ঘটবে। ফলস্বরূপ, আপনি কোনও প্রসঙ্গে "কিছু" এর আগে ক্লিন-অল কমান্ড ব্যবহার করতে পারবেন না:

add_custom_target(clean-all
   COMMAND ${CMAKE_BUILD_TOOL} clean
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)

এটিও কাজ করে না।


Cmake_generated স্বয়ংক্রিয়ভাবে পূরণ করার কোন উপায় আছে? সম্ভবত, এটি ইউরি.মাকারেভিচের উত্তরের সাথে একত্রিত? বর্তমানে, এটি $ {CMAKE_BINARY_DIR} এর উপ-ডিরেক্টরিগুলিতে ফাইলগুলি সরাবে না}
ফক্সকব

নিনজা বা ভিজ্যুয়াল স্টুডিওর জন্য কাজ করে না। আমি এই ধরনের পদ্ধতির সুপারিশ করব না।
usr1234567

23

কেবল rm CMakeCache.txtআমার জন্য কাজগুলি জারি করা ।


1
কেবলমাত্র CMakeCache.txt এ সম্পর্কিত ভেরিয়েবলগুলি মুছে ফেলা আমার পক্ষেও কাজ করে।
ইয়র্কওয়ার

CMakeCache.txt মুছে ফেলা এবং তারপরে 'cmake - বিল্ড / বিল্ড-পাথ' চালানোর কারণে 'ত্রুটি: ক্যাশে লোড করা যায়নি' causes
nenchev

1
@ নেচেভে আপনাকে cmake /build-pathআবার চালানো দরকার ।
সমুরসা

@ সমরসা চ্যামেক - বিল্ড যখন পুনরায় পুনরায় সংযুক্ত হয় তখন প্রয়োজন হয়, এই পদ্ধতিটি বিল্ড ডিরেক্টরিটি ভেঙে দেয় এবং অভিযোগে অভিযোগ করে। আমার উত্তর আরও নীচে আপনাকে সিএমকেফিলস / ডিরেক্টরি মুছতে বলেছে, যা একটি পরিষ্কার পুনর্নির্মাণের কারণ এবং স্বয়ংক্রিয়ভাবে পুনরায় পুনরায় পুনরায় চালিত হওয়ার কারণ।
nenchev

2
@ নেচেভ আমি আপনার অর্থ কী তা আমি দেখতে পেয়েছি এবং আমি সম্মত।
সমরসার

9

এটি কিছুটা পুরানো হতে পারে তবে আপনি গুগল করার পরে এটিই প্রথম হিট তাই cmake cleanআমি এটি যুক্ত করব:

যেহেতু আপনি একটি নির্ধারিত লক্ষ্য সহ বিল্ড ডিরের একটি বিল্ড শুরু করতে পারেন

cmake --build . --target xyz

আপনি অবশ্যই চালাতে পারেন

cmake --build . --target clean

cleanউত্পন্ন বিল্ড ফাইলগুলিতে লক্ষ্য চালানোর জন্য ।


8

আমি সম্মত যে আউট-অফ-সোর্স বিল্ডই সেরা উত্তর। তবে যে সময়ের জন্য আপনাকে কেবল ইন-সোর্স বিল্ড করতে হবে, আমি এখানে পাইথন স্ক্রিপ্ট লিখেছি , যা:

  1. "পরিষ্কার করুন" রান
  2. শীর্ষ স্তরের ডিরেক্টরিতে যেমন CMakeCache.txt হিসাবে নির্দিষ্ট সিএমকে-উত্পাদিত ফাইলগুলি সরিয়ে দেয়
  3. সিএমকেফিলস ডিরেক্টরি অন্তর্ভুক্ত প্রতিটি উপ-ডিরেক্টরিতে এটি সিএমকেফিলস, মেকফিল, cmake_install.cmake অপসারণ করে।
  4. সমস্ত খালি সাব ডিরেক্টরিগুলি সরান।

তার জন্য ধন্যবাদ. আমি আপনার স্ক্রিপ্টে একটি লাইন যুক্ত করতে চাই যা পূর্ববর্তী পরিষ্কারের কারণে উপস্থিত makeনা থাকায় চুপ করে যায় Makefile(অর্থাত্ এই স্ক্রিপ্টটিকে আদর্শবান করে তোলে)। কেবল লাইনটি যোগ করুন (সঠিকভাবে ব্যবধানযুক্ত): if os.path.isfile(os.path.join(directory,'Makefile')):লাইন 24 এর ঠিক আগে: args = [এবং অবশ্যই লাইনটি যুক্ত করার পরে বাকী ফাংশন বডিটি ইনডেন্ট করুন। এটি কেবলমাত্র একটি সঞ্চালন করবে make ... cleanযদি Makefileবর্তমান ডিরেক্টরিটি পরিষ্কার হয়ে যাওয়ার মধ্যে উপস্থিত থাকে। নাহলে স্ক্রিপ্টটি নিখুঁত!
মাইকেল গোল্ডশটাইন

4

একটি সমাধান যা আমি সম্প্রতি খুঁজে পেয়েছি তা হ'ল আউট-অফ-সোর্স বিল্ড ধারণাটি একটি মেকফিলের মোড়কের সাথে একত্রিত করা।

আমার শীর্ষ-স্তরের সিএমকেলিস্ট.টেক্সট ফাইলটিতে ইন-উত্স বিল্ডগুলি রোধ করার জন্য আমি নিম্নলিখিতগুলি অন্তর্ভুক্ত করেছি:

if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
    message( FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt." )
endif()

তারপরে, আমি একটি শীর্ষ-স্তরের মেকফিল তৈরি করি এবং নিম্নলিখিতগুলি অন্তর্ভুক্ত করি:

# -----------------------------------------------------------------------------
# CMake project wrapper Makefile ----------------------------------------------
# -----------------------------------------------------------------------------

SHELL := /bin/bash
RM    := rm -rf
MKDIR := mkdir -p

all: ./build/Makefile
    @ $(MAKE) -C build

./build/Makefile:
    @  ($(MKDIR) build > /dev/null)
    @  (cd build > /dev/null 2>&1 && cmake ..)

distclean:
    @  ($(MKDIR) build > /dev/null)
    @  (cd build > /dev/null 2>&1 && cmake .. > /dev/null 2>&1)
    @- $(MAKE) --silent -C build clean || true
    @- $(RM) ./build/Makefile
    @- $(RM) ./build/src
    @- $(RM) ./build/test
    @- $(RM) ./build/CMake*
    @- $(RM) ./build/cmake.*
    @- $(RM) ./build/*.cmake
    @- $(RM) ./build/*.txt

ifeq ($(findstring distclean,$(MAKECMDGOALS)),)
    $(MAKECMDGOALS): ./build/Makefile
    @ $(MAKE) -C build $(MAKECMDGOALS)
endif

ডিফল্ট লক্ষ্য allটাইপ করে বলা হয় make, এবং লক্ষ্য প্রার্থনা ./build/Makefile

লক্ষ্যটি প্রথম কাজটি করে ডিরেক্টরিটি ব্যবহার করে ./build/Makefileতৈরি করা যা এর জন্য একটি পরিবর্তনশীল । ডিরেক্টরিটি যেখানে আমরা আমাদের উত্স-বহির্গমন বিল্ড সম্পাদন করব। ইতিমধ্যে উপস্থিত থাকতে পারে এমন একটি ডিরেক্টরি তৈরি করার চেষ্টা করার জন্য আমাদের যাতে আর্তনাদ না হয় তা নিশ্চিত করার জন্য আমরা যুক্তিটি সরবরাহ করি ।build$(MKDIR)mkdir -pbuild-pmkdir

দ্বিতীয়টি লক্ষ্যটি ./build/Makefileহ'ল ডিরেক্টরিকে ডিরেক্টরিতে পরিবর্তন করা buildএবং অনুরোধ করা cmake

allলক্ষ্য ফিরে , আমরা অনুরোধ $(MAKE) -C build, যেখানে $(MAKE)একটি Makefile পরিবর্তনশীল স্বয়ংক্রিয়ভাবে উত্পাদিত হয় makemake -Cকিছু করার আগে ডিরেক্টরি পরিবর্তন করে। সুতরাং, ব্যবহার $(MAKE) -C buildকরা সমান cd build; make

সংক্ষিপ্তসার হিসাবে, এই Makefile মোড়কে কল করে make allবা makeকরা সমান:

mkdir build
cd build
cmake ..
make 

লক্ষ্য distcleanপূজা cmake .., তারপর make -C build clean, এবং পরিশেষে থেকে সমস্ত সামগ্রী সরিয়ে ফেলা হবে buildডিরেক্টরি। আমি বিশ্বাস করি আপনি নিজের প্রশ্নে ঠিক এটি অনুরোধ করেছেন।

মেকফিলের শেষ অংশটি ব্যবহারকারী-সরবরাহিত লক্ষ্যটি কিনা তা মূল্যায়ন করে distclean। যদি তা না হয় তবে এটি ডিরেক্টরি করার buildআগে এটি পরিবর্তন করতে হবে। এটি খুব শক্তিশালী কারণ ব্যবহারকারী উদাহরণস্বরূপ টাইপ করতে পারেন make cleanএবং মেকফিল এটিকে সমতুল্য রূপান্তরিত করবে cd build; make clean

উপসংহারে, এই মেকফিল মোড়কে, কোনও বাধ্যতামূলক বাহ্যিক উত্স বিল্ড সিএমকে কনফিগারেশনের সংমিশ্রণে এটি তৈরি করুন যাতে ব্যবহারকারীকে কখনই কমান্ডের সাথে ইন্টারঅ্যাক্ট করতে না হয় cmakebuildডিরেক্টরি থেকে সমস্ত সিএমকে আউটপুট ফাইল সরানোর জন্য এই সমাধানটি একটি মার্জিত পদ্ধতিও সরবরাহ করে ।

PS মেকফাইলে আমরা @শেল কমান্ড থেকে আউটপুট দমন করতে উপসর্গ @-এবং শেল কমান্ড থেকে ত্রুটি উপেক্ষা করার উপসর্গ ব্যবহার করি। টার্গেটের rmঅংশ হিসাবে ব্যবহার করার সময় distclean, ফাইল উপস্থিত না থাকলে কমান্ডটি একটি ত্রুটি ফিরিয়ে দেবে (তারা ইতিমধ্যে কমান্ড লাইন ব্যবহার করে ইতিমধ্যে মুছে ফেলা হতে পারে rm -rf build, বা তারা প্রথম স্থানে তৈরি করা হয়নি)। এই রিটার্ন ত্রুটিটি আমাদের মেকফিলটিকে প্রস্থান করতে বাধ্য করবে। আমরা @-তা আটকাতে উপসর্গটি ব্যবহার করি। যদি কোনও ফাইল ইতিমধ্যে মুছে ফেলা হয় তবে তা গ্রহণযোগ্য; আমরা চাই আমাদের মেকফিলটি চলতে থাকুক এবং বাকিটি সরিয়ে দিন।

নোটটিতে আরেকটা জিনিস: এই Makefile, কাজ নাও করতে পারে যদি আপনি CMake ভেরিয়েবল একটি পরিবর্তনশীল নম্বর ব্যবহার উদাহরণস্বরূপ, আপনার প্রকল্পের নির্মাণ করতে cmake .. -DSOMEBUILDSUSETHIS:STRING="foo" -DSOMEOTHERBUILDSUSETHISTOO:STRING="bar"। এই মেকফিলটি ধরে নিয়েছে যে আপনি সিএমকে অনুরূপ উপায়ে অনুরোধ করেছেন, তা টাইপ করে cmake ..বা cmakeধারাবাহিক সংখ্যক যুক্তি সরবরাহ করে (যা আপনি আপনার মেকফাইলে অন্তর্ভুক্ত করতে পারেন)।

অবশেষে, creditণ যেখানে creditণ প্রদান is এই মেকফিলের মোড়কটি সি ++ অ্যাপ্লিকেশন প্রকল্প টেম্পলেট দ্বারা সরবরাহিত মেকফাইল থেকে গৃহীত হয়েছিল ।


4

অবশ্যই, আউট-অফ-সোর্স বিল্ডগুলি হ'ল ইউনিক্স মেকফিলের জন্য যাওয়ার পদ্ধতি, তবে আপনি যদি অন্য একটি জেনারেটর যেমন এক্লিপস সিডিটি ব্যবহার করেন তবে এটি আপনাকে ইনসোর্স তৈরি করতে পছন্দ করে। কোন ক্ষেত্রে, আপনাকে সিএমকে ফাইলগুলি ম্যানুয়ালি মুছে ফেলতে হবে। এটা চেষ্টা কর:

find . -name 'CMakeCache.txt' -o -name '*.cmake' -o -name 'Makefile' -o -name 'CMakeFiles' -exec rm -rf {} +

অথবা আপনি যদি গ্লোবস্টারটি সক্ষম করে রেখেছেন তবে shopt -s globstarপরিবর্তে এটির চেয়ে কম জঘন্য পদ্ধতির চেষ্টা করুন:

rm -rf **/CMakeCache.txt **/*.cmake **/Makefile **/CMakeFiles

গতকাল আমার পছন্দটি একটি নতুন ফোল্ডারে রেপো ক্লোনিং করছিল, সাবফোল্ডার থেকে তৈরি করতে CMakeLists.txt আপডেট করুন build। এই কমান্ডগুলির তুলনায় এটি কিছুটা বেশি সময় নিয়েছে তবে আমাকে কেবল এটি
টিয়েন ডো

4

ব্যবহারের চেষ্টা করুন: সিএমকে - ক্লিন-সিমন-প্যাক-অফ-সিএমকেলিস্টস.টেক্সট-ফাইল-বি আউটপুট-ডির

- ক্ল্যান-ফার্স্ট: টার্গেট প্রথমে ক্লিন করুন, তারপরে বিল্ড করুন।
(কেবল পরিষ্কার করার জন্য, - স্টেট ব্যবহার করুন।)


স্ক্রিন শটটি কেবল পাঠ্য দেখায় । তবুও আপনি এটির স্ক্রিন শট নিয়েছেন, এখানে যে কোনও স্ক্রিনরিডার নিয়ে এসেছেন তার উত্তর ভেঙে। দয়া করে সেই চিত্রটি ফেলে দিন এবং পাঠ্যের একটি অনুলিপি / পেস্ট করুন এবং সেই ইনপুটটি সঠিকভাবে ফর্ম্যাট করতে 1 মিনিট ব্যয় করুন।
ঘোস্টটিক

3

-Dবিল্ড ফাইলগুলি তৈরি করার সময় আপনি যখন সিএমকেতে প্যারামিটারগুলি পাস করেন এবং পুরো বিল্ড / ডিরেক্টরিটি মুছতে চান না সে ক্ষেত্রে:

আপনার বিল্ড ডিরেক্টরিতে কেবল সিএমকেফিলস / ডিরেক্টরি মুছুন।

rm -rf CMakeFiles/
cmake --build .

এর ফলে সিএমকে পুনরায় কাজ শুরু হয় এবং সিস্টেম ফাইলগুলি পুনরায় জন্মানো হয়। আপনার বিল্ডও স্ক্র্যাচ থেকে শুরু হবে।


1

"আউট অফ সোর্স" বিল্ডটি ব্যবহার করার সময় পরিষ্কার করা সহজ করার জন্য (যেমন আপনি buildডিরেক্টরিতে তৈরি করেন ), আমি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করি:

$ cat ~/bin/cmake-clean-build
#!/bin/bash

if [ -d ../build ]; then
    cd ..
    rm -rf build
    mkdir build
    cd build
else
    echo "build directory DOES NOT exist"
fi

প্রতিবার আপনাকে পরিষ্কার করার দরকার পরে buildডিরেক্টরি থেকে এই স্ক্রিপ্টটি উত্স করা উচিত :

. cmake-clean-build

সুন্দর এবং নিরাপদ। আমি যেমন ফাইল ম্যানেজারে আপনার বিল্ড ডিরেক্টরিটি খোলার থাকতে পারে তাই আমি cd .. ; rm ; mkdir ; cdক্রমটি এর সাথে প্রতিস্থাপনের পরামর্শ দিই cd .. ; rm -rf build/*
মোস্তফা ফারজান

0

আপনার যদি কাস্টম সংজ্ঞায়িত হয় এবং পরিষ্কার করার আগে সেগুলি সংরক্ষণ করতে চান তবে আপনার বিল্ড ডিরেক্টরিতে নিম্নলিখিতটি চালান:

sed -ne '/variable specified on the command line/{n;s/.*/-D \0 \\/;p}' CMakeCache.txt

তারপরে একটি নতুন বিল্ড ডিরেক্টরি তৈরি করুন (বা পুরাতন বিল্ড ডিরেক্টরিটি সরিয়ে এটি পুনরায় তৈরি করুন) এবং অবশেষে cmakeআপনি উপরের স্ক্রিপ্টটির সাথে যুক্তিগুলি দিয়ে চলুন run


0

আপনি যদি চালান

cmake .

এটি সিএমকে ফাইলগুলি পুনরায় তৈরি করবে। উদাহরণস্বরূপ, আপনি যদি * .cc দ্বারা নির্বাচিত একটি উত্স ফোল্ডারে কোনও নতুন ফাইল যুক্ত করেন তবে প্রয়োজনীয়।

যদিও এটি প্রতি সেফ "পরিষ্কার" নয়, এটি ক্যাশে পুনর্জাত করে সিএমকে ফাইলগুলি "পরিষ্কার" করে।


এটি কব্জি পরিষ্কার করে না। সংকলন স্থিতি: "cmake" পরে যদি 1200 টির মধ্যে 500 টি ফাইল সংকলন করা থাকে। এটি কেবল সর্বশেষ 700 ফাইলগুলি দিয়ে চালিয়ে যাবে।
পিটার মর্টেনসেন

0

আমি এই জাতীয় উদ্দেশ্যে নিম্নলিখিত শেল স্ক্রিপ্ট ব্যবহার করি:

#!/bin/bash

for fld in $(find -name "CMakeLists.txt" -printf '%h ')
do
    for cmakefile in CMakeCache.txt cmake_install.cmake CTestTestfile.cmake CMakeFiles Makefile
    do
        rm -rfv $fld/$cmakefile
    done
done

আপনি যদি উইন্ডোজ ব্যবহার করেন তবে এই স্ক্রিপ্টের জন্য সাইগউইন ব্যবহার করুন।


0

এই প্রশ্নটি এত বেশি মনোযোগ এবং জটিল সমাধান পায় তা মজাদার, যা প্রকৃতপক্ষে cmake সহ পরিষ্কার পদ্ধতি না রাখার জন্য একটি ব্যথা দেখায়।

ঠিক আছে, আপনি অবশ্যই cd buildআপনার কাজটি করতে পারেন , তারপরে rm -rf *আপনাকে পরিষ্কার করার দরকার পরে একটি করুন । যাইহোক, rm -rf *একটি বিপজ্জনক আদেশ দেওয়া হয়েছে যে অনেক লোক প্রায়শই অবগত হয় না যে তারা কোন দিরের মধ্যে রয়েছে।

আপনি যদি cd .., rm -rf buildএবং তারপর mkdir buildএবং তারপর cd build, যে শুধু অত্যধিক টাইপিং আছে।

সুতরাং একটি ভাল সমাধানটি হ'ল বিল্ড ফোল্ডারের বাইরে থাকা এবং পথটি চটকে বলা:
কনফিগার করা: cmake -B build
বিল্ড: cmake --build build
পরিষ্কার করা: rm -rf build
বিল্ড ফোল্ডারটি পুনরায় তৈরি করা: আপনার এমনকি প্রয়োজন হয় না mkdir build, কেবল এটির সাথে কনফিগার করুন cmake -B buildএবং cmake এটি তৈরি করবে


0

cmakeবেশিরভাগই একটি রান্না Makefile, এক যোগ করতে পারিনি rmকরার পরিষ্কার অপ্রকৃত

উদাহরণ স্বরূপ,

[root@localhost hello]# ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  CMakeLists.txt  hello  Makefile  test
[root@localhost hello]# vi Makefile
clean:
        $(MAKE) -f CMakeFiles/Makefile2 clean
        rm   -rf   *.o   *~   .depend   .*.cmd   *.mod    *.ko   *.mod.c   .tmp_versions *.symvers *.d *.markers *.order   CMakeFiles  cmake_install.cmake  CMakeCache.txt  Makefile

-1

আমার শেল আরসি ফাইলটিতে এটি রয়েছে ( .bashrc, .zshrc):

t-cmake-clean() {
    local BUILD=$(basename $(pwd))
    cd ..
    rm -rf $BUILD
    mkdir $BUILD && cd $BUILD
}

আপনার এটি কেবলমাত্র উত্সের বাইরে তৈরির জন্য ব্যবহার করার কথা । ধরা যাক আপনার build/এই উদ্দেশ্যে একটি ডিরেক্টরি নাম আছে say তারপরে আপনাকে কেবল এর t-cmake-cleanমধ্যে থেকে চালাতে হবে।


-3

নিম্নলিখিত সমস্যার সমাধান করতে আমি zsxwing এর উত্তর সফলভাবে ব্যবহার করেছি :

আমার কাছে উত্স রয়েছে যে আমি একাধিক হোস্টে তৈরি করি (একটি রাস্পবেরি পাই লিনাক্স বোর্ডে, ভিএমওয়্যার লিনাক্স ভার্চুয়াল মেশিনে ইত্যাদি))

আমার কাছে বাশ স্ক্রিপ্ট রয়েছে যা মেশিনের হোস্টনামের উপর ভিত্তি করে অস্থায়ী ডিরেক্টরি তৈরি করে:

# Get hostname to use as part of directory names
HOST_NAME=`uname -n`

# Create a temporary directory for cmake files so they don't
# end up all mixed up with the source.

TMP_DIR="cmake.tmp.$HOSTNAME"

if [ ! -e $TMP_DIR ] ; then
  echo "Creating directory for cmake tmp files : $TMP_DIR"
  mkdir $TMP_DIR
else
  echo "Reusing cmake tmp dir : $TMP_DIR"
fi

# Create makefiles with CMake
#
# Note: switch to the temporary dir and build parent 
#       which is a way of making cmake tmp files stay
#       out of the way.
#
# Note 2: to clean up cmake files, it is OK to
#        "rm -rf" the temporary directories

echo
echo Creating Makefiles with cmake ...

cd $TMP_DIR

cmake ..

# Run makefile (in temporary directory)

echo
echo Starting build ...

make

-8

একটি অস্থায়ী বিল্ড ডিরেক্টরি তৈরি করুন, উদাহরণস্বরূপ build_cmake,। সুতরাং আপনার সমস্ত বিল্ড ফাইল এই ফোল্ডারের ভিতরে থাকবে।

তারপরে আপনার সিএমকে ফাইলটিতে নীচের কমান্ডটি যুক্ত করুন।

add_custom_target(clean-all
    rm -rf *
)

তাই সংকলন করার সময়

cmake ..

এবং পরিষ্কার করতে:

make clean-all

11
আপনার সমস্ত প্রকল্প অপসারণ করার দুর্দান্ত উপায় যদি কোনও দুর্ঘটনাক্রমে কেউ উত্স-এর পরিবর্তে ইন-উত্স তৈরি করে

3
হ্যাঁ. এই পদ্ধতিটি শুধুমাত্র "উত্স তৈরির বাইরে"
নাটেশ

6
ভয়াবহ সুপারিশ। উত্তর হিসাবে থাকা উচিত নয়।
অ্যান ভ্যান রসাম

@ অ্যানভ্যানরোসাম সম্মত হন
জ্যাভারিটো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.