2017-10-07 1 views
1

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?

Antwort

1

Graben in Ihre project/src/Makefile erzeugt man so etwas sehen werden:

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

A .PHONY target wird immer neu gemacht werden, also ja valgrind wird immer ausgeführt werden (was ich auch beobachtet).

EDIT:

Vergessen Sie all das. Nach make -d quality läuft (nachdem sie bereits das Protokoll gemacht zu haben) bemerkte ich:

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

So einfach zu ändern:

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

zu

QUALITY_FILE=$(QUALITYDIR)/quality.log 

sollte es wie erwartet machen verhalten. Zumindest hat es für mich getan.

+0

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. –

+0

@JohnBollinger Nachdem ich etwas mehr herumgespielt habe, habe ich festgestellt, dass du Recht hast. – ldav1s

+0

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. –