সিএমকে 'কনফিগার - প্রিফিক্স = ডিআইআর & অ্যান্ড ইন্ড ইনস্টল করুন' এর সমতুল্য কী?


386

আমি কি cmake . && make all install। এটি কাজ করে তবে ইনস্টল করে /usr/local

আমার একটি অন্য উপসর্গে ইনস্টল করা প্রয়োজন (উদাহরণস্বরূপ, থেকে /usr)।

এর পরিবর্তে ইনস্টল করার জন্য cmakemakeকমান্ড লাইনটি কী ?/usr/usr/local


1
ফ্লাইয়ে ইনস্টল ডিরেক্টরিটি পরিবর্তন করার জন্য এটি একটি দুর্দান্ত প্রশ্ন, তবে এটি কেন এমন স্পষ্টতই সাধারণ প্রয়োজন? আমার দৃষ্টিকোণ থেকে, উত্তরটি কোনও কমান্ড লাইন বিকল্প ব্যবহার করা উচিত নয়, পরিবর্তে বেসটি সম্পাদনা করুন CMakeLists.txtযাতে আপনি এটি সেট করতে পারেন এবং এটি ভুলে যেতে পারেন। আমি বলছি না যে ফ্লাইতে ইনস্টল ডিরেক্টরিটি পরিবর্তন করার জন্য একটি সাধারণ ব্যবহারের কেস নেই - স্পষ্টতই ভোটের সংখ্যা দ্বারা বিচার করা হচ্ছে - আমি যখন মুখ্য সমস্যাটি আসি তখন সিএমকে আমি মোটামুটি নতুন এবং কৌতূহলী।
সিভিফ্যান

8
@ সিআইভিফ্যান এটি এমন ব্যবহারকারীদের খাওয়ানোর জন্য যা প্রকল্পটি কোনও নির্দিষ্ট জায়গায় তৈরি করতে এবং ইনস্টল করতে চায় তবে প্রকল্পের বিকাশকারী / রক্ষণাবেক্ষণকারীদের মতো একই মানুষ নয়।
ডেভিড র্যাথলিসবার্গার

4
@ সিআইভিফ্যান সুতরাং একজন রক্ষণাবেক্ষণকারী হিসাবে make install, আমার বিকাশ যন্ত্রটিকে গণ্ডগোল না করে যা কিছু ইনস্টল করা দরকার তা সঠিক জায়গায় ইনস্টল করা হয়েছে তা নিশ্চিত করার জন্য আমার অস্থায়ী পথে পরীক্ষা করা আমার পক্ষে অস্বাভাবিক নয় । শুধু একটি উদাহরণ। আরেকটি কেস অন্য স্থাপত্যের জন্য ক্রস-সংকলন।
ড্যানিয়েল

5
@ সিভিফ্যান: আমার এটি দরকার কারণ আমি আরপিএম প্যাকেজ তৈরি করতে চাই। যদি আমার এটি পরিবর্তন করতে হয় CMakeLists.txtতবে আমার মূল উত্সটি প্যাচ করা দরকার। কমান্ড লাইন অপশন থাকা সত্ত্বেও ফেডোরা specফাইলটিতে পাথগুলি পেতে সক্ষম করে ।
মার্টিন উয়েডিং

1
@ সিভিফ্যান (এবং অন্যান্যরা এটি পড়ছেন) এফওয়াইআই, সাধারণত CMakeLists.txtআপনি যদি সফ্টওয়্যার তৈরি এবং ইনস্টল করে থাকেন - কমান্ড লাইন বা প্রাথমিক ক্যাশে ফাইল থেকে ভেরিয়েবলকে ওভাররাইডিং / সেট করা ইত্যাদি পছন্দসই "গ্রাহক" বিকল্প স্থাপনের উপায়।
রায়ান পাভলিক

উত্তর:


444

আপনি কমান্ড লাইনে যে কোনও সিএমকে ভেরিয়েবল পাস করতে পারেন, বা ccmake / cmake-gui ব্যবহার করে ক্যাশে ভেরিয়েবল সম্পাদনা করতে পারেন। কমান্ড লাইনে,

cmake -DCMAKE_INSTALL_PREFIX: PATH = / usr। && সমস্ত ইনস্টল করুন

প্রকল্পটি কনফিগার করবে, সমস্ত লক্ষ্যমাত্রা তৈরি করবে এবং / usr উপসর্গটিতে ইনস্টল করবে। টাইপ (PATH) কঠোরভাবে প্রয়োজনীয় নয়, তবে Qt ভিত্তিক cmake-gui ডিরেক্টরি চয়নকারী ডায়ালগ উপস্থাপন করতে পারে।

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

mkdir build && cd build && cmake-DCMAKE_INSTALL_PREFIX: PATH = / usr .. && cmake - build। --target ইনস্টল করুন --config রিলিজ

