Makefile 在GNU Make中使用ifeq和ifndef

Makefile 在GNU Make中使用ifeq和ifndef,makefile,Makefile,我编写了一个相当简单的测试Makefile,其中我定义了两个目标,all&clean。我有两个不同的条件语句。一个检查是否存在$(MAKECMDGOALS)特殊变量,另一个检测是否有任何命令行目标与变量(NODEPS)中列出的目标匹配。我遇到的问题是,我的条件中没有一个分支得到执行。最终,我想使用一个条件来决定我提供的目标是否应该包含一些自动生成的依赖项文件,但目前我正努力让这两个表达式都进行计算。我正在运行GNU make版本3.81,我在Ubuntu和Mac OS X下试过,但没有用

我编写了一个相当简单的测试
Makefile
,其中我定义了两个目标,all&clean。我有两个不同的条件语句。一个检查是否存在
$(MAKECMDGOALS)
特殊变量,另一个检测是否有任何命令行目标与变量(
NODEPS
)中列出的目标匹配。我遇到的问题是,我的条件中没有一个分支得到执行。最终,我想使用一个条件来决定我提供的目标是否应该包含一些自动生成的依赖项文件,但目前我正努力让这两个表达式都进行计算。我正在运行GNU make版本3.81,我在Ubuntu和Mac OS X下试过,但没有用

    NODEPS := clean
    INCLUDE = $(filter $(NODEPS),$(MAKECMDGOALS))

    .PHONY : all clean

    ifndef $(MAKECMDGOALS)
        @echo "$$(MAKECMDGOALS) is not defined"
    else 
        @echo "$(MAKECMDGOALS) is defined"
    endif

    ifneq (0, $(words $(INCLUDE)))
        @echo "INCLUDE = $(INCLUDE) != 0"
    else
        @echo "INCLUDE = $(INCLUDE) == 0"
    endif


    all :
        @echo "all : $(MAKECMDGOALS)"

    clean : 
        @echo "clean : $(MAKECMDGOALS)"

生成文件不是shell脚本。您不能“随机”地将可执行语句放在任何您喜欢的地方,并期望它们被执行

从makefile中与外部世界进行通信有多种方式:
$(信息…
$(警告…
$(错误…
$(shell@echo…
)(其中部分或全部可能是GNU make扩展)


附言:你拼错了

我终于找到了问题所在@eriktous是对的,他指出我应该使用
$(info)
而不是
@echo
。但更微妙的是,部分问题在于我用一个制表符缩进了
@echo
s。似乎制表符对于规则是强制性的,但在条件中是不允许的。另一个错误是,我在测试条件中扩展了
$(MAKECMDGOALS)
变量,而该变量本应作为
ifndef MAKECMDGOALS
编写


听起来你好像在与谷物作对。如果要传入变量,请将其作为变量传入,而不是作为目标传入。如果要包含依赖项文件,请包含它。感谢您发现拼写错误。在大多数Makefiles打印信息的示例中,
@echo
似乎是最流行的形式。我没有意识到这似乎只是一个规则的一部分。我只是被缩进问题咬了一口。