सीएमके 'कॉन्फिगरेशन - डिपरिफिक्स = डीआईआर && सभी स्थापित करें' के बराबर है?


386

मैं करता हूं cmake . && make all install। यह काम करता है, लेकिन करने के लिए स्थापित करता है /usr/local

मुझे एक अलग उपसर्ग (उदाहरण के लिए, /usr) पर स्थापित करने की आवश्यकता है ।

के बजाय स्थापित करने के लिए cmakeऔर makeकमांड लाइन क्या है ?/usr/usr/local


1
यह मक्खी पर स्थापित निर्देशिका को बदलने के लिए एक बड़ा सवाल है, लेकिन यह इतनी स्पष्ट रूप से आम आवश्यकता क्यों है? मेरे दृष्टिकोण से, इसका उत्तर कमांड लाइन विकल्प का उपयोग नहीं करना चाहिए, इसके बजाय आधार को संपादित करें CMakeLists.txtताकि आप इसे सेट कर सकें और इसे भूल सकें। मैं यह नहीं कह रहा हूं कि फ्लाई पर स्थापित निर्देशिका को बदलने के लिए एक सामान्य उपयोग का मामला नहीं है - स्पष्ट रूप से वोटों की संख्या को देखते हुए - मैं सीएमके के लिए बिल्कुल नया हूं और जब यह समस्या आती है तो मैं उत्सुक हूं।
CivFan

8
@CivFan यह उन उपयोगकर्ताओं को पूरा करने के लिए है जो किसी विशेष स्थान पर प्रोजेक्ट का निर्माण और स्थापित करना चाहते हैं, लेकिन वे प्रोजेक्ट के डेवलपर्स / अनुरक्षकों के समान लोग नहीं हैं।
डेविड रोथ्लिसबर्गर

4
@CivFan तो एक अनुचर के रूप में, यह मेरे लिए असामान्य नहीं है कि मैं अपने make installअस्थायी रास्ते का परीक्षण करूं ताकि यह सुनिश्चित हो सके कि जो कुछ भी स्थापित करने की आवश्यकता है, वह मेरी विकास मशीन को गड़बड़ किए बिना सही स्थान पर स्थापित हो गया। सिर्फ एक उदाहरण। एक और मामला एक और वास्तुकला के लिए क्रॉस-संकलन है।
डैनियल

5
@CivFan: मुझे इसकी आवश्यकता है क्योंकि मैं RPM पैकेज बनाना चाहता हूँ। अगर मुझे बदलने की आवश्यकता होगी CMakeLists.txt, तो मुझे मूल स्रोत को पैच करना होगा। बस एक कमांड लाइन विकल्प होने से मुझे फेडोरा specफ़ाइल में सही रास्ते मिल सकते हैं ।
मार्टिन यूडिंग

1
@CivFan (और इसे पढ़ने वाले अन्य) FYI करें, यह आमतौर पर CMakeLists.txtफ़ाइल को संपादित करने के लिए एक बुरा विचार माना जाता है यदि आप सिर्फ सॉफ्टवेयर बना रहे हैं और स्थापित कर रहे हैं - कमांड लाइन या प्रारंभिक कैश फ़ाइल से चर ओवरराइड करना / स्थापित करना, पसंदीदा "उपभोक्ता" है। विकल्प स्थापित करने का तरीका।
रयान पावलिक

जवाबों:


444

आप कमांड लाइन पर किसी भी CMake चर में पास कर सकते हैं, या ccmake / cmake-gui का उपयोग करके कैश्ड चर को संपादित कर सकते हैं। कमांड लाइन पर,

cmake -DCMAKE_INSTALL_PREFIX: पथ = / usr। && सभी इंस्टॉल करें

परियोजना को कॉन्फ़िगर करेगा, सभी लक्ष्यों को बनाएगा और / usr उपसर्ग को स्थापित करेगा। प्रकार (PATH) कड़ाई से आवश्यक नहीं है, लेकिन क्यूटी आधारित cmake-gui का कारण निर्देशिका चयनकर्ता संवाद प्रस्तुत करेगा।

टिप्पणियों के रूप में कुछ मामूली परिवर्धन यह स्पष्ट करते हैं कि एक सरल तुल्यता प्रदान करना कुछ के लिए पर्याप्त नहीं है। सबसे अच्छा अभ्यास एक बाहरी निर्माण निर्देशिका का उपयोग करना होगा, अर्थात सीधे स्रोत नहीं। जेनरेटर को अमूर्त करने के लिए अधिक सामान्य सीएमके सिंटैक्स का उपयोग करने के लिए भी।

mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX: PATH = / usr .. && cmake --build। --target install --config रिलीज़

आप देख सकते हैं कि यह थोड़ा लंबा हो गया है, और अब सीधे बराबर नहीं है, लेकिन काफी संक्षिप्त रूप में सर्वोत्तम प्रथाओं के करीब है ... --config का उपयोग केवल मल्टी-कॉन्फ़िगरेशन जनरेटर (यानी MSVC) द्वारा किया जाता है, जिसे अनदेखा कर दिया जाता है दूसरों के द्वारा।


21
आश्चर्य है कि: पेट क्या है? यह cmake-gui के लिए उपयोगी है, उस वैरिएबल के लिए विजेट चुनने में मदद करता है। Linux.die.net/man/1/cmake-gui (सेट सेक्शन) में doc देखें
एल्बफैन

2
वे सीएमके जीयूआई को संकेत प्रदान करते हैं जैसा कि कहा गया है, सीएमके में सब कुछ प्रभावी रूप से एक स्ट्रिंग है, लेकिन पैथ, फ़िलेपैथ, STRING, BOOL आदि की स्थापना जीयूआई को अधिक उपयुक्त विजेट पेश करने में मदद करती है।
माक्र्स डी। हनवेल

13
आप यह भी उपयोग कर सकते हैं: "cmake --build --target स्थापित करें।" बनाने के बजाय।
रॉबर्टजेमैयार्ड

2
/ Usr के बाद के लिए डॉट क्या है? /usr .
बॉडासिडो

5
CMakeLists.txt के साथ फ़ोल्डर का @bodacydo स्थान हम से उत्पन्न कर रहे हैं।
कामीकोलो


29

ध्यान दें कि CMake और Autotools दोनों में आपको हमेशा कॉन्फ़िगर समय पर इंस्टॉलेशन पथ सेट नहीं करना पड़ता है। आप DESTDIR का उपयोग इनस्टॉल समय ( यहाँ भी देखें ) के रूप में कर सकते हैं:

make DESTDIR=<installhere> install

यह प्रश्न भी देखें जो DESTDIR और PREFIX के बीच के सूक्ष्म अंतर को बताता है।

यह इरादा है का मंचन किया इंस्टॉल के लिए और जहाँ वे जैसे चलाए जा रहे हैं से एक अलग स्थान में कार्यक्रमों के भंडारण के लिए अनुमति देने के लिए /etc/alternativesके माध्यम से सांकेतिक लिंक।

हालांकि, अगर आपके पैकेज पुनःआवंटन करने योग्य है और किसी भी कठिन कोडित (उपसर्ग) पथ कॉन्फ़िगर मंच के माध्यम से निर्धारित करने की आवश्यकता नहीं है कि आप कर सकते हैं इसे छोड़ करने में सक्षम हो। इसलिए इसके बजाय:

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

आप दौड़ेंगे:

cmake . && make DESTDIR=/usr all install

ध्यान दें कि, जैसा कि उपयोगकर्ता 7498341 बताता है, यह उन मामलों के लिए उपयुक्त नहीं है जहां आपको वास्तव में PREFIX का उपयोग करना चाहिए।


9
मुझे इसका उपयोग दिखाना पसंद है DESTDIR। लेकिन वास्तव में यह गलत है। आपको cmake डॉक्स cmake.org/cmake/help/v3.0/variable/CMAKE_INSTALL_PREFIX.html ... का उल्लेख करना चाहिए, make DESTDIR=/home/john installजो इंस्टॉलेशन उपसर्ग का उपयोग करके संबंधित सॉफ़्टवेयर स्थापित करेगा, उदाहरण के लिए "usr / स्थानीय" DESTDIR मान के साथ prepended। जो अंत में "/ घर / जॉन / यूएसआर / स्थानीय" देता है।
जोकिम

1
मुझे नहीं लगता कि यह विरोधाभासी है। यदि आपका पैकेज स्थानांतरित हो रहा है, तो आपको CMAKE_INSTALL_PREFIX की आवश्यकता नहीं है, या आप या तो विधि चुन सकते हैं। यदि आप ऐसा नहीं करते हैं क्योंकि CMAKE_INSTALL_PREFIX बिल्ड टाइम पर कहीं न कहीं बेक किया जाएगा।
ब्रूस एडम्स

यदि आप जानते हैं कि आपका जनरेटर मेकफाइल है ... मुझे cmake --build build --target install -- DESTDIR=/usrध्यान दें: यह निंजा जनरेटर के साथ भी काम करना चाहिए (नियमों में ऐसा लगता है $ENV{DESTDIR})
मिज़क्स

