2017-10-07 8 views
1

J'ai un problème pour ajouter des règles spécifiques à un projet autotools.contrôle de dépendances dans les règles d'automake

Je possède ce petit projet exemple:

projet/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 

projet/Makefile.am:

SUBDIRS = src 

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

Chaque tim e que je fais:

$ font la qualité

la substance valgrind est exécuté, même si "myprog" n'a pas été reconstruit. Je suppose qu'il ne sera exécuté que lorsque myprog est plus jeune que le fichier quality.log dans build/src/quality.

Qu'est-ce que je fais de mal?

Répondre

1

Creuser dans votre produit project/src/Makefile vous verrez quelque chose comme:

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

A .PHONY target sera toujours refaite, donc oui valgrind sera toujours exécuté (que j'ai aussi observé).

EDIT:

Oubliez tout cela. Après avoir exécuté make -d quality (après avoir déjà fait le journal) j'ai remarqué:

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

Alors changeant simplement:

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

à

QUALITY_FILE=$(QUALITYDIR)/quality.log 

devrait faire se comporter comme prévu. Au moins, ça l'a fait pour moi.

+0

Je ne pense pas que cela l'explique. Oui, les cibles .PHONY sont toujours refaites, mais cela ne force pas une reconstruction de leurs prérequis à jour (considérez que la cible "all" conventionnelle est normalement .PHONY). La commande valgrind de l'OP fait partie de la recette pour une cible régulière; il ne devrait fonctionner que si la cible de cette règle est absente ou périmée par rapport à ses prérequis. –

+0

@JohnBollinger après avoir joué un peu plus, j'ai découvert que vous avez raison. – ldav1s

+0

Bonne prise au deuxième essai, +1. J'ajouterai que ce genre de chose est une excellente raison d'écrire des règles DRY make, et en particulier d'utiliser la variable intégrée $ @ dans la recette d'une règle pour faire référence à la cible de cette règle. –