1

私は最近、CMUのOS設計コースでこれらのコード行を含むmakefileを閲覧しました。

$(TEST_PROGS) tests/verify_test: %: %.o libtraceback.a
    $(CC) -o $@ $@.o -L. libtraceback.a $(CFLAGS) $(LDFLAGS) $(LIBS) -static
    python ./symtabgen.py $@

ここで「%:」が何を意味するのかわかりません。TEST_PROGS変数には、リストtraceback / traceback_globals.o traceback/traceback.oが含まれています

libtraceback.aを作成するには、traceback / traceback_globals.o traceback/traceback.oが必要です。

%.oを削除して遊んでみました。そうすることで、TEST_PROGSオブジェクトのコンパイルが停止しました

%を削除しますが、%。oを保持すると、いくつかの警告が表示され、何もコンパイルされませんでした。

誰かがここでmakefileの構文に光を当てることができることを願っています。グーグルですばやく検索すると、%:は二次拡張に関連していることがわかりました。しかし、私が見ているこのコードでは、特別なターゲット.SECONDEXPANSIONは定義されていません。

助けてください、このコードは私の脳を傷つけます...

4

2 に答える 2

4

見るべき標準的な場所は、Makeマニュアルです。

とにかく、これは静的パターンルールの例です。ワイルドカードを使用して、各ターゲットと同様の名前の前提条件との間の関係を指定します。

于 2013-01-10T06:12:43.013 に答える
1

これは静的なパターンです。

これが意味することです:

ターゲットは、$(TEST_PROGS)またはtest/verify_testで記述されたファイルのいずれかです。

ターゲットを構築するために必要なのは、2番目の部分です:%。o libtraceback.a

%記号を置き換える文字列は、作成しようとしているファイルの名前とまったく同じです。

したがって、たとえば、make test / verify_testを実行すると、%が「test / verify_test」に設定され、test/verify_test.oとlibtraceback.aが必要になります。

于 2014-09-04T23:28:12.280 に答える