Fortranソースコードから2つの異なるライブラリを構築しようとしています。 1つはOMPをサポートし、もう1つはサポートしません。したがって、同じソースの%.oファイルはコンパイラフラグによって異なります。ソースファイルを変更/再コンパイルするとき、arはライブラリを再構築するためにまだすべてのファイルを必要とします。すべてのソースファイルの再コンパイルを避けるために、変更されていないソースファイルのoファイルを2つの異なるディレクトリに保存したいと思います。 1 つは omp をサポートする o ファイルを含み、もう 1 つは omp をサポートしません。ライブラリの終わりにあるディレクトリにファイルを作成しなければなりません。
ただし、vpath変数の動作により、単一のコマンドでライブラリを再構築することはできません。 Make ファイルは次のようになります。
SRC :=
FORTRAN = ifort
OPTSSEQ = -mkl=sequential -DThreadUnSafe -warn nounused -warn declarations -O3 -DTIMEDETAIL
DRVOPTS = $(OPTS)
NOOPT =
LOADER = ifort
LOADOPTS =
kernel=$(shell uname -r)
ARCH = ar
ARCHFLAGS= cr
RANLIB = ranlib
LibName=Lib_LM_$(FORTRAN)_$(kernel)_1.0.a
.SUFFIXES:
.SUFFIXES: .f90 .o
include Moduls.mk
vpath %.f90 src/
vpath %.o NoOMP/
OBJS = $(patsubst %.f90,%.o,$(SRC))
$(LibName): $(OBJS)
$(ARCH) $(ARCHFLAGS) $@ $?
$(RANLIB) $@
%.o : %.f90
$(FORTRAN) $(OPTSSEQ) -c $? -o $(addprefix NoOMP/,$@)
clean:
-rm *.mod
-rm NoOMP/*.o
-rm *.smod
-rm $(LibName)
すべての%.f90ファイルがsrc /から読み取られ、すべての%.oファイルがNoOMP /に書き込まれるため、 "make clean"の後にすべての%.oファイルが正常に構築されます。ただし、%.oファイルの「NoOMP」プレフィックスが削除されたため、アーカイブの構築は失敗します。したがって、arは%.oファイルが見つからないと文句を言います。 「make」を再実行する場合にのみ、%.o ファイルに NoOMP プレフィックスがあるため、アーカイブが構築されます。最初からビルドする場合は、アーカイブビルドラインにプレフィックスコマンドを追加するとうまくいきます。ただし、単一のファイルのみが変更された場合、変更されていないファイルには「NoOMP / NoOMP /」プレフィックスが含まれ、別の中断が発生します。
これは非常に迷惑ですが、私がマニュアルを理解している限り、これはGNU makeの基本的な動作です。私が間違っている場合はmakefileを修正することができますが、正しい場合はどうすればこの問題を回避できますか?
答え1
解決済み
この例は、行を変更するときに機能します。
$(ARCH) $(ARCHFLAGS) $@ $?
到着
$(ARCH) $(ARCHFLAGS) $@ $(addprefix NoOMP/,$?)
上記ではこのソリューションを除外しましたが、$^
代わりに私の実験はそれに基づいていました$?
。最初は古いファイルと新しい%.oファイルからアーカイブ全体を再構築しますが、最後は新しい%.oファイルで既存のアーカイブのみを更新します。古い%.oファイルと新しい%.oファイルからアーカイブ全体を再構築すると、古い%.oファイルに誤った接頭辞があり、新しいファイルに正しい接頭辞があります。したがって、新しくコンパイルされた %.o ファイルでアーカイブを更新し、古い %.o ファイルを除外すると問題を回避できます。
乾杯