CMake文件在脚本模式下继承变量

时间:2012-12-04 21:59:34

标签: cmake

如何从其他cmake文件以脚本模式(-P)调用cmake文件,因此这个“cmake child”知道其父级的所有变量?因为,如果我有很多孩子需要的变量,我必须编写很多-D选项,我想避免它。

示例:

// 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选项,test.cmake中的“teststr”变量将被取消设置,因此输出为空。

在“遗产模式”中调用test.cmake的任何选项,或类似的东西?

2 个答案:

答案 0 :(得分:5)

您可以将参数传递给使用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编号也会相应地移动。

答案 1 :(得分:3)

我知道没有特别简单的方法可以做到这一点。

您可以将父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}")