2012-08-16 63 views
9

以下是一个非常简单的makefile,它似乎不能正常工作。Makefile ifeq:它们何时被评估?

TEST=ON 

buildbegin: 
ifeq ($(TEST),ON)   
    @echo TEST PASSED 
else 
    @echo TEST FAILED 
endif 

无论我将TEST变量设置为什么,我的ifeq语句都会通过。我总是看到TEST PASSED。有人看到我在这里做错了吗?

编辑:

好的。我的例子并不完全准确。我实际上有是这样的:

SHELL = /bin/sh 

DEFAULT_TARGS:= all all_debug 
DEBUG_TARGS:= all_debug 
ALL_TARGS:= $(DEFAULT_TARGS) $(DEBUG_TARGS) 

.PHONY: $(ALL_TARGS) 
.PHONY: buildbegin 

$(ALL_TARGS): buildbegin 

TEST=ON 

$(DEBUG_TARGS): TEST=OFF 

buildbegin: 
    @echo $(TEST) 
ifeq ($(TEST),ON) 
    @echo PASSED 
else 
    @echo FAILED 
endif 

运行的是使所有或使all_debug将导致“合格”进行打印。如果我在条件之前回显$(TEST),看起来好像我的规则正在改变变量,但ifeq只能看到默认值。

+0

对我的作品 - 'GNU让3.82' – plaes 2012-08-16 19:24:43

+0

嗯我这里有3.81 – kalden 2012-08-16 19:26:51

+0

工程,以及 - 。GNU 3.81 – Thor 2012-08-16 19:33:42

回答

24

make在读取makefile时(如您所知,它使用2遍)评估条件,请参阅:Conditional Parts of Makefiles。你可以简单地通过使用警告(这是好事调试makefile文件)检查:

buildbegin: 
    @echo $(TEST) 
$(warning now we reached ifeq TEST=$(TEST)) 
ifeq ($(TEST),ON) 
    @echo PASSED 
else 
    @echo FAILED 
endif 

您应该使用shell命令来代替,包括他们在规则:

buildbegin: 
     @if [ "$(TEST)" = "ON" ]; then echo "PASSED"; else echo "FAILED"; fi 
+2

谢谢。这解释了一切 – kalden 2012-08-16 20:55:06

+1

@ user1604180欢迎来到SO!如果这个答案是正确的(当然,它是),你应该[接受](http://stackoverflow.com/faq#howtoask)它。 – 2012-08-16 23:28:28

+0

不应该'$ TEST'中的'$'逃脱?也就是'$$ TEST' ... – kralyk 2016-12-01 23:23:33

3

这里有一个更清洁(我想,反正)的方式做你想要什么:

all: 
    $(MAKE) TEST=ON buildbegin 

all_debug: 
    $(MAKE) TEST=OFF buildbegin 

buildbegin: 
    @echo $(TEST) 
ifeq ($(TEST),ON) 
    @echo PASSED 
else 
    @echo FAILED 
endif 
+0

@pmod Sub-make继承父Make的环境,因此不需要复制变量明确。 – 2012-08-17 09:04:52

+0

你是对的... – pmod 2012-08-17 10:05:07

1

参数化使用shell命令做出变量。这避免了递归化妆,甚至壳(请直接派生的命令,并通过shell,如果命令不包含任何shell元字符不会去(<>” &;等等))

喜欢的东西:

result<ON> := PASSED 
result<OFF> := FAILED 

buildbegin: 
    @echo ${result-<${TEST}>} 

<...>是一个简单的约定,表明某种间接的