CMake脚本模式中继承变量的CMake文件

12
我该如何在脚本模式(-P)中从其他cmake文件调用一个cmake文件,以便这个“cmake子文件”知道其父文件的所有变量?因为如果我有很多变量是子文件需要的,我就必须编写许多-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个回答

11

你可以使用 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> ...

现在,在cmake中VAR和FOO将可用。
另外,请注意脚本文件后参数的编号将相应地移动。


另外,请注意脚本文件后参数的编号将相应地移动。


5

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接