我是这个(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(这也没有帮助。)
答案 0 :(得分: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将在运行规则之前评估此条件,并且在ifeq
或endif
之前必须没有TAB,因为Make不能将它们解释为要传递给shell的命令。
命令(在规则中)可以包含shell条件:
target:
if [ -f log ]; \
then echo "log exists." ; \
fi
if
之前的缩进是TAB。另一个空白是为了眼睛。
你的makefile在shell命令的中间有一个Make条件; Make无法在命令执行之前评估条件,并且shell无法理解Make语法。 您应该使用shell条件。
答案 1 :(得分: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