包含许多源文件夹的makefile

时间:2018-12-02 14:40:09

标签: linux bash shell makefile compilation

我拥有的原始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文件时,可以看到依赖项模块已添加到源文件中

0 个答案:

没有答案