ifeq:在意外令牌附近出现语法错误

Rya*_* Li 61 makefile

我正在编写一个在一个地方进行字符串匹配的Makefile,代码如下:

if test ...; \
    then \
    shell scripts... \
fi

ifeq ($(DIST_TYPE),nightly)
    shell scripts ...
endif
Run Code Online (Sandbox Code Playgroud)

这里第一个if是shell脚本,第二个ifeq是GNU Make的条件.但是会生成以下错误:

ifeq(每晚,每晚)

/ bin/sh:-c:第0行:意外令牌附近的语法错误`每晚,每晚'

/ bin/sh:-c:第0行:`ifeq(每晚,每晚)'

这里发生了什么事?似乎Make正试图调用shell.

谢谢.

Rya*_* Li 225

我玩了代码,发现条件语句应该写成没有缩进,这解决了我的问题.

如果没有缩进,Make会将其视为自己的指令; 否则,它被视为shell脚本.

示例代码

错误:

target:
    ifeq (foo, bar)
        ...
    endif
Run Code Online (Sandbox Code Playgroud)

正确:

target:
ifeq (foo, bar)
    ...
endif
Run Code Online (Sandbox Code Playgroud)

  • 我只想感谢并向你致以这个答案.我还在其中添加了一个示例.:) (27认同)
  • 这是非常明显的,感谢这个答案,让我节省了数小时的挫折感 (7认同)
  • “迄今为止历史上最少的逻辑语法”奖授予 Makefile... ;D 感谢您的回答! (3认同)
  • 有趣的是,这是互联网上唯一的例子。非常感谢。 (2认同)

小智 7

此外,如果条件语句用于定义函数,例如:

define myFunc
ifeq (foo, bar)
    ...
endif
endef
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Make也会将其视为shell脚本.

这个问题可以通过使用if-function来解决:

define myFunc
    $(if condition,then-part[,else-part])
endef
Run Code Online (Sandbox Code Playgroud)