7

この make ファイルは、次のような静的パターン ルールを使用して .c ソース ファイルをコンパイルします。

OBJECTS = foo.o bar.o baz.o

$(OBJECTS): %.o: %.c
    $(CC) $< $(C_OPTIONS) -c -o $@

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

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

ありがとう

4

3 に答える 3

7

Make が簡単にできるはずのことのリストに、このどちらか一方の動作を追加できますが、そうではありません。「eval」を使用して各オブジェクトに個別のルールを作成する方法は次のとおりです。

RULE_template を定義する
$(1): $(ワイルドカード $(basename $(1)).[cm])
エンデフ

OBJECTS = foo.o bar.o baz.o

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

$(オブジェクト):
    $(CC) $< $(C_OPTIONS) -c -o $@

これは、Make を実行する前に既に存在しているソース ファイル (foo.c または foo.m、ただし両方ではない) に依存することに注意してください。これらのソースを同じステップで生成している場合、これは機能しません。

これは、それほど巧妙ではありませんが、より堅牢な方法です。

CPP_OBJECTS = foo.o バー.o
OBJECTIVE_OBJECTS = baz.o
オブジェクト = $(CPP_OBJECTS) $(OBJECTIVE_OBJECTS)

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

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

$(オブジェクト):
    $(CC) $< $(C_OPTIONS) -c -o $@

編集: Jonathan Leffler のおかげで、OBJECTS の割り当てが修正されました。

于 2009-10-22T17:55:41.933 に答える
1

単にコピーするだけではありません

$(OBJECTS): %.o: %.m
  $(CC) $< $(C_OPTIONS) -c -o $@
于 2009-10-21T21:26:12.833 に答える
-1

同じコンパイラへの呼び出しは、ちょうど良い機会です。通常は、objective-c コードを でコンパイルしません$(CC)。それはただ奇妙に感じます。

$(OBJECTS)しかし、あなたは厳しいやり方をしているので、目的の C ターゲットを C ターゲットから 2 つの異なる変数に分け、2 つのルールを作成するという正しい解決策は投稿しません(これは実際に行う必要があります)。あまりにもつまらないです。代わりに、ハックしてください!

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,$@)

$(OBJC_FILES): %.c: %.m
  ln -s $< $@

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

ところで、m-ファイルが生成されている場合、これは明らかに機能しません。

于 2009-10-21T21:28:56.493 に答える