INSTALL_PATH=.

FORTRAN=gfortran
CC=GCC

MACHINE := $(shell uname -s)
ARCH := $(shell uname -m)

ifeq ($(MACHINE), Linux)
$(info Compiles for Linux)
X11=/usr/include/X11R6
X11_F=-L/usr/X11R6/lib
endif

ifeq ($(MACHINE), Darwin)
$(info Compiles for Mac)
X11=/usr/X11/include
X11_F=-L/usr/X11/lib
endif

GFORTRAN_VERSIONA := $(shell expr `gfortran -dumpversion | cut -f1 -d.` \>= 4)
GFORTRAN_VERSIONB := $(shell expr `gfortran -dumpversion | cut -f2 -d.` \>= 6)

#FFLAGS=-ggdb -g3 -static
#FFLAGS=-static -O3 -m32
FFLAGS=-O3 -m32 -static -Wall
#FFLAGS=-O3 -m32 -Wall -L/usr/lib # for Fedora/Red Hat
CFLAGS=-c -O3 -I$(X11)

COMMON=formats.f rayinvrpar.f shared_variables.f vmodels.f args.f parhist.f
COMMON_XRAY=xray_common.f stats.f txindata.f namelists.f bitmaps.f
EXEC_NAMES=vmontecarlo vnodes vperturbations vposvneg vequivalent vmaxvmin vnodlim vthresplot vparhist vsum v2grid vin2xz rout2ray vzoom

info:
	$(info make vmontecarlo - compiles vmontecarlo only)
	$(info make vthresplot - compiles vthresplot only)
	$(info make vparhist - compiles vparhist only)
	$(info make vnodes - compiles vnodes only)
	$(info make v2grid - compiles v2grid only)
	$(info make vin2xz - compiles vin2xz only)
	$(info make vperturbations - compiles vperturbations only)
	$(info make vposvneg - compiles vposvneg only)
	$(info make vequivalent - compiles vequivalent only)
	$(info make vmaxvmin - compiles vmaxvmin only)
	$(info make vnodlim - compiles vnodlim only)
	$(info make vzoom - compiles vzoom only)
	$(info make vsum - compiles vsum only)
	$(info make rout2ray - compiles rout2ray only)
	$(info make checkversion - checks compiler version for compatibility with vmontecarlo code)
	$(info make instal - compiles everything)
	$(info make clean - erases compiled files)


.PHONY: checkversion
checkversion:
ifeq ($(GFORTRAN_VERSIONA),0)
	$(info Warning: Current version of gfortran may not be suitable to compile vmontecarlo. Please use gfortran 4.6.0 or higher.)
	exit
endif
ifeq ($(GFORTRAN_VERSIONB),0)
	$(info Warning: Current version of gfortran may not be suitable to compile vmontecarlo. Please use gfortran 4.6.0 or higher.)
	exit
endif
#Set correct X11 architecture
ifneq ($(ARCH),i686)
	$(info Warning: Compiling for 64 bit architecture.)
	X11=$(X11_64)
endif

all: $(EXEC_NAMES)

vmontecarlo: $(COMMON) $(COMMON_XRAY) vmontecarlo.f
	$(FORTRAN) $(FFLAGS) $(COMMON) $(COMMON_XRAY) vmontecarlo.f -o vmontecarlo

vnodes: $(COMMON) vnodes.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vnodes.f -o vnodes

vperturbations: $(COMMON) vperturbations.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vperturbations.f -o vperturbations

vposvneg: $(COMMON) vposvneg.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vposvneg.f -o vposvneg

vequivalent: $(COMMON) vequivalent.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vequivalent.f -o vequivalent

v2grid: $(COMMON) v2grid.f
	$(FORTRAN) $(FFLAGS) $(COMMON) v2grid.f -o v2grid

vin2xz: vin2xz.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vin2xz.f -o vin2xz

vmaxvmin: $(COMMON) vmaxvmin.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vmaxvmin.f -o vmaxvmin

rout2ray: $(COMMON) rout2ray.f
	$(FORTRAN) $(FFLAGS) rout2ray.f -o rout2ray

vzoom: $(COMMON) vnodlim.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vzoom.f -o vzoom

vnodlim: $(COMMON) vnodlim.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vnodlim.f -o vnodlim

vthresplot: $(COMMON) vthresplot.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vthresplot.f -o vthresplot

vparhist: $(COMMON) vparhist.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vparhist.f -o vparhist

vsum: $(COMMON) vsum.f
	$(FORTRAN) $(FFLAGS) $(COMMON) vsum.f -o vsum

.PHONY: clean
clean:
	rm -rf *.mod $(EXEC_NAMES)

.PHONY: install
install: all
	mv --target-directory=$(INSTALL_PATH) $(EXEC_NAMES)