আপনি দেখতে পাচ্ছেন এটি বেশ খানিকটা দীর্ঘ হয়ে যায়, এবং সরাসরি আর সমতুল্য নয়, তবে মোটামুটি সংক্ষিপ্ত আকারে সেরা অনুশীলনের আরও কাছাকাছি ... --config কেবলমাত্র বহু-কনফিগারেশন জেনারেটর (যেমন এমএসভিসি) দ্বারা ব্যবহৃত হয়, উপেক্ষা করা হয় অন্যদের দ্বারা.


21
ভাবছেন কি: PATH কি? এটি চক্রের জন্য উইজেট চয়ন করতে সহায়তা করে, চতুর-গুইয়ের জন্য দরকারী। Linux.die.net/man/1/cmake-gui (সেট বিভাগ)
আলবফান

2
তারা সিএমকে জিইউআই-কে ইঙ্গিত সরবরাহ করে বলেছে যে, সিএমকেকের প্রতিটি জিনিস কার্যকরীভাবে একটি স্ট্রিং, তবে পাঠ্য, ফাইলপথ, STRING, বোল ইত্যাদি নির্ধারণ করে জিইউআইকে আরও উপযুক্ত উইজেট উপস্থাপন করতে সহায়তা করে।
মার্কাস ডি। হ্যানওয়েল

13
আপনি এটি ব্যবহার করতে পারেন: "cmake - বিল্ড - স্টেট ইনস্টল।" পরিবর্তে করা।
রবার্টজেমায়নার্ড

2
পরে / usr জন্য বিন্দু কি? /usr .
বোড্যাসিডো

5
সিএমকেলিস্টস টেক্সট সহ ফোল্ডারের @ বোডাসিডো অবস্থান
কামিককলো

48

গৃহীত উত্তরের ": PATH" অংশটি বাদ দেওয়া যেতে পারে। এই বাক্য গঠন আরও স্মরণীয় হতে পারে:

cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install

... এখানে উত্তর হিসাবে ব্যবহৃত ।



29

নোট উভয় CMake মাঝে এবং যা কিছু Autotools আপনি সবসময় কনফিগার সময়ে ইনস্টলেশন পাথ সেট করতে হবে না। আপনি ইনস্টলের সময় DESTDIR ব্যবহার করতে পারেন ( পরিবর্তে এখানেও দেখুন ) এর পরিবর্তে:

make DESTDIR=<installhere> install

আরও দেখুন এই প্রশ্নের যা DESTDIR এবং উপসর্গ মধ্যে সূক্ষ্ম পার্থক্য ব্যাখ্যা করে।

এটি স্টেজড ইনস্টলগুলির জন্য এবং প্রোগ্রামগুলি যেখানে সেগুলি চালিত হয় সেখান থেকে কোনও পৃথক স্থানে সংরক্ষণের জন্য যেমন /etc/alternativesপ্রতীকী লিঙ্কগুলির মাধ্যমে পরিচালিত করার উদ্দেশ্যে is

যাইহোক, যদি আপনার প্যাকেজ relocatable নেই এবং আমরা কোন হার্ড কোডেড (প্রিফিক্স) পাথ কনফিগার পর্যায় মাধ্যমে সেট প্রয়োজন নেই আপনি পারে এটা এড়িয়ে যেতে সক্ষম হবেন। এর পরিবর্তে:

cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install

আপনি দৌড়াতে হবে:

cmake . && make DESTDIR=/usr all install

মনে রাখবেন যে, ব্যবহারকারী 74৪৯৮৪৪১ হিসাবে উল্লেখ করেছেন যে, আপনি যে পরিস্থিতিগুলি ইতিমধ্যে PREFIX ব্যবহার করা উচিত সে ক্ষেত্রে এটি উপযুক্ত নয়।


9
আমি এর ব্যবহার দেখাচ্ছে DESTDIR। তবে আসলে এটি ভুল। আপনার cmake ডকস cmake.org/cmake/help/v3.0/variable/CMAKE_INSTALL_PREFIX.html ... উল্লেখ করা উচিত make DESTDIR=/home/john installযা ইনস্টলেশন উপসর্গ ব্যবহার করে সম্পর্কিত সফ্টওয়্যার ইনস্টল করবে, যেমন "/ usr / স্থানীয়" DESTDIR মান সহ প্রিপেন্ড করা হবে যা শেষ পর্যন্ত "/ হোম / জন / ইউএসআর / স্থানীয়" দেয়।
জোয়াকিম

