2010-10-07 78 views
5

我試圖做類似的東西How to make two different source directories in a Makefile output to one bin directory?,所以我有這些文件(相對於我的項目的根目錄):強制ERL -make重新編譯文件時宏改變

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 

的問題是,運行make test沒有按不要重新編譯已經用make編譯的任何模塊。看起來erl -make並不在意它們是在沒有TEST定義的情況下編譯的,它只是檢查模塊本身是否比beam文件早。我如何強制它重新編譯(並在不需要時避免重新編譯)?

UPDATE:奇怪的是,make clean後立即運行make all_test時,似乎./Emakefile代替test/Emakefile:我正在

Recompile: src/tests 
Recompile: src/server_protocol_client 

等,並沒有測試來代替

Recompile: ../src/tests 
Recompile: ../src/server_protocol_client 

我手動執行cd test; erl -make。任何想法爲什麼?無論如何,我已經刪除了test/EmakefileMakefile更換all_test固定的這個問題:

all_test: before_compile 
    erl -noshell -eval "make:all([{d, 'TEST'}])." -s init stop 

回答

3
all_test: before_compile 
    cd test 
    erl -make 
    cd .. 

這是不正確。每一行生成自己的過程。這樣做:

all_test: before_compile 
    cd test; \ 
    erl -make