Here I have two Fortran90 files and a makefile:
Contents of file main_mod.f90:
module main_mod
contains
subroutine add(a, b)
implicit none
integer, intent(in) :: a, b
print *, (a+b)
end subroutine add
end module main_mod
contents of file main_mod2.f90
module main_mod2
use main_mod
contains
subroutine add2(a, b)
implicit none
integer, intent(in) :: a, b
call add(a, b)
end subroutine add2
end module main_mod2
and in makefile, I automatically generate a list of ".o" files from current directory:
F90 = /usr/bin/gfortran
COMPFLAGS = -c
%.o: %.f90
$(F90) $(COMPFLAGS) $*.f90
all: $(patsubst %.f90,%.o,$(wildcard *.f90))
when I make the project, the wildcard statement in my make file generates a list of object files like:
main_mod2.o main_mod.o
and then the compilation fails because first, the file main_mod.f90 needs be compiled which would give us main_mod.o and main_mod.mod used in main_mod2.f90. Then main_mod2.f90 would be compiled successfully. That means the permutation of object files must be:
main_mod.o main_mod2.o
Now, the question is, in general case when I create the list of object files using wildcard, how can I enforce correct permutation of object files?
... Specify them in your rules.
While gcc does have
-M
and related flags for doing exactly this with C/C++ files, they unfortunately do not work with gfortran. Actually, it is possible, but only if you already know the dependencies. Therefore you will need an external program to generate your dependencies.In my projects, I use this python script, and add the following to my makefile:
fort_depend.py
basically just makes a list of all the modulesUSE
d in a given file.