GNU Make:使用带有隐式规则的通配符函数

GNU Make: Using the wildcard function with implicit rules

我有一个看起来像这样的项目结构:

.
└── src
    ├── Module1
    │   ├── source1.cc
    │   ├── source2.cc
    │   └── source3.cc
    ├── Module2
    │   ├── source1.cc
    │   ├── source2.cc
    │   └── source3.cc
    └── Module3
        ├── source1.cc
        ├── source2.cc
        └── source3.cc

我有一个隐式规则,将为每个源文件创建一个目标文件,并维护目录结构(例如 src/Module1/source2.cc 将编译为 obj/Module1/source2.o)。

但是,我现在想要一个隐式规则来为每个模块创建存档文件。例如,从 src/Module2 编译的每个目标文件都将添加到 obj/Module2.a。我的第一个想法看起来与我对目标文件的隐式规则非常相似:

obj/%.a: $(wildcard obj/%/*.o)
    @mkdir -p $(@D);
    ar -crs "$@" $^;

这会将编译目标文件的工作交给其他隐式规则。但是,这里的问题是 % 字符没有展开。

有没有办法从通配符函数调用中的隐式规则访问 %

你可以用 Secondary Expansion:

.SECONDEXPANSION:
obj/%.a: $$(wildcard obj/%/*.o)
    @mkdir -p $(@D);
    ar -crs "$@" $^;