具有自动依赖项生成的Makefile

具有自动依赖项生成的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

我正在阅读,同时试图为我的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-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)
# ====================================================================================================