সিএমকে আউটপুট / বিল্ড ডিরেক্টরি


116

আমি সিএমকেতে বেশ নতুন, এবং এটি কীভাবে ব্যবহার করব সে সম্পর্কে কয়েকটি টিউটোরিয়াল পড়েছি এবং 3 টি বিভিন্ন সংকলকের জন্য একটি প্রোগ্রাম তৈরি করতে সিএমকে স্ক্রিপ্টের 50 টি জটিল পংক্তি লিখেছি। এটি সম্ভবত আমার সমস্ত জ্ঞান সিএমকেতে শেষ করে।

এখন আমার সমস্যাটি হ'ল আমার কাছে কিছু সোর্স কোড রয়েছে, যার ফোল্ডারটি আমি প্রোগ্রামটি তৈরি করার সাথে সাথে স্পর্শ করতে / গোলযোগ করতে চাই না। আমি চাই যে সমস্ত সিএমকে এবং makeআউটপুট ফাইল এবং ফোল্ডারগুলিতে প্রবেশ করা উচিত ../Compile/, তাই আমি তার জন্য আমার সিএমকে স্ক্রিপ্টে কয়েকটি ভেরিয়েবল পরিবর্তন করেছি এবং আমার ল্যাপটপে যখন আমি এরকম কিছু করেছি তখন এটি কিছু সময়ের জন্য কাজ করেছিল:

Compile$ cmake ../src
Compile$ make

যেখানে এই মুহুর্তে আমি এখনই ফোল্ডারে আছি তার পরিষ্কার পরিচ্ছন্নতা ছিল যা আমি সন্ধান করছি।

এখন আমি অন্য কম্পিউটারে চলে এসে সিএমকে ২.৮.১১.২ পুনরায় কম্পাইল করেছিলাম এবং আমি প্রায় এক বর্গাকারে ফিরে এসেছি! এটি সর্বদা srcআমার যেখানে CMakeLists.txtঅবস্থিত ফোল্ডারে জিনিসটি সংকলন করে ।

আমি আমার সিএমকে স্ক্রিপ্টে যে অংশটি ডিরেক্টরিটি চয়ন করেছি তা হ'ল:

set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/)
set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir})
set(CMAKE_BUILD_FILES_DIRECTORY ${dir})
set(CMAKE_BUILD_DIRECTORY ${dir})
set(CMAKE_BINARY_DIR  ${dir})
SET(EXECUTABLE_OUTPUT_PATH ${dir})
SET(LIBRARY_OUTPUT_PATH ${dir}lib)
SET(CMAKE_CACHEFILE_DIR ${dir})

এবং এখন এটি সর্বদা এর সাথে শেষ হয়:

-- Build files have been written to: /.../src

আমি কিছু অনুপস্থিত করছি?


4
আপনার সেট করা সমস্ত ভেরিয়েবল সেট করার দরকার নেই। সিএমকে তাদের যুক্তিসঙ্গত খেলাপি স্থির করে দেয়। আপনি অবশ্যই পরিবর্তন বা না করা উচিত । আপনি যদি এই সমস্ত কলগুলি সরিয়ে এবং কেবল করেন তবে কি হবে ? CMAKE_BINARY_DIRCMAKE_CACHEFILE_DIRset()cd Compile; rm -rf *; cmake ../src
এঞ্জিউ আর

5
মূলত, সিএমকে চালানোর সময় আপনি যতক্ষণ সোর্স ডিরেক্টরি থেকে বাইরে থাকবেন, ততক্ষণ আপনার সিএমকেলিস্টটি স্পষ্টভাবে না বললে এটি উত্স ডিরেক্টরিটি পরিবর্তন করবে না।
এঞ্জিউ আর

@ অ্যাঞ্জিউ এই টিপটির জন্য আপনাকে ধন্যবাদ, যা অবাক করার মতো! আমি এই সমস্ত লাইন সরিয়েছি এবং স্রেফ cmake ব্যবহার করেছি ../src এবং এটি একটি কবজির মতো কাজ করেছে! এটি এত আশ্চর্যজনক কারণ আমি যখন প্রথমবারের মতো সিএমকে শিখছিলাম তখন এটি চেষ্টা করেছিলাম এবং এটি কার্যকর হয়নি। আপনাকে বড় ফ্যাট চেক চিহ্ন দেওয়ার জন্য দয়া করে আপনার উত্তরটি একটি সরকারী উত্তরে রেখে দিন :)
কোয়ান্টাম পদার্থবিদ

