#*******************************************************************************
#  Copyright (c) 2009, 2013 IBM Corp.
# 
#  All rights reserved. This program and the accompanying materials
#  are made available under the terms of the Eclipse Public License v1.0
#  and Eclipse Distribution License v1.0 which accompany this distribution. 
# 
#  The Eclipse Public License is available at 
#     http://www.eclipse.org/legal/epl-v10.html
#  and the Eclipse Distribution License is available at 
#    http://www.eclipse.org/org/documents/edl-v10.php.
# 
#  Contributors:
#     Ian Craggs - initial API and implementation and/or initial documentation
#     Allan Stockdill-Mander - SSL updates
#     Andy Piper - various fixes
#*******************************************************************************/

# Build output is produced in the current directory.

# MQTTCLIENT_DIR must point to the base directory containing the MQTT client source code.
# Example:  make -f makefile MQTTCLIENT_DIR=V3Client/MQTTClient

# Note: this makefile requires gnu make which you may need to obtain if compiling on AIX or Solaris
# Note: on OS X you should install XCode and the associated command-line tools

ifndef MQTTCLIENT_DIR
  MQTTCLIENT_DIR = $(CURDIR)
endif

ifndef SSL_DIR
  SSL_DIR = ${MQTTCLIENT_DIR}/../../../../source/openssl-1.0.1c/
endif

ifndef SAMPLES_DIR
SAMPLES_DIR = ${SSL_DIR}/../com.ibm.mq.mqxr.listener/SDK/clients/c/samples/
endif

