10

我想做这样的事情,如果文件已更改,我想在其中运行 svn commit。该文件具有始终更改的时间戳。因此,如果时间戳更改以外的任何内容,那么我想提交文件。

makefile 将具有与此类似的内容。但是 If 条件无法正常工作。即使不满足,它也会被执行。有人可以帮我解决如果这里有什么问题。

    UPDATE_STATE_FILE :
        $(eval NO_LINES_CHANGES_IN_STATE = $(shell svn di STATE/build.state --diff-cmd=diff -x --normal | grep "^[<>]" | wc -l))
        @echo $(NO_LINES_CHANGES_IN_STATE)
    ifneq ($(strip $(NO_LINES_CHANGES_IN_STATE)), 2)
    ifneq ($(strip $(NO_LINES_CHANGES_IN_STATE)), 0)
        @echo $(NO_LINES_CHANGES_IN_STATE)
        $(SVN) commit;
        $(SVN) update;
    endif
    endif
4

2 回答 2

18

您不能在命令规则中混用 make 条件。Make 条件类似于 C 或 C++ 中的预处理器语句;在执行任何处理(如运行规则)之前,它们在读入文件时被处理。

如果你想在规则中使用条件,你必须使用 shell 条件来编写规则,而不是创建条件:

UPDATE_STATE_FILE :
        @NO_LINES_CHANGES_IN_STATE=`svn di STATE/build.state --diff-cmd=diff -x --normal | grep "^[<>]" | wc -l`; \
        echo $$NO_LINES_CHANGES_IN_STATE; \
        if [ $$NO_LINES_CHANGES_IN_STATE -ne 2 ] && [ $$NO_LINES_CHANGES_IN_STATE -ne 0 ]; then \
            echo $$NO_LINES_CHANGES_IN_STATE; \
            $(SVN) commit; \
            $(SVN) update; \
        fi
于 2013-05-21T12:07:50.067 回答
3

在阅读了@MadScientist 给出的答案后,我想出了一个不同的方法。

不知道 shell 条件是否适用于任何环境(windows 与 linux),我将规则包装在条件中,而不是在规则中包含条件。IE

ifdef MY_FLAG
%.o: %.c
    $(CC) -o $@ -c $^ $(CFLAGS)

else
%.o: %.c
    @$(CC) -o $@ -c $^ $(CFLAGS)

endif

祝任何访问这里的人好运。

编辑

正如 James Moore 在评论中指出的那样,这种不同的方法需要注意和注意何时以及如何定义与if语句在控制流中的位置相关的变量。

于 2016-07-04T19:47:18.577 回答