1
আমাকে অ্যাডাম বোভেনের মন্তব্যটি যা রক্ষা করেছিল তা হ'ল "আপনি ইন-উত্স বিল্ড দিয়ে উত্স ডিরেক্টরিতে আউট-অফ-সোর্স বিল্ড তৈরি করতে পারবেন না"
অর সরফ

উত্তর:


60

আপনার সেট করা সমস্ত ভেরিয়েবল সেট করার দরকার নেই। সিএমকে তাদের যুক্তিসঙ্গত খেলাপি স্থির করে দেয়। আপনি অবশ্যই পরিবর্তন বা না করা উচিত । এগুলি কেবল পঠনযোগ্য হিসাবে বিবেচনা করুন।CMAKE_BINARY_DIRCMAKE_CACHEFILE_DIR

প্রথমে src ডিরেক্টরি থেকে বিদ্যমান সমস্যাযুক্ত ক্যাশে ফাইলটি সরান:

cd src
rm CMakeCache.txt
cd ..

তারপরে সমস্ত set()কমান্ড মুছে ফেলুন এবং করুন:

cd Compile
rm -rf *
cmake ../src

সিএমকে চালানোর সময় আপনি যতক্ষণ সোর্স ডিরেক্টরি থেকে বাইরে থাকবেন না, যতক্ষণ না আপনার সিএমকেলিস্ট এটিকে স্পষ্টভাবে না বলে it

একবার আপনার এই কাজটি শেষ হয়ে গেলে আপনি সিএমকে ডিফল্টরূপে জিনিসগুলি কোথায় রাখছেন তা দেখতে পারেন এবং কেবলমাত্র আপনি যখন ডিফল্ট অবস্থানগুলি (যেমন এর ডিফল্ট মান EXECUTABLE_OUTPUT_PATH) এর সাথে সন্তুষ্ট না হন তবে কেবলমাত্র আপনার যা প্রয়োজন তা সংশোধন করুন। আর তাদের আপেক্ষিক প্রকাশ করার চেষ্টা CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, PROJECT_BINARY_DIRইত্যাদি

আপনি যদি সিএমকে ডকুমেন্টেশনটি দেখেন তবে আপনি ভেরিয়েবলগুলি সিনেমিক বিভাগগুলিতে বিভক্ত দেখতে পাবেন। খুব বিশেষ পরিস্থিতি ব্যতীত আপনার "ভেরিয়েবলগুলি যে তথ্য সরবরাহ করে" এর অধীনে তালিকাবদ্ধ সমস্তগুলি কেবল সিএমকেলিস্টের অভ্যন্তরে কেবল পঠন হিসাবে বিবেচনা করা উচিত।


2
আমি এসআরসি ডিরেক্টরিতে বিল্ডস সহ কমকে ব্যবহার শুরু করেছি ... এই কৌশলটি প্রাথমিকভাবে ব্যর্থ হয়েছিল। এসআরসি ডিরেক্টরিতে এই প্রযুক্তিটি যে কাজ করেছিল তাতে আমি সমস্ত ক্যামেক বিল্ড ফাইল / ক্যাশে মুছে ফেললাম। ধন্যবাদ!
আভি তেভেট

18
সম্ভবত এটি ব্যবহার না করার পরামর্শ দেওয়া ভাল rm -rf *cd Compileব্যর্থ হলে এটি সুন্দর নয় ...
রোমান

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

@ অ্যাভিটিভেট: আমি মনে করি এটি সঠিক উত্তর। যদি উত্স ডিরেক্টরিতে পূর্ববর্তী চিরকুট আমন্ত্রণ থেকে ক্যামকে ক্যাশে ফাইলগুলি থাকে তবে উত্স ফাইল থেকে পুরানো সমস্তগুলি মুছে না দেওয়া পর্যন্ত আপনি উত্পন্ন ফাইলগুলির জন্য অন্য ডিরেক্টরি বাছতে চাইবেন না। আমার মতে সিএমকে খুব সুন্দর ভাঙা আচরণ। কেন আপনি অন্য উত্তর লিখবেন না?
জো সো

113

