在GNU Make中使用ifeq和ifndef

Ala*_*air 4 makefile

我写了一个相当简单的测试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)"
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 15

我最终成功解决了什么问题.@eriktous是对的,指出我应该使用$(info)而不是@echo.但更巧妙的是,问题的一部分是我@echo用标签缩进了s.似乎选项卡对于规则是强制性的,但在条件中不允许.另一个错误是我$(MAKECMDGOALS)在测试条件中扩展了它应该被编写为公正的变量ifndef MAKECMDGOALS.

  • 我只是被缩进问题咬了一口。 (4认同)

eri*_*ous 10

makefile不是shell脚本.您不能"随机"将可执行语句放置在您喜欢的任何地方并期望它们被执行.

有从一个makefile内与外界沟通的各种方式: $(info ...),$(warning ...),$(error ...)$(shell @echo ...)(部分或全部的这些可能是GNU使扩展).

Ps:你拼错了PHONY.