【发布时间】:2017-04-19 20:55:47
【问题描述】:
在 (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 和b.o 的规则时具有值a.so,而current 仅在执行b.so 的规则时具有值b.so。这就是我要的。我对此的心智模型是,一旦 make 发现应该构建 a.so(即在运行 a.so 或 b.so 的规则之前),就会触发 a.so: current = a.so 行。如果我错了,请纠正我。
在我的实际情况中,我有更多 .so 文件,所以我想用这样的东西替换最后两行;
%.so: current = $@
或者这个;
sofiles = a b
$(addsuffix .so, $(sofiles)): current = $@
但是,这两种方法都会导致相同的错误行为,即使在即将构建 b.o 目标时,current 变量也会被重新设置。为什么b.o 目标会触发这些行?如何实现与为每个 .so 手动编写 a.so: current = a.so 时相同的行为,但实际上不为每个 .so 连接它?
注意:我知道示例代码中显示的用例很奇怪,并且如果没有这个尴尬的current 变量,也可以达到追求的效果。但是,我对任何不使用此变量即可解决问题的解决方案不感兴趣。
【问题讨论】:
标签: makefile build compilation gnu-make