如何告诉 cmake 在哪里输出其构建数据?

Posted

技术标签:

【中文标题】如何告诉 cmake 在哪里输出其构建数据?【英文标题】:How do I tell cmake where to output its build data? 【发布时间】:2011-11-08 12:39:37 【问题描述】:

我如何告诉 cmake 它应该在哪里输出它的构建数据?

假设我有一个名为 src/ 的源代码目录, 然后因为 cmake 输出了很多文件,我希望他把所有的文件都放进去 一个名为 build/ 的目录。 但我希望他把生成的 Makefile 放在项目根目录中, 所以我不必进入构建目录来构建应用程序。

cmake 可以做到这一点吗?

如果我像这样在构建目录中玩 cmake,我已经设法将 cmake 输出:

cd build/
cmake ../src/
make
./hello 

但最好留在项目根目录并输入类似这样的内容

cmake
make 
./hello

我想我需要在项目根目录中放置一个 CMakeList.txt,并使用一些魔术命令告诉他可以将目标文件放在哪里以及在哪里可以找到源代码。

谢谢


更新: 因为我的问题有点模糊。

运行 cmake 命令后,我希望我的树看起来像这样:

src/CMakeLists.txt
src/hello.c 
src/hello.h

build/CMakeCache.txt  
build/CMakeFiles/
build/cmake_install.cmake  

CMakeLists.txt
Makefile

所以问题是 CMakeLists.txt 在这个设置中应该是什么样子。

CMakeLists.txt src/CMakeLists.txt

但也许这是不可能的?

【问题讨论】:

你有什么运气吗?我想要完全相同的东西。 @meffordm 不,我放弃了这个想法(和 cmake)。 那么,你最终做了什么?也许您的解决方案(即使没有 cmake)可能对我的项目有帮助。 那个项目很小,所以我留在了 GNU Make,但我正在考虑编写一个小的“包装脚本”(“构建脚本”)并将其放在项目根目录中。 我一直在思考同样的问题......也许是一个python脚本,所以它可以成为一个跨平台的工具。我只是不喜欢无法控制项目。 【参考方案1】:

但是我希望他将生成的 Makefile 放在项目根目录中,这样我就不必进入构建 构建应用程序的目录。

据我所知,cmake 不是为此而设计的, 但是您可以留在项目根目录中并输入: 制作 -C 构建 。/你好 使用自定义构建规则或 set_target_properties, 您可以强制 cmake 将结果可执行文件放入 源目录,或者您可以使用 ./build/你好

键入“cd build && cmake ..”你只需要一次, 之后make会自动启动cmake,如果有的话 改变了。

【讨论】:

【参考方案2】:

cmake希望你有一个新的构建目录。

【讨论】:

没问题,我的想法是让 cmake 那个目录让他自己玩。所以名为 build/ 的目录是空的,这样行吗? 不,你应该在构建目录中运行make(在运行cmake之后,就像你在第一个示例中所做的那样)。 是的,cmake 的目的是你的第一种方式(至少这是我的理解,但我不是 cmake 专家)【参考方案3】:

好的,我得到你想要的。我认为,您可以通过 CMakeLists.txt 中的一些机制来实现这一点。当然,如果你不是项目开发者,这不是选项。

在根 CMakeLists.txt 中,您可以添加 file(WRITE ...) 命令,该命令会将 Makefile 写入 $CMAKE_SOURCE_DIR。这个 Makefile 将包含每个目标的这些命令:

<target>:
  cd $CMAKE_BUILD_DIR && $CMAKE_MAKE_PROGRAM <target>

所以,现在您可以从源目录运行make,它将在构建目录中构建您的项目。

【讨论】:

但是等一下,如果我输入 cmake 。 && make 那么 cmake 文件(CMakeCache.txt、CMakeFiles/、cmake_install.cmake 和 CMakeList.txt)不会在构建目录中结束,它们会在项目根目录中创建? 对,我以为你在问这个问题。 也许我应该澄清这个问题。 不,只是我的英文解析器有时会失败,抱歉。【参考方案4】:

简单使用

cmake .
make

在您的 src 目录中。 unix 系统上的 (.) 点表示当前目录。请记住,实际上不建议这样做,因为您的 src 目录中有很多构建文件,您必须在之后或发布时清理。

【讨论】:

这甚至与问题的内容不符,我想进入项目根目录并运行所有命令。不在任何子目录中。但我不认为 cmake 对此有任何支持。

以上是关于如何告诉 cmake 在哪里输出其构建数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CMake 获取命令行输出作为参数?

如何在CMake构建中每次运行python脚本?

如何在 gcc/clang 中的错误和警告之间添加换行符/边框

Cmake 问题。复制 dll 构建后

CMake:使用自定义工具输出生成标头

CMAKE 如何告诉 makefile 链接库?