使用Makefile封装CMake构建

4

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

最佳的集成cmake配置步骤的方法是什么?可以使用$(shell ) 调用来评估某些变量吗?这将在每次调用时运行configure...

如何集成构建本身?只需(MAKE) -C cmake-build-dir [targets]即可?

2个回答

4
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会检查生成的构建系统本身,因此将根据需要重新配置。


也许更好的依赖关系应该是“递归地找到所有的CMakeLists.txt”,作为下面建议的.PHONY的替代方案? - kwesolowski
确保子项目是最新的唯一方法就是始终运行其Makefile。项目可能需要重新构建,原因是源代码发生了更改,而不一定是CMakeLists.txt。一旦生成了Makefile,请始终调用make以确保完成所有需要完成的工作。 - raspy
啊,所以在第一代 cmake 之后,它已经将所有的 txt 文件添加到了依赖项中。 - kwesolowski

1
除了嘶哑的答案外,我还会在Makefile目标中添加.PHONY:
.PHONY: $(CMAKE_BUILD_DIR)/Makefile
$(CMAKE_BUILD_DIR)/Makefile: $(CMAKE_SOURCE_DIR)/CMakeLists.txt
    cmake -S $(<D) -B $(@D)

由于Makefile文件已经存在,并且其依赖关系没有改变,除非我们将Makefile视为始终过时,否则在更改源代码时不会执行任何操作。


1
我不会这样做。这将导致每次构建时项目重新配置,这是不必要的。CMake生成的Makefile会自行对构建系统进行清理,并在“make”调用时根据需要重新配置。唯一需要使用此规则的时间是在尚不存在Makefile时进行引导。 - raspy

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