মনে হচ্ছে আপনি কোনও উত্স তৈরির বাইরে চান । কয়েকটি উত্স রয়েছে যা আপনি উত্স তৈরির বাইরে তৈরি করতে পারেন।

  1. আপনি যা করছিলেন তা করুন, চালান

    cd /path/to/my/build/folder
    cmake /path/to/my/source/folder

    যা cmake একটি জেনারেট করতে হবে build ট্রি মধ্যে /path/to/my/build/folderজন্য উৎস গাছ মধ্যে /path/to/my/source/folder

    একবার এটি তৈরি হয়ে গেলে, ক্যামাক স্মরণ করে যে উত্স ফোল্ডারটি কোথায় - তাই আপনি এটি দিয়ে বিল্ড ট্রিতে পুনরায় চালাতে পারেন

    cmake /path/to/my/build/folder

    অথবা এমনকি

    cmake .

    যদি আপনার বর্তমান ডিরেক্টরিটি ইতিমধ্যে বিল্ড ফোল্ডার হয়।

  2. সিএমকে ৩.১৩ বা তার পরে, উত্স সেট করতে এবং ফোল্ডারগুলি তৈরি করতে এই বিকল্পগুলি ব্যবহার করুন

    cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
  3. পুরানো সিএমকে জন্য, উত্স সেট করতে এবং ফোল্ডারগুলি তৈরি করতে কিছু অনাবন্ধিত বিকল্পগুলি ব্যবহার করুন :

    cmake -B/path/to/my/build/folder -H/path/to/my/source/folder

    যা (1) হিসাবে ঠিক একই জিনিসটি করবে তবে বর্তমান কার্যনির্বাহী ডিরেক্টরিতে নির্ভরতা ছাড়াই।

CMake তার আউটপুট সব রাখে build ট্রি ডিফল্টরূপে, তাই যদি না আপনি অকুণ্ঠচিত্তে ব্যবহার করছেন ${CMAKE_SOURCE_DIR}বা ${CMAKE_CURRENT_SOURCE_DIR}আপনার cmake ফাইলের মধ্যে, এটি আপনার স্পর্শ করতে না পারে উৎস গাছ

সবচেয়ে বড় যেটি ভুল হতে পারে তা হ'ল যদি আপনি পূর্বে আপনার উত্স গাছটিতে একটি বিল্ড ট্রি তৈরি করেছেন (যেমন আপনার উত্স বিল্ড রয়েছে)। একবার আপনি এই (1) এর দ্বিতীয় অংশটি উপরে কিক্স করে নিলে, এবং সিমেক উত্সটিতে কোনও পরিবর্তন করে না বা অবস্থানগুলি তৈরি করে না। সুতরাং, আপনি ইন-সোর্স বিল্ড সহ উত্স ডিরেক্টরিতে আউট-অফ-সোর্স বিল্ড তৈরি করতে পারবেন নাCMakeCache.txtউত্স ডিরেক্টরি থেকে (সর্বনিম্ন) অপসারণ করে আপনি এটি মোটামুটি সহজেই ঠিক করতে পারেন । আরও কয়েকটি ফাইল রয়েছে (বেশিরভাগ CMakeFilesডিরেক্টরিটিতে) যা সিএমকে জেনারেট করে যে আপনারও অপসারণ করা উচিত, তবে এগুলি উত্স গাছটিকে একটি বিল্ড ট্রি হিসাবে বিবেচনা করার কারণ হবে না।

যেহেতু আউট-অফ-সোর্স বিল্ডগুলি ইন-সোর্স বিল্ডগুলির চেয়ে প্রায়শই কাঙ্ক্ষিত হয় তাই আপনি উত্স বিল্ডগুলির প্রয়োজনের জন্য নিজের চক্রটি পরিবর্তন করতে চাইতে পারেন:

# Ensures that we do an out of source build

MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
     STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
     "${CMAKE_BINARY_DIR}" insource)
     GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
     STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
     "${PARENTDIR}" insourcesubdir)
    IF(insource OR insourcesubdir)
        MESSAGE(FATAL_ERROR "${MSG}")
    ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)

MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
    "${CMAKE_PROJECT_NAME} requires an out of source build."
)

