# Parameters.

include ../config.mk
include formats.mk

# Files which are always compiled and linked in

LOCALSOURCES = $(FORMATSOURCES) misc.c filt.c rdtape_eg.c main.c data_io.c \
	spectra.c
REMOTESOURCES = ../sunsort_src/data_queue.c

SOURCES = $(LOCALSOURCE) $(REMOTESOURCES)

# Files which are only linked if the user doesn't specify their own routine

OPTSOURCES = optional.c optuserinit.c optusersortin.c optuserfinish.c \
	optinit.c optsortin.c optfinish.c
OPTSOURCES2 =  optuserinitf.c optusersortinf.c optuserfinishf.c

# Files which are compiled differently depending on whether we're targetting
# a single processor or multi processor version

PROCSOURCES = spectra_buf.c spectra_proc.c

# Macro that expands to all sources

ALLSOURCES = $(SOURCES) $(PROCSOURCES) $(OPTSOURCES) $(OPTSOURCES2)

# Object macros

LOCALOBJECTS = $(LOCALSOURCES:%.c=%.o)
REMOTEOBJECTS = data_queue.o 
OBJECTS = $(LOCALOBJECTS) $(REMOTEOBJECTS)

SPOBJS = spectra_buf_sp.o spectra_proc_sp.o
MPOBJS = spectra_buf_mp.o spectra_proc_mp.o

OPTOBJS = $(OPTSOURCES:%.c=%.o)
OPTOBJS2 = $(OPTSOURCES2:%.c=%.o)

ALLOBJS = $(OBJECTS) $(SPOBJS) $(MPOBJS) $(OPTOBJS) $(OPTOBJS2)

# Compiler flags.

# for solaris 2.x
COPTFLAGS = $(OPTFLAG)
CFLAGS = $(PICFLAG) $(STDCFLAG) $(COPTFLAGS) -I../sunsort_src -D_REENTRANT
CPPFLAGS += 
LDFLAGS +=
LDLIBS += -lthread

SPFLAGS =
MPFLAGS = -DALLOW_MULTIPROCESS -DSPEC_COMMAND_QUEUE

# Standard targets.

all:	 $(ALLOBJS)

