【问题标题】:CMake file in script mode inheriting variables脚本模式下的CMake文件继承变量
【发布时间】:2012-12-04 21:59:34
【问题描述】:

如何从其他 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 的任何选项?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您可以使用cmake -P 将参数传递给脚本。 如果你打电话:

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

    那么变量CMAKE_ARGC, CMAKE_ARGV0, CMAKE_ARGV1, ... 将可用于脚本。 请参阅 CMAKE_ARGCCMAKE_ARGV0 的文档。

    另一种方法是定义变量,就像使用非脚本cmake 命令一样。不过有一点需要注意:需要在-P之前定义变量:

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

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

    【讨论】:

      【解决方案2】:

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

      您可以将父 CMakeLists.txt 中的所有当前变量写入单独的文件,然后在 test.cmake 中 include this:

      # 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}")
      

      【讨论】:

        猜你喜欢
        • 2014-08-15
        • 1970-01-01
        • 1970-01-01
        • 2021-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        相关资源
        最近更新 更多