ifeq makefile

时间:2017-05-31 17:13:39

标签: makefile

我正在挑选一些不符合常规的旧代码,并且遇到一些希望非常简单易解的问题。

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

# this is the rule the describes how to execute a SQL script
%.done: %.sql
    @echo "+==============================================================================+"
    @echo "building $@"
    @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

从错误消息中,我看起来有两个相等的值。我真的不确定意外的标记是什么。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

相关问题