【发布时间】: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