Как выполнить сканирование в разных каталогах, чтобы найти и скомпилировать модули, прежде чем связывать исполняемый файл Фортрана - PullRequest
0 голосов
/ 26 февраля 2019

Это продолжение вопросов 231229 , 8855896 и 35234003 : у меня есть ряд служебных модулей в ~ / Fortran / include и я разрабатываю новый код в ~ / Fortran / ProjectA .Моя мечта Makefile увидит, что A.f90 нужно mod_MyMod , и зарегистрируйся в ~ / Fortran / include , чтобы увидеть, если mod_mymod.mod и mod_MyMod.o существуют, в противном случае он сгенерирует и поместит их в include , а затем, после связывания объектов из обоих include и ProjectA он будет производить A в ProjectA

Пока у меня есть это:

FC = gfortran
PROGRAMS = A
FCFLAGS = -I../include
LDFLAGS = -lm -L/usr/local/lib 
# flags forall (e.g. look for system .mod files, required in gfortran)
# "make" builds all
all: $(PROGRAMS)
# Using Fortran MODULES:

A.o: ../include/mod_MyMod.o
A: ../include/mod_MyMod.o

# Linking
%: %.o
    $(FC)  -o  $@  $^   $(LDFLAGS)

# Compiling (fortran)
%.o: %.f90
    $(FC) $(FCFLAGS) -c $<


# Utility targets

clean:
    rm -f *.o *.mod

в ProjectA / У меня есть

Program A
  use, intrinsic :: iso_fortran_env, only: R64 => real64,I32 => int32,&
       & input_unit,output_unit,error_unit
  use mod_MyMod
  implicit none

  ! global variables

  character(len=23) :: string="This is A speaking"

  call Print_This(string)
End Program A

в include / У меня есть

Module mod_MyMod
  use, intrinsic :: iso_fortran_env, only: R64 => real64,I32 => int32,&
       & input_unit,output_unit,error_unit
  implicit none
contains
  Subroutine Print_This(string)
    character(len=20),intent(in) :: string
    write(output_unit,"(*(g0,:,' '))")string
  End Subroutine Print_This
End Module mod_MyMod

Чтобы выполнить то, что я хочу, я думаю, что мне нужно отдельноправила компиляции A.f90 и mod_MyMod.f90 .В первом случае объект указывает на локальный каталог, во втором должны быть помещены .mod и .o в include .

...