2009-10-21 13 views
7

を持つことができる私たちのメイクファイルは、このような静的なパターンルールの.cソースファイルをコンパイル:GNUのmakeでは、静的なパターンルールでの前提条件が異なるサフィックス

OBJECTS = foo.o bar.o baz.o 

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

私は.Cの1つを変更する必要がありますファイルをObjective-C .mファイルにコピーします。コンパイラの呼び出しは両方のソースタイプで同じですので、同じルールを使用して、より柔軟にするためにそれを微調整したいと思います。私はむしろOPTIONS変数を変更するのではなく、リンクステップなどにも使用されているからです。

上記のルールを.cと.mの両方のファイルに対応できるように柔軟にする方法はありますか?

おかげ

答えて

1

は本当にただ同じコンパイラへの呼び出しは、ちょうど幸せな機会である

$(OBJECTS): %.o: %.m 
    $(CC) $< $(C_OPTIONS) -c -o [email protected] 
+0

エラーが発生します。最初のインスタンスについては、 '%.m'ファイルは見つかりません(エラー!).2番目のファイルには'%.c'(別のエラー!)がありません。 –

+0

Sorryは、 cファイルを作成すると、%.cルールが呼び出されません – Mark

-1

にコピーされていません。通常、objective-cコードは$(CC)でコンパイルしません。それはちょっと変わった感じです。

しかし、あなたは厳しいやり方をしているので、目標のCターゲットとCターゲットを別々の2つの異なる$(OBJECTS)という変数に分けて、2つのルールを作るdo-it-rightソリューションを投稿しません。本当にやらなければならない)。あまりにもつまらないです。代わりに、ハックを取る!

OBJC_FILES:=$(subst $(wildcard *.m)) 

real_name = `(test -h $(1) && readlink $(1)) || echo $(1)` 

$(OBJECTS): %.o: %.c 
    $(GCC) $< $(C_OPTIONS) -c -o $(call real_name,[email protected]) 

$(OBJC_FILES): %.c: %.m 
    ln -s $< [email protected] 

そして神はそれを維持する人々を助けます!

Btw、これは明らかにあなたのmファイルが生成されても動作しません。

7

私たちは、このどちらかの動作を動作のリストに追加することができます。簡単に行うことができるはずですが、そうではありません。ここでは、 "eval"を使ってオブジェクトごとに別々のルールを作成する方法があります。

 
define RULE_template 
$(1): $(wildcard $(basename $(1)).[cm]) 
endef 

OBJECTS = foo.o bar.o baz.o 

$(foreach obj,$(OBJECTS),$(eval $(call RULE_template,$(obj)))) 

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

これは、Make(foo.cまたはfoo.mではなく両方)を実行する前に既に存在するソースファイルによって異なります。同じ手順でこれらのソースを生成している場合、これは機能しません。

ここでは、があります。賢くなく頑丈な方法です。

 
CPP_OBJECTS = foo.o bar.o 
OBJECTIVE_OBJECTS = baz.o 
OBJECTS = $(CPP_OBJECTS) $(OBJECTIVE_OBJECTS) 

$(CPP_OBJECTS): %.o: %.c 

$(OBJECTIVE_OBJECTS): %.o: %.m 

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

EDIT:修正OBJECTS割り当て、ジョナサン・レフラーのおかげ。

+1

もっと堅牢なメソッドに同意します。しかし、OBJECTS =マクロは、RHS上でいくらかの$(...)を必要とします。 –

+0

Ack!あなたは正しい、私はもっと慎重にすべきだった。 – Beta

+0

最初のファイルfoo.oのみが生成されています(2番目のファイル)。何が問題なの? – BogdanSikach

関連する問題