1

タイトルが意味をなさないかどうかわからないので、少し詳しく説明します。

gcc の自動依存リスト ジェネレーターを使用するこの makefile をいじっています。

同時に、ソース、ヘッダー、およびリソースを分離する、適切にソートされたディレクトリ構造を維持したいと考えました。

レイアウトはこのようにシンプルでいいですね

  • 主要
    • ソース
    • 含む
    • オブジェクト
    • 依存関係

これで、makefile 依存関係リスト ジェネレーター atm は次のようになります。

$(DEP_PATH)%.d : $(SRC_PATH)%.c
    @${CC} $(CFLAGS) -MM -c $(INCLUDE) $< > $(DEP_PATH)$*.d
include $@

ここでの考え方は、依存関係ルールを生成し、それを make ビルドに含めるというものです。

そして、たとえば foo1.o の結果は次のとおりです。

foo1.o: src/foo1.c include/foo1.h include/foo2.h include/foo3.h

すべてのオブジェクトがメイン ディレクトリにあるようにラベル付けした場合、これはうまく機能しますが、代わりに /main/objects にあるため、make は /main/objects/foo1 のルールが見つからないと言っています。 o

今、私はこれを試しました:

@echo "$(OBJ_PATH)" > $(DEP_PATH)$*.d
@${CC} $(CFLAGS) -MM -c $(INCLUDE) $< >> $(DEP_PATH)$*.d

> はオブジェクトパスを新しい/上書きされたファイルにフィードし、GCC 自動依存ルールの生成をそれに連結します...しかし、2 つのセットの間に改行を追加します。

上記の情報を含む2つの個別のファイルをcat'ingしようとしました...しかし、改行も取得します。

改行を追加せずに依存関係ファイルを追加する良い方法はありますか?

また、makefile、cat、および echo に関する本当に優れたチュートリアルがあれば、本当に感謝します。

すべての応答に感謝します。

4

2 に答える 2

3

あなたが尋ねた質問への答えは次のsedとおりです。

@${CC} blah blah blah | sed 's|^|$(OBJ_PATH)|' > $(DEP_PATH)$*.d

しかし、この部分では別の問題が発生します。

include $@

includeディレクティブは Make 自体に対するものであり、シェル コマンド (のようなもの)ではありません$(CC)...。And$@はルール内で定義された自動変数であり、ルール外のディレクティブでは使用できません。代わりに、次のようにしてみてください。

include $(DEP_PATH)/*.d

Advanced Auto-Dependency Generation をご覧ください。

于 2010-07-27T16:47:38.703 に答える
0

代替案、おそらくより良いものがあると思いますが、問題の解決策を見つけたと思います。

エコーを tr にパイプして、改行を削除できます。したがって、結果のコードは次のとおりです。

$(DEP_PATH)%.d : $(SRC_PATH)%.c
    @echo "$(OBJ_PATH)" | tr -d '\n' > $(DEP_PATH)$*.d
    @${CC} $(CFLAGS) -MM -c $(INCLUDE) $< >> $(DEP_PATH)$*.d
cat $@
include $@

これで次のことができます...

1) 各 .d について、.c が存在し、最新であることを確認します。

2)オブジェクト パスをエコー| (パイプ)改行を削除する tr に変換し、>結果を .d ファイルに上書き/作成します。

3) $(CC) に依存関係リストを生成させる... 残念ながら、オブジェクト ファイルの意図した場所が除外されます (これが 1 ~ 2 行が存在する理由です)。

4)結果のファイルをターミナルに連結するだけです(必要ありませんが、これが機能するのを見るのが好きです!)

5) 結果の依存関係リストをビルドに含めます。

後続の実行で注目に値するはずです...私はこれを一番上にリストしています:

all: $(MAIN)
-include $(DEP)

これにより、メインの実行可能ファイルがチェックされ、依存関係ファイルが作成されている場合は含まれます。( - は、ファイルがまだ作成されていない場合にエラーを無視するためにここにあります...最初からの私のスニペットが後で実行されるので、これは問題ありません。)

繰り返しになりますが、提案や建設的な批判は大歓迎です。

于 2010-07-27T16:53:21.600 に答える