【问题标题】:What does "premature end of file" mean in GNU makefile?GNU makefile 中的“文件过早结束”是什么意思?
【发布时间】:2019-09-15 16:37:32
【问题描述】:

我正在尝试在 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 前添加 @),但没有任何效果。

【问题讨论】:

  • 配方行必须以制表符开头,但您使用了 3 个空格。
  • Make 是少数几个标签和空格之间的区别真正重要的程序之一。 make 的创建者 Stu Feldman 承认这是一个错误,但在意识到这一点时,已经有太多用户冒着改变它的风险。在其他地方见Tabs and Makefiles
  • 感谢您的回答。我注意到了,但我认为这不是问题(复制粘贴标签只是为了确保)
  • 绝对和标签无关。错误消息会完全不同:你会得到一个 make 语法错误而不是 shell 语法错误。让我们奖励像 RJ9 这样真正提供完整、有用的问题(包括错误消息)的人,仔细阅读它们并使用这些信息来确保我们给出适当的答案......!这里的问题是缺少反斜杠作为 G.M.指出。

标签: c linux makefile gnu-make


【解决方案1】:

其他答案/cmets 表明您的“tabbing”不正确——这可能是真的——但查看错误消息...

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

我认为这只是命令中不正确的 shell 语法的一种情况。请记住,一般来说,make 配方的命令部分中的每一行都将在其自己的 shell 中运行。尝试以下方法(请记住,我不是 shell 专家)...

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

【讨论】:

  • 更好的是,写在一行中:if [ yes ]; then echo "it works"; fi -- 更易于维护。基本前提当然是正确的:Recipes 不是“shell sn-ps”,它们是每行一个命令。
  • 或者更好,只是[ yes ] && echo "it works" :)
  • 抱歉这么晚才回复,我还要完成一些其他的作业。但是非常感谢,它有效!终端说找不到 echo 命令,但是 if 有效
【解决方案2】:

作为the manual explains,你需要使用标签(默认):

请注意:您需要在每个食谱行的开头放置一个制表符!这是一个让粗心大意的人陷入困境的默默无闻。如果您更喜欢在食谱前加上制表符以外的字符,可以将 .RECIPEPREFIX 变量设置为备用字符(请参阅特殊变量)。

因此,你需要写:

foo:
    gcc

换句话说,就是字符串foo:\n\tgcc\n

请注意,StackOverflow 在渲染 Markdown 时会将制表符转换为 4 个空格(但如果您尝试编辑此答案,您将看到制表符)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2021-04-11
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多