19

以下是一个非常简单的 makefile,似乎无法正常工作。

TEST=ON

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

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

编辑:

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

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

运行 make all 或 make all_debug 将导致打印“PASSED”。如果我在条件之前回显 $(TEST),看起来好像我的规则正在更改变量,但 ifeq 只看到默认值是什么。

4

4 回答 4

44

make在读取 makefile 时评估条件(您知道它使用 2 遍),请参阅:Makefile 的条件部分。您可以通过使用警告来简单地检查这一点(这对调试 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
于 2012-08-16T19:58:02.900 回答
3

这是一种更清洁的(无论如何我认为)方法来做你想做的事:

all:
    $(MAKE) TEST=ON buildbegin

all_debug:
    $(MAKE) TEST=OFF buildbegin

buildbegin:
    @echo $(TEST)
ifeq ($(TEST),ON)
    @echo PASSED
else
    @echo FAILED
endif
于 2012-08-16T21:03:46.750 回答
2

使用make变量参数化 shell 命令。这避免了递归 make 甚至是 shell(如果命令不包含 shell 元字符(<>"&; 等),make 将直接派生命令而不通过 shell)。

就像是:

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

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

<...>只是表示某种间接的约定。

于 2012-08-24T13:30:02.187 回答
1

虽然问题很老,但我想分享一个更简单的方法。

它是使用MAKECMDGOALS表示目标列表的变量。

在您的情况下,解决方案可能是:

buildbegin:
    @echo $(MAKECMDGOALS)
ifeq ($(MAKECMDGOALS),all)
    @echo PASSED
else ifeq ($(MAKECMDGOALS),debug_all)
    @echo FAILED
endif


debug_all: buildbegin

all: buildbegin

用法:make debug_allmake all

于 2018-05-02T10:22:09.913 回答