Makefile if-statement不用导出变量进行评估?

时间:2011-06-14 22:04:53

标签: unix if-statement makefile global-variables

这是我的其他question的分支。

为了使这个工作与导出变量有关,我还需要做些什么吗?

所以我在Makefile中运行它,其中包含另一个位置的主Makefile。在这个本地Makefile中,我有:

include /path/to/master/Makefile/
export TOOL = A

现在我的Master Makefile中有:

ifeq ( $(TOOL), A )
    echo "Tool A will be run..."
    [syntax for toolA]
else
    echo "Tool B will be run..."
    [syntax for toolB]
endif

但是当我运行gmake时,toolB总是运行!我检查了变量$(TOOL),它显示了A.我做错了什么?

谢谢!

编辑:添加Makefile示例。

对于我的问题,在导出后将include移动到修复了我的问题。但这是一个现有的Makefile,并且包含在最顶端的一直有效!

include语句在本地最高,而所有导出在底部。只有我的新导出行失败。有谁知道为什么?

本地Makefile

export TOOL A
include /path/to/master/Makefile
export VERSION IMP-IR5

Master Makefile

export VERSION IAP-100

ci:
ifeq ( $(TOOL), A )
    echo "Tool A will be run..."
    [syntax for toolA]
    echo $(VERSION)
else
    echo "Tool B will be run..."
    [syntax for toolB]
    echo $(VERSION)
endif

输出

echo "Tool A will be run..."
Tool A will be run...
echo IMP-IR5
IMP-IR5

但是,如果我将顶部切换到本地Makefile中的行(就像它最初的那样):

include /path/to/master/Makefile
export TOOL A
export VERSION IMP-IR5

我明白了:

echo "Tool B will be run..."
Tool B will be run...
echo IMP-IR5
IMP-IR5

为什么IMP-IR5会通过而不是工具A?很困惑......

2 个答案:

答案 0 :(得分:2)

尝试将export TOOL = A行移到本地Makefile中的include语句上方。同时将ifeq ( $(TOOL), A )更改为ifeq ($(TOOL),A)

答案 1 :(得分:2)

将变量定义放在include语句之前:

export TOOL = A
include /path/to/master/Makefile/

否则包含的Makefile中的规则将无法看到它。

另外,请注意条件中的空格:

ifeq ($(TOOL),A)

修改:

轻松!您使用两个变量的方式不同。 Make从上到下评估makefile,在重建任何目标之前决定重建哪些目标,然后执行规则,使用变量获取的任何值。考虑一下这个makefile:

# I've added '@' to make it quieter.
ci:
ifeq ( $(TOOL), A )
    @echo "Tool A will be run..."
    @echo $(VERSION)
else
    @echo "Tool B will be run..."
    @echo $(VERSION)
endif

# (Never mind the "export". You aren't calling $(MAKE),
# you're just including a makefile.)
TOOL = A
VERSION = IMP-IR5

获取到if行,TOOL尚未定义,因此它的计算结果为空,因此makefile读作:

ci:
    @echo "Tool B will be run..."
    @echo $(VERSION)

TOOL = A
VERSION = IMP-IR5

Mow Make已确定它会执行ci规则,TOOL = A(太晚)和VERSION = IMP-IR5。因此:

Tool B will be run...
IMP-IR5