我想做这样的事情,如果文件发生了变化,我想运行一个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
答案 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
语句的位置相关的变量。