我有一个测试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表示三个文件名,但只创建了第一个文件的符号链接。
发布于 2016-02-01 11:38:56
手册解释道:
规则的顺序并不重要,除非确定默认目标:
make要考虑的目标(如果没有指定目标的话)。默认目标是第一个makefile中第一个规则的目标。
换句话说,$(XXX)被认为是默认目标,而不是all。其余的makefile甚至没有运行。
有两种方法可以解决这个问题:
make all.DEFAULT_GOAL:
.DEFAULT_GOAL := allhttps://stackoverflow.com/questions/35129441
复制相似问题