为ifeq出错:意外令牌附近的语法错误


77

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

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

ifeq ($(DIST_TYPE),nightly)
    shell scripts ...
endif

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

ifeq(每晚,每晚)

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

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

这里发生了什么事?似乎Make正在尝试调用Shell。

谢谢。


您将sh(例如第一个)中的条件语句与make(例如第二个)中的条件语句混淆。
reinierpost 2012年

Answers:


269

我在代码旁玩耍,发现条件语句应该不缩进地编写,这解决了我的问题。

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

范例程式码

错误:

target:
    ifeq (foo, bar)
        ...
    endif

正确:

target:
ifeq (foo, bar)
    ...
endif

28
我只是想感谢您,并向您致意。我还添加了一个示例。:)
直到2012年

8
太不明显了,感谢您的回答,这为我节省了很多时间的挫败感

哇,我一直在寻找如何在我的makefile文件中工作。这很简单,但在任何地方都看不到!谢谢!
Eisi Sig

1
有趣的是,这是互联网上唯一的例子。非常感谢。
jlegler '17

2
而“迄今为止,历史上最不逻辑的语法”奖授予了Makefile ...; D谢谢您的回答!
Ole HenrikSkogstrøm17年

9

另外,如果在定义函数中使用了条件语句,例如:

define myFunc
ifeq (foo, bar)
    ...
endif
endef

在这种情况下,Make还将其视为shell脚本。

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

define myFunc
    $(if condition,then-part[,else-part])
endef

为我节省了很多时间:)
Anoop
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.