#---------------------------------------------------------------------------
# Makefile for FIT and some related programs
#
# Markus Zolliker, Sept 2002
#--------------------------------------------------------------------------
-include make_deb
#NXFLAG is Y when NeXus should be used
NXF_Y = dat_nexus.o
NXF_ = dat_nexus_dum.o
F_OBJ = fit_main.o fit_win.o \
  cvt.o fit_merge.o fit_abskor.o fit_auto.o fit_mon.o \
  fit_bars.o fit_multiply.o inex.o \
  fit_command.o fit_out.o \
  dat_utils.o fit_connect.o fit_peak.o migrad.o \
  dat_fit3.o fit_cor.o fit_dat.o fit_print.o \
  dat_lnsp.o fit_exit.o fit_rel.o quick_sort.o \
  dat_init.o dat_open.o fit_export.o fit_scale.o simplex.o \
  dat_tasmad.o fit_file.o fit_set.o dat_ccl.o dat_5c2.o \
  dat_2t.o dat_rita.o dat_table.o dat_frm.o \
  dat_oldtas.o dat_sics.o dat_fullp.o fit_fit.o fit_style.o \
  fit_fix.o fit_subtract.o \
  fit_fun.o fifun.o fit_init.o fit_title.o \
  fit_list.o fit_user.o fit_range.o fit_array.o str.o \
  metaf.o intprt.o dat_ida.o dat_fda.o dat_d1a.o \
  gra.o fit_plot.o fit_bgedit.o cho.o \
  dat_xy.o dat_xys.o dat_xysm.o dat_inx.o dat_spec.o \
  sys_getenv.o sys_home.o sys_cmdpar.o sys_date.o sys_remote_host.o \
  sys_wait.o sys_lun.o sys_file.o sys_open.o sys_parse.o \
  $(NXF_$(NXFLAG)) $(NAPIF)
NXC_Y = napi_err.o dat_c.o
C_OBJ = sys_fun.o sys_unix.o \
  metac.o myc_str.o myc_err.o myc_tmp.o \
  sys_env.o sys_rdline.o sys_try.o \
  dat_tascom_dir.o main.o \
  $(NXC_$(NXFLAG))
LIB_OBJ = $(C_OBJ) $(F_OBJ) sys_fvi.o fit_help.o fit_vers.o

NXINC_Y=-I$(NXINC) -I$(NXHDF)
NXPATH_Y=:$(NXINC):$(NXHDF)
NXLIB_Y=$(NXLIB)
LL = $(PGLIB) $(RDLIB) $(NXLIB_$(NXFLAG))
LIB_a= $(LL)
LIB_so=
LIBFIT = libfit.$(LIB_TYPE)
LF = $(LIB_$(LIB_TYPE)) libfit.a

ARFLAGS = cr

.SUFFIXES: .o .c .f

F_OPT_D = $(F_DEB)
F_OPT_ = $(F_OPT)
FFLAGS = $(F_FLAGS) $(F_STRICT) $(F_OPT_$(DEB))
FFLAGSR = $(F_FLAGS) $(F_RELAXED) $(F_OPT_$(DEB))
CFLAGS = $(C_FLAGS) $(C_STRICT) -Isrc/gen
CFLAGSR = $(C_FLAGS) $(C_RELAXED) -Isrc/gen

VPATH = src/gen/$(SPECPATH):src/unix/:src/pgm/:./$(NXPATH_$(NXFLAG))

SUPBIN = cho_ terinq_ sumvar deteff clamp abskor3 csc addit subit \
  trics_ccl addchan addei polcal csvsumvar autofit fitlor

MAINBIN = fit $(ADD_ALL)

ALL = $(MAINBIN) $(LIBFIT) $(SUPBIN)

default: fit libfit.a $(LIBFIT) $(RDLIBSO)

all: $(ALL)

fit: fit.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF) $(LDFLAGS)

myfit: src/makefile_$(FIT_VERSION) src/make_gen src/gen/myfit_head
	cp -f src/gen/myfit_head ./myfit
	@echo '$(FC) $(FFLAGS) $$* $(INSTDIR)/lib/libfit.a $(LL) $(INSTDIR)/lib/libfit.a' >> myfit
	chmod +x myfit

