Makefile Fortran90 с предварительной компиляцией и модулями

Я пытаюсь написать Makefile для компиляции проекта Fortran90, состоящего из нескольких исходных файлов, содержащих подпрограммы и модули. Чтобы усложнить задачу, я использую предварительную компиляцию (создание *.for файлов из *.F файлов). Я не смог найти на это ответа, но это может быть связано с тем, что меня смущают разные стили синтаксиса Makefile.

Я создал урезанную версию для воспроизведения своей проблемы (доступно на https://github.com/stineb/stackoverflow). Он содержит основную программу (sayhello.F), две подпрограммы в отдельных исходных файлах (schleppe.F и schnuppi.F) и два модуля в отдельных исходных файлах (words_schleppe.mod.F и words_schnuppi.mod.F). Исполняемый файл - hello.

Я могу создать его с помощью простого файла Makefile, избегая предварительной компиляции. Этот файл (Makefile_simple) выглядит так:

FCOM=gfortran
EXE = hello

standard: 
    $(FCOM) -c words_schleppe.mod.F
    $(FCOM) -c words_schnuppi.mod.F
    $(FCOM) -c schleppe.F
    $(FCOM) -c schnuppi.F
    $(FCOM) words_schleppe.mod.o words_schnuppi.mod.o schleppe.o schnuppi.o sayhello.F -o $(EXE)

 .PHONY: clean
 clean:
    rm $(EXE) *.o *.mod

Однако мой проект будет немного больше этого, поэтому я хочу использовать загадочные функции более сложного Makefile для определения правил. И что очень важно: я хочу предварительно скомпилировать исходные файлы *.F в .for. Здесь мне не удалось определить правила для создания .mod файлов из модулей и сборки всего этого. Не обращая внимания на модули, я запускаю его со следующим Makefile (Makefile_complex в моем репозитории github):

FCOM=gfortran
CPPFLAGS=-e
COMPFLAGS=
EXE=hello
SOURCES=sayhello.F schleppe.F schnuppi.F 
OBJS=$(SOURCES:.F=.o)

all: $(OBJS)
    # this may also be replaced by the ar command (creating archive)
    $(FCOM) $(OBJS) -o $(EXE)

%.for: %.F
    rm -f $*.for
    $(FCOM) $(CPPFLAGS) $*.F > $*.for

$(OBJS): %.o: %.for
    $(FCOM) -c -o $@ $(COMPFLAGS) $*.for

# clean: remove .for, .o, .do, and .stb files
.PHONY: clean
clean:
    -rm -f *.for *.o *.stb *.mod

Что мне нужно добавить к этому, чтобы включить модули в сборку? Зависимости следующие: subroutine schleppe ‹- module words_schleppe; и subroutine schnuppi ‹- module words_schnuppi.

Кто-нибудь поможет? Огромное спасибо!


person stineb    schedule 24.10.2014    source источник
comment
Как сделать .mod файлы из модулей (это .mod.F файлы)? Как эти .mod файлы затем используются в остальной части процесса сборки?   -  person Etan Reisner    schedule 24.10.2014
comment
@EtanReisner .mod файлы создаются компилятором автоматически при компиляции исходных файлов, которые содержат модуль. Они неявно используются одним и тем же компилятором, когда встречаются с любым оператором use.   -  person Vladimir F    schedule 24.10.2014
comment
Вы имеете в виду, что при компиляции schleppe.F будет генерироваться schleppe.for, а при компиляции words_schleppe.mod.F автоматически будет генерироваться words_schleppe.mod с использованием той же команды компиляции?   -  person Etan Reisner    schedule 24.10.2014
comment
@EtanReisner, да, это так.   -  person stineb    schedule 24.10.2014
comment
Тогда я думаю, вы просто хотите продублировать бит о OBJS с MODS и добавить %.mod: %.F рецепт и соответствующий $(MODS): %.o: %.mod рецепт (если это также необходимо).   -  person Etan Reisner    schedule 24.10.2014
comment
Простое решение: правило для all: должно включать исходные файлы модуля, и они должны предшествовать другим исходным файлам. Кроме того, необходимо добавить правила создания объектных файлов из исходных файлов модуля. Рабочий Makefile выглядит так:   -  person stineb    schedule 26.10.2014
comment
@stineb Не редактируйте свой вопрос, опубликуйте решение в качестве ответа и примите его!   -  person Chnossos    schedule 26.10.2014
comment
Извините, первый раз пользователь ...   -  person stineb    schedule 26.10.2014


Ответы (1)


Я НАШЕЛ РЕШЕНИЕ! Просто правило для all: должно включать исходные файлы модуля, и эти должны предшествовать другим исходным файлам. Кроме того, необходимо добавить правила создания объектных файлов из исходных файлов модуля. Рабочий Makefile выглядит так:

FCOM=gfortran

CPPFLAGS=-E
COMPFLAGS=

EXE=hello

SOURCES=sayhello.F schleppe.F schnuppi.F
MODS=words_schleppe.F words_schnuppi.F

OBJS=$(SOURCES:.F=.o)
MODOBJS=$(MODS:.F=.o)

# this may also be replaced by the ar command (creating archive)
all: $(MODOBJS) $(OBJS)
    $(FCOM) $(OBJS) $(MODOBJS) -o $(EXE)

%.for: %.F
    rm -f $*.for
    $(FCOM) $(CPPFLAGS) $*.F > $*.for

$(MODOBJS): %.o: %.for
    $(FCOM) -c -o $@ $(COMPFLAGS) $*.for

$(OBJS): %.o: %.for
    $(FCOM) -c -o $@ $(COMPFLAGS) $*.for

# clean: remove .for, .o, .do, and .stb files
.PHONY: clean
clean:
    -rm -f *.for *.o *.stb *.mod
person stineb    schedule 25.10.2014