na56:~/experiment/fmod/gfortran>cat testmod.nm
00000004 C x_
na56:~/experiment/fmod/gfortran>cat usemod.nm
00000000 T MAIN__
U __stack_chk_fail
U _gfortran_set_std
U _gfortran_st_write
U _gfortran_st_write_done
U _gfortran_transfer_character
U _gfortran_transfer_integer
U compute_
00000004 C x_
na56:~/experiment/fmod/gfortran>cat compute.nm
U __stack_chk_fail
U _gfortran_st_write
U _gfortran_st_write_done
U _gfortran_transfer_character
00000000 T compute_
00000004 C x_
[testmod.f90]
MODULE TESTMOD
IMPLICIT NONE
INTEGER :: X
COMMON /X/ X
INTERFACE
SUBROUTINE COMPUTE(X)
INTEGER X
END SUBROUTINE
END INTERFACE
END MODULE TESTMOD
[usemod.f90]
PROGRAM USEMOD
USE TESTMOD
IMPLICIT NONE
!INTEGER X ! This will shadow the global X
!CALL COMPUTE(1D0) ! This does not work (compile error)
X=0
WRITE(*,*) 'X is now:',X
WRITE(*,*) 'Calling "compute"'
CALL COMPUTE(1)
WRITE(*,*) 'X is now:',X
END PROGRAM USEMOD
[compute.f90]
SUBROUTINE COMPUTE(Y)
USE TESTMOD
IMPLICIT NONE
INTEGER Y
!INTEGER X ! this will shadow the X from usemod
!COMMON /X/ X
WRITE(*,*) 'Inside the compute routine (increasing X by 1)'
X=X+1
END SUBROUTINE COMPUTE
[Makefile]
.SUFFIXES: .f90 .o .mod
.PHONY: clean objdump
FC=gfortran
FCOPTS=-c
ALL=usemod
MODFILES=testmod.mod
OBJFILES=testmod.o compute.o usemod.o
usemod: $(MODFILES) $(OBJFILES)
$(FC) -o $@ $(OBJFILES)
.f90.o:
$(FC) $(FCOPTS) $<
# .mod files are actually generated as a "bi-product"
.f90.mod:
$(FC) $(FCOPTS) $<
# Disable default build rule for .mod files.
%.o : %.mod
clean:
rm -f $(OBJFILES) $(MODFILES) $(ALL)