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文件更年轻时执行。
我该怎么做?
我不认为这可以解释它。是的,.PHONY的目标总是重新制作,但不会强制重建最新的先决条件(考虑到传统的“全部”目标通常是.PHONY)。 OP的valgrind命令是常规目标配方的一部分;只有当该规则的目标不存在或者其先决条件已过时时才应运行。 –
@JohnBollinger在玩了更多之后,我发现你是对的。 – ldav1s
第二次尝试,+1。我会补充说,这种事情是编写DRY make规则的一个很好的理由,特别是在规则的配方中使用内置变量'$ @'来引用该规则的目标。 –