1

我是这个(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 `,'

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

4

2 回答 2

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 将在运行规则之前评估此条件,并且or之前不能有 TAB ,因为 Make 不能将它们解释为要传递给 shell 的命令。ifeqendif

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

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

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

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

于 2012-08-13T14:19:16.953 回答
0

好像你在 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
于 2012-08-12T05:24:37.777 回答