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.
|