Как написать файл `make` для отдельного исходного кода и каталог сборки для большой программы со смешанным кодом Fortran F77 и F90

У меня есть около 39 исходных файлов Fortran F90 и 35 файлов, связанных с Fortran 77 Lapack. Я использую оператор include в своей основной программе для подключения всех этих файлов.

Я создал пакетный файл make.bat с командой ifort "MDL HydroD.F90", которая компилирует мой код и генерирует файл mdlhydrod.exe. В процессе компилятор Fortran создает множество .mod и .obj файлов сборки, что затрудняет управление. Я хотел бы поместить свои исходные файлы в каталог Source, а файлы библиотеки Lapack в каталог lapack и построить файлы в каталоге Debug.

Может ли кто-нибудь помочь мне изменить мой make.bat файл так, чтобы ifort смотрел на Source каталог и создавал Debug каталог.

Спасибо за помощь.

В настоящее время при использовании make.bat есть только одна строка команды:

File Name: make.bat

ifort  "MDL HydroD.F90"

Работа над файлом make для использования с nmake (неполный):

File Name: make.mak:

#Make File for MDL HydroD
# Compiler options
FC          :=  ifort
VPATH       :=  src
BINDIR      :=  bin

$(BINDIR):
    mkdir -p $(BINDIR)

clean:
@rm -rf $(BINDIR)

person Amitava    schedule 31.03.2014    source источник
comment
Вы действительно используете в этом процессе инструмент make или ваш скрипт называется просто make.bat?   -  person Etan Reisner    schedule 31.03.2014
comment
Это просто мой файл make.bat. Время компиляции не слишком велико, поэтому достаточно простого командного файла.   -  person Amitava    schedule 31.03.2014
comment
Я также пытаюсь написать простой makefile.mak, который можно использовать с nmake инструментом командной строки. Но я новичок в этом и пока не нашел хорошего руководства для ОС Windows. Было бы полезно, если бы вы направили меня по правильному пути.   -  person Amitava    schedule 31.03.2014
comment
Как вам помочь, если вы не показываете сценарий?   -  person Vladimir F    schedule 31.03.2014
comment
Показ сценария может быть хорошим началом (особенно, если он включает в себя нечто большее, чем простая команда ifort). Если вопрос в том, как указать ifort, где искать источники и библиотеки, то это похоже на то, что ifort документация или справочная информация должны вам сказать.   -  person Etan Reisner    schedule 31.03.2014
comment
Отредактировал свой вопрос с моими make.bat и make.mak файлом. Приношу свои извинения за то, что не разместил их раньше. Я не умею писать make скрипты и пытаюсь собрать их вместе из фрагментов с разных веб-страниц. Спасибо за помощь.   -  person Amitava    schedule 01.04.2014
comment
вам следует отредактировать вопрос (заголовок), чтобы отразить, что вы просите помощи с make. Вопрос действительно не имеет отношения конкретно к Intel fortran.   -  person agentp    schedule 01.04.2014


Ответы (1)


Поскольку вы используете странный способ работы с исходными файлами, который вы показали в своем другой вопрос, это будет очень сложно изменить.

Для резюмирования вы включаете все в один исходный файл с помощью оператора include. Мне это кажется довольно неудачным, и я прокомментировал это там. Если у вас есть один исходный файл, вы вынуждены собирать его с помощью одной команды, здесь нет места для какого-либо тонкого контроля. Это не проблема сценария bash или bat по сравнению с Makefile.

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

Удалите включенные или хотя бы соответствующие. Тогда ты можешь просто сделать

ifort Source/the_source_file1 -c Output/name_of_obj1 -module the_directory_for_modules -I the_directory_for_modules  -other_flags

для каждого файла. А потом в конце:

ifort Output/name_of_obj1 Output/name_of_obj2 Output/name_of_obj3 .... -o the_result

В Scons (который я бы использовал) это было бы так (проверено на паре фиктивных файлов). Файл Sconstruct:

import os

env = Environment(tools=['default','ifort'])

env.Append(ENV = {'PATH' : os.environ['PATH']})
try:
  env.Append(ENV = {'LIBRARY_PATH' : os.environ['LIBRARY_PATH']})
except:
  pass

env.Append(F90FLAGS='-g -fast') #whatever flags you need
env.Append(FORTRANFLAGS='-g -fast') #whatever flags you need

outdir = "Output/"

srcdir = "Sources/"

lapackdir = "lapack/"


objs = []
for file in os.listdir(srcdir):
  objs += env.Object(target=outdir+os.path.splitext(file)[0], source=srcdir+file)

for file in os.listdir(lapackdir):
  objs += env.Object(target=outdir+os.path.splitext(file)[0], source=lapackdir+file)

env.Append(FORTRANMODDIR = outdir)

objs = filter(lambda o: str(o)[-4:] != '.mod', objs)

prg = env.Program(target="bin/result.exe", source= objs)

Default(prg)
person Vladimir F    schedule 01.04.2014
comment
Спасибо @ vladimir-f за ответ в обоих моих сообщениях. Из вашего ответа я понимаю, что мне следует написать команду ifort для каждого кода Фортрана в соответствующем порядке, чтобы создать Object файлы, а затем связать их для создания .exe файла. Мне было интересно, может ли файл make, такой как можно сделать это, которое будет автоматически искать все исходные файлы внутри src каталога, или это невозможно, поскольку между кодами существует порядок зависимости? - person Amitava; 01.04.2014
comment
С модулями Fortran вы должны заботиться о правильном порядке и зависимости. Это не то, что make может делать автоматически. Я больше не использую make для Fortran, потому что stackoverflow.com/questions/tagged/scons намного лучше. - person Vladimir F; 01.04.2014
comment
Спасибо, что познакомили меня с SCons. Позже я выучу и внедряю это в свой код. Я думаю, что ваша идея о нескольких командах ifort, записанных в пакетном файле, сработает. - person Amitava; 02.04.2014