如何在Makefile输出中将两个不同的源目录放到一个bin目录中?

Jer*_*ond 2 erlang makefile

我有以下Makefile来构建我的erlang项目:

.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
Run Code Online (Sandbox Code Playgroud)

我正在尝试更新这个以在test/eunit文件夹中构建我的eunit测试,并让输出转到与src相同的ebin文件夹,如下所示:

.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
Run Code Online (Sandbox Code Playgroud)

使主要工作正常,但如果我尝试进行测试它失败了:

make: *** No rule to make target `ebin/data_eunit.beam', needed by `eunit'.  Stop.
Run Code Online (Sandbox Code Playgroud)

测试模块data_eunit.erl位于test/eunit中.问题似乎与ebin /%.beam target有关.如果我将src /%.erl与test/eunit /%.erl交换,那么我可以构建测试而不是src.如何从两个源文件夹进行构建并将输出转到一个输出文件夹?

小智 5

您可以在Makefile中使用vpath/VPATH

.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
Run Code Online (Sandbox Code Playgroud)