我正在编写一个Makefile,它在一个地方进行字符串匹配,代码如下:
if test ...; \
then \
shell scripts... \
fi
ifeq ($(DIST_TYPE),nightly)
shell scripts ...
endif
这里第一个if
是shell脚本,第二个ifeq
是GNU Make的条件。但是会生成以下错误:
ifeq(每晚,每晚)
/ bin / sh:-c:第0行:意外令牌附近的语法错误`每晚,每晚'
/ bin / sh:-c:第0行:`ifeq(每晚,每晚)'
这里发生了什么?似乎Make正试图调用shell。
谢谢。
答案 0 :(得分:198)
我玩了代码,发现条件语句应该写成没有缩进,这解决了我的问题。
如果没有缩进,Make会将其视为自己的指令;否则,它被视为shell脚本。
错:
target:
ifeq (foo, bar)
...
endif
正确:
target:
ifeq (foo, bar)
...
endif
答案 1 :(得分:6)
此外,如果条件语句用于定义函数,例如:
define myFunc
ifeq (foo, bar)
...
endif
endef
在这种情况下,Make也会将其视为shell脚本。
这个问题可以通过使用if-function来解决:
define myFunc
$(if condition,then-part[,else-part])
endef