我在理解如何设计我的 makefile 以按照我想要的方式构建我的项目时遇到了一些麻烦。具体来说,我不知道如何将所有源文件保存在一个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
的模块文件 ( ) 放在项目根目录中而不是目录中。我意识到我可以指定一个规则将它们放在那里,但这会与构建顺序混淆,并且有时会破坏 build。.mod
bin
获得这种行为的“正确”方法是什么?
是的,我看过 autotools 和 automake,但我以前从未使用过它们,而且对于这个项目来说,它们似乎有点矫枉过正。因为我找不到任何关于它们如何工作的好的教程(不,我不喜欢gnu.org 上的教程),我宁愿避免为了完成这项工作而不得不学习这个工具......