GNU makefile中的“premature end of file”是什么意思?

3

我正在尝试在makefile中练习if语句,但它一直提示文件结束过早。

代码:

test_rule:
   if  [ yes ]
       echo "if works"
   endif

输出:

make test_rule
/bin/sh: -c: line 1: syntax error : premature end of file
make: *** [Makefile:13: test_rule] Error 1

我尝试使用许多在线代码(例如将 [] 替换为 () 或在 echo 前面添加 @),但都无效。


2
配方行必须以制表符开头,但您使用了3个空格。 - HolyBlackCat
Make是少数几个制表符和空格真正有区别的程序之一。make的创造者Stu Feldman承认这是一个错误,但当意识到这一点时,已经有太多的用户了,无法冒险更改。请参见制表符和Makefile等其他地方。 - Jonathan Leffler
这个看起来也很有用:http://gromnitsky.users.sourceforge.net/articles/notes-for-new-make-users/ - Jonathan Leffler
1
这绝对与选项卡无关。错误消息将完全不同:您会得到一个make语法错误而不是shell语法错误。让我们奖励像RJ9这样的人,他们提供完整、有用的问题,包括错误消息,仔细阅读并利用这些信息确保我们给出适当的答案...!问题在于缺少反斜杠,正如G.M.所指出的那样。 - MadScientist
希望你在测试中并没有真正使用yes程序 :)。 - MadScientist
显示剩余2条评论
2个回答

4
手册所述,你需要使用制表符(默认情况下):

请注意:每行食谱开头都需要放置一个制表符!这是一个容易被忽视的细节。如果你喜欢在食谱前加上其他字符,可以将.RECIPEPREFIX变量设置为替代字符(参见特殊变量)。

因此,你需要写成:

foo:
    gcc

换句话说,那就是字符串 foo:\n\tgcc\n。 请注意,当StackOverflow渲染Markdown时,它会将制表符转换为4个空格(但如果您尝试编辑此答案,您将看到制表符字符)。

4
其他答案/评论表明你的“tabbing”不正确--这可能是真的--但查看错误消息...
make test_rule
/bin/sh: -c: line 1: syntax error : premature end of file
make: *** [Makefile:13: test_rule] Error 1

我认为这只是命令中错误的shell语法问题。请记住,一般来说,makefile中命令部分中的每一行都会在自己单独的shell中运行。尝试以下命令(请注意,我不是shell专家)...

test_rule:
    if [ yes ]; then \
      echo "it works"; \
    fi

甚至更好的做法是将其写成一行代码:if [ yes ]; then echo "it works"; fi -- 更容易维护。当然,基本前提是正确的:配方不是“shell片段”,而是每行一个命令。 - DevSolar
甚至更好的是,只需 [ yes ] && echo "it works" :) - MadScientist
抱歉回复晚了,我得完成其他的任务。但是非常感谢,它有效!终端显示找不到echo命令,但if语句是可以工作的。 - qwerty_99

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接