2012-12-04 21 views
5

如何從腳本模式(-P)從其他cmake文件調用cmake文件,以便「cmake child」知道其父文件的所有變量?因爲,如果我有很多孩子需要的變量,我必須編寫許多-D選項,並且我想避免它。以腳本模式繼承變量的CMake文件

實施例:

// 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 

當然,沒有-D選項時, 「teststr」 變量,在test.cmake,是沒有設置,因此,輸出是空的。

任何選項來調用test.cmake在「遺產模式」,或類似的東西?

回答

2

有沒有特別簡單的方法來做到這一點,我知道。

你可以寫在父的CMakeLists.txt目前所有的變量到一個單獨的文件,然後include這在test.cmake:

# 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_ARGCCMAKE_ARGV0CMAKE_ARGV1,......將可用於腳本。 請參閱CMAKE_ARGCCMAKE_ARGV0的文檔。

另一種方法是定義變量,就像使用非腳本cmake命令一樣。有一件事情:你需要-P之前定義的變量:

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

而且,不就是腳本文件後,args來編號將相應出現偏移。