Dear Craig Dedo
Actually i want to use it on Linux (ubuntu 8.10) and the method
suggested by Daniel can be used on any operating system (by adjusting
the MKDIR variable in the makefile. this is the final one that works
for me:
PROG = a.out
SRCDIR = sources
OBJDIR = objects
MKDIR= mkdir
OBJS = $(OBJDIR)/main.o $(OBJDIR)/setarray.o $(OBJDIR)/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
$(OBJDIR)/%.o : $(SRCDIR)/%.f90
test -d $(OBJDIR) || $(MKDIR) $(OBJDIR)
$(F90) $(F90FLAGS) -c $< -o $@
$(OBJDIR)/main.o: $(OBJDIR)/vardef.o
$(OBJDIR)/setarray.o: $(OBJDIR)/vardef.o
Regards,
Hadian
On Thu, Feb 5, 2009 at 9:25 AM, Craig Dedo <[log in to unmask]> wrote:
>
> It would be helpful if the original poster would let us know the operating system, compiler and make utility, including version numbers, that he is using. Not all operating systems, compilers, and utilities are the same.
>
> Sincerely,
> Craig Dedo
> 17130 W. Burleigh Place
> P. O. Box 423
> Brookfield, WI 53008-0423
> USA
> E-mail: <[log in to unmask]>
>
> > -----Original Message-----
> > From: Fortran 90 List [mailto:[log in to unmask]] On Behalf
> > Of M.R.Hadian
> > Sent: Wednesday, February 04, 2009 23:20
> > To: [log in to unmask]
> > Subject: Re: makefile
> >
> > Anthony Stone wrote:
> > > 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
> > >
> > i did the changes but did not work.
> > i put the source files in folder ./src and made folder ./debug. the
> > makefile is in the root of project folder and this is its content:
> > vpath %.f90 ../src
> > 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)
> > cd debug; $(F90) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) && mv $@ ..
> > clean:
> > rm -f $(PROG) $(OBJS) *.mod
> > .SUFFIXES: $(SUFFIXES) .f90
> > .f90.o:
> > $(F90) $(F90FLAGS) -c $<
> > main.o: vardef.o
> > setarray.o: vardef.o
> >
> > it make the following error message:
> > make: *** No rule to make target `vardef.o', needed by `main.o'. Stop.
|