Makefile 为什么此规则位置依赖于此生成文件?真奇怪

Makefile 为什么此规则位置依赖于此生成文件?真奇怪,makefile,gnu-make,Makefile,Gnu Make,我有一个运行正常的测试生成文件。它创建了三个符号链接,只是回显链接名(这只是象征编译过程) 结果如下 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.

我有一个运行正常的测试生成文件。它创建了三个符号链接,只是回显链接名(这只是象征编译过程)

结果如下

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定义和符号链接生成规则移到顶部,它就不起作用了。更改的生成文件:

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表示三个文件名,但仅创建第一个文件的符号链接。

说明:

规则的顺序并不重要,除了确定 <强>默认目标< /强>:<代码>的目标使考虑,如果您不指定另一个。默认目标是第一个的目标 第一个makefile中的规则

换句话说,
$(XXX)
被视为默认目标,而不是
全部
。生成文件的其余部分甚至没有运行

有两种解决方法:

  • 明确指定目标:
    makeall

  • 使用
    。默认目标

    .默认目标:=全部

  • 好的,没错。(事实上,我知道这条规则,但没有注意到这一点)。但在我的例子中,更大的问题是,为什么符号链接生成方法会生成第一个符号链接,而不是所有的三个链接?
    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