##
# Makefile for shadow3
#
#
#
# Usage:
#       make  (or make shadow3): builds shadow3 binary 
#       make lib        : builds shared libraries libshadow3*.so
#       make clean      : cleans files created when running make
#
# Recommended compiler: gfortran
#


##-------------------------------------------------------------------------------
##                   THIS SECTION CAN BE CUSTOMIZED 
##-------------------------------------------------------------------------------

SO=.dll
COMPILEOPT=-D_COMPILE4WIN

#
# customize compiler and flags
#
FC = gfortran
FFLAGS = -I ./def/ -cpp -ffree-line-length-none -O2 -fomit-frame-pointer $(COMPILEOPT)
LINKFLAGS = -shared -lm

CC = gcc

CXX = g++

CFLAGS = -I ./def/ -fPIC $(32BITS)

LIBFLAGS = -shared -lm 

CPP = cpp -traditional

##-------------------------------------------------------------------------------
##                   END OF CUSTOMIZABLE SECTION
##
## (you may also want to customize the install target, if you want to use it)
##-------------------------------------------------------------------------------


#
# LIST OF SOURCE FILES
#
# note that the order is important...
#

OBJFMODULES = \
	shadow_version.o \
	shadow_globaldefinitions.o \
	stringio.o \
	gfile.o \
	shadow_beamio.o \
	shadow_math.o \
	shadow_variables.o \
	shadow_roughness.o \
	shadow_kernel.o \
	shadow_synchrotron.o \
	shadow_pre_sync.o \
	shadow_pre_sync_urgent.o \
	shadow_preprocessors.o \
	shadow_postprocessors.o \
	shadow_bind_f.o \
	shadow_crl.o

FMODULESPRE = ${FMODULES:.F90=.f90}

#
# targets
#
all: shadow3 

#
# shadow3 target ----------------
#
shadow3: $(OBJFMODULES) shadow3.o
	$(FC) $(LINKFLAGS) -o shadow3.exe shadow3.o $(OBJFMODULES)

shadow3.o: fortran/shadow3.f90
	$(FC) $(FFLAGS) -c fortran/shadow3.f90 

#
#objects ingredients
#

shadow_version.o: fortran/shadow_version.f90
	$(FC) $(FFLAGS) -c fortran/shadow_version.f90 

shadow_globaldefinitions.o: fortran/shadow_globaldefinitions.f90
	$(FC) $(FFLAGS) -c fortran/shadow_globaldefinitions.f90

stringio.o: fortran/stringio.f90
	$(FC) $(FFLAGS) -c fortran/stringio.f90 

gfile.o: fortran/gfile.f90
	$(FC) $(FFLAGS) -c fortran/gfile.f90 

shadow_beamio.o: fortran/shadow_beamio.f90
	$(FC) $(FFLAGS) -c fortran/shadow_beamio.f90 

shadow_math.o: fortran/shadow_math.f90
	$(FC) $(FFLAGS) -c fortran/shadow_math.f90 

shadow_variables.o: fortran/shadow_variables.f90
	$(FC) $(FFLAGS) -c fortran/shadow_variables.f90 

shadow_roughness.o: fortran/shadow_roughness.f90
	$(FC) $(FFLAGS) -c fortran/shadow_roughness.f90 

shadow_kernel.o: fortran/shadow_kernel.f90
	$(FC) $(FFLAGS) -c fortran/shadow_kernel.f90 

shadow_synchrotron.o: fortran/shadow_synchrotron.f90
	$(FC) $(FFLAGS) -c fortran/shadow_synchrotron.f90 

shadow_pre_sync.o: fortran/shadow_pre_sync.f90
	$(FC) $(FFLAGS) -c fortran/shadow_pre_sync.f90 

shadow_pre_sync_urgent.o: fortran/shadow_pre_sync_urgent.f90
	$(FC) $(FFLAGS) -c fortran/shadow_pre_sync_urgent.f90 

shadow_preprocessors.o: fortran/shadow_preprocessors.f90
	$(FC) $(FFLAGS) -c fortran/shadow_preprocessors.f90 

shadow_postprocessors.o: fortran/shadow_postprocessors.f90
	$(FC) $(FFLAGS) -c fortran/shadow_postprocessors.f90 

shadow_bind_f.o: fortran/shadow_bind_f.f90
	$(FC) $(FFLAGS) -c fortran/shadow_bind_f.f90 

shadow_crl.o: fortran/shadow_crl.f90
	$(FC) $(FFLAGS) -c fortran/shadow_crl.f90 

#
# lib target ----------------
#
lib: $(OBJFMODULES) shadow_bind_c.o
	$(FC) $(LIBFLAGS) $(CFLAGS) -o libshadow3$(SO) $(OBJFMODULES)
	$(CC) $(LIBFLAGS) $(CFLAGS) -o libshadow3c$(SO) shadow_bind_c.o -L. -lshadow3

shadow_bind_c.o: c/shadow_bind_c.c
	$(CC) $(CFLAGS) -c c/shadow_bind_c.c


