如果条件在Makefile中的目标内

时间:2013-05-21 09:45:08

标签: makefile

我想做这样的事情,如果文件发生了变化,我想运行一个svn提交。该文件的时间戳始终更改。因此,如果超过时间戳更改,我想提交文件。

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

2 个答案:

答案 0 :(得分:14)

您不能在命令规则中混合使用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

答案 1 :(得分:4)

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

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

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

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

endif

祝所有来这里的人好运。

修改

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