2014-05-19 114 views
0

以下makefile是一個示例。我正在嘗試使用已定義的宏來生成構建目標的規則。
我得到的是Makefile宏生成規則

make: *** No rule to make target `../x86_64/lib-reloc-debug/libstats.tar', needed by `all'. Stop. 

sources=$(wildcard $1/*.cpp) 
MODE_SUFFIX=-debug 
M=../x86_64/lib$(MODE_SUFFIX) 
L=../x86_64/lib-reloc$(MODE_SUFFIX) 
dir_c_objects=$(patsubst %.c,%.o,$(wildcard $1/*.c)) 
dir_cpp_objects=$(patsubst %.cpp,%.o,$(wildcard $1/*.cpp)) 
dir_objects=$(filter-out $1/test%, $(call dir_c_objects, $1) $(call dir_cpp_objects, $1)) 
dir_objects_with_tests=$(call dir_c_objects, $1) $(call dir_cpp_objects, $1) 
libobjdir=$(subst lib,obj,$(dir $1)) 
l_prefix=$(foreach file,$(1),$(addprefix $L/, $(file)))) 
TRACE=$(if $(VERBOSE),,@) 
define my_make_archive 
    $(eval name:=$(strip $1)) 
    $(eval reqs:=$2) 
    $(eval L_sources:=$(call sources, $(name))) 
    $(eval objects:=$(call dir_objects, $(name))) 
    $(eval L_objects:=$(foreach file,$(objects),$(addprefix $L/, $(file)))) 
    $(eval M_objects:=$(foreach file,$(objects),$(addprefix $M/, $(file)))) 
    $(eval L_reqs:=$(foreach file,$(reqs),$(addprefix $L/, $(file)))) 
    $(eval M_reqs:=$(foreach file,$(reqs),$(addprefix $M/, $(file)))) 
    $L/lib$(name).tar: $$(L_sources) $(L_reqs) 
     tar xvf $L/lib$(name).tar: $(L_sources) $(L_reqs) 
endef 

$(call my_make_archive, stats,) 

all: $L/libstats.tar 
    echo foo 

我無法找到使用定義生成規則中的任何很好的例子。

+0

不確定,但在Makefile中看到'$ 1'看起來很奇怪。 '1'是什麼意思? –

+0

你認爲'2美元'是什麼?你似乎只用一個參數調用'my_make_archive'。 – Beta

+0

@Didier:$ 1 $ 2是宏的參數(定義) – dbbd

回答

1

你讓這太複雜了,你的編碼在你測試之前就已經出來了。試試這個:

define my_make_archive 
name:=$(strip $1) 
reqs:=$(2) 
L_sources:=$(name).cpp 
L_reqs=$$(addprefix $$L/,$$(reqs)) 

$(L)/lib$(name).tar: $$(L_sources) $$(L_reqs) 
    tar xvf [email protected] $$^ 

endef 

all: $L/libstats.tar 
    echo foo 

$(eval $(call my_make_archive, stats))