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

Posted

技术标签:

【中文标题】如何创建用于从子目录中的其他 Makefile 编译多个驱动程序的 Makeflow【英文标题】:How to Create a Makeflow for Compiling Multiple Drivers from other Makefiles in Subdirectories 【发布时间】:2020-03-26 15:30:11 【问题描述】:

我对 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”替换为 $@

【问题讨论】:

【参考方案1】:

让我们先做粗略和简单的方法。您已经有了驱动程序 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 &lt;some compiler&gt; 确实如此,所以我不知道如何解决。我不知道各种&lt;some folders&gt; 包含什么,所以我不知道将这些源文件作为其驱动程序的先决条件是多么容易。但我肯定会查看不同驱动程序目录中的 makefile,看看它们是否可以承担一些负担——毕竟,它们是负责构建各自驱动程序的人。

【讨论】:

感谢您的回复。多亏您的帮助,我设法使某些东西运行良好。

以上是关于如何创建用于从子目录中的其他 Makefile 编译多个驱动程序的 Makeflow的主要内容,如果未能解决你的问题,请参考以下文章

如何从子组件中获取价值?

使用 @State 变量不适用于从子视图更改 Body 中的视图状态

如果它是使用 XPath 在 Scrapy 中的其他节点的父节点,如何从子节点获取文本

Makefile,在 src 目录树中查找源代码并在构建文件中编译为 .o

如何从子目录加载张量流中的数据

如何使用 Makefile (g++) 仅将一些文件链接到对象?