具有自动依赖项生成的Makefile
我正在阅读,同时试图为我的Fortran项目编写一个精简而通用的具有自动依赖项生成的Makefile,makefile,fortran,dependencies,gnu-make,Makefile,Fortran,Dependencies,Gnu Make,我正在阅读,同时试图为我的Fortran项目编写一个精简而通用的Makefile。我在下面的代码中迷失了方向 define make-depend $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -M $1 | \ $(SED) 's,\($$(notdir $2)\) *:,$$(dir $2) $3: ,' > $3.tmp $(MV) $3.tmp $3 endef %.o: %.c $(call make-depe
Makefile
。我在下面的代码中迷失了方向
define make-depend
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -M $1 | \
$(SED) 's,\($$(notdir $2)\) *:,$$(dir $2) $3: ,' > $3.tmp
$(MV) $3.tmp $3
endef
%.o: %.c
$(call make-depend,$<,$@,$(subst .o,.d,$@))
$(COMPILE.c) -o $@ $<
bash脚本
dep-gen.sh
从标准输入中获取一个文件.f90
文件,并将文件.o
文件所依赖的文件的空格分隔列表发送到标准输出。您知道编译器的-M
标志的作用吗?我在书中读到了它的作用.c
文件;几天前,我试图了解它是否可以用于生成Fortran文件的依赖项,但我在web上发现了一些关于此问题的线索,因此我坚持使用我为make
生成依赖项而编写的bash脚本(它生成:
之后的内容,而目标加冒号添加到生成文件本身中).你认为我应该添加我的非工作示例吗?实际上它甚至不是最小的…不是很大,但也不是最小的。如果你只是想理解这个概念,而不是有一个可用的Fortran版本的依赖项处理,那么你尝试的生成文件可能不需要包括在内。我可能不知道你需要的是流程中的哪些部分不太明白。我从来没有使用过FORTRAN,真的,所以可能有一些事情使FORTRAN编译器无法使用这些功能。特别是我不太明白您的语句,创建了依赖项文件,编译失败,但由于之前创建的依赖项,后续编译更进一步ency file这意味着什么?为什么下一次编译会因为上一次编译创建的依赖文件而更进一步?依赖文件是(a)仅用于make,而不是编译器,和(b)只与它的特定文件相关,而不与其他文件相关。@VladimirF只在你没有正确编写Makefile的情况下使用。make
的全部目的是准确地构建所需的内容,这就是依赖文件的全部要点。然而,这显然是为能够生成这些文件的编译器设计的,我不知道FORTRAN是否我能做到。
# ====================================================================================================
FC = mpifort
FLIBS = -llapack -lblas
FCFLAGS = -ffree-form -ffree-line-length-0 -fimplicit-none -fdefault-real-8
# ====================================================================================================
PROGRAM := main
SRCDIR := src
OBJDIR := obj
MODDIR := mod
DEPDIR := dep
SRC := $(wildcard $(SRCDIR)/*.f90)
OBJ := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(SRC:.f90=.o))
MOD := $(shell echo $(patsubst $(SRCDIR)/%,$(MODDIR)/%,$(SRC:.f90=.mod)) | tr '[:upper:]' '[:lower:]')
DEP := $(patsubst $(SRCDIR)/%,$(DEPDIR)/%,$(SRC:.f90=.d))
# ====================================================================================================
$(PROGRAM): $(OBJ)
$(FC) $(FCFLAGS) -o $@ $^ $(LDFLAGS) $(FLIBS)
# ====================================================================================================
ifneq "$(MAKECMDGOALS)" "clean"
-include $(DEP)
endif
# $(call make-depend,source-file,object-file,depend-file)
define make-depend
./dep-gen.sh < $1 | sed -e 's,\([^ ]*\),'"$(OBJDIR)"'/\1,g' \
-e 's,.*,'"$2 $3"': &,' > $(DEPDIR)/$(notdir $3)
endef
# ====================================================================================================
$(OBJDIR)/%.o: $(SRCDIR)/%.f90
@echo '************************************************************ target %.o'
$(call make-depend,$<,$@,$(DEPDIR)/$(subst .o,.d,$(notdir $@)))
$(FC) $(FCFLAGS) $(FLIBS) -c $< -J $(MODDIR) -o $@
# ====================================================================================================
.PHONY: clean veryclean
clean:
$(RM) $(OBJ) $(MOD) $(DEP)
veryclean: clean
$(RM) $(PROGRAM)
# ====================================================================================================