2017-10-24 6 views
1

私はGCCでコンパイルされた巨大なプロジェクトを持っています。 私が知っているのは、通常、実行前ビルドはすべてではなく、最新の依存関係ですが、変更されたファイルの一部が再構築されていないということが分かります。 .h makeファイルの階層があり、メインのmakeファイルには、必要に応じて必要なmakeファイルが含まれています。 には、最近変更された.hファイルを "#include"するファイルの再構築を保証する方法がありますか?自動再構築依存関係(メイクファイル)

+0

各ターゲットが依存するファイルのmakefileを宣言します。ツールによっては、そのような依存関係リストを自動的に作成することができます。 –

+1

makefileには、再構築を決定するためにファイルをチェックするルールがあります。通常これにはソースファイルのみが含まれます。 .Hファイルをルールセットに追加するだけです。 – Devolus

+0

[Auto-Dependency Generation](http://make.mad-scientist.net/papers/advanced-auto- dependency-generation/) –

答えて

1

ヘッダーファイルが前提条件に正しくリストされていることを確認する必要があります。大規模なプロジェクトでは、これを手作業で行うことは不可能ですが、gcc(またはclang)とGNU Makeを組み合わせると、それを自動化する強力な方法が得られます。

gccによって生成された追加の前提条件を追加するファイルをインクルードするようにしてください

CC := gcc 
CFLAGS := -std=c11 -Wall -Wextra -pedantic 
OBJS := main.o module.o 

all: program 

program: $(OBJS) 
    $(CC) [email protected] $^ 

%.o: %.c 
    $(CC) -c $(CFLAGS) [email protected] $< 

clean: 
    rm -f *.o 

.PHONY: all clean 

は、その後、あなたがGNUのMakefileの機能の自動リメイクを使用することができます。

あなたはかなり標準のMakefile用いたパターンルールを持っていると仮定すると、

CC := gcc 
CFLAGS := -std=c11 -Wall -Wextra -pedantic 
OBJS := main.o module.o 

all: program 

program: $(OBJS) 
    $(CC) [email protected] $^ 

# rule to create "dependency files", make the dependency file itself 
# depend on the same prerequisites 
%.d: %.c 
    $(CC) -MM -MT"[email protected] $(@:.d=.o)" [email protected] $(CFLAGS) $< 

# include dependency files except for targets not building anything 
ifneq ($(filter-out clean,$(MAKECMDGOALS)),) 
-include $(OBJS:.o=.d) 
endif 

# add Makefiles themselves to prerequisites here (with a changed Makefile, 
# the only safe thing is to rebuild all): 
%.o: %.c Makefile 
    $(CC) -c $(CFLAGS) [email protected] $< 

# remove dependency files on clean 
clean: 
    rm -f *.o *.d 

.PHONY: all clean 

これは単なる例であり、これらの機能をどのように使用するかについてはさまざまな可能性があります。

+0

主な質問は、すべての.hファイルを独立して指定する必要があるか、またはソース(c)ファイルが十分である必要があるかどうかです。 – Itay

+0

MakeはCファイルを解析しません。すべての.hファイルは、依存関係として個別に指定する必要があります。フェリックスはコンパイラに手作業で行うのではなく、自動的にこれを行う方法を示しています。上記以外の方法(より良い、より良い、IMO)の方法については、http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/を読むこともできます。 – MadScientist

+0

@Itayあなたは私の答えとMadScientistsのコメントを理解していないか、あなたの質問を理解できません。 –

関連する問題