我拥有的原始makefile有效且仅涉及一个源文件夹,而该makefile存储在该文件夹中。现在,我的src文件夹中有多个文件夹。
我正在使用自动生成脚本来计算依赖项和目标文件。每个子文件夹都有一个Make-deps和Make-objs文件。这些是通过$(AUTOGEN)命令生成的
在我拥有这个之前:
deps:
$(AUTOGEN) -d -s $(SRCDIR) -f ../scripts/fgenrc ;\
sed -i "" -e's/(SRCDIR)/(OBJDIR)/' Make-objs ; \
sed -i "" -e's/(SRCDIR)\(.*\)\.o/(OBJDIR)\1\.o/g' Make-deps ; \
所以$(AUTOGEN)只是生成依赖项的shell脚本,而$(SRCDIR)是源文件所在的位置。 Make-obj和Make-deps是包含依赖项和目标文件名的文件。 我在其他地方有以下内容:
$(OBJDIR)/%.o: %.f Makefile
@$(F90) $(FFLAGS) $(POPTIONS) -o $@ $<
现在我要这样做,但是我的%.f文件在各个文件夹中,还有几个Make-obj和Make-deps。
也许我应该举一个Make-obs和Make-deps的例子:
进行以下操作:
$(OBJDIR)/fluxes.o fluxes.o: \
path/to/src/folder1/fluxes.f90 \
$(OBJDIR)/mod.o \
$(OBJDIR)/ig.o ig.o: \
path/to/src/folder1/ig.f90 \
$(OBJDIR)/mod.o \
从sed
命令中我将目标文件路径更改为$(OBJDIR),因为在编译时这是我将其移动到的位置。
制作对象
OBJS = \
$(OBJDIR)/fluxes.o \
$(OBJDIR)/ig.o \
现在我已经定义了
SOURCE_FILES_c := $(shell find $(SRCDIR) -name '*.c')
SOURCE_FILES_f90 := $(shell find $(SRCDIR) -name '*.f90')
所有这些源文件都找到了SRCDIR及其子文件夹。我也定义了
DEPS_FILES := $(shell find $(SRCDIR) -name 'Makefile-deps')
OBJS_FILES := $(shell find $(SRCDIR) -name 'Makefile-objs')
都是依赖文件和目标文件。这些包含在每个包含某些源代码的子文件夹中。
然后,我正在尝试执行以下操作。 (目标deps似乎可以正常工作,因为当我注释掉编译规则时,它确实在每个文件夹中正确创建了deps和objs文件。)
code: create_dir deps scripts
@make -j $(CORES) $(NAMEEXE)
$(NAMEEXE): $(LIBRARY) $(OBJS)
@$(F90) $(FFLAGS) $(OPTIONS) -o $(OBJDIR)/$(MAIN).o main/$(MAIN).f90
@$(F90) -o $(NAMEEXE) $(LOPTIONS) $(OBJS) $(LIBRARY) && \
deps:
${AUTOGEN} -d $(AUTOGEN_COMMAND) -f ${AUTOCONF} ; \
$(SEDI) -e "s/[(][^)]*[)]/\$$(OBJDIR)/g" $(OBJS_FILES) ; \
$(SEDI) -e "s/[(][^)]*[)]\(.*\)\.o/\$$(OBJDIR)\1\.o/g"
$(DEPS_FILES) ; \
$(OBJDIR)/%.o: $(SOURCE_FILES_f:.f90=.o) Makefile
@$(F90) $(FFLAGS) $(POPTIONS) -o $@ $< && \
( mv -f *.mod $(OBJDIR) > /dev/null 2>&1;
$(OBJDIR)/%.o: $(SOURCE_FILES_c:.c=.o) Makefile
@$(F90) $(FFLAGS) $(POPTIONS) -o $@ $< && \
( mv -f *.mod $(OBJDIR) > /dev/null 2>&1;
%.o: $(SOURCE_FILES_c:.c=.o) Makefile
@make $(OBJDIR)/$@
%.o: $(SOURCE_FILES_c:.c=.f90) Makefile
@make $(OBJDIR)/$@
我通过此命令包含deps和objs
-include $(DEPS_FILES)
-include $(OBJS_FILES)
我显然不想把整个makefile放在这里,但是如果在您了解发生了什么之前缺少某些内容,请告诉我。
当我键入make错误时,我得到的是我的$(main)源文件无法打开包含在主源文件中的已编译模块文件。 这是因为它没有被编译,但这也意味着我的依赖文件不能按预期工作吗? 当我查看包含主文件的相应dep文件时,可以看到依赖项模块已添加到源文件中