# -*- Makefile -*-
# NOTE: this file requires GNU Make.
#
#PLAT = unix
#PRIV = install-private-headers
#
# Linux:
#LDFLAGS = -L/usr/X11R6/lib -lX11 -ldl -lm # -lpthread
#
# Mac OS X:
#LDFLAGS = -framework CoreFoundation -L/usr/X11R6/lib -lX11 -weak-lXss -lXext
#LDFLAGS = -framework CoreFoundation -framework Carbon -framework IOKit
#LDSTRIP = -x

EXTDIR = ../../../../8.x
STATIC = --disable-shared --enable-static
OUTDIR = $(shell pwd)/build
OBJ    = $(OUTDIR)/zvfs$O $(OUTDIR)/zlib$O $(OUTDIR)/usb$O \
	 $(OUTDIR)/g2lite$O $(OUTDIR)/swt$O $(OUTDIR)/csr_test$O
GUIOBJ ?= $(OBJ) $(OUTDIR)/tclAppInit$O
TCLDIR = --with-tcl=$(OUTDIR)/lib --prefix=$(OUTDIR) --exec-prefix=$(OUTDIR)
STRIP ?= strip
UPX   ?= :
O     ?=.o
A     ?=.a
SO    ?=.so

BLT_OPTS = --disable-threads
VFS_OPTS = --disable-threads
TDOM_OPTS = --disable-threads
TCLX_OPTS = --disable-threads
XOTCL_OPTS = --disable-threads
SQLITE_OPTS = --disable-threads
ZLIB_OPTS = --prefix=$(OUTDIR)
LIBUSB_OPTS = --prefix=$(OUTDIR)

tclkit-gui$(EXE): kit-gui$(EXE) ../../setupvfs.tcl build/files
	cp kit-gui$(EXE) $@
	sleep 3
	$(STRIP) $@
	$(UPX) $@
	./kit-gui -init- ../../setupvfs.tcl $(KIT_OPTS) $@ gui

