我有这个测试Makefile运行正常。它产生三个符号链接,只是回显链接名称(这只是象征编译过程)。
ARCH = o-optimize
PGM = $(ARCH)/sieve.exe
all: ${ARCH} $(PGM)
$(ARCH):
test -d ${ARCH} || mkdir $(ARCH)
$(PGM): $(XXX)
echo gathering $(XXX)
clean:
rm -fr $(ARCH)
rm -f $(XXX)
XXX = init.c system.h config.h
$(XXX) :
ln -s ../src/$@ $@
结果如下。
ckim@stph45:~/test] make clean
rm -fr o-optimize
rm -f init.c system.h config.h
ckim@stph45:~/test] make
test -d o-optimize || mkdir o-optimize
echo gathering init.c system.h config.h
gathering init.c system.h config.h
但是如果我将XXX定义和符号链接生成规则移到顶部,它就不起作用。改变了Makefile:
XXX = init.c system.h config.h
$(XXX) :
ln -s ../src/$@ $@
ARCH = o-optimize
PGM = $(ARCH)/sieve.exe
all: ${ARCH} $(PGM)
$(ARCH):
test -d ${ARCH} || mkdir $(ARCH)
$(PGM): $(XXX)
echo gathering $(XXX)
clean:
rm -fr $(ARCH)
rm -f $(XXX)
结果:
ckim@stph45:~/test] make clean
rm -fr o-optimize
rm -f init.c system.h config.h
ckim@stph45:~/test] make
ln -s ../src/init.c init.c
为什么XXX定义和规则位置很重要? XXX代表三个文件名,但只有第一个文件的符号链接。
答案 0 :(得分:1)
manual解释说:
除了确定规则外,规则的顺序并不重要 默认目标:
make
要考虑的目标,如果您没有另外指定。默认目标是第一个目标 第一个makefile中的规则。
换句话说,$(XXX)
被视为默认目标,而不是all
。你的makefile的其余部分甚至都没有运行。
有两种解决方法:
明确指定目标:make all
使用.DEFAULT_GOAL
:
.DEFAULT_GOAL:= all