libfit.a: $(LIB_OBJ) make_fdep $(CDEP)
	rm -f $@
	$(AR) $(ARFLAGS) $@ $(LIB_OBJ)
	ranlib $@

libfit.so: $(LIB_OBJ)
	rm -f libfit.so
	$(FC) $(FFLAGS) -shared -o libfit.so $(LIB_OBJ) $(LL)

dat_nexus.o: dat_nexus.f
	$(FC) $(FFLAGSR) $(NXINC_$(NXFLAG)) -c $F
dat_c.o: dat_c.c
	$(CC) $(CFLAGSR) $(NXINC_$(NXFLAG)) -c $C
napi_err.o: napi_err.c
	$(CC) $(CFLAGSR) $(NXINC_$(NXFLAG)) -c $C

sumvar: sumvar.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

csvsumvar: csvsumvar.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

csc: csc.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

deteff: deteff.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

clamp: clamp.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

abskor3: abskor3.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

addit: addit.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

addchan: addchan.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

subit: subit.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

autofit: autofit.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

fitvers: fitv.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

brows.o: brows.f
	$(FC) $(FFLAGSR) $(LDFLAGS) $(NXINC_$(NXFLAG)) -c $F

brows: brows.o $(LIBFIT)
	$(FC) $(FFLAGSR) $(LDFLAGS) -o $@ $Q $(LF)

cho_: chooser.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

terinq_: terinq.o $(LIBFIT)
	$(FC)  $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

tricslog: tricslog.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

trics_ccl: trics_ccl.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

addei: addei.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

polcal: polcal.o $(LIBFIT)
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q $(LF)

make_custom: make_custom.f make_fvi.f make_help.f make_vers.f str.o \
          sys_open.o sys_cmdpar.o sys_unix.o sys_getenv.o sys_env.o \
          myc_str.o myc_err.o myc_tmp.o
	$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $Q

fit_vers.f: make_custom fit.vers $(F_OBJ:.o=.f) $(C_OBJ:.o=.c)
	./make_custom src/gen/fit.vers

sys_fvi.c fit_help.f: make_custom lib.fvi fit.help
	./$Q

fitlor: src/gen/fitlor.py
	cp src/gen/fitlor.py fitlor

INSTBIN=$(INSTDIR)/bin
INSTLIB=$(INSTDIR)/lib

$(MAINBIN:%=$(INSTBIN)/%): $(MAINBIN)
	cp -f $(@:$(INSTBIN)/%=%) $@

$(SUPBIN:%=$(INSTBIN)/%): $(SUPBIN)
	cp -f $(@:$(INSTBIN)/%=%) $@

$(INSTLIB)/libfit.a: libfit.a
	cp -f libfit.a $(INSTLIB)/libfit.a

$(INSTLIB)/fitexample.f: src/gen/fitexample.f
	cp -f src/gen/fitexample.f $(INSTLIB)/fitexample.f

inst: $(MAINBIN:%=$(INSTBIN)/%) $(INSTLIB)/libfit.a $(INSTLIB)/fitexample.f

install: inst $(SUPBIN:%=$(INSTBIN)/%)

PRJS= $(F_OBJ:.o=.f) 

# "make check" will check everything that has been changed.
check:	fit.f $(PRJS)
	ftnchek -declare -source=dec-tab -notruncation -wrap=0 \
	-arguments=no-arrayness -nopure -nousage -quiet $Q

clean:
	rm -f *.o *.d *.df *.f *.c $(ALL) terinq make_custom \
	  make_fdep make_cdep libfit.so so_locations

purge_c:
	rm -f $(C_OBJ)

make_fdep: $(F_OBJ:.o=.f)
# search for include statements. the rest of the line is text processing
	@echo "determine Fortran include file dependencies"
	@echo $Q
	@grep "include.*'.*'" $Q | sed \
	  "s+:.*include.'\(.*\)'.*+: \1+g;s+.*/\(.*\)\.f:+\1.o: \1.f+g" \
	  | sort -u > make_fdep

make_cdep: $(C_OBJ:.o=.c)
	@echo "collect C include file dependencies"
	@- cat *.d | grep -v "/usr" > make_cdep

-include make_fdep
-include $(CDEP) $(C_OBJ:.o=.d)
