2017-05-31 26 views
0

我正在拾取一些超出我的规范的旧代码,并且遇到了一些希望解释非常简单的问题。ifeq makefile中的意外令牌

我正在研究一个运行大量sql文件的makefile,然后生成.done文件来跟踪进度。在一个特定的sql文件后,我需要能够运行一个shell脚本来做一些额外的处理。

# this is the rule the describes how to execute a SQL script 
%.done: %.sql 
    @echo "+==============================================================================+" 
    @echo "building [email protected]" 
    @echo "...from $<" 
    @echo "building $<" 
    @$(PSQL_WRAPPER) -f $< 
    @ifeq ($(@),mysqlfile.done) 
     @echo "Executing Shell Script" 
     @../path/to/script/myscript.sh 
    endif 

我添加了ifeq部分,其他所有东西都在那里,并按预期工作。

这是我得到的输出。我真的被卡住了,一直在尝试不同的小小的语法调整,但显然还有一些我只是不理解的东西。

+==============================================================================+ 
building mysqlfile.done 
...from ../..//path/to/file/mysqlfile.sql 
building ../..//path/to/file/mysqlfile.sql 
/bin/bash: -c: line 0: syntax error near unexpected token `mysqlfile.done,mysqlfile.done' 
/bin/bash: -c: line 0: `ifeq (mysqlfile.done,mysqlfile.done)' 
make: *** [mysqlfile.done] Error 1 
Command exited with non-zero status 2 

从错误消息,它看起来像我有两个相等的值。我真的不确定那个意外的令牌会是什么。我非常感谢能够得到的任何帮助。

回答

2

ifeq是一个GNU Make指令, 用于有条件地包含或排除解析的makefile的一部分。这不是一个shell命令。 您正在使用%.done: %.sql配方的其中一行。 配方的所有行必须是shell命令。只需使用shell:

%.done: %.sql 
    @echo "+==============================================================================+" 
    @echo "building [email protected]" 
    @echo "...from $<" 
    @echo "building $<" 
    @$(PSQL_WRAPPER) -f $< 
    @if [ "[email protected]" = "mysqlfile.done" ]; then \ 
     echo "Executing Shell Script"; \ 
     ../path/to/script/myscript.sh; \ 
    fi 

无法有条件地从配方本身排除特殊情况处理, ,如:

%.done: %.sql 
    @echo "+==============================================================================+" 
    @echo "building [email protected]" 
    @echo "...from $<" 
    @echo "building $<" 
    @$(PSQL_WRAPPER) -f $< 
ifeq ($(@),mysqlfile.done) 
    @echo "Executing Shell Script" 
    @../path/to/script/myscript.sh 
endif 

因为规则的目标$(@)仅在配方中定义。

+0

谢谢,这是做到了。 –