2012-12-04 15 views
5

Come posso chiamare un file cmake in modalità di script (-P) da un altro file cmake, quindi questo "cmake child" conosce tutte le variabili del suo genitore? Perché, se ho un sacco di variabili di cui il bambino ha bisogno, devo scrivere molte opzioni -D, e voglio evitarlo.CMake file in modalità script che eredita le variabili

Esempio:

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

funziona bene !. Ma, senza "-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 

Naturalmente, fermo opzione -D, il "teststr" variabile, in test.cmake, è disinserito, e pertanto, l'uscita è vuota.

Qualsiasi opzione per chiamare test.cmake in "modalità eredità" o qualcosa del genere?

risposta

2

Non c'è un modo particolarmente semplice per fare ciò che io conosca.

Si potrebbe scrivere tutte le variabili correnti nella CMakeLists.txt genitore in un file separato e poi include questo nel vostro 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

È possibile passare gli argomenti a uno script che chiami con cmake -P. Se si chiama:

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

allora le variabili CMAKE_ARGC, CMAKE_ARGV0, CMAKE_ARGV1, ... sarà disponibile per lo script. Vedere documentazione per CMAKE_ARGC e CMAKE_ARGV0.

L'altro modo è definire le variabili, proprio come con il comando non-script cmake. C'è una cosa: è necessario definire le variabili prima -P:

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

Inoltre, non che la numerazione dei args dopo lo script-file verrà spostata di conseguenza.

Problemi correlati