makefile со многими исходными папками - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть оригинальный make-файл, который работает только с одной исходной папкой, а make-файл хранится внутри этой папки.Теперь у меня есть несколько папок внутри моей папки 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) - это просто сценарий оболочки, который создает зависимости, а $ (SRCDIR) - этогде исходные файлы.Make-obj и Make-deps - это файлы, содержащие зависимости и имена целевых файлов.Где-то еще у меня есть следующее:

$(OBJDIR)/%.o: %.f Makefile
       @$(F90) $(FFLAGS) $(POPTIONS) -o $@ $<          

Теперь я хочу этого, но где мои файлы% .f находятся в разных папках, а также где у меня есть несколько Make-obj и Make-deps.

Может быть, я должен показать пример Make-obs и Make-deps:

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), потому что это то место, куда я их перемещаю при компиляции.

Make-obj

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)

Я, очевидно, не хотел помещать здесь весь make-файл, но если чего-то не хватает, прежде чем вы сможете понять, что происходит, пожалуйста, дайте мне знать.

Когда я печатаю, я получаю сообщение об ошибке:что мой $ (основной) исходный файл не может открыть файл скомпилированного модуля, который включен в основной источник.Это потому, что он не скомпилирован, но это также означает, что мой файл зависимостей не работает должным образом?Когда я просматриваю свой соответствующий файл dep, в который входит основной файл, я вижу, что модули зависимостей добавляются в исходный файл

...