如何创建用于从子目录中的其他 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 <some compiler>
确实如此,所以我不知道如何解决。我不知道各种<some folders>
包含什么,所以我不知道将这些源文件作为其驱动程序的先决条件是多么容易。但我肯定会查看不同驱动程序目录中的 makefile,看看它们是否可以承担一些负担——毕竟,它们是负责构建各自驱动程序的人。
【讨论】:
感谢您的回复。多亏您的帮助,我设法使某些东西运行良好。以上是关于如何创建用于从子目录中的其他 Makefile 编译多个驱动程序的 Makeflow的主要内容,如果未能解决你的问题,请参考以下文章
使用 @State 变量不适用于从子视图更改 Body 中的视图状态
如果它是使用 XPath 在 Scrapy 中的其他节点的父节点,如何从子节点获取文本