ifeq ($(PLAT), win)
kit-gui$(EXE): build/tcl build/tk build/blt build/tclvfs build/zlib \
	build/tdom build/tcllib build/xotcl build/sqlite build/libusb-win32 $(GUIOBJ)
	$(CC) -o $@ $(CFLAGS) ../../kitInit.c $(GUIOBJ) \
	  -Ibuild/include -DKIT_LITE -DSTATIC_BUILD \
	  build/lib/vfs1*/*vfs1*$A \
	  -DKIT_INCLUDES_TK build/lib/*tk8*$A \
	  build/lib/libz$A build/lib/libusb$A \
	  build/lib/*tcl8*$A \
	  build/lib/BLT2*/*BLT2*$A \
	  build/lib/tdom0*/*tdom0*$A \
	  build/lib/sqlite3*/*sqlite3*$A \
	  build/lib/xotcl1*/*xotcl1*$A \
	  $(LDFLAGS) $(GUI_OPTS)
else
kit-gui$(EXE): build/tcl build/tk build/blt build/tclvfs build/zlib \
	build/tdom build/tcllib build/xotcl build/sqlite build/libusb $(GUIOBJ)
	$(CC) -o $@ $(CFLAGS) ../../kitInit.c $(GUIOBJ) \
	  -Ibuild/include -DKIT_LITE -DSTATIC_BUILD \
	  build/lib/vfs1*/*vfs1*$A \
	  -DKIT_INCLUDES_TK build/lib/*tk8*$A \
	  build/lib/libz$A build/lib/libusb$A \
	  build/lib/*tcl8*$A \
	  build/lib/BLT2*/*BLT2*$A \
	  build/lib/tdom0*/*tdom0*$A \
	  build/lib/sqlite3*/*sqlite3*$A \
	  build/lib/xotcl1*/*xotcl1*$A \
	  $(LDFLAGS) $(GUI_OPTS)
endif

build/files:
	mkdir -p $@ && cd $@ && ln -s ../../../../files/* .

build/tcl:
	mkdir -p $@ && cd $@ && CFLAGS="$(CFLAGS)" && export CFLAGS && \
	  sh ../../../tcl/$(PLAT)/configure $(STATIC) $(TCL_OPTS) \
	    --prefix=$(OUTDIR) --exec-prefix=$(OUTDIR) && \
	  $(MAKE) install-binaries install-libraries $(PRIV)

build/tk: build/tcl
	mkdir -p $@ && cd $@ && CFLAGS="$(CFLAGS)" && export CFLAGS && \
	  sh ../../../tk/$(PLAT)/configure $(STATIC) $(TCLDIR) $(TK_OPTS) && \
	  $(MAKE) install-binaries install-libraries $(PRIV)

build/blt: build/tk
	mkdir -p $@ && cd $@ && CFLAGS="$(CFLAGS)" && export CFLAGS && \
	  sh $(EXTDIR)/blt/configure $(STATIC) $(TCLDIR) $(BLT_OPTS) && \
	  $(MAKE) install-binaries install-libraries

build/tclvfs: build/tcl
	mkdir -p $@ && cd $@ && CFLAGS="$(CFLAGS)" && export CFLAGS && \
	  sh $(EXTDIR)/tclvfs/configure $(STATIC) $(TCLDIR) $(VFS_OPTS) && \
	  $(MAKE) install

build/zlib: build/tcl
	cp -R ../../8.x/zlib/. $@
	cd $@ && CFLAGS="$(CFLAGS)" && export CFLAGS && \
	  sh $(EXTDIR)/zlib/configure $(ZLIB_OPTS) && \
	  $(MAKE) install

build/libusb-win32: build/tcl
	cp -R ../../8.x/libusb-win32/. $@
	cd $@ && $(MAKE) && cp libusb.a ../lib/ && cp lusb0_usb.h ../include/usb.h

build/libusb: build/tcl
	cp -R ../../8.x/libusb/. $@
	cd $@ && CFLAGS="$(CFLAGS)" && export CFLAGS && \
	  sh configure $(LIBUSB_OPTS) && \
	  $(MAKE) && $(MAKE) install

build/tdom: build/tcl
	mkdir -p $@ && cd $@ && CFLAGS="$(CFLAGS)" && export CFLAGS && \
	  sh $(EXTDIR)/tdom/configure $(STATIC) $(TCLDIR) $(TDOM_OPTS) && \
	  $(MAKE) install

build/tcllib: build/tcl
	mkdir -p $@ && cd $@ && CFLAGS="$(CFLAGS)" && export CFLAGS && \
	  sh $(EXTDIR)/tcllib/configure $(STATIC) $(TCLDIR) $(TCLLIB_OPTS) && \
	  $(MAKE) install-libraries

build/xotcl: build/tcl
	mkdir -p $@ && cd $@ && CFLAGS="$(CFLAGS)" && export CFLAGS && \
	  sh $(EXTDIR)/xotcl/configure $(STATIC) $(TCLDIR) $(XOTCL_OPTS) && \
	  $(MAKE) install-binaries

build/sqlite: build/tcl
	mkdir -p $@ && cd $@ && CFLAGS="$(CFLAGS)" && export CFLAGS && \
	  sh $(EXTDIR)/sqlite/tea/configure $(STATIC) $(TCLDIR) $(SQLITE_OPTS) && \
	  $(MAKE) install-binaries

base: build/tcl build/tk
	ls -l build/bin

tidy: cleanext
	rm -rf build/tcl build/tk build/tkdyn

cleanext:
	rm -rf build/tclvfs build/thread build/zlib build/*.o
	rm -rf build/lib/vfs* build/lib/thread*

clean:
	rm -rf build kit-gui$(EXE)

distclean: clean
	rm -f tclkit-gui$(EXE)

.PHONY: all base clean distclean threaded tidy

$(OUTDIR)/zvfs$O: ../../zvfs.c
	$(CC) -o $@ $(CFLAGS) -DHAVE_UNISTD_H=1 -DSTATIC_BUILD -Ibuild/include -c $<

$(OUTDIR)/zlib$O: ../../zlib.c
	$(CC) -o $@ $(CFLAGS) -DSTATIC_BUILD -Ibuild/include -c $<

$(OUTDIR)/g2lite$O: ../../g2lite.c
	$(CC) -o $@ $(CFLAGS) -DSTATIC_BUILD -Ibuild/include -c $<

$(OUTDIR)/usb$O: ../../usb.c
	$(CC) -o $@ $(CFLAGS) -DSTATIC_BUILD -Ibuild/include -c $<

$(OUTDIR)/swt$O: ../../swt.c
	$(CC) -o $@ $(CFLAGS) -DSTATIC_BUILD -Ibuild/include -c $<

$(OUTDIR)/csr_test$O: ../../csr_test.c
	$(CC) -o $@ $(CFLAGS) -DSTATIC_BUILD -Ibuild/include -c $<

$(OUTDIR)/tclAppInit$O: ../tcl/$(PLAT)/tclAppInit.c
	$(CC) -o $@ $(CFLAGS) -DSTATIC_BUILD -Ibuild/include \
	  -DTCL_LOCAL_APPINIT=TclKit_AppInit -c $<

$(OUTDIR)/winMain$O: ../tk/$(PLAT)/winMain.c
	$(CC) -o $@ $(CFLAGS) -DSTATIC_BUILD -Ibuild/include \
	  -DTK_LOCAL_APPINIT=TclKit_AppInit -c $<

$(OUTDIR)/tclkit.res.o: ../../tclkit.rc
	cp $< build/tk/tclkit.rc
	windres -o $@ --define STATIC_BUILD --define TCLKIT_WITH_TK \
	  --define BASE_NO_TK_ICON --include build/include \
	  --include build/tk --include ../../files --include ../tk/win/rc \
	  build/tk/tclkit.rc

$(OUTDIR)/tclkitsh.res.o: ../../tclkit.rc
	windres -o $@ --define STATIC_BUILD --include build/include \
	  --include ../../files $<
