2013-04-18 7 views
27

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

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar .. 

लेकिन, यह है, उदा लिए डिफ़ॉल्ट होने चाहिए यह निर्दिष्ट करता है, तो उपयोगकर्ता नहीं करता है ${PWD}/installed

परिवर्तनीय CMAKE_INSTALL_PREFIX पहले से ही /usr/local पर सेट है, इसलिए मैं यह देखने के लिए जांच नहीं कर सकता कि यह इसे सेट करने से पहले अनसेट/खाली है या नहीं।

option(ENABLE_INSTALL_PREFIX "Install build targets to system (path given by '-DCMAKE_INSTALL_PREFIX' or '${CMAKE_INSTALL_PREFIX}' if not specified)." OFF) 
if (ENABLE_INSTALL_PREFIX) 
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root") 
else() 
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root" FORCE) 
endif() 

मेरे सवाल कर रहे हैं:

मेरे वर्तमान समाधान है कि उपयोगकर्ता निर्दिष्ट करने के लिए कि CMAKE_INSTALL_PREFIX चर का सम्मान हो जाता है को लागू करने की है एक कस्टम स्विच जोड़ना है

(क) वहाँ रहे हैं किसी भी मुद्दे उपरोक्त के साथ, CMAKE_INSTALL_PREFIX प्राप्त करने के लिए सीएमके को पारित करने के लिए आवश्यक अतिरिक्त ध्वज की परेशानी से परे?

(बी) क्या ऊपर प्राप्त करने के लिए एक बेहतर, साफ, अधिक मजबूत, अधिक मूर्खतापूर्ण और/या कम परेशान तरीका है?

धन्यवाद।

उत्तर

45

सीएमके बूलियन चर CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT सेट करता है यदि CMAKE_INSTALL_PREFIX स्पष्ट रूप से निर्दिष्ट नहीं किया गया है और इसकी डिफ़ॉल्ट सेटिंग में प्रारंभ किया गया है। आप इसे निम्न तरीके से ओवरराइड कर सकते हैं:

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) 
    set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/installed" CACHE PATH "default install path" FORCE) 
endif() 
+0

बिल्कुल सही! धन्यवाद! – Jeet

+0

मेरी इच्छा है कि मुझे कुछ दिन पहले यह पोस्ट मिले, जबकि मैं सही चीज करने के लिए कई बाहरी प्रोजेक्ट निर्भरताओं को प्राप्त करने की कोशिश कर अपने बालों को खींच रहा था। धन्यवाद! – KarateSnowMachine

2

कुछ साल पहले, मैं एक ही चीज़ का प्रयास करना चाहता था। दुर्भाग्य से मैं कभी भी पूरी तरह से संतोषजनक समाधान नहीं ढूंढ सका। इसके बजाय, मैंने CMAKE_INSTALL_PREFIX डिफ़ॉल्ट से मेल खाने के लिए एक रेगेक्स का उपयोग करना चुना है।

उदा।

if (CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files") 
    # Override to an "Install" directory in the current build-dir 
    message(STATUS " Install-prefix was at default -> forcing it to the build-dir") 
    message(STATUS "  'set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install)'") 
    set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install) 
endif (CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files") 

इस निर्माण के साथ सबसे बड़ी समस्या यह है कि आप मैन्युअल कि CMake C:\Program Files में स्थापित करना चाहिए निर्दिष्ट कर सकते हैं: खिड़कियों पर मैं निर्माण निर्देशिका में install निर्देशिका बनाने के लिए निम्नलिखित का उपयोग करें। जैसे ही मैं अपने उपकरण को एनएसआईएस-इंस्टॉलर के साथ वितरित करता हूं, यह कोई मुद्दा नहीं है (मेरे लिए)।

शायद आप यूनिक्स पर कुछ ऐसा करने का प्रयास कर सकते हैं।

+0

यूनिक्स पर मिलान में "^/usr/local" 'का उपयोग करेगा; या, नियमित अभिव्यक्ति मिलान के बजाय, 'STREQUAL "/ usr/local"' भी बेहतर है। – thiagowfx