

#PREF_CCFLAGS 	+= $(CCOPTFLAG) ;		# Turn optimisation on
PREF_CCFLAGS    += $(CCDEBUGFLAG) ;		# Debugging flags
PREF_LINKFLAGS	+= $(LINKDEBUGFLAG) ;

# Compile .c as .m
if $(OS) = MACOSX {
	ObjectCcFlags dispwin : -ObjC ;
	ObjectCcFlags dispwin_dispwin : -ObjC ;
}

DEFINES += ENABLE_FTDI ;

MADVRSOURCE = ;

# Setup the right hardware access libraries
if $(NT) {
	MADVRSOURCE = madvrwin.c ;

	if $(USE_LIBUSB) = true {
		DEFINES += USE_LIBUSB ;
		if $(USE_LIBUSB1) = true {
			DEFINES += USE_LIBUSB1 ;
			LIBUSBDIR = ../libusb1 ;
			LIBUSBHDRS = ../libusb1 ;
			if $(MSVCNT) {
				LIBUSBHDRS += ../libusb1/msvc ;	# So stdint.h can be found
			}
			if $(LIBUSB_IS_DLL) = true {
				LIBUSB = $(LIBUSB1NAME)$(SUFIMPLIB) ;
				LIBUSBSH = $(LIBUSB1NAME)$(SUFSHLIB) ;
			} else {
				LIBUSB = $(LIBUSB1NAME)$(SUFLIB) ;
			}
		} else {
			LIBUSBDIR = ../libusbw ;
			LIBUSBHDRS = ../libusbw ;
			LIBUSB = libusb ;
		}
	} else {
		LIBUSBHDRS = ../usb/driver ;	# libusb-win32 kernel driver info
	}
}

if $(UNIX) {
	if $(USE_LIBUSB)  = true {
		DEFINES += USE_LIBUSB ;
		if $(USE_LIBUSB1) = true {
			DEFINES += USE_LIBUSB1 ;
			LIBUSBDIR = ../libusb1 ;
			LIBUSBHDRS = ../libusb1 ;
			if $(LIBUSB_IS_DLL) = true {
				LIBUSB = $(LIBUSB1NAME)$(SUFIMPLIB) ;
				LIBUSBSH = $(LIBUSB1NAME)$(SUFSHLIB) ;
			} else {
				LIBUSB = $(LIBUSB1NAME)$(SUFLIB) ;
			}
		} else {
			LIBUSBDIR = ../libusb ;
			LIBUSBHDRS = ../libusb ;
			LIBUSB = libusb ;
		}
	}
	CONVFILE = pollem.c ;
}

#Products
Libraries = libinsttypes libdisptechs libinst libdisp libconv libinstapp ;
Executables = dispwin synthcal dispread dispcal fakeread synthread
              chartread spotread illumread ccxxmake spec2cie average oeminst ;
Headers = inst.h ;
Samples = SOtele.sp linear.cal strange.cal ccxx.ti1 ;

#Install
InstallBin  $(DESTDIR)$(PREFIX)/bin : $(Executables) ;
InstallFile $(DESTDIR)$(PREFIX)/$(REFSUBDIR) : $(Samples) ;
#InstallFile $(DESTDIR)$(PREFIX)/h : $(Headers) ;
#InstallLib  $(DESTDIR)$(PREFIX)/lib : $(Libraries) ;

if $(UNIX) && $(OS) != MACOSX {
	# Micro Unix CMM for handling monitor profile association
	CMMHDRS = ../ucmm ;
	CMMLIBS = ../ucmm/libucmm ../jcnf/libjcnf ../yajl/libyajl ;
}

HDRS = ../h ../numlib ../icc ../cgats ../rspl ../xicc ../gamut ../spectro
       ../plot ../render ../ccast $(LIBUSBHDRS) $(CMMHDRS) ;

