2016-04-29 7 views
0

は、私はこのようなソースファイルのリストを持っていると言う:GNUMakeでターゲット依存の前提条件をどのように指定するのですか?

SOURCE=aaa.src bbb.src ccc.src 

私はの名前はsoruceファイルに依存し、独自のフォルダにそれぞれ対応するターゲットを構築するためのルールを作成します。

SOURCEFILE ---->対応する出力ファイル/ターゲット


aaa.src -------------------> AAA/AAA bbb.src

の.out -------------------> BBB/ccc.src

bbb.out --------- ----------> ccc/ccc.out

私はGNUMakeを使ってこのためのルールを書いていますか?ここでの問題は、すべてのソース(すなわち.srcファイル)が代わりに同じを持っているただ一つの、(すなわち.outファイル)いずれかのターゲットがに依存していること、である

.PHONY: all clean 

CC=somecompiler 

SOURCE := aaa.src bbb.src ccc.src 
RTARGS := $(SOURCE:%.src=%.out) 
TDIRS := $(addsuffix /,$(basename $(SOURCE))) 
TARGS := $(join $(TDIRS), $(RTARGS)) 

all:$(TARGS) 

%.out: $(SOURCE)  # Better source specification? 
    @[ ! -d "$(dir $*)" ] && mkdir "$(dir $*)" 
    $(CC) "$(patsubst %/,%,$(dir $*)).src" "[email protected]" 

clean: 
    rm -f $(TARGS) 
    rmdir --ignore-fail-on-non-empty $(TDIRS) 

:私の最善の努力には、以下のMakefileましたベースネーム。私はコメント行を%.out: %.srcに変更できますが、ソースファイルは出力ファイルと同じディレクトリになければなりません。

%.out: %.src 
    $(CC) "$>" -o "$*/[email protected]" 

しかし、makeは、すでに存在するかどうかに関係なく、常にすべてのターゲットをコンパイルします。

適切なソースファイルのみを使用するようにmakeを取得するにはどうすればよいですか。 ジェネリックルールで各ターゲットの依存関係を個別に指定する適切な方法は何ですか?

答えて

1
GNUで

あなたはレシピとは別に前提条件を指定して、まだすべての.outファイル用の汎用/パターンルールを持つことができ行います

.PHONY: all clean 

all : 

SOURCES := aaa.src bbb.src ccc.src 
OUTPUTS := $(foreach src,${SOURCES},$(basename ${src})/${src:%.src=%.out}) 

# Build dependencies in the form of x/x.out : x.src | x 
define ESTABLISH_DEPENDENCY = 
$(basename ${1})/${1:%.src=%.out} : ${1} | $(basename ${1}) # Also depend on the output directory. 
$(basename ${1}) : # Rule to create the output directory. 
    mkdir [email protected] 
endef 

$(foreach src,${SOURCES},$(eval $(call ESTABLISH_DEPENDENCY,${src}))) 

all : ${OUTPUTS} 

# Generice rule for all .out files. 
%.out : 
    @echo "build [email protected] from $^" 
    touch [email protected] 

%.src : # For debugging only. 
    touch [email protected] 

.PHONY: all 

出力:それは、より効率的であることを

$ make 
touch aaa.src 
mkdir aaa 
build aaa/aaa.out from aaa.src 
touch aaa/aaa.out 
touch bbb.src 
mkdir bbb 
build bbb/bbb.out from bbb.src 
touch bbb/bbb.out 
touch ccc.src 
mkdir ccc 
build ccc/ccc.out from ccc.src 
touch ccc/ccc.out 

注意ディレクトリの存在を最初にチェックするよりも、ディレクトリに依存しないディレクトリを作成して作成することができます。

+0

これは基本的に 'ESTABLISH_DEPENDENCY'と呼ばれ、依存関係を指定するだけの空のルールと、ディレクトリを作成する別のルールを作成するものです。私は正しい?いずれにせよ、これはかなり上手です。ありがとうございました! –

+0

@ con-f-use右。ペタンティックであるためには、依存関係のみを作成し、 '.out'のルールは作成しません。ディレクトリのルール –

+0

もう一度ありがとうございます。私の編集を無視してください。私は 'all:'が既に3行目の右にあったことを見落としました。 –

関連する問題