gpt4 book ai didi

build-process - 从make调用cmake来创建Makefiles?

转载 作者:行者123 更新时间:2023-12-03 15:00:27 25 4
gpt4 key购买 nike

我正在使用 cmake构建我的项目。对于 UNIX,我想输入 make从我的项目的根目录,并有 cmake调用以创建正确的 Makefile(如果它们尚不存在),然后构建我的项目。我要 cmake “内部”文件(目标文件,cmake 内部 Makefiles 等)被隐藏(例如放在 .build 目录中),这样它就不会弄乱我的项目目录。

我的项目有几个子项目(特别是一个库、一个用户可执行文件和一个单元测试可执行文件)。我希望每个子项目的 Makefiles(即我输入 make 并发生这种情况)来执行 cmake (如上所述)并仅构建该子项目(具有依赖项,因此如果需要,将从可执行文件的 Makefile 构建库)。生成的二进制文件(.so 库或可执行文件)应位于子项目的目录中。

我制作了一个 Makefile,它在主要项目上做得有点好,虽然它感觉有点hackish。我无法使用它构建特定目标,因为我的 Makefile 只是调用 makecmake的构建目录。

请注意,因为该库是唯一的依赖项(并且可能不需要手动构建,而且因为我很懒),所以我在我的 Makefile 中省略了它。

BUILD_DIR   :=  .build

.PHONY: all clean project-gui ${BUILD_DIR}/Makefile

all: project-gui project-test

clean:
@([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} clean && rm -r ${BUILD_DIR}) || echo Nothing to clean

project-gui: ${BUILD_DIR}/Makefile
@make -C ${BUILD_DIR} project-gui
@cp ${BUILD_DIR}/project-gui/project-gui $@

project-test: ${BUILD_DIR}/Makefile
@make -C ${BUILD_DIR} project-test
@cp ${BUILD_DIR}/project-test/project-test $@

${BUILD_DIR}/Makefile:
@[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}
@[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CMAKE_OPTS} ..)

如果有帮助,这是我的项目结构(如果这是“错误”,请告诉我 - 我仍在学习 cmake ):
project/
project/CMakeLists.txt
project/common.cmake
project/Makefile -- see Makefile above for this; should be replaced with something better, building libproject, project-gui, and project-test

project/libproject/
project/libproject/CMakeLists.txt
project/libproject/libproject.so -- after build
project/libproject/Makefile -- doesn't exist yet; should build libproject only
project/libproject/source/
project/libproject/include/

project/project-gui/
project/project-gui/CMakeLists.txt
project/project-gui/Makefile -- doesn't exist yet; should build libproject then project-gui
project/project-gui/source/
project/project-gui/include/

project/project-test/
project/project-test/CMakeLists.txt
project/project-test/Makefile -- doesn't exist yet; should build libproject then project-test
project/project-test/source/
project/project-test/include/

如果你还没有理解,我基本上是在寻找一种方法来构建项目和子项目,就像 cmake不存在:好像我的项目只包含 Makefile。这能做到吗?解决方案是优雅的还是凌乱的?我应该尝试做其他事情吗?

谢谢!

最佳答案

如果 cmake 正在生成 makefile,您可以简单地将生成的 makefile 包含在主 makefile 中,例如

# makefile
all: # Default
include $GENERATED
$GENERATED:$CMAKEFILE
# Generate the makefile here`

生成包含的文件,然后使用新的包含文件重新启动 make。包含的文件应详细说明目标等。

您应该能够使用 vpath 指令更改已使用文件的位置,请参见例如 Gnu make manual ,
vpath %.o project/.build

否则,繁琐的方法是重写规则并记下必要的目录。

埃德:
也许我们不应该使用平面生成文件。

尝试类似:
# makefile
all: gui test
clean:
$(MAKE) -f $(GUI-MAKE) clean
$(MAKE) -f $(TEST-MAKE) clean

gui:$(GUI-MAKE)
$(MAKE) -f $(GUI-MAKE) all
$(GUI-MAKE):$(GUI-CMAKE)
# Generate

# Same for test

如果 $(MAKE) -f $(GUI-MAKE) all 命令在命令行上工作,并且我们在生成目标中隐藏了 cmake,这应该可以工作。您还必须将任何其他目标复制到主 makefile,并注意并行运行 make。

通过传播目标文件应该涉及类似
%.o:$(GUI-MAKE)
$(MAKE) -f $(GUI-MAKE) $@

虽然你可能会在尝试制作测试对象时遇到错误

关于build-process - 从make调用cmake来创建Makefiles?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/406004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com