在GNU Make中使用ifeq和ifndef

时间:2011-11-09 20:50:46

标签: makefile

我写了一个相当简单的测试Makefile,我在其中定义了两个目标,all&清洁。我有两个不同的条件语句。一个检查是否存在$(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)"

2 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:10)

makefile不是shell脚本。您无法“随机”将可执行语句放置在您喜欢的任何位置并期望它们被执行。

在makefile中有多种与外界通信的方式:$(info ...)$(warning ...)$(error ...)$(shell @echo ...)(部分或全部可能是GNU做扩展)。

Ps:你拼写错误PHONY