2

バイナリは obj に依存し、obj は .c ファイル (C プロジェクトを想定) に依存することがわかっています。たとえば、env.mk ファイルがあるとします。このファイルには、「export NO_DISPLAY=YES」のようなフラグがあります。メインの Makefile には、次のものがあります。

ifeq ($(NO_DISPLAY),YES)
CFLAGS += -D__DISPLAY_DISABLE
endif

明らかに、env.mk はメインの make ファイルに含まれています。いつでも、フラグ値「NO_DISPLAY」を変更します。メイクファイルが実行可能ファイルを再構築することはありません。ただし、.o ファイルが削除された場合も同じように機能します。その背後にある理由は、.c、.h ファイルに依存していることを理解しています。.c .h ファイルは変更されないため、makefile は無視して再構築します。ただし、CFLAGS の値が変更された場合は、makefile にコードを再構築してもらいたいと考えています。どうすればいいですか?オブジェクトを削除して再構築したくないことに注意してください。

target_dbg: $(patsubst ./src/%.c,./obj_dbg/%.o,$(wildcard ./src/*.c)) 
    @echo "Target main rule__dbg $(NPROCS)"
    $(CC) $(patsubst ./src/%.c,./obj_dbg/%.o,$(wildcard ./src/*.c)) $(LIBS) -o gif_dbg 

./obj_dbg/%.o: ./src/%.c ./include/*.h 
    @echo "I am called first..dbg"
    @mkdir -p ./obj_dbg
    #$(CC) $(CFLAGS) -E $<
    $(CC) $(CFLAGS) $(LDFLAGS) -DDEBUG -c $< -o $@

どんな助けでも大歓迎です。

4

2 に答える 2

2

Make は、ファイルのタイムスタンプを調べるだけで機能します。すべてのビルド アーティファクトが自分に依存することはほとんどMakefileありません (少なくとも積極的に開発している間はそうではありません) が、Make にこの依存関係を真剣に処理させたい場合は、CFLAGS定義をセカンダリ ファイルbuildflags.mkに入れ、メインからインクルードし、Makefileすべてをオブジェクトにすることができます。ファイルは に依存しbuildflags.mkます。

ただし、実際にこれを実際に行う人はほとんどいないと思います。確実にクリーン ビルドを取得する唯一の方法が、すべてをフラッシュして最初からやり直すことである状況が常に存在します。適切で最新のrealcleanおよび/またはdistcleanターゲットがあることを確認し、ビルド インフラストラクチャに根本的な変更を加えるときにそれらを使用することを忘れないでください。完全に白紙の状態からビルドを開始する毎晩のビルド ジョブ (または類似のジョブ) を持つこと (たとえば、新しいコピーを一時ディレクトリにチェックアウトすることによって) も明らかに良い考えです。

--help代わりに、または追加で、各オブジェクト ファイルにビルド フラグのコピーを静的な文字列として含めることで、オプションなどを使用して後で確認できます。

于 2013-08-31T13:13:05.030 に答える