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 obtenez
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, en cours d'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, pourquoi?
L'exécution de la même commande fonctionne directement:
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)
...
Peut-être avez-vous un fichier/répertoire nommé test
dans le répertoire. Si ce répertoire existe et ne contient pas de dépendances plus récentes, cette cible n'est pas reconstruite.
Pour forcer la reconstruction sur ce type de cibles non liées à un fichier, vous devez les rendre fausses comme suit:
.PHONY: all test clean
Notez que vous pouvez y déclarer toutes vos cibles factices.
EDIT: Ceci ne s'applique qu'à certaines versions de make
- vous devriez vérifier votre page de manuel.
Vous pouvez également passer le -B
drapeau à make
. Selon la page de manuel, ceci:
-B, --always-make
Faire inconditionnellement toutes les cibles.
Alors make -B test
résoudrait votre problème si vous ne vouliez pas éditer le Makefile
ou changer le nom de votre dossier de test.