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?
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. –
@JohnBollinger après avoir joué un peu plus, j'ai découvert que vous avez raison. – ldav1s
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. –