2017-05-09 15 views
0

私はテストのための小さなプロジェクトを持っており、テストするソリューションのさまざまな実装をリンクしたいと思います。メイクファイルの変数に依存するターゲット

だから、私はここでは、この

CC=g++ 
FLAGS=-Wall -O2 
CFLAGS=-c $(FLAGS) 
I_PATH=implementation1.cpp 

all: instance 

instance: instance.cpp .implementation.o 
    $(CC) $(FLAGS) instance.cpp .implementation.o -o [email protected] 

.implementation.o: $(I_PATH) 
    $(CC) $(CFLAGS) $(I_PATH) -o [email protected] 

clean: 
    -rm .implementation* 
    -rm instance 

のように見えるメイクファイルを作成し、I_PATHは、ソリューションの実装へのパスです。コマンドライン引数で別の実装を渡す別のソリューションをテストしたい:make I_PATH=implementation2.cpp

しかし、すべての私の実装が同じオブジェクトファイル.implementation.oにコンパイルされているため、makeは何かが変更されたことを理解できず、プロジェクトを再構築しません。

具体的な実装ではmakeを実行する前にmake cleanと呼ぶことができます。しかし、これはビルド時間を増やす(私は1回の実装に対して何度もテストを実行できます)、それほど快適ではありません。私は、オブジェクトファイルで毎回makeI_PATH依存オブジェクトファイル(実装へのパスのハッシュを取る)と、さらに力の再リンクinstance.cppを作成ここで

CC=g++ 
FLAGS=-Wall -O2 
CFLAGS=-c $(FLAGS) 
I_PATH=implementation1.cpp 
C_PATH := $(shell echo -n $(I_PATH) | md5sum | awk '{print ".implementation_" substr($$1, 0, 10) ".o";}') 

all: force instance 

force_relink: 
    touch -c $(C_PATH) 

instance: instance.cpp $(C_PATH) 
    $(CC) $(FLAGS) instance.cpp $(C_PATH) -o [email protected] 

$(C_PATH): $(I_PATH) 
    $(CC) $(CFLAGS) $< -o [email protected] 

clean: 
    -rm .implementation* 
    -rm instance 

私はこのような何かにこのメイクファイルを修正することができます走る

でも、この現象を修正するには、makeに何らかのメカニズムがありますか?あるいは、私は異なるアプローチで同じ目標を達成することができますか?

答えて

1

コンパイルされた各ファイルに別の名前を付けるのは意味がありません。コンパイルした.oファイルにリンクするだけですか?

instance: instance.cpp $(IMPL_O) 
    $(CC) $(FLAGS) $^ -o [email protected] # propably no need to override default rule 

ご質問の例を生成するには、make IMPL_O=implementation2.oを使用してください。

このように、各ファイルの名前は本当にそのIDを明らかにするため、明示的に何かを追跡する必要はありません。

(あなただけIMPL=implementation2または何を言うことができるので、明らかに、あなたはMakefileの自体に.o拡張子をリファクタリングできます。)

+0

はい、これは意味になり - シンプルで良い解決策を。 別のやり方で再リンクしたり、私のアプローチを受け入れることをお勧めしますか? 次の状況で再リンクする必要があります。 'make IMPL_O = i1.o'、' make IMPL_O = i2.o'、 'make IMPL_O = i1.o' - 3回目の呼び出しでmakeは変更を追跡せず、何も再構築されません。 –

+0

単にファイルを削除してリメイクできない場合は、以前に 'md5sum'で行ったようなことが、パラメータが変更された場合に強制的にリメイクするのに使用できます。 – tripleee

+0

...同様に、コンパイルされた各アーティファクトに、埋め込まれた実装を反映する一意の名前を与えることもできます。 – tripleee

関連する問題