【问题标题】:have cmake change to the binary directory对二进制目录进行 cmake 更改
【发布时间】:2010-01-13 23:17:23
【问题描述】:

假设我有一个项目,我已经在 .build 目录中运行了 CMake:

project/
    .build/
    .src

目前我必须这样做才能运行构建:

cd .build
make

我希望能够从我的项目的根目录运行 make,也许可以使用

make -f ./build/Makefile

但它不起作用。我收到这样的错误

make[1]: CMakeFiles/Makefile2: No such file or directory
make[1]: *** No rule to make target `CMakeFiles/Makefile2'.  Stop.
make: *** [all] Error 2

这是因为 CMake 生成的 Makefile 假定其工作目录与其所在的位置相同 (.build)。

是否可以让 CMake 生成一个 makefile,以便 makefile 将工作目录更改为它所在的位置?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    你只需要告诉make你的基目录在哪里,不需要改变cmake。

    make -C your_build_directory
    

    【讨论】:

    • 这个方法很有帮助,因为它允许从任何目录生成,并且可以正常访问所有目标 - 包括制表符补全。
    【解决方案2】:

    另一种方法是在要从中运行 make 的目录中创建另一个 Makefile,其内容类似于:

    all:
           cd ./build;  make $(MFLAGS)
    

    然后您可以从顶级目录中键入“make”。

    我认为没有办法让 cmake 生成可以从任何位置运行的 Makefile。这不是通常使用 make 的方式。

    但是您也许可以诱使 cmake 在您的项目根目录中创建一个额外的帮助程序 makefile,在 CMakeLists.txt 中使用一些 cmake,如下所示:

    configure_file(ProjectRootMakefile.in ${CMAKE_SOURCE_DIR}/Makefile @ONLY)
    

    (如果需要,将“${CMAKE_SOURCE_DIR}”替换为解析为您的项目根目录的表达式)

    您需要在源代码树中创建文件 ProjectRootMakefile.in,其内容如下:

    all:
           cd @CMAKE_BINARY_DIR@; make $(MFLAGS)
    

    它将用作您的项目根 Makefile 的模板。 (确保在“cd”之前使用制表符,而不是空格)

    我没有测试过这些建议,但这里应该足够给你大致的想法了。

    【讨论】:

    • 这是一个有趣的想法......关于如何让 CMake 将所有目标放入顶级 makefile 的任何想法?
    • 您可以考虑使用老式的源代码构建过程。这些天它已被弃用,但曾经是常态。将 CMakeLists.txt 文件放在项目根目录中。 “ccmake -i .”、“make”、“make what”和“make install”就在那里。您的来源将与您的二进制文件混合在一起,纯粹主义者会嗤之以鼻,但它可能会满足您的需求。
    猜你喜欢
    • 2018-10-28
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多