উপরের ম্যাক্রোটি ব্যবহৃত একটি সাধারণ ব্যবহৃত মডিউল থেকে আসে MacroOutOfSourceBuildMacroOutOfSourceBuild.cmakeগুগলে প্রচুর উত্স রয়েছে তবে আমি আসলটি খুঁজে পাচ্ছি না এবং এখানে পুরোপুরি অন্তর্ভুক্ত করার পক্ষে এটি যথেষ্ট সংক্ষিপ্ত।

দুর্ভাগ্যক্রমে cmake সাধারণত ম্যাক্রোটি আহ্বানের সময় কয়েকটি ফাইল লিখেছিল, যদিও এটি আপনাকে প্রকৃতপক্ষে বিল্ড সম্পাদন করা থেকে বিরত করবে যদিও আপনার এখনও মুছে ফেলতে হবে CMakeCache.txtএবং প্রয়োজন CMakeFiles

বাইনারি, ভাগ করা এবং স্ট্যাটিক লাইব্রেরিগুলিতে যে রাস্তাগুলি লিখিত রয়েছে সেটগুলি স্থাপন করা আপনার পক্ষে দরকারী হতে পারে - এই ক্ষেত্রে দেখুন আমি কীভাবে একটি 'বিন' দিরের মধ্যে cmake আউটপুট তৈরি করব? (অস্বীকৃতি, আমি এই প্রশ্নের উপরে শীর্ষে উত্তর দেওয়া আছে ... কিন্তু আমি এটি সম্পর্কে জানি যে কিভাবে)।


আসলে উৎস ফোল্ডার সেট করতে বিকল্প -Sনা-H
smac89

@ smac89 ধন্যবাদ! দেখে মনে হচ্ছে তারা এগুলি 3.13 এ নথিভুক্ত করেছেন - আমি আধুনিক সিএমকে প্রতিবিম্বিত করার জন্য উত্তরটি আপডেট করেছি।
অ্যাডাম

8

আমার মন্তব্যকে উত্তরে রূপান্তর করা:

যদি কেউ আমার কাজটি করেছিল তবে যা উত্স ডিরেক্টরিতে সমস্ত বিল্ড ফাইল রেখে দিয়ে শুরু হয়েছিল:

cd src
cmake .

cmake বিল্ড ফাইল এবং ক্যাশে ফাইল (একটি গুচ্ছ করা হবে CMakeCache.txt, CMakeFiles, cmake_install.cmakeমধ্যে, ইত্যাদি) srcDir।

উত্স বিল্ডের বাইরে যাওয়ার জন্য, আমাকে এই ফাইলগুলি সরিয়ে ফেলতে হয়েছিল। তারপরে @ অঞ্জিউ তার উত্তরে যা বলেছিল তা আমি করতে পেরেছিলাম:

mkdir -p src/build
cd src/build
cmake ..

7

সিএমকে উইকি হিসাবে :

CMAKE_BINARY_DIR যদি আপনি ইন-উত্সটি তৈরি করে থাকেন তবে এটি CMAKE_SOURCE_DIR এর সমান, অন্যথায় এটি আপনার বিল্ড ট্রি এর শীর্ষ স্তরের ডিরেক্টরি

আউট অফ অফ সোর্স বিল্ড শুরু হয়েছে কিনা তা নির্ধারণ করতে এই দুটি ভেরিয়েবলের সাথে তুলনা করুন


6

আপনার স্ক্রিপ্টে আপনার হার্ড কোডড বিল্ড দির নামের উপর নির্ভর করা উচিত নয়, সুতরাং লাইনটি ../Compileঅবশ্যই পরিবর্তন করা উচিত।

এটি কারণ যেখানে এটি সংকলন করতে হবে তা ব্যবহারকারীদের উচিত।

পরিবর্তে পূর্বনির্ধারিত ভেরিয়েবলগুলির মধ্যে একটি ব্যবহার করুন : http://www.cmake.org/Wiki/CMake_Useful_Variables (অনুসন্ধান করুন CMAKE_BINARY_DIRএবং CMAKE_CURRENT_BINARY_DIR)


2
এটি নিখুঁতভাবে যা আমি সন্ধান করছিলাম - CMAKE_CURRENT_BINARY_DIRএটি সাধারণত বাইনারি বিল্ড পাথ সম্পর্কে জানায়। নির্ভরশীল libs / বিন বিল্ড সেট করার জন্য সম্ভবত ব্যবহার করা যেতে পারে।
পরশ্রিশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.