Ich habe ein Problem des Hinzufügen spezifische Regeln zu einem Autotool Projekt.Abhängigkeitsprüfung in auto Regeln
Ich habe dieses kleine exemple Projekt:
Projekt/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
Projekt/Makefile.am:
SUBDIRS = src
Projekt/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)
Jeder tim e ich tun:
$ Qualität
die valgrind Sachen machen ausgeführt wird, auch wenn "myprog" wurde nicht wieder aufgebaut worden. Ich erwarte, dass es nur ausgeführt wird, wenn Myprog jünger als die Datei quality.log in Build/src/Qualität ist.
Was mache ich falsch?
Ich glaube nicht, dass es erklärt. Ja, .PHONY Ziele immer wieder gemacht, aber das nicht gezwungen, ein Wiederaufbau ihrer up-to-date Voraussetzungen (beachten Sie, dass das herkömmliche „alles“ Ziel normalerweise .PHONY ist). Der Valgrind-Befehl des OP ist Teil des Rezepts für ein reguläres Ziel. Es sollte nur ausgeführt werden, wenn das Ziel dieser Regel in Bezug auf die Voraussetzungen nicht vorhanden oder veraltet ist. –
@JohnBollinger Nachdem ich etwas mehr herumgespielt habe, habe ich festgestellt, dass du Recht hast. – ldav1s
Guter Fang beim zweiten Versuch, +1. Ich füge hinzu, dass diese Art von Sache ein guter Grund ist, DRY-make-Regeln zu schreiben, und insbesondere die eingebaute Variable $ @ 'im Regelwerk einer Regel zu verwenden, um auf das Ziel dieser Regel zu verweisen. –