MQTTLIB = mqttv3c
VPATH   = ${MQTTCLIENT_DIR}  
ALL_SOURCE_FILES = $(wildcard $(MQTTCLIENT_DIR)/*.c)
SOURCE_FILES = $(filter-out $(MQTTCLIENT_DIR)/MQTTAsync.c $(MQTTCLIENT_DIR)/MQTTVersion.c $(MQTTCLIENT_DIR)/SSLSocket.c, $(ALL_SOURCE_FILES))
ALL_HEADERS = $(MQTTCLIENT_DIR)/*.h
HEADERS = $(filter-out $(MQTTCLIENT_DIR)/MQTTAsync.h, $(ALL_HEADERS))

MQTTLIB_S = mqttv3cs
SOURCE_FILES_S = $(filter-out $(MQTTCLIENT_DIR)/MQTTAsync.c $(MQTTCLIENT_DIR)/MQTTVersion.c, $(ALL_SOURCE_FILES))

MQTTLIB_A = mqttv3a
SOURCE_FILES_A = $(filter-out $(MQTTCLIENT_DIR)/MQTTClient.c $(MQTTCLIENT_DIR)/MQTTVersion.c $(MQTTCLIENT_DIR)/SSLSocket.c, $(ALL_SOURCE_FILES))
HEADERS_A = $(MQTTCLIENT_DIR)/*.h

MQTTLIB_AS = mqttv3as
SOURCE_FILES_AS = $(filter-out $(MQTTCLIENT_DIR)/MQTTClient.c $(MQTTCLIENT_DIR)/MQTTVersion.c, $(ALL_SOURCE_FILES))

# In most cases the targets will be built for the native platform. However, to allow for cross compiling,
# a target platform variable can be set to override the platform choice. If this variable is set to
# a recognised string (currently just 'Arm') the appropriate values of OSTYPE and MACHINETYPE are set.
ifeq ($(TARGET_PLATFORM),Arm)
	OSTYPE = Linux
	MACHINETYPE = Arm
else
	ifeq ($(OS),Windows_NT)
		OSTYPE = $(OS)
	else
		OSTYPE = $(shell uname -s)
		MACHINETYPE = $(shell uname -m)
	endif
endif

ifeq ($(OSTYPE),Linux)

ifeq ($(MACHINETYPE),x86_64)
	CC = gcc

	CCFLAGS_SO = -fPIC -Os -Wall -I ${SSL_DIR}/include -fvisibility=hidden
	CCFLAGS_EXE = -I ${MQTTCLIENT_DIR}
	LDFLAGS = -shared -Wl,-soname,lib${MQTTLIB}.so
	LDFLAGS_S = -shared -Wl,-soname,lib${MQTTLIB_S}.so -ldl -Wl,-whole-archive -L${SSL_DIR}/output/lib -lcrypto -lssl -Wl,-no-whole-archive
	LDFLAGS_A = -shared -Wl,-soname,lib${MQTTLIB_A}.so
	LDFLAGS_AS = -shared -Wl,-soname,lib${MQTTLIB_AS}.so -ldl -Wl,-whole-archive -L${SSL_DIR}/output/lib -lcrypto -lssl -Wl,-no-whole-archive
	LDFLAGS_EXE = -lpthread

	MQTTLIB_IA64 = linux_ia64/lib${MQTTLIB}.so
	MQTTLIB_IA64_S = linux_ia64/lib${MQTTLIB_S}.so
	MQTTLIB_IA64_A = linux_ia64/lib${MQTTLIB_A}.so
	MQTTLIB_IA64_AS = linux_ia64/lib${MQTTLIB_AS}.so

ifdef BUILD_SAMPLES
all: linux_ia64 ${MQTTLIB_IA64} ${MQTTLIB_IA64_A} ${MQTTLIB_IA64_S} ${MQTTLIB_IA64_AS} samples
else
all: linux_ia64 ${MQTTLIB_IA64} ${MQTTLIB_IA64_A} ${MQTTLIB_IA64_S} ${MQTTLIB_IA64_AS}
endif

linux_ia64:
	-mkdir linux_ia64

samples:
	-mkdir ${SAMPLES_DIR}/linux_ia64
	${CC} -m64 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/linux_ia64 -o ${SAMPLES_DIR}/linux_ia64/MQTTV3Sample ${SAMPLES_DIR}/MQTTV3Sample.c -lmqttv3c -lpthread
	${CC} -m64 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/linux_ia64 -o ${SAMPLES_DIR}/linux_ia64/MQTTV3SSample ${SAMPLES_DIR}/MQTTV3SSample.c -lmqttv3cs -lpthread
	${CC} -m64 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/linux_ia64 -o ${SAMPLES_DIR}/linux_ia64/MQTTV3ASample ${SAMPLES_DIR}/MQTTV3ASample.c -lmqttv3a -lpthread
	${CC} -m64 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/linux_ia64 -o ${SAMPLES_DIR}/linux_ia64/MQTTV3ASSample ${SAMPLES_DIR}/MQTTV3ASSample.c -lmqttv3as -lpthread

${MQTTLIB_IA64}: ${SOURCE_FILES} ${HEADERS}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS} -o $@ ${SOURCE_FILES}
	strip $@

${MQTTLIB_IA64_S}: ${SOURCE_FILES_S} ${HEADERS}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS_S} -o $@ ${SOURCE_FILES_S} -DOPENSSL
	strip $@

${MQTTLIB_IA64_A}: ${SOURCE_FILES_A} ${HEADERS_A}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS_A} -o $@ ${SOURCE_FILES_A}
	strip $@

${MQTTLIB_IA64_AS}: ${SOURCE_FILES_AS} ${HEADERS_A}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS_AS} -o $@ ${SOURCE_FILES_AS} -DOPENSSL
	strip $@

else
ifeq ($(MACHINETYPE),ppc64)
	CC = gcc

	CCFLAGS_SO = -fPIC -Os -Wall -I ${SSL_DIR}/include -fvisibility=hidden
	CCFLAGS_EXE = -I ${MQTTCLIENT_DIR}
	LDFLAGS = -shared -Wl,-soname,lib${MQTTLIB}.so
	LDFLAGS_S = -shared -Wl,-soname,lib${MQTTLIB_S}.so -ldl -Wl,-whole-archive -L${SSL_DIR}/output/lib -lcrypto -lssl -Wl,-no-whole-archive
	LDFLAGS_A = -shared -Wl,-soname,lib${MQTTLIB_A}.so
	LDFLAGS_AS = -shared -Wl,-soname,lib${MQTTLIB_AS}.so -ldl -Wl,-whole-archive -L${SSL_DIR}/output/lib -lcrypto -lssl -Wl,-no-whole-archive
	LDFLAGS_EXE = -lpthread

	MQTTLIB_PPC64 = linux_ppc64/lib${MQTTLIB}.so
	MQTTLIB_PPC64_S = linux_ppc64/lib${MQTTLIB_S}.so
	MQTTLIB_PPC64_A = linux_ppc64/lib${MQTTLIB_A}.so
	MQTTLIB_PPC64_AS = linux_ppc64/lib${MQTTLIB_AS}.so

all: linux_ppc64 ${MQTTLIB_PPC64} ${MQTTLIB_PPC64_A} #${MQTTLIB_PPC64_S} ${MQTTLIB_PPC64_AS}

linux_ppc64:
	-mkdir linux_ppc64

${MQTTLIB_PPC64}: ${SOURCE_FILES} ${HEADERS}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS} -o $@ ${SOURCE_FILES}
	strip $@

${MQTTLIB_PPC64_S}: ${SOURCE_FILES_S} ${HEADERS}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS_S} -o $@ ${SOURCE_FILES_S} -DOPENSSL
	strip $@

${MQTTLIB_PPC64_A}: ${SOURCE_FILES_A} ${HEADERS_A}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS_A} -o $@ ${SOURCE_FILES_A}
	strip $@

${MQTTLIB_PPC64_AS}: ${SOURCE_FILES_AS} ${HEADERS_A}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS_AS} -o $@ ${SOURCE_FILES_AS} -DOPENSSL
	strip $@

else
ifeq ($(MACHINETYPE),s390x)
  CC 	   = gcc

  CCFLAGS_SO = -fPIC -Os -Wall -DREVERSED -fvisibility=hidden
  CCFLAGS_EXE = -I ${MQTTCLIENT_DIR}
  LDFLAGS = -shared -Wl,-soname,lib${MQTTLIB}.so
  LDFLAGS_EXE = -lpthread

  MQTTLIB_390 = linux_s390x/lib${MQTTLIB}.so

  all: ${MQTTLIB_390}

${MQTTLIB_390}: ${SOURCE_FILES} ${HEADERS}
	-mkdir linux_s390x
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS} -o $@ ${SOURCE_FILES}
	strip $@

else
ifeq ($(MACHINETYPE),Arm)

	CC = gcc
	# ARM_GLIBC_CC = arm-linux-gcc
	# ARM_UCLIBC_CC = ~/x-tools/arm-unknown-linux-uclibcgnueabi/bin/arm-unknown-linux-uclibcgnueabi-gcc

	ifndef ARM_GLIBC_CC
		ARM_GLIBC_CC = arm-linux-gcc
	endif
	ifndef ARM_UCLIBC_CC
		ARM_UCLIBC_CC = arm-unknown-linux-uclibcgnueabi-gcc
	endif

	ifndef ARM_GLIBC_STRIP
		ARM_GLIBC_STRIP = $(subst -gcc,-strip,${ARM_GLIBC_CC})
	endif
	ifndef ARM_UCLIBC_STRIP
		ARM_UCLIBC_STRIP = $(subst -gcc,-strip,${ARM_UCLIBC_CC})
	endif

	CCFLAGS_SO = -fPIC -Os -Wall -fvisibility=hidden
	CCFLAGS_EXE = -I ${MQTTCLIENT_DIR}
	LDFLAGS = -shared -Wl,-soname,lib${MQTTLIB}.so
	LDFLAGS_EXE = -lpthread

	MQTTLIB_ARM_GLIBC = linux_ARM_glibc/lib${MQTTLIB}.so
	MQTTLIB_ARM_UCLIBC = linux_ARM_uclibc/lib${MQTTLIB}.so

	MQTTLIB_ARM_GLIBC_A = linux_ARM_glibc/lib${MQTTLIB_A}.so
	MQTTLIB_ARM_UCLIBC_A = linux_ARM_uclibc/lib${MQTTLIB_A}.so

all: ${MQTTLIB_ARM_GLIBC} ${MQTTLIB_ARM_UCLIBC}

${MQTTLIB_ARM_GLIBC}: ${SOURCE_FILES} ${HEADERS}
	-mkdir linux_ARM_glibc
	${ARM_GLIBC_CC} ${CCFLAGS_SO} ${LDFLAGS} -o $@ ${SOURCE_FILES}
	${ARM_GLIBC_STRIP} $@

${MQTTLIB_ARM_UCLIBC}: ${SOURCE_FILES} ${HEADERS}
	-mkdir linux_ARM_uclibc
	${ARM_UCLIBC_CC} ${CCFLAGS_SO} ${LDFLAGS} -o $@ ${SOURCE_FILES}
	${ARM_UCLIBC_STRIP} $@

else

	CC = gcc

	CCFLAGS_SO = -fPIC -Os -Wall -I ${SSL_DIR}/include -fvisibility=hidden
	CCFLAGS_EXE = -I ${MQTTCLIENT_DIR}
	LDFLAGS = -shared -Wl,-soname,lib${MQTTLIB}.so
	LDFLAGS_S = -shared -Wl,-soname,lib${MQTTLIB_S}.so -ldl -Wl,-whole-archive -L${SSL_DIR}/output/lib -lcrypto -lssl -Wl,-no-whole-archive
	LDFLAGS_A = -shared -Wl,-soname,lib${MQTTLIB_A}.so
	LDFLAGS_AS = -shared -Wl,-soname,lib${MQTTLIB_AS}.so -ldl -Wl,-whole-archive -L/${SSL_DIR}/output/lib -lcrypto -lssl -Wl,-no-whole-archive
	LDFLAGS_EXE = -lpthread

	MQTTLIB_IA32 = linux_ia32/lib${MQTTLIB}.so
	MQTTLIB_IA32_S = linux_ia32/lib${MQTTLIB_S}.so
	MQTTLIB_IA32_A = linux_ia32/lib${MQTTLIB_A}.so
	MQTTLIB_IA32_AS = linux_ia32/lib${MQTTLIB_AS}.so

ifdef BUILD_SAMPLES
all: linux_ia32 ${MQTTLIB_IA32_A} ${MQTTLIB_IA32} ${MQTTLIB_IA32_S} ${MQTTLIB_IA32_AS} samples
else
all: linux_ia32 ${MQTTLIB_IA32_A} ${MQTTLIB_IA32} ${MQTTLIB_IA32_S} ${MQTTLIB_IA32_AS}
endif

samples:
	-mkdir ${SAMPLES_DIR}/linux_ia32
	${CC} -m32 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/linux_ia32 -o ${SAMPLES_DIR}/linux_ia32/MQTTV3Sample ${SAMPLES_DIR}/MQTTV3Sample.c -lmqttv3c -lpthread
	${CC} -m32 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/linux_ia32 -o ${SAMPLES_DIR}/linux_ia32/MQTTV3SSample ${SAMPLES_DIR}/MQTTV3SSample.c -lmqttv3cs -lpthread
	${CC} -m32 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/linux_ia32 -o ${SAMPLES_DIR}/linux_ia32/MQTTV3ASample ${SAMPLES_DIR}/MQTTV3ASample.c -lmqttv3a -lpthread
	${CC} -m32 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/linux_ia32 -o ${SAMPLES_DIR}/linux_ia32/MQTTV3ASSample ${SAMPLES_DIR}/MQTTV3ASSample.c -lmqttv3as -lpthread

linux_ia32:
	-mkdir linux_ia32

${MQTTLIB_IA32}: ${SOURCE_FILES} ${HEADERS}
	${CC} -m32 ${CCFLAGS_SO} ${LDFLAGS} -o $@ ${SOURCE_FILES}
	strip $@

${MQTTLIB_IA32_S}: ${SOURCE_FILES_S} ${HEADERS}
	${CC} -m32 ${CCFLAGS_SO} ${LDFLAGS_S} -o $@ ${SOURCE_FILES_S} -DOPENSSL
	strip $@

${MQTTLIB_IA32_A}: ${SOURCE_FILES_A} ${HEADERS_A}
	${CC} -m32 ${CCFLAGS_SO} ${LDFLAGS_A} -o $@ ${SOURCE_FILES_A}
	strip $@

${MQTTLIB_IA32_AS}: ${SOURCE_FILES_AS} ${HEADERS_A}
	${CC} -m32 ${CCFLAGS_SO} ${LDFLAGS_AS} -o $@ ${SOURCE_FILES_AS} -DOPENSSL
	strip $@
endif

endif

endif

endif

endif

ifeq ($(OSTYPE),Darwin)

ifeq ($(MACHINETYPE),x86_64)
	CC = gcc

	CCFLAGS_SO = -fPIC -Os -Wall -I ${SSL_DIR}/include
	CCFLAGS_EXE = -I ${MQTTCLIENT_DIR}
	LDFLAGS = -shared -Wl,-install_name,lib${MQTTLIB}.so
	LDFLAGS_S = -shared -Wl,-install_name,lib${MQTTLIB_S}.so -ldl -Wl,-all_load -L${SSL_DIR}/lib -lcrypto -lssl
	LDFLAGS_A = -shared -Wl,-install_name,lib${MQTTLIB_A}.so
	LDFLAGS_AS = -shared -Wl,-install_name,lib${MQTTLIB_AS}.so -ldl -Wl,-all_load -L${SSL_DIR}/lib -lcrypto -lssl
	LDFLAGS_EXE = -lpthread

	MQTTLIB_IA64 = darwin_ia64/lib${MQTTLIB}.so
	MQTTLIB_IA64_S = darwin_ia64/lib${MQTTLIB_S}.so
	MQTTLIB_IA64_A = darwin_ia64/lib${MQTTLIB_A}.so
	MQTTLIB_IA64_AS = darwin_ia64/lib${MQTTLIB_AS}.so

ifdef BUILD_SAMPLES
all: darwin_ia64 ${MQTTLIB_IA64} ${MQTTLIB_IA64_A} ${MQTTLIB_IA64_S} ${MQTTLIB_IA64_AS} samples
else
all: darwin_ia64 ${MQTTLIB_IA64} ${MQTTLIB_IA64_A} ${MQTTLIB_IA64_S} ${MQTTLIB_IA64_AS}
endif

darwin_ia64:
	-mkdir darwin_ia64

samples:
	-mkdir ${SAMPLES_DIR}/darwin_ia64
	${CC} -m64 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/darwin_ia64 -o ${SAMPLES_DIR}/darwin_ia64/MQTTV3Sample ${SAMPLES_DIR}/MQTTV3Sample.c -lmqttv3c -lpthread
	${CC} -m64 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/darwin_ia64 -o ${SAMPLES_DIR}/darwin_ia64/MQTTV3SSample ${SAMPLES_DIR}/MQTTV3SSample.c -lmqttv3cs -lpthread
	${CC} -m64 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/darwin_ia64 -o ${SAMPLES_DIR}/darwin_ia64/MQTTV3ASample ${SAMPLES_DIR}/MQTTV3ASample.c -lmqttv3a -lpthread
	${CC} -m64 -I ${MQTTCLIENT_DIR} -L ${MQTTCLIENT_DIR}/darwin_ia64 -o ${SAMPLES_DIR}/darwin_ia64/MQTTV3ASSample ${SAMPLES_DIR}/MQTTV3ASSample.c -lmqttv3as -lpthread

${MQTTLIB_IA64}: ${SOURCE_FILES} ${HEADERS}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS} -o $@ ${SOURCE_FILES}
	strip -x $@

${MQTTLIB_IA64_S}: ${SOURCE_FILES_S} ${HEADERS}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS_S} -o $@ ${SOURCE_FILES_S} -DOPENSSL
	strip -x $@

${MQTTLIB_IA64_A}: ${SOURCE_FILES_A} ${HEADERS_A}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS_A} -o $@ ${SOURCE_FILES_A}
	strip -x $@

${MQTTLIB_IA64_AS}: ${SOURCE_FILES_AS} ${HEADERS_A}
	${CC} -m64 ${CCFLAGS_SO} ${LDFLAGS_AS} -o $@ ${SOURCE_FILES_AS} -DOPENSSL
	strip -x $@

endif

endif

ifeq ($(OSTYPE),AIX)
# applications must be linked with -I. -L. -lmqttv3c -Wl,-brtl -pthread
  CC 	   = gxlc

  CCFLAGS_SO = -fPIC -Os -shared -DREVERSED -DAIX
  LDFLAGS = -Wl,-G

  MQTTLIB_AIX = aix/lib${MQTTLIB}.so

all: ${MQTTLIB_AIX}

${MQTTLIB_AIX}: ${SOURCE_FILES} ${HEADERS}
	-mkdir aix
	${CC} ${CCFLAGS_SO} ${LDFLAGS} -o $@ ${SOURCE_FILES}
	strip $@
endif


ifeq ($(OSTYPE),Windows_NT)
  CC       = cl
  LD 	   = link

  # compiler flags
  CPPFLAGS = /D "WIN32" /D "_UNICODE" /D "UNICODE" /D "_CRT_SECURE_NO_WARNINGS"
  CFLAGS = /nologo /c /O2 /W3 /Fd /MD /TC
  CPPFLAGS_S = /D "OPENSSL" /I ${SSL_DIR}/include

  # linker flags
  LINKFLAGS = /nologo /machine:x86 /manifest
  WINLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib
  WINLIBS_S = crypt32.lib ssleay32.lib libeay32.lib
  SSLLIBPATH = /LIBPATH:${SSL_DIR}/output/lib
  # Flags to link C libraries
  LIBLINKFLAGS = /dll
  IMP = /implib:$(@:.dll=.lib)
  LIBPDB = /pdb:$(@:.dll=.pdb)
  LIBMAP = /map:$(@:.dll=.map)
  LIBLDFLAGS = $(LINKFLAGS) $(WINLIBS) $(LIBLINKFLAGS) $(IMP) $(LIBPDB) $(LIBMAP)
  LIBLDFLAGS_S = $(LINKFLAGS) $(SSLLIBPATH) $(WINLIBS) $(WINLIBS_S) $(LIBLINKFLAGS) $(IMP) $(LIBPDB) $(LIBMAP)
  # Flags to link C programs
  MAINLINKFLAGS = /subsystem:console
  EXEPDB = /pdb:$(@:.exe=.pdb)
  EXEMAP = /map:$(@:.exe=.map)
  MAINLDFLAGS = $(LINKFLAGS) $(WINLIBS) $(MAINLINKFLAGS) $(EXEPDB) $(EXEMAP)

  MQTTLDLIB = windows_ia32/$(MQTTLIB).lib
  MQTTDLL   = windows_ia32/$(MQTTLIB).dll
  MQTTLDLIB_A = windows_ia32/$(MQTTLIB_A).lib
  MQTTDLL_A   = windows_ia32/$(MQTTLIB_A).dll
  MQTTLDLIB_AS = windows_ia32/$(MQTTLIB_AS).lib
  MQTTDLL_AS   = windows_ia32/$(MQTTLIB_AS).dll
  MQTTLDLIB_S = windows_ia32/$(MQTTLIB_S).lib
  MQTTDLL_S   = windows_ia32/$(MQTTLIB_S).dll

ifdef BUILD_SAMPLES
all: windows_ia32 ${MQTTDLL} ${MQTTDLL_A} ${MQTTDLL_AS} ${MQTTDLL_S} samples
else
all: windows_ia32 ${MQTTDLL} ${MQTTDLL_A} ${MQTTDLL_AS} ${MQTTDLL_S}
endif

samples:
	-mkdir ${SAMPLES_DIR}/windows_ia32
	${CC} /nologo /D "WIN32" /I ${MQTTCLIENT_DIR} ${SAMPLES_DIR}/MQTTV3Sample.c /Fe${SAMPLES_DIR}/windows_ia32/ /link /LIBPATH:${MQTTCLIENT_DIR}/windows_ia32 /nologo /subsystem:console /manifest /machine:x86 mqttv3c.lib
	${CC} /nologo /D "WIN32" /I ${MQTTCLIENT_DIR} ${SAMPLES_DIR}/MQTTV3CSSample.c /Fe${SAMPLES_DIR}/windows_ia32/ /link /LIBPATH:${MQTTCLIENT_DIR}/windows_ia32 /nologo /subsystem:console /manifest /machine:x86 mqttv3cs.lib
	${CC} /nologo /D "WIN32" /I ${MQTTCLIENT_DIR} ${SAMPLES_DIR}/MQTTV3ASample.c /Fe${SAMPLES_DIR}/windows_ia32/ /link /LIBPATH:${MQTTCLIENT_DIR}/windows_ia32 /nologo /subsystem:console /manifest /machine:x86 mqttv3a.lib
	${CC} /nologo /D "WIN32" /I ${MQTTCLIENT_DIR} ${SAMPLES_DIR}/MQTTV3ASSample.c /Fe${SAMPLES_DIR}/windows_ia32/ /link /LIBPATH:${MQTTCLIENT_DIR}/windows_ia32 /nologo /subsystem:console /manifest /machine:x86 mqttv3as.lib

windows_ia32:
	-mkdir windows_ia32

$(MQTTDLL): ${SOURCE_FILES}  ${HEADERS}
	-rm -f *.obj
	${CC} ${CPPFLAGS} ${CFLAGS} /I ${MQTTCLIENT_DIR} /I ${MQTTCLIENT_DIR}/.. /Fo ${SOURCE_FILES}
	$(LD) $(LIBLDFLAGS) *.obj /out:$(MQTTDLL)
	mt -manifest windows_ia32/mqttv3c.dll.manifest -outputresource:$(MQTTDLL)\;2

$(MQTTDLL_A): ${SOURCE_FILES_A}  ${HEADERS_A}
	-rm -f *.obj
	${CC} ${CPPFLAGS} ${CFLAGS} /I ${MQTTCLIENT_DIR} /I ${MQTTCLIENT_DIR}/.. /Fo ${SOURCE_FILES_A}
	$(LD) $(LIBLDFLAGS) *.obj /out:$(MQTTDLL_A)
	mt -manifest windows_ia32/mqttv3a.dll.manifest -outputresource:$(MQTTDLL_A)\;2

$(MQTTDLL_S): ${SOURCE_FILES_S}  ${HEADERS}
	-rm -f *.obj
	${CC} ${CPPFLAGS} ${CFLAGS} ${CPPFLAGS_S} /I ${MQTTCLIENT_DIR} /I ${MQTTCLIENT_DIR}/.. /Fo ${SOURCE_FILES_S}
	$(LD) $(LIBLDFLAGS_S) *.obj /out:$(MQTTDLL_S)
	mt -manifest windows_ia32/mqttv3cs.dll.manifest -outputresource:$(MQTTDLL_S)\;2

$(MQTTDLL_AS): ${SOURCE_FILES}  ${HEADERS}
	-rm -f *.obj
	${CC} ${CPPFLAGS} ${CFLAGS} ${CPPFLAGS_S} /I ${MQTTCLIENT_DIR} /I ${MQTTCLIENT_DIR}/.. /Fo ${SOURCE_FILES_AS}
	$(LD) $(LIBLDFLAGS_S) *.obj /out:$(MQTTDLL_AS)
	mt -manifest windows_ia32/mqttv3as.dll.manifest -outputresource:$(MQTTDLL_AS)\;2

endif

#########################################################################################################
# The following was how the C Clients were built using cygwin GNU make and has been left here as a reference
# This has been converted to use ming GNU make (which uses the native format of file names)
#
#$(MQTTDLL): $(shell cygpath -au ${SOURCE_FILES})  $(shell cygpath -au ${HEADERS})
#	-mkdir windows_ia32
#	${CC} ${CPPFLAGS} ${CFLAGS} /I $(shell cygpath -am ${MQTTCLIENT_DIR}) /I $(shell cygpath -am ${MQTTCLIENT_DIR})/.. /Fo $(shell cygpath -am ${SOURCE_FILES})
#	$(LD) $(LIBLDFLAGS) *.obj /out:$(MQTTDLL)
#	mt -manifest windows_ia32/mqttv3c.dll.manifest -outputresource:$(MQTTDLL)\;2
#
#endif
#########################################################################################################
