2016-08-27 8 views
2

は私が持っていると言う:前提条件のリストとMakeのターゲットのリストを関連付けるには?

TARGETS = a.o b.o c.o 
SOURCES = F1/a.c F2/F3/b.c c.c 

私が取得したい:

a.o: F1/a.c 
    gcc $< -c 
b.o: F2/F3/b.c 
    gcc $< -c 
c.o: c.c 
    gcc $< -c 

私は仕事をするためのコンパクトな表現をしたいと思います、のようなもの:あなたはVPATHを使用することができ

$(TARGETS): $(SOURCES) 
    #Appropriate compile command 

答えて

2

ソースディレクトリについてmakeに伝え、単純なパターンルールを使用します:

TARGETS := a.o b.o c.o 
VPATH := F1:F2/F3 # Use ; instead of : on Windows 

%.o: %.c 
    $(CC) -c $< -o [email protected] 

(あるいは暗黙のルールが、この場合には正常に動作します作る、完全にルールを省略)

しかし、あなたは「(それを仕事に行くのではないです異なるパスで同じように命名されたファイルを持っている場合最初に見つけたものを選んでください)。

TARGETS := a.o b.o c.o 
SOURCES := F1/a.c F2/F3/b.c c.c 

$(TARGETS): 
    $(CC) -c $< -o [email protected] 

list-rem = $(wordlist 2,$(words $1),$1) 
pairmap = $(and $(strip $2),$(strip $3),$(call \ 
     $1,$(firstword $2),$(firstword $3))$(call \ 
     pairmap,$1,$(call list-rem,$2),$(call list-rem,$3))) 
gen-prereq = $(eval $1: $2) 

$(call pairmap,gen-prereq,$(TARGETS),$(SOURCES)) 

を、私はその前提条件をコンパイル明示的なルールを定義したが、私はそれをすべての前提条件を与えていない:これは、あなたが尋ねたようにリストをビュンによって動作します。次に、関数名と2つのリストを取り、要素の各ペアの関数を呼び出すpairmapを定義しました。これは再帰的で、list-remの助けを借りて、最初の要素をリストから削除します。 gen-prereqは、最初の引数で指定されたターゲットの前提条件として第2引数を設定します。それ以来残っているのはgen-prereqを超えてpairmapを呼び出し、ターゲットを最初のリストとして、ソースを2番目のリストとして渡します。

別の実現可能と簡単な方法は次のとおりです(前提条件)、それらの間で:と一緒に、ターゲットとソースに参加し、それぞれをeval'ingことによって動作

TARGETS := a.o b.o c.o 
SOURCES := F1/a.c F2/F3/b.c c.c 

$(TARGETS): 
    gcc -c $< -o [email protected] 

$(foreach x,$(join $(addsuffix :,$(TARGETS)),$(SOURCES)),$(eval $x)) 

+0

最初の例は正常に機能しました。ありがとうございます。 – user3228136

+0

@ user3228136共通名(dir1/a.cやdir2/a.cなど)がある場合は、それが爆発することに注意してください。 –

関連する問題