У меня есть оригинальный 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, в который входит основной файл, я вижу, что модули зависимостей добавляются в исходный файл