如何创建 Makeflow 以从子目录中的其他 Makefile 编译多个驱动程序

How to Create a Makeflow for Compiling Multiple Drivers from other Makefiles in Subdirectories

我对 GNU makefile 比较陌生,目前我的工作要求我在 makefile 中为一个项目创建一个目标来编译一堆驱动程序。每个驱动程序都已经在自己的构建目录中创建了自己的 makefile,并且每个驱动程序需要调用的目标都是相同的。 IE。对于驱动程序A和驱动程序B,必须调用"make shared"。

我目前的想法是像这样在主 makefile 中定义每个驱动程序的路径:

DRIVER_A = $(CURR_DIR)/<path_to_a>/driver
DRIVER_B = $(CURR_DIR)/<path_to_b>/driver
DRIVER_C = $(CURR_DIR)/<path_to_c>/driver

从这里开始,我真正想做的是为每个 DRIVER_A、DRIVER_B 和 DRIVER_C 调用相同的进程,即:

        source <some_compiler>; \
        cp -r <some_folder> DRIVER_A/source/; \
        cd DRIVER_A/build; \
        make shared <some_flags>; \
        make so_test <some_flags>

为了实现这一点,我尝试将 DRIVER_A、DRIVER_B 和 DRIVER_C 放入一个对象中,例如

DRIVER_SOURCES := \
        DRIVER_A\
        DRIVER_B \
        DRIVER_C

然后在 DRIVER_SOURCES

上调用目标
drivers_sw: ${DRIVER_SOURCES}
        source <some_compiler>; \
        cp -r <some_folder> $@/source/; \
        cd $@/build; \
        make shared <some_flags>; \
        make so_test <some_flags>

但这不起作用,因为没有为 DRIVER_A、DRIVER_B 和 DRIVER_C 制定目标的规则,事后看来这对我来说很有意义,但我不知道完成我想要完成的事情的另一种方法。

我也愿意接受一种更好的方法来为每个驱动程序调用 make,而不是 cd 到它的目录并调用 make,我相信有一种更简洁的方法,但我只是想立即使用函数蝙蝠

任何帮助都会很棒,如果需要更多信息,请告诉我,如果我遗漏了什么,我深表歉意,我对在堆栈溢出上发帖还很陌生。

编辑:我在第 4 个代码块中输入错误,将 "DRIVER_A" 替换为 $@

先来个粗略简单的方法吧。您已经有了 Driver 的食谱 A:

DRIVER_A = $(CURR_DIR)/<path_to_a>/driver
build_DRIVER_A:
    source <some_compiler>; \
    cp -r <some_folder> DRIVER_A/source/; \
    cd DRIVER_A/build; \
    make shared <some_flags>; \
    make so_test <some_flags>

如果你确认这行得通,你就可以轻松编写 B 和 C 的规则了。

一旦它们都正常工作,您可以使用一个规则来构建所有三个:

build_all_drivers: build_DRIVER_A build_DRIVER_B build_DRIVER_C

别忘了:

.PHONY: build_all_drivers build_DRIVER_A build_DRIVER_B build_DRIVER_C

一旦一切正常,您可以考虑让整个设计更优雅,但如果不了解项目的细节,就很难知道如何做到这一点。我不知道什么source <some compiler> 有,所以我不知道如何解除它。我不知道各种 <some folders> 包含什么,所以我不知道使这些源文件成为其 driver 的先决条件有多容易。但我肯定会查看不同 driver 目录中的 makefile,看看它们是否可以承担部分负担——毕竟,它们是负责构建各自 driver 的人。