2

プロジェクトを希望どおりにビルドするためのメイクファイルの設計方法を理解するのに苦労しています。具体的には、プロジェクトのルートにあるリンクされた実行可能ファイルを除いて、srcすべてのバイナリをディレクトリに配置しながら、すべてのソースファイルをディレクトリに保持する方法を理解できません。bin

これは私のメイクファイルです:

# Compiler options
FC          :=  mpif90
FFLAGS      :=  -O3 -g -Wall -Warray-bounds -ffixed-line-length-none -fbounds-check 
VPATH       :=  src
BINDIR      :=  bin

# Define file extensions
.SUFFIXES:
.SUFFIXES: .f .o .mod 

# All modules
OBJS        :=  $(BINDIR)/ratecoeffs.o $(BINDIR)/interpolation.o $(BINDIR)/io.o $(BINDIR)/eedf.o $(BINDIR)/single_particle.o $(BINDIR)/physics.o $(BINDIR)/random.o $(BINDIR)/mpi.o $(BINDIR)/precision.o $(BINDIR)/populations.o 

# Build rules
all: runner | $(BINDIR)

$(BINDIR):
    mkdir -p $(BINDIR)

$(BINDIR)/%.o: $(VPATH)/%.f | $(BINDIR)
    $(FC) $(FFLAGS) -c $^ -o $@

runner: $(OBJS)

clean:
    @rm -rf $(BINDIR)

実行makeすると、すべてが正常にビルドされます - すべてのソース ファイルが検索されsrc、すべての.oファイルが配置されますが、コンパイラによって生成されるbinモジュール ファイル ( ) は、ディレクトリ.modではなくプロジェクト ルートに配置されます。binそれらをそこに配置するルールを指定するだけでよいことに気づきましたが、それはビルド順序を台無しにし、ビルドを壊すことがあります。

この動作を取得する「正しい」方法は何ですか?

はい、autotools と automake を見てきましたが、これまで使用したことがなく、このプロジェクトではやり過ぎのようです。それらがどのように機能するかについての良いチュートリアルを見つけることができなかったので (いいえ、私はgnu.org のチュートリアルが好きではありませんでした)、このツールを機能させるためだけにこのツールを学ぶ必要がないようにしたいと思います...

4

2 に答える 2

1

基礎となる Fortran コンパイラが gfortran であると仮定して、-J コマンド ライン オプションを使用します。

$(FC) $(FFLAGS) -c $^ -o $@ -J$(BINDIR)

将来を見据えて、BINDIR の代わりに使用する MODDIR または同様の変数を作成する方がよい場合があります。オブジェクト コード (*.o) と mod ファイルは、後のコンパイルとリンクのステップで異なる役割を果たします。大規模なプロジェクトでは、しばしば別々に保管されます。

于 2013-05-17T02:47:57.540 に答える