# Instrument access library library
SER_INSTS = dtp22.c dtp41.c dtp51.c ss.c ss_imp.c ;

USB_INSTS = dtp20.c i1disp.c i1d3.c i1pro.c i1pro_imp.c
                      munki.c munki_imp.c hcfr.c spyd2.c huey.c
                      colorhug.c ex1.c usbio.c hidio.c ;

FAST_SER_INSTS = specbos.c kleink10.c ;

SER_USB_INSTS = dtp92.c ;

if $(USE_SERIAL) = true {
	DEFINES += ENABLE_SERIAL ;
	INST_SRCS += $(SER_INSTS) ;
}

if $(USE_USB) = true {
	DEFINES += ENABLE_USB ;
	INST_SRCS += $(USB_INSTS) ;
}

if $(USE_FAST_SERIAL) = true || $(USE_SERIAL) = true {
	DEFINES += ENABLE_FAST_SERIAL ;
	INST_SRCS += $(FAST_SER_INSTS) ;
}

if $(USE_SERIAL) = true || $(USE_USB) = true {
	INST_SRCS += $(SER_USB_INSTS) ;
}

if $(USE_DEMOINST) = true && [ GLOB [ NormPaths . ] : demoinst.c ] {
	echo "Compiling demo instrument support" ;
	DEFINES += ENABLE_DEMOINST ;
	INST_SRCS += demoinst.c ;
}

Library libinst : inst.c insttypes.c icoms.c disptechs.c $(INST_SRCS) ;

# Display access library 
ObjectKeep mongoose.c ;
Library libdisp : dispsup.c dispwin.c webwin.c ccwin.c
                  $(MADVRSOURCE) : : : $(LibWinH) : mongoose ;

# Instrument and Display types utility functions library. Use these instead of libinst when */
# applications need to know about different instrument or display types, but not access them. */
# (Note we're working around a bug in Jam caused by objects shared between libraries)
Object insttypes2 : insttypes.c ;
LibraryFromObjects libinsttypes : insttypes2 ;

Object disptechs2 : disptechs.c ;
LibraryFromObjects libdisptechs : disptechs2 ;

# System utility functions (keyboard, msec_*, thread)
Library libconv : xdg_bds.c aglob.c conv.c base64.c $(CONVFILE) : : : $(LibWinH) ;

# Command line application instrument related convenience functions
Library libinstapp : instappsup.c ;

# Support file
#Object alphix : ../target/alphix.c ;

LINKLIBS = libinst libinstapp 
           ../xicc/libxcolorants ../xicc/libxicc
           ../gamut/libgamut
           ../rspl/librspl ../cgats/libcgats
           ../icc/libicc ../plot/libplot ../plot/libvrml
		   ../ccast/libccast ../ccast/axTLS/libaxtls ../yajl/libyajl ../render/librender
           $(TIFFLIB) $(JPEGLIB) $(PNGLIB) $(ZLIB)
           ../numlib/libui ../numlib/libnum
           $(CMMLIBS) libconv ;

if $(LIBUSB_IS_DLL) = true {
	LINKSHLIBS = $(LIBUSBDIR)/$(LIBUSB) ;
	File $(LIBUSBSH) : $(LIBUSBDIR)/$(LIBUSBSH) ;
	# executable needs .so/.dll in same directory
	NDepends $(Executables) : $(LIBUSBSH) ;
} else {
	LINKLIBS += $(LIBUSBDIR)/$(LIBUSB) ;
}

# General target reader program
Main chartread : chartread.c ../target/alphix.c : : : ../target : : ;

# Illuminant measurement
Main illumread : illumread.c : : : ../target : : ;

# Printed target spot reader utility
Main spotread : spotread.c : : : : : ;

# Test code
if $(HOME) = "d:\\usr\\graeme" && $(PWD) = "/src/argyll/spectro" {
	Main setoem : setoem.c : : : : : ../numlib/libui ;
}

