2016-08-18 7 views
7

CMake में, आप का उपयोग करCMake: वर्तमान निर्देशिका के रूप में, निरपेक्ष पथ में बदलें निर्माण निर्देशिका के साथ रिश्तेदार पथ

get_filename_component(ABSOLUTE_PATH ${RELATIVE_PATH} ABSOLUTE) 

हालांकि, इस तरह के रूप में ../../other_program/ रास्तों स्रोत निर्देशिका पर आधारित होते हैं निरपेक्ष पथ संबंधित पथ परिवर्तित कर सकते हैं (यानी निर्देशिका जहां CMakeLists.txt फाइलें हैं), निर्देशिका निर्देशिका (यानी निर्देशिका cmake कहा जाता है)। यदि आप एक कमांड लाइन विकल्प के रूप में एक सापेक्ष पथ देते हैं तो इससे कुछ भ्रम पैदा हो सकता है।

क्या get_filename_component बताने का कोई तरीका है कि वर्तमान स्रोत डीआईआर के बजाय वर्तमान बाइनरी डीआईआर पर सापेक्ष पथ का आधार होना चाहिए?

उत्तर

7

get_filename_componentकी डॉक्स से (प्रकाश डाला मुझे होना) : <FileName> का निरपेक्ष पथ, जहां <COMP> में से एक है करने के लिए

get_filename_component(<VAR> <FileName> 
         <COMP> [BASE_DIR <BASE_DIR>] 
         [CACHE]) 

सेट <VAR>:

ABSOLUTE = फ़ाइल करने के लिए पूर्ण पथ= सिमलिंक के साथ मौजूदा फ़ाइल के लिए पूर्ण पथ का समाधान

यदि उपलब्ध कराया गया <FileName> एक रिश्तेदार पथ है, यह देखते हुए आधार निर्देशिका <BASE_DIR> के सापेक्ष मूल्यांकन किया जाता है। यदि कोई आधार निर्देशिका प्रदान नहीं की जाती है, तो डिफ़ॉल्ट आधार निर्देशिका CMAKE_CURRENT_SOURCE_DIR होगी।

पथ आगे के स्लेश के साथ वापस लौटाए जाते हैं और कोई पिछली स्लैश नहीं होती है। यदि वैकल्पिक CACHE तर्क निर्दिष्ट है, तो परिणाम चर कैश में जोड़ा गया है।

इस प्रकार, आप का उपयोग करें:

get_filename_component(buildDirRelFilePath "${myFile}" 
         REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") 

एक संबंधित पथ में एक फ़ाइल के लिए एक निरपेक्ष पथ बदलने के लिए, आप file command उपयोग कर सकते हैं:

file(RELATIVE_PATH <variable> <directory> <file>) 

कंप्यूट <directory> से <file> पर सापेक्ष पथ और इसेमें संग्रहीत करें।

file(RELATIVE_PATH buildDirRelFilePath "${CMAKE_BINARY_DIR}" "${myFile}") 
+0

हाँ, यह समाधान CMake संस्करणों 3.4 और उच्चतर के लिए आदर्श है। पुराने सीएमके संस्करणों के लिए (संस्करण 2.6 तक) mike.did का समाधान इसे संभालने का सबसे अच्छा तरीका है। –

3

आप यह जांच सकते हैं कि पथ if(IS_ABSOLUTE path) के साथ पूर्ण है या नहीं और यदि वह मूल निर्देशिका को पूर्ववत नहीं करता है। उदाहरण के लिए,

if(NOT IS_ABSOLUTE ${p}) 
    set(p "${CMAKE_CURRENT_BINARY_DIR}/${p}") 
endif() 
3
get_filename_component(MY_RESULT_ABSOLUTE_PATH_VAR 
         "${CMAKE_CURRENT_LIST_DIR}/${MY_RELATIVE_PATH_VAR}" 
         ABSOLUTE) 
+0

यह वाक्यविन्यास – korbes

+0

https://cmake.org/cmake/help/v3.0/command/get_filename_component.html https://cmake.org/cmake/help/v3 मौजूद नहीं है।0/चर/CMAKE_CURRENT_LIST_DIR.html ABSOLUTE_PATH - लक्ष्य चर; RELATIVE_PATH - पथ – tvorez

+0

पथ के हिस्से के साथ स्रोत परिवर्तक मेरा बुरा। चर को स्पष्ट करने के लिए कृपया प्रश्न संपादित करें ताकि मैं अपना डाउनवोट हटा सकूं। – korbes

संबंधित मुद्दे