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

Имам около 39 изходни файла на Fortran F90 и 35 свързани файла с Fortran 77 Lapack. Използвам оператор за включване в основната си програма, за да свържа всички тези файлове.

Създадох команден файл 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.bat?   -  person Etan Reisner    schedule 31.03.2014
comment
Това е само моят файл make.bat. Времето за компилиране не е твърде голямо, така че макар и обикновен партиден файл трябва да е достатъчен.   -  person Amitava    schedule 31.03.2014
comment
Също така се опитвам да напиша прост makefile.mak, който може да се използва с инструмента за команден ред nmake. Но аз съм много нов в това и все още не можах да намеря добър урок за Windows OS. Би било полезно, ако можете да ме насочите към правилния път.   -  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 за всеки код на Fortran в подходящ ред, за да създам 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