私はテストのための小さなプロジェクトを持っており、テストするソリューションのさまざまな実装をリンクしたいと思います。メイクファイルの変数に依存するターゲット
だから、私はここでは、この
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回の実装に対して何度もテストを実行できます)、それほど快適ではありません。私は、オブジェクトファイルで毎回make
をI_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
に何らかのメカニズムがありますか?あるいは、私は異なるアプローチで同じ目標を達成することができますか?
はい、これは意味になり - シンプルで良い解決策を。 別のやり方で再リンクしたり、私のアプローチを受け入れることをお勧めしますか? 次の状況で再リンクする必要があります。 'make IMPL_O = i1.o'、' make IMPL_O = i2.o'、 'make IMPL_O = i1.o' - 3回目の呼び出しでmakeは変更を追跡せず、何も再構築されません。 –
単にファイルを削除してリメイクできない場合は、以前に 'md5sum'で行ったようなことが、パラメータが変更された場合に強制的にリメイクするのに使用できます。 – tripleee
...同様に、コンパイルされた各アーティファクトに、埋め込まれた実装を反映する一意の名前を与えることもできます。 – tripleee