为了简化我的问题,如果我有一个Makefile,如下所示
%: %.c
gcc -o $@ $<
make foo
Make foo
将从foo
构建可执行文件foo.c
。没有问题。如果我要更改下面的Makefile,那么我可以从Makefile命令行传递目标
# To make things little complex
TARG=$(EXE)
$(TARG): %.c
gcc -o $@ $<
make EXE=foo
以上命令make EXE=foo
说:
"make: *** No rule to make target %.c, needed by
富”。 Stop.`
为什么$(TARG)
不在Makefile的target
规则中展开?
答案 0 :(得分:2)
我认为你需要Static Pattern rule
TARG=$(EXE)
$(TARG):%: %.c
gcc -o $@ $<
make EXE=foo
答案 1 :(得分:1)
只需保留第一个示例中的代码,然后添加以下行:
.DEFAULT_GOAL := $(EXE)
或者(实际上是相同的)在任何其他规则之前添加$(EXE) :
规则而没有配方。默认情况下,如果在命令行中未指定任何内容,则选择Makefile中定义的第一个目标。