2009-12-12 41 views
2

我有以下的Makefile建立我的二郎項目:如何在Makefile輸出中將兩個不同的源目錄輸出到一個bin目錄?

.SUFFIXES: .erl .beam .yrl 

ERL_SRC := $(wildcard src/*.erl) 
ERL_OBJ := $(patsubst src/%.erl,ebin/%.beam,${ERL_SRC}) 

all: main 

main: ${ERL_OBJ} 

ebin/%.beam: src/%.erl 
     erlc +debug_info -W -o ebin $< 

clean: 
     rm -fr ebin/*.beam 

我試圖更新這也是建立我eunit測試,在測試/ eunit文件夾,並具有輸出到同一個文件夾EBIN作爲在src像這樣:

.SUFFIXES: .erl .beam .yrl 

ERL_SRC := $(wildcard src/*.erl) 
ERL_OBJ := $(patsubst src/%.erl,ebin/%.beam,${ERL_SRC}) 
EUNIT_SRC := $(wildcard test/eunit/*.erl) 
EUNIT_OBJ := $(patsubst test/eunit/%.erl,ebin/%.beam,${EUNIT_SRC}) 

all: main 

main: ${ERL_OBJ} 

ebin/%.beam: src/%.erl test/eunit/%.erl 
     erlc +debug_info -W -o ebin $< 

clean: 
     rm -fr ebin/*.beam 

eunit: ${EUNIT_OBJ} 

test: main eunit 

製作主要工作正常,但如果我嘗試使測試失敗:

make: *** No rule to make target `ebin/data_eunit.beam', needed by `eunit'. Stop. 

測試模塊data_eunit.erl位於測試/ eunit。這個問題似乎與ebin /%beam目標有關。如果我將src /%。erl與test/eunit /%。erl交換,那麼我可以構建測試,但不是src。我如何從兩個源文件夾構建並將輸出轉到一個輸出文件夾?

+0

我肯定新的使用使/ Makefile文件。我試圖研究一個解決方案,但我正在努力尋找解決方案。 – 2009-12-12 18:56:34

回答

5

您可以使用VPATH/VPATH在Makefile

.SUFFIXES: .erl .beam .yrl 

# use vpath to tell make where to search for %.erl files 
vpath %.erl src eunit 
# or use VPATH to tell make where to search for any prerequisite 
# VPATH=src:eunit  

ERL_OBJ = $(patsubst src/%.erl,ebin/%.beam, $(wildcard src/*erl)) 
ERL_OBJ += $(patsubst eunit/%.erl,ebin/%.beam, $(wildcard eunit/*erl)) 

all: main 

main: ${ERL_OBJ} 

ebin/%.beam: %.erl 
    erlc +debug_info -W -o ebin $< 

clean: 
    rm -fr ebin/*.beam 
+0

現在這就是我正在尋找的。非常感謝,它像一個魅力。 – 2009-12-17 21:11:36

0

您應該製作另一個將該樹編譯爲ebin的目標,使其依賴於原始構建目標。

2

這不會真的回答你的問題,但我不喜歡有污染我的ebin /測試代碼的風險。所以這是我如何安排我的頂層的Makefile:

all: 
    (cd src && erl -make) 

test: 
    (cd test && erl -make && \ 
     erl -noinput -eval 'eunit:test({dir, "."}, [verbose]), init:stop()') 

然後我把下列src/Emakefile

{['*'], 
[{outdir,"../ebin"}]}. 

而進入test/Emakefile我把

{['../src/*'], 
[debug_info, {d, 'TEST'}]}. 
{['*'], 
[debug_info, {d, 'TEST'}]}. 

所以,如果我跑make all然後src/*。erl被編譯到ebin /中,但是如果我運行make test,我將src/*。erl和test/*。erl編譯到test /中,並在那裏運行所有的beam文件試驗。

當編譯宏被啓用,因此,如果用的ifdef爲eunit引導裝置包圍該單元測試是禁用的測試表明:

-ifdef(TEST). 
test_code_() -> ... 
-endif. 

它的設置,我是相當滿意。

+0

我正在尋找類似的東西,但更喜歡所有的束文件在ebin中結束 - 不要混合與erl文件混合的束文件。 – 2009-12-13 02:11:50

+0

這是微不足道的完成。 – Christian 2009-12-13 10:33:49

4

也許你應該大大簡化你的構建。我的二郎構建系統只是調用erl -make與Emakefile看起來像這樣:

{"src/*", [debug_info, {outdir, "ebin"}, {i, "include"}]}. 

你可以,當然,有一個以上的SRC LOC更多,只是混合測試和常規代碼 - 你已經在ebin中混合它們。不要讓自己比自己更難。

+0

我不介意在同一個ebin目錄下編譯輸出,但更喜歡將應用程序和測試源代碼分開。 – 2009-12-13 18:08:05

+0

現在天螺紋鋼(https://github.com/basho/rebar)是Erlang應用程序的方式。 – 2012-01-25 21:35:24

0

這是做什麼我想:

.SUFFIXES: .erl .beam .yrl 

ERL_SRC := $(wildcard src/*.erl) 
ERL_OBJ := $(patsubst src/%.erl,ebin/%.beam,${ERL_SRC}) 
EUNIT_SRC := $(wildcard test/eunit/*.erl) 
EUNIT_OBJ := $(patsubst test/eunit/%.erl,ebin/%.beam,${EUNIT_SRC}) 

all: main 

main: ${ERL_OBJ} 

${ERL_OBJ}: ${ERL_SRC} 
     erlc +debug_info -W -o ebin $< 

clean: 
     rm -fr ebin/*.beam 

${EUNIT_OBJ}: ${EUNIT_SRC} 
     erlc +debug_info -W -o ebin $< 

eunit: ${EUNIT_OBJ} 

test: main eunit 

任何其他辦法可以改善嗎?也許可以將$ {ERL_OBJ}和$ {EUNIT_OBJ}中的類似編譯行移動到一個變量中。

0

而不是 「EBIN /%束:。SRC /%的ERL測試/ eunit /%的ERL」 你有嘗試過:

%.beam:%。ERL

+0

這不起作用,因爲我的Makefile與源或輸出不在同一個目錄中。我有 ./Makefile ./src ./test/eunit – 2009-12-14 11:59:45