【问题标题】:Wrapping cmake build with makefile用 makefile 包装 cmake 构建
【发布时间】:2020-06-05 14:55:03
【问题描述】:

我有一个现有基于 makefile 的构建系统的项目,我想在其中添加现有的基于 cmake 的组件。

集成 cmake 配置步骤的最佳方法是什么?作为评估某个变量的 $(shell ) 调用?在每次调用时运行配置...

如何整合建筑本身? Just (MAKE) -C cmake-build-dir [targets]?

【问题讨论】:

    标签: makefile cmake qnx


    【解决方案1】:

    CMake 的目标是生成一个 Makefile,所以我会使用这样的东西:

    CMAKE_BUILD_DIR := some_dir
    CMAKE_SOURCE_DIR := some_src_dir
    
    $(CMAKE_BUILD_DIR)/Makefile: $(CMAKE_SOURCE_DIR)/CMakeLists.txt
        cmake -S $(<D) -B $(@D)
    
    .PHONY: $(CMAKE_BUILD_DIR)/built_executable_or_library  # to allow CMake's make check the build
    $(CMAKE_BUILD_DIR)/built_executable_or_library: $(CMAKE_BUILD_DIR)/Makefile
        $(MAKE) -C $(@D) $(@F)
    

    这应该在 Makefile 不存在时调用 CMake 配置步骤,并直接运行 make 以构建您需要的任何内容(可能您需要根据您的需要定制调用的目标)。 CMake 生成的 Makefile 会检查生成的构建系统本身,因此会根据需要对其进行重新配置。

    【讨论】:

    • 可能对 Makefile 更好的依赖应该是“所有递归找到的 CMakeLists.txt”?作为下面建议的 .Phony 的替代品?
    • 确保您的子项目是最新的唯一方法是始终运行它的 Makefile。由于源代码更改,项目可能需要重建,不一定是 CMakeLists.txt。生成 Makefile 后,始终调用 make 以确保完成所有需要完成的工作。
    • 啊,所以在第一代cmake之后已经将所有txt文件添加到依赖项中。
    【解决方案2】:

    除了粗鲁的回答,我还将 .PHONY 添加到 Makefile 目标:

    .PHONY: $(CMAKE_BUILD_DIR)/Makefile
    $(CMAKE_BUILD_DIR)/Makefile: $(CMAKE_SOURCE_DIR)/CMakeLists.txt
        cmake -S $(<D) -B $(@D)
    

    由于文件 Makefile 已经存在,并且它的依赖关系没有改变,因此在更改源时不会做任何事情,除非我们将 Makefile 视为总是过时的。

    【讨论】:

    • 我不会。这将导致项目在每次构建时重新配置,这是不必要的。 CMake 生成的 Makefile 会对构建系统进行自己的清理,如果需要,将在 make 调用时重新配置。唯一需要此规则的情况是在 Makefile 尚不存在时进行引导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2013-02-26
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多