2017-10-07 79 views
1

我在向autotools项目添加特定规则时遇到了一些问题。automake规则中的相关性检查

我有这样的小项目为例:

项目/ configure.ac:

AC_INIT([myprog], [0.1], [[email protected]]) 
AM_INIT_AUTOMAKE([foreign -Wall -Werror]) 
AM_EXTRA_RECURSIVE_TARGETS([quality]) 
AC_PROG_CC 
AC_SUBST([AM_CFLAGS]) 
AC_CONFIG_HEADERS([config.h]) 
AC_CONFIG_FILES([Makefile src/Makefile]) 
AC_OUTPUT 

项目/ Makefile.am:

SUBDIRS = src 

项目/ src目录/ Makefile.am:

bin_PROGRAMS= myprog 

myprog_SOURCES = myprog.c 

QUALITYDIR=$(builddir)/quality 
QUALITY_FILE="$(QUALITYDIR)/quality.log" 

quality-local: $(QUALITY_FILE) 

$(QUALITY_FILE): myprog 
    mkdir -p $(QUALITYDIR) 
    valgrind ./myprog 2>&1 | tee $(QUALITY_FILE) 

CLEANFILES = $(QUALITY_FILE) 

each tim Ë我做的:

$使质量

的东西Valgrind的运行,即使“MYPROG”尚未重建。 我希望它只能在myprog比build/src/quality中的quality.log文件更年轻时执行。

我该怎么做?

回答

1

挖掘到你产生project/src/Makefile,你会看到类似这样的:

.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ 
     ... quality-am quality-local ... 

一个.PHONY target总会被翻拍,所以是valgrind将始终运行(这也是我观察到的)。

编辑:

忘记这一切。运行make -d quality后(已作出日志后)我注意到:

Considering target file '"./quality/quality.log"'. 
    File '"./quality/quality.log"' does not exist. 

所以,简单地改变:

QUALITY_FILE="$(QUALITYDIR)/quality.log" 

QUALITY_FILE=$(QUALITYDIR)/quality.log 

应使其行为像您期望。至少它为我做了。

+0

我不认为这可以解释它。是的,.PHONY的目标总是重新制作,但不会强制重建最新的先决条件(考虑到传统的“全部”目标通常是.PHONY)。 OP的valgrind命令是常规目标配方的一部分;只有当该规则的目标不存在或者其先决条件已过时时才应运行。 –

+0

@JohnBollinger在玩了更多之后,我发现你是对的。 – ldav1s

+0

第二次尝试,+1。我会补充说,这种事情是编写DRY make规则的一个很好的理由,特别是在规则的配方中使用内置变量'$ @'来引用该规则的目标。 –