# CCMX and CCSStool
Main ccxxmake : ccxxmake.c : : : : : libdisp ;

# Gretag Spectroscan/T filmstrip reader
#Main filmread : filmread.c : : : : : ;

# Create synthetic .cal
Main synthcal : synthcal.c ;

# Display calibration program
Main dispcal : dispcal.c : : : ../target : : libdisp ;

# Display tester program
Main dispread : dispread.c : : : : : libdisp ;

#display test window test/Lut loader utility
# [ Could avoid need for libinst libusb etc.
#   by separating system dependent utils to a separate library .] 
MainVariant dispwin : dispwin.c webwin.c ccwin.c $(MADVRSOURCE) : : STANDALONE_TEST : : mongoose : $(LibWin) ;

LINKLIBS = libinsttypes libdisptechs ../xicc/libxicc ../gamut/libgamut ../rspl/librspl
           ../cgats/libcgats ../icc/libicc ../plot/libplot ../numlib/libnum ../numlib/libui
           ../plot/libvrml ;

# Fake device print/read utility using ICC profile
Main fakeread : fakeread.c ;

# Synthetic device print/read utility
Main synthread : synthread.c ;

# Add CIE values to a spectral reading file
Main spec2cie : spec2cie.c ;

# Average RGB or CMYK .ti3 files
Main average : average.c ;

# Utility to install ccmx's, ccss's or install from OEM EDR files
Objects oemarch.c vinflate.c inflate.c LzmaDec.c mongoose.c ;
Main oeminst : oeminst.c : : : : oemarch vinflate inflate LzmaDec : libconv ;

# Generate linear.cal example/diagnostic
# (NoUpdate so that Cross Compile Win64 hack works)
NNoUpdate linear.cal ;
GenFileND linear.cal : synthcal [ NormPaths linear ] ;
NDepends exe : linear.cal ;	# Normally create it 

# Generate strange.cal example/diagnostic
# (NoUpdate so that Cross Compile Win64 hack works)
NNoUpdate strange.cal ;
GenFileND strange.cal : synthcal -s 0.7,1.0,0.9 -p 1.7,0.8,0.7 [ NormPaths strange ] ;
NDepends exe : strange.cal ;	# Normally create it 

# Dumy ti3 file generator for testing
#Main dumyti3 : dumyti3.c ;

# Test utility for XYZ matrix spectral correction
#Main xyzfix : xyzfix.c ;

# Individual stand alone test of xdg_bds library
MainVariant xdg_bds : xdg_bds.c : : STANDALONE_TEST : : : libconv ;

# Simple test code of aglob
#Main globtest : globtest.c : : : : : libconv ;

# fp conversion code test
#Main fp : fp.c ;

# test code
#Main t : t.c ;
#Main tt : tt.c ;
#Main ttt : ttt.c ;
#Main t1 : t1.c ;
#Main tt : tt.c ;
#Main t8 : t8.c ;
#Main t9 : t9.c ;
#Main i1d3eval : i1d3eval.c ;


# Test code
if $(HOME) = "d:\\usr\\graeme" && $(PWD) = "/src/argyll/spectro" {
	# /SUBSYSTEM:WINDOWS on NT link ?
#	GuiBin oemdnld ;
	Main oemdnld : oemdnld.c : : : : oemarch vinflate inflate LzmaDec mongoose : libconv ;
#	Main fakeindev : fakeindev.c ;
#	Main cmtest : cmtest.c : : : : : libconv ;
#	Main webdisp : webdisp.c : : : : : libconv ;
}

if $(OLD_GRETAG) && $(UNIX) && $(OS) != MACOSX {

	# test for parsing a VISE archive
	Main visetest : visetest.c vinflate.c ;

	# Compute deconvolution filter for i1pro
	#Main i1deconv : i1deconv.c ;

	# Compute stray light calibration for i1pro
	#Main i1stray : i1stray.c ;
}

