我在理解如何設計我的生成文件以按照我想要的方式構建我的項目時遇到了一些麻煩。具體來說,我不知道如何將所有源文件保存在src
目錄中,同時將所有二進制文件放在bin
目錄中,但鏈接的可執行文件(該文件位於項目根目錄中)除外。Makefile與Fortran - src和bin目錄
這是我的makefile:
# 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 [email protected]
runner: $(OBJS)
clean:
@rm -rf $(BINDIR)
運行make
好吧建立的一切 - 它發現在src
所有的源文件,並把在bin
所有.o
文件 - 而是由編譯器生成的模塊文件(.mod
)放在項目根目錄中,而不是在bin
目錄中。我意識到我可以指定一條規則將它們放置在那裏,但是that messes with the build order, and will sometimes break the build。
什麼是「正確」的方式來獲得這種行爲?
是的,我看過autotools和automake,但我從未使用過它們,它們似乎對這個項目過度。因爲我找不到任何好的教程他們如何工作(不,我不喜歡the tutorial on gnu.org)我寧願如果我可以避免學習這個工具只是爲了得到這個工作...
'-J'選項似乎正是我要找的!所有文件最終都在我想要的地方=)然而,構建失敗,因爲'gfortran'不知道在'bin /'中查找'.mod's。我如何指定他們在那裏? –
另外,關於創建'MODDIR' - 如果這個項目比較大,但它只有大約15個源文件(並且不會增長太多),所以一個目錄對我來說沒問題。 –
雖然這很奇怪 - 第一個文件可以正常工作;它沒有依賴關係。第二個取決於第一個,但建立好。第三個依賴於第一個和第二個,並失敗,因爲它無法找到第二個模塊中定義的幾個變量 - 但是文件在那裏,變量被定義(在源文件中正確指定,在mod文件中提到,雖然我不知道mod的格式,所以我不能說如果有什麼錯誤...)。 [這裏是mod文件](http://paste.ubuntu.com/5673502/) - 無法找到的符號是'rnk'和'nproc'。 –