Starałem się zrobić coś podobnego do How to make two different source directories in a Makefile output to one bin directory?, więc mam te pliki (w stosunku do mojego korzenia projektu):Zmuszanie ERL -make przekompilować pliki gdy makra są zmieniane
Emakefile:
% EMakefile
% -*- mode: erlang -*-
{["src/*", "src/*/*", "src/*/*/*"],
[{i, "include"}, {outdir, "ebin"}, debug_info]}.
test/Emakefile:
% EMakefile
% -*- mode: erlang -*-
{["../src/*", "../src/*/*", "../src/*/*/*"],
[{i, "../include"}, {outdir, "../ebin"}, debug_info, {d, 'TEST'}]}.
Makefile:
EPATH=-pa ebin
all: before_compile
erl -make
all_test: before_compile
cd test
erl -make
cd ..
before_compile: mk_ebin copy_sqlite create_db copy_config copy_dot_app
test: all_test
erl -noshell $(EPATH) \
-s tests run \
-s init stop
rm -f ct.db
clean:
rm -fv ebin/*
... dependencies of before_compile
Problemem jest to, że działa make test
robi Rekompiluj wszystkie moduły, które są już skompilowane z make
. Wydaje się, że erl -make
nie obchodzi, że zostały one skompilowane bez zdefiniowania TEST
, po prostu sprawdza, czy same moduły są starsze niż pliki wiązki. Jak zmusić go do rekompilacji (i uniknięcia ponownej kompilacji, gdy nie jest to potrzebne)?
UPDATE: O dziwo, gdy uruchomiony make all_test
natychmiast po make clean
wydaje się, że ./Emakefile
jest używany zamiast test/Emakefile
: Dostaję
Recompile: src/tests
Recompile: src/server_protocol_client
itp i żadne testy zamiast
Recompile: ../src/tests
Recompile: ../src/server_protocol_client
, którą otrzymuję ręcznie, wykonując cd test; erl -make
. Każdy pomysł, dlaczego? W każdym razie, Naprawiłem ten problem poprzez usunięcie i zastąpienie all_test
test/Emakefile
w Makefile
:
all_test: before_compile
erl -noshell -eval "make:all([{d, 'TEST'}])." -s init stop