@Joakim जितना मैं CMAKE_INSTALL_PREFIX का उपयोग करना चाहूंगा, उतना संकलित फ़ाइलों में इंस्टॉल पथ को एम्बेड करना। जैसा कि होता है, मैं केवल एक .rpm पैकेज का निर्माण कर रहा था, इसलिए वह ऐसा नहीं करेगा। DESTDIR ने बिल्डरोट में चीजों को प्राप्त करने के लिए एक आकर्षण की तरह काम किया।
श्री रेडस्टोनर

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/stage। मल्टी-कॉन्फ़िगरेशन बिल्ड के लिए, जैसे विजुअल स्टूडियो में, आप कॉन्फ़िगरेशन को भी निर्दिष्ट कर सकते हैं। वैकल्पिक --config <config>ध्वज।
  • cmake --buildकमांड का उपयोग करते समय अच्छा हिस्सा यह है कि यह सभी जनरेटर (यानी मेकफाइल्स और विजुअल स्टूडियो) के लिए अलग-अलग कमांड की आवश्यकता के बिना काम करता है।

बाद में मैं पैकेज बनाने के लिए स्थापित फ़ाइलों का उपयोग करता हूं या उन्हें अन्य परियोजनाओं में शामिल करता हूं ...


कदम से कदम स्पष्टीकरण के लिए धन्यवाद! IMO यह एकमात्र तरीका है, अन्यथा cmake (प्लेटफ़ॉर्म इंडिपेंडेंस) के पूरे बिंदु को छोड़ दिया जाता है ...
helmesjo

1
क्या आप पंक्ति 3 में स्रोतों (../) में शामिल करना भूल गए? BTW यह स्वीकृत उत्तर होना चाहिए।
स्लाव

1
LIne 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 थ्रेड्स का उपयोग करते हैं। वास्तव में, आप --
क्लाउड

1
@MrRedstoner -jcmake के लिए एक झंडा, सभी झंडे के बाद नहीं आया है --अंतर्निहित निर्माण प्रणाली के लिए गुजर रहा है ...
बादल

4

ब्रूस एडम्स के उत्तर के बारे में:

आपका जवाब खतरनाक भ्रम पैदा करता है। DESTDIR को जड़ के पेड़ से स्थापित करने का इरादा है। यदि कोई DESTDIR को निर्दिष्ट नहीं करता है, तो यह देखने की अनुमति देता है कि रूट ट्री में क्या स्थापित किया जाएगा। PREFIX आधार निर्देशिका है जिस पर वास्तविक स्थापना आधारित है।

उदाहरण के लिए, PREFIX = / usr / स्थानीय इंगित करता है कि पैकेज का अंतिम गंतव्य / usr / स्थानीय है। DESTDIR = $ HOME का उपयोग करने से फ़ाइलें स्थापित होंगी जैसे कि $ HOME रूट (/) था। यदि, DESTDIR का कहना है, तो / tmp / destdir था, कोई यह देख सकता है कि 'क्या स्थापित करें' प्रभावित करेगा। उस भावना में, DESTDIR को कभी भी निर्मित वस्तुओं को प्रभावित नहीं करना चाहिए ।

इसे समझाने के लिए एक मेकफाइल सेगमेंट:

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

कार्यक्रमों को यह मान लेना चाहिए कि PREFIX अंतिम (यानी उत्पादन) निर्देशिका का आधार निर्देशिका है। DESTDIR = / कुछ में स्थापित प्रोग्राम को सिम्क्लिंक करने की संभावना का अर्थ केवल यह है कि प्रोग्राम PREFIX पर आधारित फाइलों तक नहीं पहुंचता क्योंकि यह बस काम नहीं करेगा। बिल्ली (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 की तुलना में कहीं और से prog चलाने की कोशिश की, तो prog.db कभी नहीं मिलेगा क्योंकि यह उसके अपेक्षित स्थान पर नहीं है।

अंत में, / etc / विकल्प वास्तव में इस तरह से काम नहीं करते हैं। रूट ट्री (जैसे 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लिए निंजा किसी भी जनरेटर-विशिष्ट आदेश को याद करने की आवश्यकता नहीं होती)।


1
इसका उत्तर बेहतर हो सकता था यदि उपयोग किए गए सभी तर्कों को स्पष्टीकरण प्रदान किया गया था और उनका उपयोग क्यों किया गया है। विशेष रूप से, --configतर्क की बात क्या है ?
दिमित्री कबानोव

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.