次のMakefileを検討してください。
CC = g++
CFLAGS = -c -O -Wall
EFLAGS = -O -Wall -lm -o
UTILITIES = error.o stream_manip.o mat_ops.o GaussElim.o
UTILITIES += abstractmatrix.o dvector.o dmatrix.o ConjGrad.o
# All objects
%.o: %.cpp %.hpp
$(CC) $(CFLAGS) $<
# Executables (doesn't have extension)
% : %.cpp $(UTILITIES)
$(CC) $(EFLAGS) % $< $(UTILITIES)
# Specific executable
#TS_CG : TS_CG.cpp $(UTILITIES)
#$(CC) $(EFLAGS) $@ $@.cpp $(UTILITIES)
(実行可能ファイルの)match-anythingルールにより、端末に次のように入力できるようになります。
make TS_CG
TS_CGという実行可能ファイルをコンパイルします。ただし、make
すべて一致するターゲットは使用しません。代わりに、デフォルトのコンパイルルールを使用します。
一方、UTILITIESにリストされているすべてのオブジェクトが存在する場合は、すべて一致するターゲットを使用します。したがって、マッチングは前提条件の存在に依存しているようです。
どうやら:
ルールがターミナルの場合、その前提条件が実際に存在しない限り、ルールは適用されません。
( マニュアル作成による)。しかし、私のルールは終末ではありません。二重コロンでマークされていません!
では、なぜこれがまだ当てはまるように見えるのでしょうか?
また、ファイルで実行しようとしたように、オブジェクトターゲットと実行可能ターゲットを区別するためのより良い解決策があるかどうかを尋ねる場合もあります。