Shell 生成错误(Windows):第1行:意外标记“,'”附近的语法错误;

Shell 生成错误(Windows):第1行:意外标记“,'”附近的语法错误;,shell,syntax,makefile,syntax-error,gnu-make,Shell,Syntax,Makefile,Syntax Error,Gnu Make,我是这个(make)的初学者,在尝试grep文件中的文本时遇到了一些问题(作为Windows上make过程的一部分)。我试图解决的更大的问题是检查给定目录中的所有二进制可执行文件是否满足各自的依赖关系。我在后面的部分中使用dependens.exe(Dependency Walker),我正在尝试对其输出文件进行grep,如果依赖项验证失败,可能会中止构建过程 binary-dependency-validate: for BINARYEXEC in $(shell $(PATH_TO_FIND

我是这个(make)的初学者,在尝试grep文件中的文本时遇到了一些问题(作为Windows上make过程的一部分)。我试图解决的更大的问题是检查给定目录中的所有二进制可执行文件是否满足各自的依赖关系。我在后面的部分中使用dependens.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 `,'

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

看起来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

似乎在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

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

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

target:
    first command
    second command
命令采用shell语言,每个命令前面必须有一个选项卡

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将在运行规则之前计算此条件,并且在
ifeq
endif
之前不能有选项卡,因为Make不能将它们解释为要传递给shell的命令

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

target:
    if [ -f log ]; \
  then echo "log exists." ; \
  fi
如果是制表符,则在
之前的缩进。另一个空格是给眼睛的


你的MaFo文件在shell命令的中间有一个Apple条件;Make无法在命令执行之前计算条件,并且shell无法理解Make语法。您应该使用shell条件。

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

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

target:
    first command
    second command
命令采用shell语言,每个命令前面必须有一个选项卡

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将在运行规则之前计算此条件,并且在
ifeq
endif
之前不能有选项卡,因为Make不能将它们解释为要传递给shell的命令

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

target:
    if [ -f log ]; \
  then echo "log exists." ; \
  fi
如果
是制表符,则在
之前的缩进。另一个空格是给眼睛的


你的MaFo文件在shell命令的中间有一个Apple条件;Make无法在命令执行之前计算条件,并且shell无法理解Make语法。您应该使用shell条件。

gnumake建议语法正确。i、 e.ifeq(arg1,)。来源:(删除了它,但没有解决问题)。GNUMake建议语法正确。i、 e.ifeq(arg1,)。来源:(删除了它,但并没有解决问题)。谢谢,Beta(也提供了详细的解释)。当我改用shell条件时,这个问题得到了解决。但我有另一个问题挥之不去。运行make时,“grep”命令总是在目标之前启动,因此运行grep时$$BINARYEXEC为空。即使for循环在fine中迭代,每次迭代都不会重新计算grep,得到的错误是:“grep://-depends.txt:没有这样的文件或目录”。我一定错过了一些关于如何处理这些命令的微妙之处。任何指针都很好。通过纯粹的实验,我发现任何标记为在shell中运行的命令都会比其他命令提前处理(和执行)。因此,我将$(shell$(PATH_TO_GREP)…)更改为$(PATH_TO_GREP)…,将其全部从if条件中取出,现在我的shell条件如下所示:if[$?-eq 0]]。这对我很有效。谢谢。@durden83,你又一次把Make语言(
$(shell…
)放在命令中了。我同意,刚开始的时候,我只是通过查看代码的其他部分(碰巧在那里工作)得到了鼓励。我意识到了这一点,并从命令中删除了Make语言部分。不过,谢谢你的解释——这很有帮助。谢谢Beta(也谢谢你的详细解释)。当我改用shell条件时,这个问题得到了解决。但我有另一个问题挥之不去。运行make时,“grep”命令总是在目标之前启动,因此运行grep时$$BINARYEXEC为空。即使for循环在fine中迭代,每次迭代都不会重新计算grep,得到的错误是:“grep://-depends.txt:没有这样的文件或目录”。我一定错过了一些关于如何处理这些命令的微妙之处。任何指针都很好。通过纯粹的实验,我发现任何标记为在shell中运行的命令都会比其他命令提前处理(和执行)。因此,我将$(shell$(PATH_TO_GREP)…)更改为$(PATH_TO_GREP)…,将其全部从if条件中取出,现在我的shell条件如下所示:if[$?-eq 0]]。这对我很有效。谢谢。@durden83,你又一次把Make语言(
$(shell…
)放在命令中了。我同意,刚开始的时候,我只是通过查看代码的其他部分(碰巧在那里工作)得到了鼓励。我意识到了这一点,并从命令中删除了Make语言部分。不过,谢谢你的解释,这很有帮助。