2011-01-13 129 views
1

這與Makefile有點相似,只是在Makefile command substitution problem中有一個不同的問題。消除Makefile中的重複問題

REBAR=./rebar 
REBAR_DEBUG=$(REBAR) -C rebar.debug.config 
REBAR_COMPILE=$(REBAR) get-deps compile 
LAST_CONFIG:=$(shell cat config.tmp) 
PLT=dialyzer/sqlite3.plt 

all: config_normal compile 

compile: 
    $(REBAR_COMPILE) 

test: 
    $(REBAR_COMPILE) eunit 

clean: 
    -rm -rf deps ebin priv doc/* .eunit c_src/*.o 

docs: 
    $(REBAR_COMPILE) doc 

static: config_debug 
    $(REBAR_DEBUG) get-deps compile 
ifeq ($(wildcard $(PLT)),) 
    dialyzer --build_plt --apps kernel stdlib erts --output_plt $(PLT) 
else 
    dialyzer --plt $(PLT) -r ebin 
endif 

cross_compile: config_cross 
    $(REBAR_COMPILE) -C rebar.cross_compile.config 

valgrind: clean 
    $(REBAR_DEBUG) get-deps compile 
    valgrind --tool=memcheck --leak-check=yes --num-callers=20 ./test.sh 

ifeq ($(LAST_CONFIG),normal) 
config_normal: 
    echo "$(LAST_CONFIG) == normal" 
else 
config_normal: clean 
    echo "$(LAST_CONFIG) != normal" 
    rm -f config.tmp 
    echo "normal" > config.tmp 
endif 

ifeq ($(LAST_CONFIG),debug) 
config_debug: ; 
else 
config_debug: clean 
    rm -f config.tmp 
    echo "debug" > config.tmp 
endif 

ifeq ($(LAST_CONFIG),cross) 
config_cross: ; 
else 
config_cross: clean 
    rm -f config.tmp 
    echo "cross" > config.tmp 
endif 

.PHONY: all compile test clean docs static valgrind config_normal config_debug config_cross 

我怎樣才能消除(或減少顯著)config_normalconfig_debugconfig_cross之間的重複?

回答

2

如果您使用的版本至少爲3.80 GNU的製作,你可以使用$(eval)從模板創建的規則,就像這樣:

define templ 
ifeq ($$(LAST_CONFIG),$(config)) 
config_$(config): 
     echo "$$(LAST_CONFIG) == $(config)" 
else 
config_$(config): 
     echo "$$(LAST_CONFIG) != $(config)" 
     rm -f config.tmp 
     echo "$(config)" > config.tmp 
endif 
endef 

$(foreach config,normal debug cross,$(eval $(templ)))