首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个Makefile中的规则位置依赖于此?真奇怪

为什么这个Makefile中的规则位置依赖于此?真奇怪
EN

Stack Overflow用户
提问于 2016-02-01 11:30:33
回答 1查看 24关注 0票数 1

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

代码语言:javascript
复制
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/$@  $@

这是结果。

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)

其结果是:

代码语言:javascript
复制
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表示三个文件名,但只创建了第一个文件的符号链接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-01 11:38:56

手册解释道:

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

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

有两种方法可以解决这个问题:

  1. 显式指定目标:make all
  2. 使用.DEFAULT_GOAL: .DEFAULT_GOAL := all
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35129441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档