299 votes

Pourquoi pensez-vous que la cible est à jour ?

C'est mon Makefile :

REBAR=./rebar
REBAR_COMPILE=$(REBAR) get-deps compile

all: compile

compile:
    $(REBAR_COMPILE)

test:
    $(REBAR_COMPILE) skip_deps=true eunit

clean:
    -rm -rf deps ebin priv doc/*

docs:
    $(REBAR_COMPILE) doc

ifeq ($(wildcard dialyzer/sqlite3.plt),)
static:
    $(REBAR_COMPILE) build_plt analyze
else
static:
    $(REBAR_COMPILE) analyze
endif

Je peux courir make compile plusieurs fois et obtenir

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make compile
./rebar get-deps compile
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)

Cependant, pour une raison quelconque, l'exécution make test donne toujours

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make test
make: `test' is up to date.

même si les fichiers ne sont pas compilés. La question est de savoir pourquoi.

L'exécution de la même commande directement fonctionne :

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ ./rebar get-deps compile skip_deps=true eunit
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)
Compiled src/sqlite3_lib.erl
Compiled src/sqlite3.erl
==> erlang-sqlite (eunit)
...

610voto

Didier Trosset Points 17949

Vous avez peut-être un fichier/répertoire nommé test dans le répertoire. Si ce répertoire existe, et n'a pas de dépendances plus récentes, alors cette cible n'est pas reconstruite.

Pour forcer la reconstruction sur ce type de cibles non liées à des fichiers, vous devez les rendre fausses comme suit :

.PHONY: all test clean

Notez que vous pouvez y déclarer toutes vos cibles fictives.

Une cible fictive n'est pas vraiment le nom d'un fichier ; il s'agit plutôt du nom d'une recette à exécuter lorsque vous faites une demande explicite.

4 votes

J'avais un répertoire appelé build et un autre appelé lib. Avec le recul, ce ne sont pas des noms de cibles parfaits. Ugh.....make.

16 votes

*Où all , test y clear sont les noms des cibles de votre makefile

0 votes

Une autre solution consiste à changer l'étiquette. Dans votre cas, changez test pour test_rule ou quelque chose de différent.

58voto

Piyush Sonigra Points 31

Cela se produit lorsque vous avez un fichier avec le même nom que le nom de la cible du Makefile dans le répertoire où le Makefile est présent.

enter image description here

51voto

jamesc Points 1076

EDIT : Ceci ne s'applique qu'à certaines versions de make - vous devriez vérifier votre page de manuel.

Vous pouvez également passer le -B pour make . Comme indiqué dans la page de manuel, c'est le cas :

-B, --always-make Faites inconditionnellement toutes les cibles.

Alors make -B test résoudrait votre problème si vous étiez dans une situation où vous ne voulez pas modifier la Makefile ou changez le nom de votre dossier de test.

4voto

ThorSummoner Points 396

Mon erreur a été de faire le nom de la cible "nomfichier.c :" au lieu de "nomfichier :".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X