Add the following line near the beginning of your makefile:
vpath %.f90 ../src
and replace the following lines:
$(PROG): $(OBJS)
$(F90) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
by
$(PROG): $(OBJS)
cd debug; $(F90) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) && mv $@ ..
Not tested, but I routinely do something like this for the same reason.
You need to use Gnu make for this. You might have to supply an absolute
path instead of ../src.
Anthony Stone
On 04/02/09 17:02, M.R.Hadian wrote:
> Dear All
> Excuse me if my question is not directly about Fortran.
> I want to compile and link my Fortran files using a makefile.
> The Fortran source files are in a sub-folder and I want the object files
> are made in another sub-folder while the executable file is made in the
> root folder. For example the source files are in ./src, the object files
> in ./debug.
> I can generate a make file (using a perl script) that compile the
> sources and link them while all the files are in a folder but I could
> not change it to do the above task. In the present way all the files are
> mixed in a folder but i want to have only executable file and my input
> and output files in the root folder.
> Thanks in advance,
> Hadian
>
> My makefile for a project including 3 files is as follows:
> ==== makefile ======
> PROG = a.out
> SRCS = main.f90 setarray.f90 vardef.f90
> OBJS = main.o setarray.o vardef.o
> LIBS =
> FC = gfortran
> FFLAGS = -O
> F90 = gfortran
> F90FLAGS = -O
> LDFLAGS = -s
> all: $(PROG)
> $(PROG): $(OBJS)
> $(F90) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
> clean:
> rm -f $(PROG) $(OBJS) *.mod
> .SUFFIXES: $(SUFFIXES) .f90
> .f90.o:
> $(F90) $(F90FLAGS) -c $<
> main.o: vardef.o
> setarray.o: vardef.o
>
> ==== main.f90 ======
> program test
> use VarDef
> implicit none
> integer :: i
> Print *, "input array dimension:"
> read *,n
> call SetArray
> a=(/(2*i,i=1,n)/)
> print * ,a
> end program
>
> ==== setarray.f90 ======
> subroutine SetArray
> use VarDef
> implicit none
> allocate(a(n))
> end subroutine SetArray
>
> ==== vardef.f90 ======
> module VarDef
> implicit none
> integer,allocatable,dimension(:)::a
> integer::n
> end module VarDef
|