automake 规则中的依赖项检查

dependency check in automake rules

我在向 autotools 项目添加特定规则时遇到问题。

我有这个小示例项目:

project/configure.ac :

AC_INIT([myprog], [0.1], [dev@corp.com])
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

project/Makefile.am:

SUBDIRS = src

project/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)

每次我这样做:

$ 制作质量

valgrind 的内容是 运行,即使 "myprog" 尚未重建。 我希望它只在 myprog 比 build/src/quality 中的 quality.log 文件年轻时执行。

我做错了什么?

深入了解您生成的 project/src/Makefile,您会看到如下内容:

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

A .PHONY target 将始终被重制,所以是的 valgrind 将始终是 运行(我也观察到)。

编辑:

忘了这一切吧。在 运行ning 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

应该使它按您预期的方式运行。至少它对我有用。