【问题标题】:make error (Windows) : line 1: syntax error near unexpected token `,'产生错误(Windows):第1行:意外标记','附近的语法错误
【发布时间】:2012-08-12 05:17:05
【问题描述】:

我是这个(make) 的初学者,在尝试用grep 查找文件中的文本时遇到了一些问题(作为Windows 上make 过程的一部分)。我要解决的更大问题是检查给定目录中的所有二进制可执行文件是否满足其各自的依赖关系。我在后面的部分使用depends.exe(Dependency Walker),我正在尝试对其输出文件进行grep,如果依赖验证失败,可能会中止构建过程。

binary-dependency-validate:
for BINARYEXEC in $(shell $(PATH_TO_FIND_EXE) $(PRE_DEFINED_DIR) -name "*.exe"); do \
   $(PATH_TO_DEPENDS_EXE) /c /pb /ot $(PRE_DEFINED_DIR)/$$BINARYEXEC-depends.txt $(PRE_DEFINED_DIR)/$$BINARYEXEC ; \
   ifeq ($(shell $(PATH_TO_GREP_EXE) "Error: At least one required implicit or forwarded dependency was not found." $(PRE_DEFINED_DIR)/$$BINARYEXEC-depends.txt),); \
      @echo "Dependency ok" ; \
   endif ; \
done

我遇到以下错误:

line 1: syntax error near unexpected token `,'

任何建议都会有很大帮助。我查看了this 的帖子并尝试在没有缩进的情况下对齐 ifeq(这也没有帮助。)

【问题讨论】:

    标签: shell syntax makefile syntax-error gnu-make


    【解决方案1】:

    问题是您将 Make 语言与 shell 语言混合在一起。

    makefile 包含规则,而规则包含由 shell 执行的命令:

    target:
        first command
        second command
    

    命令是shell语言,每个命令前面必须有一个TAB。

    Make中有条件:

    ifeq (foo, bar)
      VAR = something      
    endif
    

    (压痕只是为了眼睛。)

    在各种脚本语言中也有条件:

    if [ -f log ]
      then
        echo "log exists."
    fi
    

    Make 条件可以将命令包含在规则中:

    target:
    ifeq (foo, bar)
        first command
    endif
        second command
    

    Make 将在运行规则之前评估此条件,并且 ifeqendif 之前不能有 TAB,因为 Make 不得将它们解释为要传递给 shell 的命令。

    一个命令(在一个规则中)可以包含一个 shell 条件:

    target:
        if [ -f log ]; \
      then echo "log exists." ; \
      fi
    

    if 之前的缩进是一个 TAB。另一个空白是为了眼睛。

    您的 makefile 在 shell 命令中间有一个 Make 条件; Make 无法在命令执行之前评估条件,并且 shell 无法理解 Make 语法。 您应该使用 shell 条件。

    【讨论】:

    • 感谢 Beta(也提供详细说明)。当我改用 shell 条件时,我解决了这个问题。但我还有另一个问题挥之不去。当我运行 make 时,'grep' 命令总是在目标之前开始,因此当运行 grep 时 $$BINARYEXEC 是空的。即使 for 循环很好地迭代,每次迭代都不会重新计算 grep。得到的错误是:“grep:/-depends.txt:没有这样的文件或目录”。我一定遗漏了一些关于 make 如何处理这些命令的微妙之处。任何指针都会很棒。
    • 通过纯粹的实验,我看到任何被标记为在 shell 中运行的东西都在其他命令之前被处理(和执行)。因此,我将 $(shell $(PATH_TO_GREP) ...) 更改为 $(PATH_TO_GREP) ....,将其全部从 if 条件中提取出来,现在我的 shell 条件如下所示:if [[ $$ ? -eq 0]]。这对我有用。谢谢。
    • @durden83,您再次将 Make 语言 ($(shell ...)) 放入命令中。
    • :我同意,我最初只是通过查看代码的其他部分(它碰巧工作的地方)受到鼓励。我意识到了这一点,并从命令中删除了 Make 语言部分。不过,感谢您的解释 - 它帮助很大。
    【解决方案2】:

    您的 ifeq 行似乎有一个杂散的逗号

    binary-dependency-validate:
    for BINARYEXEC in $(shell $(PATH_TO_FIND_EXE) $(PRE_DEFINED_DIR) -name "*.exe"); do \
       $(PATH_TO_DEPENDS_EXE) /c /pb /ot $(PRE_DEFINED_DIR)/$$BINARYEXEC-depends.txt $(PRE_DEFINED_DIR)/$$BINARYEXEC ; \
       ifeq ($(shell $(PATH_TO_GREP_EXE) "Error: At least one required implicit or forwarded dependency was not found." $(PRE_DEFINED_DIR)/$$BINARYEXEC-depends.txt)); \
          @echo "Dependency ok" ; \
       endif ; \
    done
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2012-10-20
    • 2012-09-29
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多