1
আমি মনে করি না যে এটি পরস্পরবিরোধী। যদি আপনার প্যাকেজটি স্থানান্তরযোগ্য হয় তবে আপনার CMAKE_INSTALL_PREFIX দরকার নেই, বরং আপনি যে কোনও পদ্ধতি বেছে নিতে পারেন। যদি এটি না হয় তবে CMAKE_INSTALL_PREFIX তৈরির সময় কোথাও বেক করা হবে।
ব্রুস অ্যাডামস 21

যদি আপনি জানেন যে আপনার জেনারেটরটি মেকফাইল ... আমি cmake --build build --target install -- DESTDIR=/usrনোটটি পছন্দ করি : এটি নিনজা জেনারেটরের সাথেও কাজ করা উচিত (নিয়মগুলি মনে হয় $ENV{DESTDIR})
মিজাক্স

@ জোয়াকিম যতটা আমি CMAKE_INSTALL_PREFIX ব্যবহার করতে চাই, কম্পাইল করা ফাইলগুলিতে ইনস্টলনের পথটি এম্বেড করে রেখেছি। এটি যেমন ঘটেছিল, আমি কেবল একটি .আরএম প্যাকেজ তৈরি করেছিলাম, যাতে এটি না হয়। বিল্ডরুটে জিনিস আনার জন্য ডিএসটিডিআইআর মনোহরের মতো কাজ করেছিল।
মিঃ রেডস্টোনার

18

আমি সিএমকে প্রকল্পগুলি ক্রস প্ল্যাটফর্মটি যেভাবে তৈরি করি তা নিম্নলিখিত:

