2012-08-12 78 views
1

我是这个(make)的初学者,并且有一些问题试图grep文件中的文本(作为make的一部分在Windows上进行)。我试图解决的更大问题是检查给定目录中的所有二进制可执行文件是否满足其各自的依赖关系。我使用depends.exe(Dependency Walker)作为后面的部分,我尝试grep的输出文件,如果依赖性验证失败,可能会中止构建过程。使错误(Windows):第1行:语法错误附近的意外令牌`,'

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以及(这并没有帮助。)

回答

1

的问题是,你正在混合使语言与语言。

甲生成文件包含的规则,以及规则包含由一个壳执行的命令:

target: 
    first command 
    second command 

的命令是在壳的语言,并在每个命令必须由一个TAB之前。

有在制作条件句:(缩进仅仅是眼睛)

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或之前没有TAB,因为Make不能将它们解释为要传递给shell的命令。

的命令(在规则)可以包含有条件的壳:

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

压痕if之前是一个TAB。另一个空白是为了眼睛。

你的makefile在shell命令的中间有一个Make条件; Make不能在命令执行前评估条件,而shell不能理解Make语法。 您应该使用shell条件。

+0

谢谢,Beta(详细解释)。当我使用shell条件时,我解决了这个问题。但我有另一个问题缠绵。当我运行make时,'grep'命令始终在目标之前开始,因此当grep运行时$$ BINARYEXEC为空。即使for循环迭代通过,每次迭代都不会重新计算grep。并且得到的错误是:“grep: /-depends.txt:没有这样的文件或目录”。我必须错过一些关于如何使这些命令处理的细微事情。任何指针都会很棒。 – 2012-08-14 23:34:41

+0

通过纯粹的实验,我看到任何标记为在shell中运行的东西都在其他命令之前被处理(并执行)。因此,我将$(shell $(PATH_TO_GREP)...)更改为$(PATH_TO_GREP)....,将其全部从if条件中取出,现在我的shell条件如下所示:if [[$$ ? -eq 0]]。这对我有效。谢谢。 – 2012-08-15 00:23:18

+0

@ durden83,你再次在命令中加入Make语言('$(shell ...)')。 – Beta 2012-08-15 01:07:43

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 
+0

GNU make建议语法正确。即ifeq(arg1,)。资料来源:http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html(删除它,但它并没有解决问题)。 – 2012-08-12 06:52:02

相关问题