clean :
	-rm -f *.o */*.o core *~ *% *.prj inttypes.h
	-rmdir -s optimised debug profiled

install:
	-rm -f inttypes.h
	$(CC) -E /usr/include/inttypes.h | grep uintptr_t > /dev/null || \
		echo 'typedef unsigned int uintptr_t;' > inttypes.h
	$(MAKE) formats.mk
	-rm -f $(ALLOBJS)
	-test -d optimised || mkdir optimised
	for FILE in $(ALLOBJS); do ln -s optimised/$$FILE ; done
	$(MAKE) libsunsort.a libprocsort.a liboptsort.a liboptsort2.a \
		libsunsort.so libspsort.so libmpsort.so libprocsort.so
	-rm -f $(ALLOBJS)	
	-test -d debug || mkdir debug
	for FILE in $(ALLOBJS) ; do ln -s debug/$$FILE ; done
	$(MAKE) "COPTFLAGS=-g" libdbx_sunsort.a libdbx_procsort.a \
		libdbx_optsort.a libdbx_optsort2.a libdbx_sunsort.so \
		libdbx_spsort.so libdbx_mpsort.so libdbx_procsort.so
	@echo "sunsort libraries installed ..."
	-$(MAKE) checks

profile:
	$(MAKE) formats.mk
	-rm -f $(ALLOBJS)
	-test -d profiled || mkdir profiled
	for FILE in $(ALLOBJS) ; do ln -s profiled/$$FILE ; done
	$(MAKE) libpg_sunsort.a libpg_procsort.a libpg_optsort.a \
		libpg_optsort2.a

checks: externs.prj llib-lsunsort.ln

externs.prj: externs.f
	../ftnchek -library -project externs.f

llib-lsunsort.ln: externs.c externs-spec.c
	-lint -I../sunsort_src -osunsort externs.c externs-spec.c

llib-loptsort.ln: optional.c
	-lint -I../sunsort_src -ooptsort optional.c

libsunsort.a libdbx_sunsort.a libpg_sunsort.a: $(OBJECTS)
	-rm -f $@
	ar crv $@ `lorder $(OBJECTS) |tsort`
	@echo "make $@ ... completed"

# Statically linked code is always single processor
libprocsort.a libdbx_procsort.a libpg_procsort.a: $(SPOBJS)
	-rm -f $@
	ar crv $@ `lorder $(SPOBJS) |tsort`
	@echo "make $@ ... completed"

liboptsort.a libdbx_optsort.a libpg_optsort.a: $(OPTOBJS)
	-rm -f $@
	ar crv $@ `lorder $(OPTOBJS) |tsort`
	@echo "make $@ ... completed"

liboptsort2.a libdbx_optsort2.a libpg_optsort2.a: $(OPTOBJS2)
	-rm -f $@
	ar crv $@ `lorder $(OPTOBJS2) |tsort`
	@echo "make $@ ... completed"

libsunsort.so libdbx_sunsort.so: $(OBJECTS)
	-rm -f $@
	$(LINK.c) -o $@.$(SVERS) -G $(OBJECTS) -h $@.$(SVERS)
	ln -s $@.$(SVERS) $@
	@echo "make $@ ... completed"

libspsort.so libdbx_spsort.so: $(SPOBJS)
	-rm -f $@
	$(LINK.c) -o $@.$(SVERS) -G $(SPOBJS) -h $@.$(SVERS)
	ln -s $@.$(SVERS) $@
	@echo "make $@ ... completed"

libmpsort.so libdbx_mpsort.so: $(MPOBJS)
	-rm -f $@
	$(LINK.c) -o $@.$(SVERS) -G $(MPOBJS) -h $@.$(SVERS)
	ln -s $@.$(SVERS) $@
	@echo "make $@ ... completed"

libprocsort.so libdbx_procsort.so: $(SPOBJS)
	-rm -f $@
	LD_OPTIONS='-F $@.$(SVERS)' \
		$(LINK.c) -o $@.$(SVERS) -G -h $@.$(SVERS) -R `pwd` $(SPOBJS)
	ln -s $@.$(SVERS) $@
	@echo "make $@ ... completed"

#liboptsort.so libdbx_optsort.so: $(OPTOBJS)
#	-rm -f $@
#	$(LINK.c) -o $@.$(SVERS) -G $(OPTOBJS) -h $@.$(SVERS)
#	ln -s $@.$(SVERS) $@
#	@echo "make $@ ... completed"
#
#liboptsort2.so libdbx_optsort2.so: $(OPTOBJS2)
#	-rm -f $@
#	$(LINK.c) -o $@.$(SVERS) -G $(OPTOBJS2) -h $@.$(SVERS)
#	ln -s $@.$(SVERS) $@
#	@echo "make $@ ... completed"

lint:
	lint -DSVR4 -I../sunsort_src -m -u $(ALLSOURCES)

formats.mk formats.h: formats.lst makeformat
	./makeformat

data_queue.o: ../sunsort_src/data_queue.c ../sunsort_src/sort_def.h \
	../sunsort_src/sort_thread.h ../sunsort_src/data_queue.h
	$(COMPILE.c) -o $@ ../sunsort_src/data_queue.c

spectra_buf_sp.o: spectra_buf.c ../sunsort_src/sort_def.h \
	../sunsort_src/sort_thread.h ../sunsort_src/data_queue.h spectra_buf.h
	$(COMPILE.c) $(SPFLAGS) -o $@ spectra_buf.c

spectra_buf_mp.o: spectra_buf.c ../sunsort_src/sort_def.h \
	../sunsort_src/sort_thread.h ../sunsort_src/data_queue.h spectra_buf.h
	$(COMPILE.c) $(MPFLAGS) -o $@ spectra_buf.c

spectra_proc_sp.o: spectra_proc.c ../sunsort_src/sort_def.h \
	../sunsort_src/sort_thread.h ../sunsort_src/data_queue.h \
	../sunsort_src/eg.h data_io.h spectra.h spectraint.h spectra_buf.h
	$(COMPILE.c) $(SPFLAGS) -o $@ spectra_proc.c

spectra_proc_mp.o: spectra_proc.c ../sunsort_src/sort_def.h \
	../sunsort_src/sort_thread.h ../sunsort_src/data_queue.h \
	../sunsort_src/eg.h data_io.h spectra.h spectraint.h spectra_buf.h
	$(COMPILE.c) $(MPFLAGS) -o $@ spectra_proc.c

data_io.o: data_io.c ../sunsort_src/sort_def.h ../sunsort_src/sort_thread.h
data_io.o: ../sunsort_src/data_queue.h ../sunsort_src/eg.h data_io.h
data_io.o: main.h ../sunsort_src/version.h ../sunsort_src/data_queue.h

filt.o: filt.c ../sunsort_src/sort_def.h ../sunsort_src/sort_thread.h
filt.o: ../sunsort_src/data_queue.h rdtape.h formats.h data_io.h filt.h

main.o: main.c ../sunsort_src/sort_def.h ../sunsort_src/sort_thread.h
main.o: ../sunsort_src/data_queue.h rdtape.h formats.h data_io.h
main.o: spectraint.h filt.h spectra.h spectra_buf.h

misc.o: misc.c

optfinish.o: optfinish.c

optinit.o: optinit.c

optional.o: optional.c

optsortin.o: optsortin.c

optuserfinish.o: optuserfinish.c

optuserfinishf.o: optuserfinishf.c

optuserinit.o: optuserinit.c

optuserinitf.o: optuserinitf.c

optusersortin.o: optusersortin.c

optusersortinf.o: optusersortinf.c

rdtape_anu.o: rdtape_anu.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_demon.o: rdtape_demon.c ../sunsort_src/sort_def.h rdtape.h formats.h
rdtape_demon.o: rdtape_eg.h rdtape_eg_core.c ../sunsort_src/sort_def.h
rdtape_demon.o: rdtape.h rdtape_eg.h

rdtape_eg.o: rdtape_eg.c ../sunsort_src/sort_def.h rdtape.h formats.h
rdtape_eg.o: rdtape_eg.h

rdtape_eg_core.o: rdtape_eg_core.c ../sunsort_src/sort_def.h rdtape.h
rdtape_eg_core.o: formats.h rdtape_eg.h

rdtape_fsu.o: rdtape_fsu.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_fsupc.o: rdtape_fsupc.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_in2p3.o: rdtape_in2p3.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_jyfl.o: rdtape_jyfl.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_lbl.o: rdtape_lbl.c ../sunsort_src/sort_def.h
rdtape_lbl.o: ../sunsort_src/sort_thread.h ../sunsort_src/data_queue.h
rdtape_lbl.o: rdtape.h formats.h

rdtape_megha.o: rdtape_megha.c ../sunsort_src/sort_def.h rdtape.h formats.h
rdtape_megha.o: rdtape_eg.h rdtape_eg_core.c ../sunsort_src/sort_def.h
rdtape_megha.o: rdtape.h rdtape_eg.h

rdtape_none.o: rdtape_none.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_nscl.o: rdtape_nscl.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_nscljtm.o: rdtape_nscljtm.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_nsf.o: rdtape_nsf.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_nsf2.o: rdtape_nsf2.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_s4418.o: rdtape_s4418.c ../sunsort_src/sort_def.h rdtape.h formats.h

rdtape_user.o: rdtape_user.c ../sunsort_src/sort_def.h rdtape.h formats.h

spectra.o: spectra.c ../sunsort_src/sort_def.h ../sunsort_src/sort_thread.h
spectra.o: ../sunsort_src/data_queue.h ../sunsort_src/eg.h data_io.h
spectra.o: spectra.h spectraint.h spectra_buf.h
