首页 > 解决方案 > 是否可以在 GNU make 模式中使用目录名称?

问题描述

我有许多设备驱动程序:每个设备的源代码都在一个与设备同名的子目录中:

devices/foo/foo.c
devices/bar/bar.c

如果我像这样为每个设备设置一个单独的 GNU make 规则,它会起作用:

obj/foo.o: devices/foo/foo.c
    $(CC) $(CFLAGS) devices/foo/foo.c -o obj/foo.o

如果我设置这样的 make 模式,则无法确定如何制作文件。我猜这个问题与使用 % 作为子目录的名称有关。

obj/%.o: devices/%/%.c
    $(CC) $(CFLAGS) $< -o $@ 

有什么方法可以设置一个模式来做到这一点?

标签: gnu-make

解决方案


一个模式中只能有一个%匹配规则有点复杂。但是,匹配只发生在目标(左侧)侧,这就是为什么不能使用单个模式在多个目录中搜索正确的先决条件的原因。

作为一种解决方法,您可以为每个目录生成一个模式规则。GNU make 将使用先决条件实际存在的第一个模式规则。您还可以使用VPATH变量vpath指令来搜索多个目录。

请注意,所有这些结构都会大大降低 GNU make 的速度,并使 makefile 更难编写和调试。最后,生成一个仅包含非模式规则的简单 makefile 可能是更好的权衡(在性能和维护开销方面)。


推荐阅读