/project-root> mkdir build
/project-root> cd build
/project-root/build> cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
/project-root/build> cmake --build . --target=install --config=Release
  • প্রথম দুটি লাইন আউট-অফ-সোর্স বিল্ড ডিরেক্টরি তৈরি করে
  • তৃতীয় লাইনটি বিল্ড সিস্টেম উত্পন্ন করে উল্লেখ করে যেখানে ইনস্টলেশন ফলাফলটি কোথায় রাখা উচিত (যা আমি সর্বদা রাখি ./project-root/build/stage - পথটি সর্বদা বর্তমান ডিরেক্টরিটির তুলনায় বিবেচিত হয় যদি তা নিরঙ্কুশ না হয়)
  • চতুর্থ .লাইনটি পূর্বে লাইনে কনফিগার করা বিল্ডসিস্টেমের সাথে কনফিগার করা প্রকল্পটি তৈরি করে । এটি installটার্গেটটি কার্যকর করে যা সমস্ত প্রয়োজনীয় নির্ভরশীল লক্ষ্যগুলিও তৈরি করে যদি সেগুলি তৈরি করার প্রয়োজন হয় এবং তারপরে ফাইলগুলি অনুলিপি করে CMAKE_INSTALL_PREFIX(যা এই ক্ষেত্রে হয় ./project-root/build/stagemulti ভিজুয়াল স্টুডিওর মতো মাল্টি-কনফিগারেশন বিল্ডগুলির জন্যও আপনি কনফিগারেশনটি নির্দিষ্ট করে দিতে পারেন .চ্ছিক --config <config>পতাকা।
  • cmake --buildকমান্ডটি ব্যবহার করার সময় ভাল অংশটি হ'ল এটি বিভিন্ন কমান্ডের প্রয়োজন ছাড়াই সমস্ত জেনারেটরের জন্য (যেমন মেকফিলস এবং ভিজ্যুয়াল স্টুডিও) কাজ করে।

এরপরে আমি প্যাকেজ তৈরি করতে বা অন্য প্রকল্পগুলিতে অন্তর্ভুক্ত করার জন্য ইনস্টল করা ফাইলগুলি ব্যবহার করি ...


ধাপে ধাপে ব্যাখ্যার জন্য ধন্যবাদ! আইএমও এটিই একমাত্র উপায়, অন্যথায় চূড়ান্তভাবে প্ল্যাটফর্মের সম্পূর্ণ বিন্দু (প্ল্যাটফর্মের স্বাধীনতা) বাতিল করা হয় ...
হেলমেজো

1
আপনি কি সূত্রের পথ (../) লাইনে অন্তর্ভুক্ত করতে ভুলে গেছেন? বিটিডাব্লিউ এর এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
স্লাভা

1
লাইন 3 হওয়া উচিতcmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
কোডেনমেজারো

1
অতিরিক্ত নোট হিসাবে, ব্যবহারিকভাবে লোকেরা make -j $(nproc)বিল্ড থ্রেডের সংখ্যা নির্দিষ্ট করতে cmake --build . --target=install --config=Release -- -j 8মেকফিল জেনারেটরের cmake --build . --target=install --config=Release -- /m:8জন্য বা ভিজুয়াল স্টুডিও জেনারেটরের জন্য 8 টি থ্রেড ব্যবহার করে use আসলে, আপনি কোনও কমান্ডলাইন প্যারামিটারগুলি পরে পাস করতে পারবেন--
ক্লাউড

1
@ মিঃ রেডস্টোনার ক্যামেকের -jজন্য পতাকা নয়, সমস্ত পতাকা --অন্তর্নিহিত বিল্ড সিস্টেমে যাওয়ার পরে আসে ...
মেঘ

4

ব্রুস অ্যাডামসের উত্তর সম্পর্কে:

আপনার উত্তর বিপজ্জনক বিভ্রান্তি সৃষ্টি করে। DESTDIR মূল গাছ থেকে ইনস্টল করার উদ্দেশ্যে তৈরি for এটি ডিস্টডিআইআর নির্দিষ্ট না করে মূল গাছটিতে কী ইনস্টল করা হবে তা দেখার অনুমতি দেয়। PREFIX হ'ল বেস ডিরেক্টরি যার উপর প্রকৃত ইনস্টলেশন ভিত্তিক।

উদাহরণস্বরূপ, PREFIX = / usr / স্থানীয় নির্দেশ করে যে কোনও প্যাকেজের চূড়ান্ত গন্তব্য / usr / স্থানীয় is ডিএসটিডিআইআর = OME হোম ব্যবহার করে ফাইলগুলি ইনস্টল হবে যেন OME হোম মূল হ'ল (/)। যদি, DESTDIR, / / ​​tmp / destdir বলুন, কেউ 'মেক ইনস্টল' প্রভাব ফেলবে তা দেখতে পাবে। এই আত্মায়, DESTDIR কখনই করা উচিত নয় নির্মিত বস্তুগুলিকে প্রভাবিত করে ।

এটি ব্যাখ্যা করার জন্য একটি মেকফিল সেগমেন্ট:

install:
    cp program $DESTDIR$PREFIX/bin/program

প্রোগ্রামগুলি অবশ্যই ধরে নিতে হবে যে PREFIX চূড়ান্ত (অর্থাত্ উত্পাদন) ডিরেক্টরিটির ভিত্তি ডিরেক্টরি। DESTDIR = / কিছুতে ইনস্টল হওয়া কোনও প্রোগ্রামকে সিমলিংক করার সম্ভাবনা কেবলমাত্র এটির অর্থ হ'ল প্রোগ্রামটি প্রাইফিক্সের ভিত্তিতে ফাইলগুলি অ্যাক্সেস করে না কারণ এটি কাজ করবে না। ক্যাট (1) এমন একটি প্রোগ্রাম যা (এর সর্বাধিক আকারে) যে কোনও জায়গা থেকে চলতে পারে। এখানে এমন একটি উদাহরণ দেওয়া আছে যা:

prog.pseudo.in:
    open("@prefix@/share/prog.db")
    ...

prog:
    sed -e "s/@prefix@/$PREFIX/" prog.pseudo.in > prog.pseudo
    compile prog.pseudo

install:
    cp prog $DESTDIR$PREFIX/bin/prog
    cp prog.db $DESTDIR$PREFIX/share/prog.db

আপনি যদি $ PREFIX / bin / prog এর চেয়ে অন্য কোথাও থেকে প্রগ চালানোর চেষ্টা করেন তবে প্রগ.ডবি এটি কখনই খুঁজে পাওয়া যাবে না কারণ এটি প্রত্যাশিত স্থানে নেই।

অবশেষে, / ইত্যাদি / বিকল্পগুলি সত্যিই এইভাবে কাজ করে না। মূল গাছে প্রোগ্রাম ইনস্টল করা আছে (যেমন vi -> / usr / bin / nvi, vi -> / usr / bin / vim, ইত্যাদি)।



2

এটি makeযদি সিএমকে ব্যবহার করে প্রকৃত জেনারেটর (উদাহরণস্বরূপ ) ডাকে খারাপ অনুশীলন হিসাবে বিবেচিত হয় । এটি এটি করার জন্য অত্যন্ত সুপারিশ করা হয়:

  1. পর্যায়টি কনফিগার করুন:

    cmake -Hfoo -B_builds/foo/debug -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=/usr
    
  2. পর্যায়ক্রমে বিল্ড এবং ইনস্টল করুন

    cmake --build _builds/foo/debug --config Debug --target install
    

এই পদ্ধতির অনুসরণ করার পরে, জেনারেটর-নির্দিষ্ট কমান্ডগুলি মনে না রেখে জেনারেটরটি সহজেই স্যুইচ করা যায় (যেমন নিনজা-GNinja জন্য ) for


1
উত্তরটি যদি আরও সমস্ত যুক্তি ব্যবহৃত হয় এবং কেন সেগুলি ব্যবহৃত হয় তার ব্যাখ্যা সরবরাহ করা যেতে পারে। বিশেষত, --configযুক্তিটির বিন্দুটি কী ?
দিমিত্রি কাবানভ

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