From 7d09e5fd81e5abacad94f77d64caa62840a9f287 Mon Sep 17 00:00:00 2001 From: Andy Piper Date: Mon, 4 Mar 2013 16:55:10 +0000 Subject: [PATCH 1/2] README file, OS X build support Added top-level README.md with details of building, links to info Added OS X build rule to Makefile. NB needs updating for samples Added Paho logo to doc dir for potential future use. --- README.md | 77 ++++++++++++++++++++++++++++++++++ build/Makefile | 107 ++++++++++++++++++++++++++++++++++++----------- doc/pahologo.png | Bin 0 -> 12197 bytes 3 files changed, 159 insertions(+), 25 deletions(-) create mode 100644 README.md create mode 100644 doc/pahologo.png diff --git a/README.md b/README.md new file mode 100644 index 00000000..848418b0 --- /dev/null +++ b/README.md @@ -0,0 +1,77 @@ +# Eclipse Paho MQTT C client + + +This repository contains the source code for the [Eclipse Paho](http://eclipse.org/paho) MQTT C client library. + +This code builds libraries which enable applications to connect to an [MQTT](http://mqtt.org) broker to publish messages, and to subscribe to topics and receive published messages. + +Both synchronous and asynchronous modes of operation are supported. + +## Build requirements / compilation + +The build process requires GNU Make and gcc, and also requires OpenSSL libraries and includes to be available. There are make rules for a number of Linux "flavors" including ARM and s390, OS X, AIX and Solaris. + +The documentation requires doxygen and optionally graphviz. + +Before compiling, set some environment variables (or pass these values to the make command directly) in order to configure library locations and other options. + +Specify the location of OpenSSL using `SSL_DIR` + +e.g. using [homebrew](http://mxcl.github.com/homebrew/) on OS X: + +`export SSL_DIR=/usr/local/Cellar/openssl/1.0.1e` + +Specify where the source files are in relation to where the make command is being executed. + +``export MQTTCLIENT_DIR=../src`` + +To build the samples, enable the option (`BUILD_SAMPLES`), and specify the location of the code: + +``` +export BUILD_SAMPLES=YES +export SAMPLES_DIR=../src/samples +``` + +One more useful environment variable is ``TARGET_PLATFORM``. This provides for cross-compilation. Currently the only recognised value is "Arm" - for instance to cross-compile a Linux ARM version of the libraries: + +``export TARGET_PLATFORM=Arm`` + +## Libraries + +The Paho C client comprises four shared libraries: + + * libmqttv3a.so - asynchronous + * libmqttv3as.so - asynchronous with SSL + * libmqttv3c.so - "classic" / synchronous + * libmqttv3cs.so - "classic" / synchronous with SSL + +## Usage and API + +Detailed API documentation is available by building the Doxygen docs in the ``doc`` directory. A [snapshot is also available online](http://www.eclipse.org/paho/files/mqttdoc/Cclient/index.html). + +## Runtime tracing + +A number of environment variables control runtime tracing of the C library. + +Tracing is switched on using ``MQTT_C_CLIENT_TRACE`` (a value of ON traces to stdout, any other value should specify a file to trace to). + +The verbosity of the output is controlled using the ``MQTT_C_CLIENT_TRACE_LEVEL`` environment variable - valid values are ERROR, PROTOCOL, MINIMUM, MEDIUM and MAXIMUM (from least to most verbose). + +The variable ``MQTT_C_CLIENT_TRACE_MAX_LINES`` limits the number of lines of trace that are output. + +``` +export MQTT_C_CLIENT_TRACE=ON +export MQTT_C_CLIENT_TRACE_LEVEL=PROTOCOL +``` + +## Reporting bugs + +Please report bugs under the "MQTT" Component in [Eclipse Bugzilla](http://bugs.eclipse.org/bugs) for the Paho Technology project. + +## More information + +Discussion of the Paho clients takes place on the [Eclipse paho-dev mailing list](https://dev.eclipse.org/mailman/listinfo/paho-dev). + +General questions about the MQTT protocol are discussed in the [MQTT Google Group](https://groups.google.com/forum/?hl=en-US&fromgroups#!forum/mqtt). + +There is much more information available via the [MQTT community site](http://mqtt.org). diff --git a/build/Makefile b/build/Makefile index 46a6b88a..7707ac40 100644 --- a/build/Makefile +++ b/build/Makefile @@ -1,7 +1,11 @@ # 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 @@ -15,7 +19,7 @@ SAMPLES_DIR = ${SSL_DIR}/../com.ibm.mq.mqxr.listener/SDK/clients/c/samples/ endif MQTTLIB = mqttv3c -VPATH = ${MQTTCLIENT_DIR} +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 @@ -32,13 +36,13 @@ 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. +# 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) + ifeq ($(OS),Windows_NT) OSTYPE = $(OS) else OSTYPE = $(shell uname -s) @@ -67,12 +71,12 @@ ifeq ($(MACHINETYPE),x86_64) 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} +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 @@ -83,20 +87,20 @@ samples: ${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} + ${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 + +else ifeq ($(MACHINETYPE),ppc64) CC = gcc @@ -113,7 +117,7 @@ ifeq ($(MACHINETYPE),ppc64) 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} +all: linux_ppc64 ${MQTTLIB_PPC64} ${MQTTLIB_PPC64_A} #${MQTTLIB_PPC64_S} ${MQTTLIB_PPC64_AS} linux_ppc64: -mkdir linux_ppc64 @@ -121,20 +125,20 @@ 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} + ${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 + +else ifeq ($(MACHINETYPE),s390x) CC = gcc @@ -144,7 +148,7 @@ ifeq ($(MACHINETYPE),s390x) LDFLAGS_EXE = -lpthread MQTTLIB_390 = linux_s390x/lib${MQTTLIB}.so - + all: ${MQTTLIB_390} ${MQTTLIB_390}: ${SOURCE_FILES} ${HEADERS} @@ -232,7 +236,7 @@ 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 $@ @@ -254,6 +258,59 @@ 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 @@ -279,16 +336,16 @@ ifeq ($(OSTYPE),Windows_NT) # compiler flags CPPFLAGS = /D "WIN32" /D "_UNICODE" /D "UNICODE" /D "_CRT_SECURE_NO_WARNINGS" - CFLAGS = /nologo /c /O2 /W3 /Fd /MD /TC + CFLAGS = /nologo /c /O2 /W3 /Fd /MD /TC CPPFLAGS_S = /D "OPENSSL" /I ${SSL_DIR}/include # linker flags - LINKFLAGS = /nologo /machine:x86 /manifest + 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 + LIBLINKFLAGS = /dll IMP = /implib:$(@:.dll=.lib) LIBPDB = /pdb:$(@:.dll=.pdb) LIBMAP = /map:$(@:.dll=.map) @@ -298,7 +355,7 @@ ifeq ($(OSTYPE),Windows_NT) MAINLINKFLAGS = /subsystem:console EXEPDB = /pdb:$(@:.exe=.pdb) EXEMAP = /map:$(@:.exe=.map) - MAINLDFLAGS = $(LINKFLAGS) $(WINLIBS) $(MAINLINKFLAGS) $(EXEPDB) $(EXEMAP) + MAINLDFLAGS = $(LINKFLAGS) $(WINLIBS) $(MAINLINKFLAGS) $(EXEPDB) $(EXEMAP) MQTTLDLIB = windows_ia32/$(MQTTLIB).lib MQTTDLL = windows_ia32/$(MQTTLIB).dll @@ -349,11 +406,11 @@ $(MQTTDLL_AS): ${SOURCE_FILES} ${HEADERS} $(LD) $(LIBLDFLAGS_S) *.obj /out:$(MQTTDLL_AS) mt -manifest windows_ia32/mqttv3as.dll.manifest -outputresource:$(MQTTDLL_AS)\;2 -endif +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) +# 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 @@ -362,4 +419,4 @@ endif # mt -manifest windows_ia32/mqttv3c.dll.manifest -outputresource:$(MQTTDLL)\;2 # #endif -######################################################################################################### +######################################################################################################### diff --git a/doc/pahologo.png b/doc/pahologo.png new file mode 100644 index 0000000000000000000000000000000000000000..27f197d8e54aadaca7e8677e51f50df290c54963 GIT binary patch literal 12197 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 Date: Mon, 4 Mar 2013 21:53:25 +0000 Subject: [PATCH 2/2] Improved usage information (e.g. for C++ usage) --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 848418b0..5239ba0a 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,17 @@ The Paho C client comprises four shared libraries: Detailed API documentation is available by building the Doxygen docs in the ``doc`` directory. A [snapshot is also available online](http://www.eclipse.org/paho/files/mqttdoc/Cclient/index.html). +Samples are available in the Doxygen docs and also in ``src/samples`` for reference. + +Note that using the C headers from a C++ program requires the following declaration as part of the C++ code: + +``` + extern "C" { + #include "MQTTClient.h" + #include "MQTTClientPersistence.h" + } +``` + ## Runtime tracing A number of environment variables control runtime tracing of the C library.