[解決済み] 変更されたヘッダーファイルを含むソースファイルをMakefileが自動的にリビルドするにはどうしたらいいですか?(C/C++の場合)
質問
私は以下のmakefileを持っていて、私が作業しているプログラム(実際にはカーネル)を構築するために使用しています。それはゼロからであり、私はそのプロセスについて学んでいるので、完璧ではありませんが、私のメイクファイルを書く経験のレベルでは、この時点で十分に強力であると思います。
AS = nasm
CC = gcc
LD = ld
TARGET = core
BUILD = build
SOURCES = source
INCLUDE = include
ASM = assembly
VPATH = $(SOURCES)
CFLAGS = -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
-nostdinc -fno-builtin -I $(INCLUDE)
ASFLAGS = -f elf
#CFILES = core.c consoleio.c system.c
CFILES = $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES = assembly/start.asm
SOBJS = $(SFILES:.asm=.o)
COBJS = $(CFILES:.c=.o)
OBJS = $(SOBJS) $(COBJS)
build : $(TARGET).img
$(TARGET).img : $(TARGET).elf
c:/python26/python.exe concat.py stage1 stage2 pad.bin core.elf floppy.img
$(TARGET).elf : $(OBJS)
$(LD) -T link.ld -o $@ $^
$(SOBJS) : $(SFILES)
$(AS) $(ASFLAGS) $< -o $@
%.o: %.c
@echo Compiling $<...
$(CC) $(CFLAGS) -c -o $@ $<
#Clean Script - Should clear out all .o files everywhere and all that.
clean:
-del *.img
-del *.o
-del assembly\*.o
-del core.elf
この makefile の主な問題は、1 つ以上の C ファイルがインクルードしているヘッダファイルを変更したときに、C ファイルが再構築されないということです。私は、すべてのヘッダー ファイルをすべての C ファイルの依存関係にすることによって、非常に簡単にこれを修正できますが、それは事実上、私がヘッダー ファイルを変更または追加するたびに、プロジェクトの完全な再構築を引き起こし、それは非常に優雅なことではありません。
私が望んでいるのは、C ファイルが を含む を含む C ファイルのみを再構築し、プロジェクト全体をリンクし直したいのです。私はすべてのヘッダー ファイルをターゲットの依存関係にすることによってリンクを行うことができますが、それらの含まれるヘッダー ファイルがより新しいとき C ファイルが無効になるようにする方法を見つけ出すことができません。
GCC にはこれを可能にするいくつかのコマンドがあると聞いたことがあります (どのファイルが再構築される必要があるかを makefile がどうにかして把握できるように) が、見るべき実際の実装例をどうしても見つけることができません。誰かがmakefileでこの動作を可能にする解決策を投稿することができますか?
EDIT: 明確にすべきですが、私は個々のターゲットを入れて、各 target.o にヘッダーファイルを要求させるという概念に精通しています。それは、私がどこかにヘッダー ファイルを含めるたびに makefile を編集することを必要とし、それは少し苦痛です。私は、他のプロジェクトで見たことがあると確信している、それ自体でヘッダーファイルの依存性を導き出すことができるソリューションを探しています。
どのように解決するのですか?
このサイトの他の場所ですでに指摘されているように、このページを参照してください。 依存関係の自動生成
簡単に言うと、gcc は依存関係ファイルである .d を自動的に作成することができます。これは、コンパイルした .c ファイルの依存関係を含むミニメイクファイルの断片です。 .c ファイルを変更してコンパイルするたびに、.d ファイルは更新されます。
gccに-Mフラグを追加する以外に、.dファイルをmakefileに含める必要があります(クリスが上で書いたように)。 このページには、sed を使用して解決されるより複雑な問題がいくつかありますが、それらを無視して、もはや存在しないヘッダー ファイルを構築できないことについて make が文句を言うたびに、.d ファイルを片付けるために "make clean" を実行することができます。
関連
-
[解決済み] gcc/g++とcc1/cc1plusの違いは何ですか?
-
[解決済み] シュール vs サール ... x86 アセンブリ gnu
-
[解決済み] シグナル11[SIGSEGV]のデフォルトアクションでプロセスが終了しています。
-
C++コンパイルエラー:型に名前がない
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] ビルドターゲットの外にgccのデバッグシンボルを生成する方法は?
-
[解決済み] CMakeに新しいGCCのパスを指定する方法
-
[解決済み] ライブラリヘッダからのGCC警告を抑制する方法は?
-
[解決済み] Windows 7 マシンに gcc をインストールするには?
-
[解決済み] Makefile、ヘッダーの依存性
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] gcc エラー:間違った ELF クラスです。ELFCLASS64
-
[解決済み] シグナル11[SIGSEGV]のデフォルトアクションでプロセスが終了しています。
-
[解決済み] 静的にリンクされたライブラリでGCCのリンク時最適化を使用する
-
C++コンパイルエラー:型に名前がない
-
[解決済み] OSX 10.9にXcodeをインストール - clang: エラー: 入力ファイルがありません。
-
[解決済み] コンパイル時に127のエラーが発生する。
-
[解決済み] gcc/g++とcc1/cc1plusの違いは何ですか?
-
[解決済み】-Wl,-rpath -Wlがわかりません。
-
[解決済み] brew install gccは時間がかかりすぎる
-
[解決済み] Makefile、ヘッダーの依存性