Я пытаюсь написать 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
.
Кто-нибудь поможет? Огромное спасибо!
.mod
файлы из модулей (это.mod.F
файлы)? Как эти.mod
файлы затем используются в остальной части процесса сборки? - person Etan Reisner   schedule 24.10.2014.mod
файлы создаются компилятором автоматически при компиляции исходных файлов, которые содержат модуль. Они неявно используются одним и тем же компилятором, когда встречаются с любым операторомuse
. - person Vladimir F   schedule 24.10.2014schleppe.F
будет генерироватьсяschleppe.for
, а при компиляцииwords_schleppe.mod.F
автоматически будет генерироватьсяwords_schleppe.mod
с использованием той же команды компиляции? - person Etan Reisner   schedule 24.10.2014OBJS
сMODS
и добавить%.mod: %.F
рецепт и соответствующий$(MODS): %.o: %.mod
рецепт (если это также необходимо). - person Etan Reisner   schedule 24.10.2014all:
должно включать исходные файлы модуля, и они должны предшествовать другим исходным файлам. Кроме того, необходимо добавить правила создания объектных файлов из исходных файлов модуля. Рабочий Makefile выглядит так: - person stineb   schedule 26.10.2014