【发布时间】:2013-05-17 00:16:36
【问题描述】:
我在理解如何设计我的 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 - 但是由编译器生成的模块文件(.mod)被放入项目根目录而不是bin 目录。我意识到我可以指定一个规则将它们放在那里,但是that messes with the build order, and will sometimes break the build。
获得这种行为的“正确”方法是什么?
是的,我看过 autotools 和 automake,但我以前从未使用过它们,而且对于这个项目来说,它们似乎有点矫枉过正。因为我找不到任何关于它们如何工作的好教程(不,我不喜欢the tutorial on gnu.org),我希望我可以避免为了完成这项工作而学习这个工具......
【问题讨论】: