为什么此规则在此Makefile中依赖于位置?真奇怪

时间:2016-02-01 11:30:34

标签: makefile gnu-make

我有这个测试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代表三个文件名,但只有第一个文件的符号链接。

1 个答案:

答案 0 :(得分:1)

manual解释说:

  

除了确定规则外,规则的顺序并不重要   默认目标make要考虑的目标,如果您没有另外指定。默认目标是第一个目标   第一个makefile中的规则。

换句话说,$(XXX)被视为默认目标,而不是all。你的makefile的其余部分甚至都没有运行。

有两种解决方法:

  1. 明确指定目标:make all

  2. 使用.DEFAULT_GOAL

    .DEFAULT_GOAL:= all