【问题标题】:Error with variables when invoking CMake from CMake从 CMake 调用 CMake 时变量出错
【发布时间】:2016-04-29 02:54:39
【问题描述】:

我需要从 cmake 中调用 cmake,以便在生成项目文件之前构建二进制文件。我有以下 CmakeLists.txt

cmake_minimum_required(VERSION 3.2)
project(StarEngine)

set(CMAKE_CXX_FLAGS "-std=c++11")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

find_package(OpenGL REQUIRED) 
include_directories(${OPENGL_INCLUDE_DIR})

#copy the other cmake file into where we'd like to invoke cmake 
configure_file(deps-CMakeLists.txt deps/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} . WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/deps)

#eventually binaries will be built, for now this doesn't accomplish anything
execute_process(COMMAND ${CMAKE_COMMAND} --build . WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/deps)

还有它的朋友,deps-CmakeLists.txt,一个测试脚本:

set(GENERATED_DIR "test")
MESSAGE( STATUS ${GENERATED_DIR} )

在以下文件结构中:

Project
    build
    Code
        CmakeLists.txt
        deps-CmakeLists.txt

无论我为变量值输入什么,在MESSAGE中显示时它都是空白的。我想这是从 cmake 调用 cmake 导致的奇怪行为。我遇到了许多其他奇怪的错误,但我怀疑我是否能找出这个有助于破解它们的错误。

【问题讨论】:

  • 你想达到什么目的?为什么要将 CMakeLists.txt 传递给configure_file?你的问题没有任何意义。请澄清。
  • configure_file () 确实替换了源代码文件中的变量。只需添加COPYONLY 选项或使用file(COPY ...) 命令。
  • 感谢您提供更多信息。我认为您正在尝试做的事情不需要execute_process()。只需添加一个依赖项就足够了。能否请您添加要使用二进制文件的CMakeLists.txt 部分和构建它们的deps-CMakeLists.txt 部分? How to instruct CMake to use the build architecture compiler? 中描述了一种更通用的方法——包括交叉编译的可能性。
  • 它可能与您的特定情况相关,也可能不相关,但有一个related question and answer 可以为您提供另一种方法的想法。简而言之,在 CMake 运行期间,它调用嵌套的 cmake 构建来创建一个可执行文件,然后在主 CMake 运行中使用该可执行文件来生成源代码,甚至可以通过 add_subdirectory() 添加其他 CMakeLists.txt 文件。这不是微不足道的,但我已经在一个大型跨平台项目上工作了一段时间。

标签: cmake


【解决方案1】:

感谢@Florian,问题在于变量替换,我需要将COPYONLY 选项添加到configure_file

【讨论】:

  • 不客气。关于COPYONLY 的只有一件事:它可能不会自动识别源文件中的更改。所以最好使用@ONLY,然后源文件被跟踪,并在更改时触发CMake重新配置。
猜你喜欢
  • 2012-07-07
  • 1970-01-01
  • 2021-12-21
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
相关资源
最近更新 更多