【发布时间】:2014-07-24 01:25:33
【问题描述】:
我有一个外部工具可以获取一些来源 (Rebar)。我想根据目录的内容填写一个变量之后 Rebar 运行。
EFLAGS += -I$(PWD)/include
EFLAGS += -pa $(PWD)/ebin
## $(PWD)/deps/* will only have contents after Rebar runs
EFLAGS += $(patsubst %,-pa %,$(wildcard $(PWD)/deps/*/ebin))
build-deps:
./rebar get-deps
./rebar compile
build-main: build-deps
erlc $(EFLAGS) $(INFILE)
如果我将其作为两个单独的调用运行,以上将按预期工作:
make build-deps
make build-main
但是,如果我只创建build-main,那么在deps/ 目录为空时设置EFLAGS,然后填充目录,然后我使用EFLAGS。
在我运行了一些规则之后,我是否有一个好方法只设置EFLAGS?
编辑:这是一个可以更轻松地演示问题的 Makefile:
A=$(wildcard test*)
foo:
touch test1
bar: foo
@echo $A
clean:
-rm test*
这里,“foo”目标代表我对rebar 的调用,所以想象一下你不知道我将传递哪些文件给touch。如果你尝试
make clean
make bar
make bar
你会发现make bar 的两次调用会产生不同的结果,因为在第二次调用中test1 存在于make 开始之前。我正在寻找一种在运行make clean 后立即获得第二个make bar 调用输出的方法。
【问题讨论】:
-
如果你使用一个常规的宏(有一个新的名字,EXFLAGS),比如
EXFLAGS = $(patsubst %,-pa %,$(wildcard $(PWD)/deps/*/ebin)),然后在命令行中列出$(EXFLAGS),我觉得宏在使用的时候应该被求值,所以patsubst不应该在目录被填充之后出现。至少,这是一个理论……
标签: makefile