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...