在(GNU)make中,我希望在特定目标的构建链开始时为变量分配值。对于目标a.so
和b.so
,每个目标取决于b.o
,我可以像这样手动执行此操作:
# Rules
all: a.so b.so
a.so: b.o
@echo Current .so is $(current)
touch $@
b.so: b.o
@echo Current .so is $(current)
touch $@
b.o:
@echo Current .so is $(current)
touch $@
# Set the "current" variable based on which .so is being build
a.so: current = a.so
b.so: current = b.so
此处,current
在执行a.so
和a.so
的规则时的值为b.o
,而current
的值为b.so
仅在执行b.so
规则时。这就是我要的。我对此的心理模型是,一旦make发现a.so: current = a.so
应该构建(即,在a.so
或{{的规则之前),就会触发行a.so
。 1}}运行)。如果我错了,请纠正我。
在我的实际案例中,我有更多b.so
个文件,所以我想用这样的东西替换最后两行;
.so
或者这个;
%.so: current = $@
但是,这两者都会导致相同的错误行为,即使sofiles = a b
$(addsuffix .so, $(sofiles)): current = $@
目标即将构建,current
变量也会重新设置。为什么b.o
目标会触发这些行?如何为每个b.o
手动编写a.so: current = a.so
时实现相同的行为,但没有为每个.so
实际连接此内容?
注意:我知道示例代码中显示的用例很奇怪,并且可以在没有这个笨拙的.so
变量的情况下实现所追求的效果。然而,我对任何解决问题而不使用此变量的解决方案都不感兴趣。