Makefile для компиляции исходных файлов Fortran в разных каталогах

Вот моя проблема: я использую Java уже много лет и мне нравится иметь много каталогов, разделяющих разные части кода. Для моего текущего проекта я пишу код на Fortran, который должен компилироваться под Windows и Unix/Linux. Для Windows я использую Eclipse/Photran с инструментами MinGW/gfortran для настройки Makefiles.

Вот желаемая структура проекта (более глубокая древовидная структура, подобная Java-подобной, была бы еще лучше)

dir1/src/*.f95
dir1/make/Makefile_lib1.any
dir1/make/Makefile_lib1.win
dir1/make/Makefile_lib1.unix

dir2/src/*.f
dir2/make/Makefile_lib2.any
dir2/make/Makefile_lib2.win
dir2/make/Makefile_lib2.unix

...

dir_main/src/*.f or *.f95
dir_main/make/Makefile_main.any
dir_main/make/Makefile_main.win
dir_main/make/Makefile_main.unix

Я хотел бы позвонить make Makefile_main.unix, который будет устанавливать любые специфичные для Unix переменные, а затем включать Makefile_main.any, Makefile_lib1.any...

(похоже для создания на Windows)

Я попал на этап, где я могу видеть все исходные файлы в данном каталоге, например

SRCS  := $(wildcard $(SRC_DIR)/*.$(SRC_EXT))

Теперь я борюсь с тем, как сделать все зависимости, как в Фортране 95, каждый источник генерирует *.o а также *.mod,

Есть ли способ переключения между каталогами при компиляции, чтобы у всех целей / зависимостей не было пути dir в их именах? Обратите внимание, что я звоню make из какого-то другого сервисного каталога, где живет проект Eclipse. Любые предложения, как поступить?

Я действительно не хочу использовать обычный стиль Фортрана, чтобы иметь только один каталог со всем беспорядком вместе с кодом.

1 ответ

Есть две основные стратегии, которые вы можете использовать.

Вы можете разместить make-файл в каждом подкаталоге, чтобы он поддерживал такие цели, как all, clean и т.д., затем используйте рекурсивные вызовы make из make-файла верхнего уровня, чтобы создать ту же цель (например, all) в каждом подкаталоге.

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

Вот что вы можете сделать в вашем случае, если предположить, что SRC правильно задан список относительных путей к каждому источнику, который нужно скомпилировать.

# This replaces the SRC_EXT suffix with .o in each filename
OBJ = $(SRC:%.$(SRC_EXT)=%.o)

$(BINARY_NAME): $(OBJ)
    ...link command...

%.o: %.$(SRC_EXT)
    ...compile command...
Другие вопросы по тегам