这是我的其他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?很困惑......
答案 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