#
# define types of all source files and executables (defaults to C)
#

DX_MODULES = `grep MODULE dxmodules.mdf | sed -e "s/MODULE //g"`
SOURCE = dx++.c dxarray.c dxfield.c dxmodules.c dxinit.c dxmain.c dxcolor.c \
	 rgbtogif.c
EXEC = dxmodules dxexec++ rgbtogif
LIB_OBJECTS = dx++.o dxarray.o dxfield.o dxmodules.o dxcolor.o

include ../lib/make.init

CLEAN_FILES += dxmodules.h dxmain.ob dxexec++.c fractal.o fractal.exp \
	       $(DX_MODULES) dximodules.mdf
CFLAGS += -D$(ARCH)
LIBDIR += -L`pwd`

# uncomment the following 3 lines if you want to use a shared object file
#OLIB =
#IB_OBJECTS = fractal.o
#OB_OBJECTS = fractal.o

# inboard module libraries and objects
IB_LIB = -lDX -ly -ll -lX11 $(LIB)
IB_OBJECTS += dxexec++.o dxinit.o
IB_EXEC_DIR = $(INSTALL_DIR)

# outboard module libraries and objects
OB_LIB = -lDXlite $(LIB)
OB_OBJECTS += dxmain.o dxmain.ob

# targets

all: dx++.olib $(DXTARGET)

dxmodules.h:
	../bin/make-dxmodules dxmodules.mdf

rgbtogif: rgbtogif.o
	$(LINK.c) -o $@ rgbtogif.o $(OLIB) $(LIBDIR) -lpnm -lpbm -lpgm -lppm -lm -lg++

#
# rules for outboard module
#

dxmain.o: dxmodules.h

dxmain.ob:
	$(COMPILE.c) -xc -Dmain=dxmain -DUSERMODULE="(*dx_outboard_fn)" -c $(DX_OUTBOARD) -o dxmain.ob

dxoutboard: $(OB_OBJECTS) links
	$(LINK.c) -Xlinker -bE:$(DXDIR)/lib_$(ARCH)/dxexec.exp -o $@ $(OB_OBJECTS) $(OLIB) $(LIBDIR) $(OB_LIB)

links:
	@for i in $(DX_MODULES); do rm -f $$i; ln -s dxoutboard $$i; done

#
# rules for inboard module
#

dxexec++: dx++.olib $(IB_OBJECTS)
	$(LINK.c) -o $(IB_EXEC_DIR)/$@ $(IB_OBJECTS) $(OLIB) $(LIBDIR) $(IB_LIB)
	@-ln -s $(IB_EXEC_DIR)/$@ .
	@touch $@

dxexec++.o: dxexec++.c
	$(COMPILE.c) -xc -c dxexec++.c

# hack up module def file to call init functions
dxexec++.c: dximodules.mdf
	echo "#define _dxf_user_modules static void dxfum" > dxexec++.c
	mdf2c dximodules.mdf >> dxexec++.c
	echo "#undef _dxf_user_modules" >> dxexec++.c
	echo "void _dxf_user_modules() { extern void FractalInit(); FractalInit(); dxfum(); }" >> dxexec++.c

dximodules.mdf: dxmodules.mdf
	egrep -v OUTBOARD dxmodules.mdf > dximodules.mdf

# bogus stuff here
#dxexec++.exec: dx++.olib $(IB_OBJECTS) dximodules.mdf
#	ld -o $(IB_EXEC_DIR)/$@ -r -brename:main,new_main -brename:.main,.new_main
#	ln -s $(IB_EXEC_DIR)/$@ .
#	touch $@

#
# shared library of all modules (move this to root makefile?)
#
fractal.o: fractal.exp dx++.olib FORCE
	-echo "ld -o fractal.o ../lib/*.o -bE:fractal.exp -bM:SRE -T512 -H512 -L$(C++LIBDIR) -L$(C_LIBDIR) -L$(PNM_LIBDIR) -L$(DX_LIBDIR) -lDXlite -lpnm -lpbm -lpgm -lppm -lgcc -lg++ -lc -lm |& egrep -v WARNING" | csh -f -t

fractal.exp:
	/usr/ucb/nm -g ../lib/*.o | egrep -v " U " | sed -e "s/........ . //g" | sort | uniq > fractal.exp

FORCE:

# misc stuff

clean:	very.clean
