我该如何告诉CMake将构建数据输出到哪里?

3
如何告诉cmake它应该输出其构建数据的位置?
假设我有一个名为src/的源代码目录,由于cmake会输出大量文件,我希望将所有这些文件放在名为build/的目录中。但我希望将生成的Makefile放在项目根目录中,这样我就不必进入build目录来构建应用程序。
这个在cmake中可行吗?
如果我在build目录中运行如下命令,我已经成功地得到了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
@meffordm 不,我放弃了这个想法(和cmake)。 - Johan
那么,你最终做了什么?也许你的解决方案(即使没有cmake)对我的项目有所帮助。 - meffordm
那个项目很小,所以我使用了GNU Make,但是我在考虑编写一个小的“包装脚本”(“构建脚本”),并将其放在项目根目录中。 - Johan
我一直在考虑同样的问题...也许可以用Python脚本来实现跨平台工具。但我不喜欢失去对项目的控制权。 - meffordm
4个回答

0

好的,我明白你想要什么。我认为,你可以在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)将不会出现在构建目录中,而是会在项目根目录中创建? - Johan
1
没错,我想你确实问的就是这个。 - arrowd
1
也许我应该澄清一下问题。 - Johan
不好意思,这只是我的英语解析器有时会出错。 - arrowd

0

cmake 希望您拥有一个全新的构建目录。


没问题,我的想法是让cmake自己在那个目录中操作。所以名为build/的目录是空的,这样可以行得通吗? - Johan
不,你应该在构建目录中运行make(在第一个示例中运行cmake后)。 - Basile Starynkevitch
是的,cmake旨在按照您的第一种方式使用(至少这是我的理解,但我不是cmake专家)。 - Basile Starynkevitch

0
但是我希望他把生成的Makefile放在项目根目录中,这样我就不必进入构建目录来构建应用程序。
据我所知,cmake并不是为此而设计的, 但你可以留在项目根目录并输入: make -C build ./hello 通过自定义构建规则或set_target_properties, 你可以强制cmake将结果可执行文件放置在源目录中, 或者你可以使用./build/hello
输入“cd build && cmake ..”只需要一次, 之后如果有任何更改,make会自动启动cmake。

-2

只需使用

cmake .
make

在您的src目录中。在Unix系统上,点(.)表示当前目录。请记住,这样做实际上并不推荐,因为在您的src目录中会有很多构建文件,您将不得不在之后或发布时清理它们。


那跟问题根本不搭边啊,我想要在项目根目录下运行所有命令,而不是在任何子目录中。但我觉得 cmake 并没有支持这个功能。 - Johan

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