2013-03-20 11 views
6

मैं add_subdirectory का उपयोग करके CMake में एक उपनिर्देशिका को शामिल किया है में यह स्थापित करने के बिना एक उपनिर्देशिका से एक चर का उपयोग कैसे करें। PARENT_SCOPE के साथ संयोजन में set का उपयोग कर चर को स्पष्ट रूप से चर सेट किए बिना उस उपनिर्देशिका के दायरे से एक चर का उपयोग कैसे कर सकता हूं?CMake: स्पष्ट रूप से माता पिता गुंजाइश

set(BOX2D_BUILD_STATIC  1) 
set(BOX2D_BUILD_EXAMPLES  0) 
set(BOX2D_INSTALL_BY_DEFAULT 0) 

add_subdirectory(Box2D_v2.2.1) 

message(STATUS "Using Box2D version ${BOX2D_VERSION}") 

# how to get ${BOX2D_VERSION} variable without modifying CMakeLists.txt in Box2D_v2.2.1? 

क्या यह संभव है?

+0

उपनिर्देशिका के CMakeLists.txt में 'BOX2D_VERSION' चर सेट कैसे है? – Fraser

+1

इसे एक सादे चर के रूप में सेट किया गया है। (इसलिए नीचे दिए गए उत्तर के मुताबिक ऐसा लगता है कि Bod2d के CMakeLists.txt को संशोधित किए बिना इसे एक्सेस करना संभव नहीं है) – user1492625

+0

ठीक है, थोड़े। मैंने एक उत्तर जोड़ा है जो एक सच्चे समाधान की तुलना में अधिक कामकाज है। – Fraser

उत्तर

7

यदि चर एक सादा चर है (एक कैश चर के विपरीत), तो मूल दायरे से इसे एक्सेस करने का कोई तरीका नहीं है।

कैश वैरिएबल (set(... CACHE ...) के साथ सेट किए गए) को दायरे के बावजूद एक्सेस किया जा सकता है, जैसा वैश्विक गुण (set_property(GLOBAL ...)) कर सकते हैं।

3

जबकि @ Angew के जवाब सही है, वहाँ नहीं कई चीजें हैं जो वास्तव में असंभव CMake :-)

साथ कर रहे हैं आप की तरह

set(BOX2D_VERSION 2.2.1) 
Box2D_v2.2.1 में

एक लाइन है, तो कर रहे हैं/CMakeLists.txt, तो आप की तरह कुछ कर रही द्वारा माता-पिता दायरे में संस्करण प्राप्त कर सकते हैं:

file(STRINGS Box2D_v2.2.1/CMakeLists.txt VersionSetter 
    REGEX "^[ ]*set\\(BOX2D_VERSION") 
string(REGEX REPLACE "(^[ ]*set\\(BOX2D_VERSION[ ]*)([^\\)]*)\\)" "\\2" 
     BOX2D_VERSION ${VersionSetter}) 

इसमें कुछ समय नाजुक है, यह उदाहरण के लिए set कमांड में अतिरिक्त रिक्त स्थान के लिए समायोजित नहीं करता है, या मान को दो बार सेट करने के लिए पूरा करता है। आप इन संभावनाओं को भी पूरा कर सकते हैं, लेकिन यदि आप set कमांड के प्रारूप को जानते हैं और यह बदलने की संभावना नहीं है, तो यह एक उचित कामकाज है।

+0

अच्छी चाल। मैं '[]' '[\ t]' में बदलूंगा, बस मामले में। साथ ही, यह काम नहीं करेगा जब चर एक फ़ंक्शन का उपयोग करके सेट किया गया है (सोचें 'सेट ($ {resVar} 1.1 PARENT_SCOPE) '), एक सशर्त आदि के अंदर। मुझे आपका जवाब पसंद है, लेकिन बहुत सी चेतावनी हैं। – Angew

+0

@Angew - हाँ, मैं मानता हूं कि यह सिर्फ एक कामकाज है - आपका निश्चित रूप से सबसे अच्छा जवाब है (यह मेरे द्वारा +1 है)। मुझे लगता है कि इसे किसी भी परिदृश्य के अनुरूप रेगेक्स मिलान का उपयोग करके अनुकूलित किया जा सकता है, लेकिन यह तेजी से बड़े पैमाने पर जटिल हो जाता है और भविष्य में प्रूफ/भविष्य में प्रूफ/इत्यादि होने की संभावना नहीं है – Fraser

+0

और आपके पास से +1 मिला :-) – Angew

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