2012-12-04 13 views
5

मैं अन्य सेमेक फ़ाइल से स्क्रिप्ट मोड (-पी) में एक सेमेक फ़ाइल को कैसे कॉल कर सकता हूं, इसलिए यह "सेमेक बच्चा" अपने माता-पिता के सभी चर को जानता है? क्योंकि, अगर मेरे पास बच्चे को बहुत सारे चर हैं, तो मुझे कई-डी विकल्प लिखना होगा, और मैं इससे बचना चाहता हूं।स्क्रिप्ट मोड विरासत चर में सीएमके फ़ाइल

उदाहरण:

// CMakeLists.txt 
cmake_minimum_required(VERSION 2.8) 

set(teststr "Hello World!") 

add_custom_command(test 
    ${CMAKE_COMMAND} -Dteststr=${teststr} -P test.cmake 
) 

// test.cmake 
message("${teststr}") 

$ cmake . 
$ make test 
Hello world! 
Built target test 

वर्क्स ठीक !. लेकिन, बिना "-Dteststr":

// CMakeLists.txt 
cmake_minimum_required(VERSION 2.8) 

set(teststr "Hello World!") 

add_custom_command(test 
    ${CMAKE_COMMAND} -P test.cmake 
) 

// test.cmake 
message("${teststr}") 

$ cmake . 
$ make test 

Built target test 
बेशक

, डी विकल्प के बिना, "teststr" चर, test.cmake में, सेट नहीं है, और इस प्रकार, उत्पादन में खाली है।

"विरासत मोड" में test.cmake को कॉल करने का कोई विकल्प, या ऐसा कुछ?

उत्तर

2

ऐसा करने का कोई विशेष तरीका नहीं है जिसे मैं जानता हूं।

आप एक अलग फाइल करने के लिए माता-पिता CMakeLists.txt में सभी मौजूदा चर लिख सकता है और फिर अपने test.cmake में include इस:

# CMakeLists.txt: 
cmake_minimum_required(VERSION 2.8) 
set(teststr "Hello World!") 
set(CacheForScript ${CMAKE_BINARY_DIR}/CMakeCacheForScript.cmake) 
file(WRITE ${CacheForScript} "") 

get_cmake_property(Vars VARIABLES) 
foreach(Var ${Vars}) 
    if(${Var}) 
    string(REPLACE "\\" "\\\\" ${Var} ${${Var}}) 
    endif() 
    file(APPEND ${CacheForScript} "set(${Var} \"${${Var}}\")\n") 
endforeach() 

add_custom_target(test ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/test.cmake) 


# test.cmake 
include(${CMAKE_BINARY_DIR}/CMakeCacheForScript.cmake) 
message("${teststr}") 
2

आप तर्क दे सकते हैं एक स्क्रिप्ट के लिए जिसे आप cmake -P से कॉल करते हैं। यदि आप कहते हैं:

cmake -P <script-file> <arg3> <arg4> <arg5> ... 

तो चर CMAKE_ARGC, CMAKE_ARGV0, CMAKE_ARGV1 ... उपलब्ध स्क्रिप्ट के लिए किया जाएगा। CMAKE_ARGC और CMAKE_ARGV0 के लिए दस्तावेज़ देखें।

दूसरा तरीका वैरिएबल को परिभाषित करना है, जैसे गैर-स्क्रिप्ट cmake कमांड के साथ। एक चीज नहीं है: आप -P से पहले चर निर्धारित करने होंगे:

cmake -DVAR=VALUE -DFOO=BAR -P <script-file> <arg5> <arg6> ... 

इसके अलावा, नहीं है कि स्क्रिप्ट फ़ाइल के बाद आर्ग की नंबरिंग तदनुसार स्थानांतरित किया जाएगा।