Как правильно оформить .mod в make-файле? - PullRequest
2 голосов
/ 13 июня 2019

Я пытаюсь сделать Makefile для своего проекта в Фортране и сделать его многоразовым для текущих проектов.Mkefile, который я придумал после многих попыток, следующий.Дело в том, что он работает нормально в нескольких сценариях, но сейчас у меня есть эти файлы:

main.f90, initial.f90, parameters.f90, functions.f90

Первый имеет мойПрограмма и другие модули, где у меня есть подпрограммы.Дело в том, что для работы начальным параметрам нужны параметры, но Makefile решает попытаться скомпилировать исходные перед параметрами.Можно ли как-то выбрать их в правильном порядке?

vpath %.o obj
vpath %.mod mod 

TOP_DIR = .
MOD_DIR = $(TOP_DIR)/mod
OBJ_DIR = $(TOP_DIR)/obj

SOURCES = $(wildcard *.f90)
OBJECTS := $(patsubst %.f90, $(OBJ_DIR)/%.o, $(SOURCES))
ALL_MODULES = $(patsubst %.f90, %.mod, $(SOURCES))
MODULES = $(filter-out main.mod, $(ALL_MODULES))

FFLAGS = -O3 -J$(MOD_DIR) -march=native  -fimplicit-none  -Wall  -Wline-truncation  -fwhole-file  

.PHONY: main clean

main: main.out
./main.out

main.out: $(MODULES) $(OBJECTS)
gfortran $(FFLAGS) $(OBJECTS) -o main.out

$(OBJ_DIR)/%.o : %.f90
gfortran  $(FFLAGS) $^ -c $@

%.mod: %.f90
gfortran  $(FFLAGS) -c $^

clean:
rm -f $(OBJ_DIR)/*.o *.out $(MOD_DIR)/*.mod

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

С современным Fortran порядок составления очень важен.При использовании make-файлов, для чего-либо нетривиального слишком утомительно отслеживать зависимости вручную.Введите различные инструменты для создания этих списков зависимостей.Я успешно использовал makedepf90, который доступен в виде пакета в EPEL (для RHEL / CentOS) и Debian / Ubuntu.

Вы даже можете создать правило make-файла для восстановления списка зависимостей, если вы сохраняете списокв отдельном файле, например:

include depend.mk

# Dependencies generated by "makedepf90" tool.
depend depend.mk:
        cd $(srcdir) && makedepf90 $(yourprogramname_SOURCES) >depend.mk

Вышеупомянутый BTW работает как с обычными make-файлами, так и с автоматизированным (в этом случае вы помещаете вышеупомянутый фрагмент в ваш Makefile.am)

0 голосов
/ 13 июня 2019

Перечислять исходные файлы в порядке зависимости вместо автоматически: SOURCES = parameters.f90 initial.f90 functions.f90.

Отдельный источник для модулей и для программы: main.f90, как правило, не генерирует .mod файлов, и это нарушит ваш упрощенный Makefile.

Я также советую использовать другую систему сборки (например, cmake), но для небольших проектов вы можете обойтись Makefile, если хотите.

...