ソースディレクトリについて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))
。
最初の例は正常に機能しました。ありがとうございます。 – user3228136
@ user3228136共通名(dir1/a.cやdir2/a.cなど)がある場合は、それが爆発することに注意してください。 –