diff --git a/CMakeLists.txt b/CMakeLists.txt index f28ca75..2f8f285 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,9 +61,6 @@ endif() option(PAHO_BUILD_SAMPLES "Build sample programs" FALSE) option(PAHO_BUILD_DOCUMENTATION "Create and install the API documentation (requires Doxygen)" FALSE) -set(PAHO_MQTT_C_PATH "" CACHE PATH "Add a path to paho.mqtt.c library and headers") - -set(PAHO_MQTT_C paho-mqtt3a) ## --- C++11 build flags --- @@ -73,12 +70,9 @@ set(CMAKE_CXX_EXTENSIONS OFF) ## --- Build directories --- +# For the paho_mqtt_c module +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) add_subdirectory(src) -add_subdirectory(src/mqtt) - -if(PAHO_BUILD_SAMPLES) - add_subdirectory(src/samples) -endif() if(PAHO_BUILD_DOCUMENTATION) add_subdirectory(doc) diff --git a/README.md b/README.md index 0027318..27cbaf6 100644 --- a/README.md +++ b/README.md @@ -52,13 +52,15 @@ Before compiling, determine the value of some variables in order to configure fe Variable | Default Value | Description ------------ | ------------- | ------------- -PAHO_MQTT_C_PATH | "" | Add a path paho.mqtt.c library and headers PAHO_BUILD_SHARED | TRUE (Linux), FALSE (Win32) | Whether to build the shared library PAHO_BUILD_STATIC | FALSE (Linux), TRUE (Win32) | Whether to build the static library PAHO_BUILD_DOCUMENTATION | FALSE | Create and install the HTML based API documentation (requires Doxygen) PAHO_BUILD_SAMPLES | FALSE | Build sample programs PAHO_WITH_SSL | TRUE (Linux), FALSE (Win32) | Flag that defines whether to build ssl-enabled binaries too +If you installed the C library on a non-standard path, you might want to pass it as value to the +`CMAKE_PREFIX_PATH` option. + Using these variables CMake can be used to generate your Makefiles. The out-of-source build is the default on CMake. Therefore it is recommended to invoke all build commands inside your chosen build directory. An example build session targeting the build platform could look like this: @@ -68,7 +70,7 @@ $ git clone https://github.com/eclipse/paho.mqtt.cpp $ cd paho.mqtt.cpp $ mkdir build $ cd build -$ cmake -DPAHO_BUILD_DOCUMENTATION=TRUE -DPAHO_BUILD_SAMPLES=TRUE -DPAHO_MQTT_C_PATH=../../paho.mqtt.c .. +$ cmake -DPAHO_BUILD_DOCUMENTATION=TRUE -DPAHO_BUILD_SAMPLES=TRUE -DCMAKE_PREFIX_PATH=../../paho.mqtt.c .. $ make $ sudo make install ``` @@ -76,7 +78,7 @@ $ sudo make install or ``` -$ cmake -DCMAKE_INSTALL_PREFIX=/tmp/paho-cpp -DPAHO_MQTT_C_PATH=/tmp/paho-c \ +$ cmake -DCMAKE_INSTALL_PREFIX=/tmp/paho-cpp -DCMAKE_PREFIX_PATH=/tmp/paho-c \ -DPAHO_BUILD_SAMPLES:BOOL=ON -DPAHO_BUILD_STATIC:BOOL=ON \ -DPAHO_BUILD_DOCUMENTATION:BOOL=ON $ make @@ -113,7 +115,7 @@ The build process currently supports a number Windows versions. The build proces First install and open the cmake-gui application. This tutorial is based on cmake-gui 3.5.2. -Second, select the path to the Paho MQTT C library (PAHO_MQTT_C_PATH). Remember that the Paho MQTT C must be installed on the system. Next, choose if it is supposed to build the documentation (PAHO_BUILD_DOCUMENTATION) and/or the sample applications (PAHO_BUILD_SAMPLES). +Second, select the path to the Paho MQTT C library (CMAKE_PREFIX_PATH) if not installed in a standard path. Remember that the Paho MQTT C must be installed on the system. Next, choose if it is supposed to build the documentation (PAHO_BUILD_DOCUMENTATION) and/or the sample applications (PAHO_BUILD_SAMPLES). Once the configuration is done, click on the Configure button, select the version of the Visual Studio, and then click on Generate button. diff --git a/appveyor.yml b/appveyor.yml index 765aab0..6205c50 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,7 +27,7 @@ build_script: "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 - cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX="C:\Temp\paho-cpp" -DPAHO_MQTT_C_PATH="C:\Temp\paho-c" -DPAHO_WITH_SSL=TRUE -DPAHO_BUILD_DOCUMENTATION=FALSE -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=TRUE .. + cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX="C:\Temp\paho-cpp" -DCMAKE_PREFIX_PATH="C:\Temp\paho-c" -DPAHO_WITH_SSL=TRUE -DPAHO_BUILD_DOCUMENTATION=FALSE -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=TRUE .. nmake diff --git a/cmake/FindPahoMqttC.cmake b/cmake/FindPahoMqttC.cmake new file mode 100644 index 0000000..10c2bfa --- /dev/null +++ b/cmake/FindPahoMqttC.cmake @@ -0,0 +1,23 @@ +# find the Paho MQTT C library +if(PAHO_WITH_SSL) + set(_PAHO_MQTT_C_LIB_NAME paho-mqtt3as) + find_package(OpenSSL REQUIRED) +else() + set(_PAHO_MQTT_C_LIB_NAME paho-mqtt3a) +endif() + +find_library(PAHO_MQTT_C_LIBRARIES NAMES ${_PAHO_MQTT_C_LIB_NAME}) +unset(_PAHO_MQTT_C_LIB_NAME) +find_path(PAHO_MQTT_C_INCLUDE_DIRS NAMES MQTTAsync.h) + +add_library(PahoMqttC::PahoMqttC UNKNOWN IMPORTED) + +set_target_properties(PahoMqttC::PahoMqttC PROPERTIES + IMPORTED_LOCATION "${PAHO_MQTT_C_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${PAHO_MQTT_C_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${PAHO_MQTT_C_LIBRARIES}" + IMPORTED_LINK_INTERFACE_LANGUAGES "C") + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PahoMqttC + REQUIRED_VARS PAHO_MQTT_C_LIBRARIES PAHO_MQTT_C_INCLUDE_DIRS) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5e9269c..edb2dae 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -25,18 +25,20 @@ ## Note: on OS X you should install XCode and the associated command-line tools -## include directories -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +find_package(PahoMqttC REQUIRED) + +add_subdirectory(mqtt) + +if(PAHO_BUILD_SAMPLES) + add_subdirectory(samples) +endif() ## --- Library dependencies --- +find_package(Threads) +set(LIBS_SYSTEM Threads::Threads) if(WIN32) - set(LIBS_SYSTEM ws2_32) -elseif(UNIX) - if(CMAKE_SYSTEM_NAME MATCHES "Linux") - set(LIB_DL dl) - endif() - set(LIBS_SYSTEM ${LIB_DL} c stdc++ pthread) + string(APPEND LIBS_SYSTEM " ws2_32") endif() ## --- use Object Library to optimize compilation --- @@ -59,7 +61,14 @@ if(PAHO_WITH_SSL) add_definitions(-DOPENSSL) endif() +# Automatically add the current source- and build directories to the include path +set(CMAKE_INCLUDE_CURRENT_DIR TRUE) +set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE TRUE) + add_library(OBJS OBJECT ${SOURCES}) +# Object libraries can't use target_link_libraries in order to take advantage +# of transitive usage requirements until CMake 3.12. This is a workaround: +target_include_directories(OBJS PRIVATE ${PAHO_MQTT_C_INCLUDE_DIRS}) ## --- Build the shared library, if requested --- @@ -70,7 +79,11 @@ if(PAHO_BUILD_SHARED) add_library(${PAHO_MQTT_CPP} SHARED $) ## add dependencies to the shared library - target_link_libraries(${PAHO_MQTT_CPP} ${LIBS_SYSTEM}) + target_link_libraries(${PAHO_MQTT_CPP} + PRIVATE ${LIBS_SYSTEM} + PUBLIC PahoMqttC::PahoMqttC) + target_include_directories(${PAHO_MQTT_CPP} + PUBLIC $) ## set the shared library soname set_target_properties(${PAHO_MQTT_CPP} PROPERTIES @@ -78,7 +91,7 @@ if(PAHO_BUILD_SHARED) SOVERSION ${PAHO_VERSION_MAJOR}) ## install the shared library - install(TARGETS ${PAHO_MQTT_CPP} + install(TARGETS ${PAHO_MQTT_CPP} EXPORT PahoMqttCpp ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) @@ -90,73 +103,18 @@ if(PAHO_BUILD_STATIC) ## create the static library add_library(${PAHO_MQTT_CPP_STATIC} STATIC $) - ## add dependencies to the static library - target_link_libraries(${PAHO_MQTT_CPP_STATIC} ${LIBS_SYSTEM}) + ## add dependencies to the shared library + target_link_libraries(${PAHO_MQTT_CPP} + PRIVATE ${LIBS_SYSTEM} + PUBLIC PahoMqttC::PahoMqttC) + target_include_directories(${PAHO_MQTT_CPP} + PUBLIC $) ## install the static library - install(TARGETS ${PAHO_MQTT_CPP_STATIC} + install(TARGETS ${PAHO_MQTT_CPP_STATIC} EXPORT PahoMqttCpp ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) ## Static lib has same name as shared lib set_target_properties(${PAHO_MQTT_CPP_STATIC} PROPERTIES OUTPUT_NAME ${PAHO_MQTT_CPP}) endif() - -## extract Paho MQTT C include directory -get_filename_component(PAHO_MQTT_C_DEV_INC_DIR ${PAHO_MQTT_C_PATH}/src ABSOLUTE) -get_filename_component(PAHO_MQTT_C_STD_INC_DIR ${PAHO_MQTT_C_PATH}/include ABSOLUTE) -set(PAHO_MQTT_C_INC_DIR - ${PAHO_MQTT_C_DEV_INC_DIR} - ${PAHO_MQTT_C_STD_INC_DIR}) - -## extract Paho MQTT C library directory -get_filename_component(PAHO_MQTT_C_DEV_LIB_DIR ${PAHO_MQTT_C_PATH}/build/output ABSOLUTE) -get_filename_component(PAHO_MQTT_C_STD_LIB_DIR ${PAHO_MQTT_C_PATH}/lib ABSOLUTE) -get_filename_component(PAHO_MQTT_C_STD64_LIB_DIR ${PAHO_MQTT_C_PATH}/lib64 ABSOLUTE) -set(PAHO_MQTT_C_LIB_DIR - ${PAHO_MQTT_C_DEV_LIB_DIR} - ${PAHO_MQTT_C_STD_LIB_DIR} - ${PAHO_MQTT_C_STD64_LIB_DIR}) - -## extract Paho MQTT C binary directory (Windows may place libraries there) -get_filename_component(PAHO_MQTT_C_BIN_DIR ${PAHO_MQTT_C_PATH}/bin ABSOLUTE) - -## add library suffixes so Windows can find Paho DLLs -set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "") -set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} ".dll" ".lib") - -if(PAHO_WITH_SSL) - ## find the Paho MQTT C SSL library - find_library(PAHO_MQTT_C_LIB - NAMES paho-mqtt3as - mqtt3as - PATHS ${PAHO_MQTT_C_LIB_DIR} - ${PAHO_MQTT_C_BIN_DIR}) - - find_package(OpenSSL REQUIRED) -else() - ## find the Paho MQTT C library - find_library(PAHO_MQTT_C_LIB - NAMES paho-mqtt3a - mqtt - paho-mqtt - mqtt3 - paho-mqtt3 - mqtt3a - PATHS ${PAHO_MQTT_C_LIB_DIR} - ${PAHO_MQTT_C_BIN_DIR}) -endif() - -## use the Paho MQTT C library if found. Otherwise terminate the compilation -if(${PAHO_MQTT_C_LIB} STREQUAL "PAHO_MQTT_C_LIB-NOTFOUND") - message(FATAL_ERROR "Could not find Paho MQTT C library") -else() - include_directories(${PAHO_MQTT_C_INC_DIR}) - link_directories(${PAHO_MQTT_C_LIB_DIR}) - if(PAHO_BUILD_SHARED) - target_link_libraries(${PAHO_MQTT_CPP} ${PAHO_MQTT_C_LIB}) - endif() - if(PAHO_BUILD_STATIC) - target_link_libraries(${PAHO_MQTT_CPP_STATIC} ${PAHO_MQTT_C_LIB}) - endif() -endif() diff --git a/src/samples/CMakeLists.txt b/src/samples/CMakeLists.txt index 0aa18de..be91638 100644 --- a/src/samples/CMakeLists.txt +++ b/src/samples/CMakeLists.txt @@ -24,35 +24,8 @@ ## --- Library dependencies --- -if(NOT WIN32) - set(LIBS_THREADING pthread) -endif() - - -## Paho MQTT C include directory -get_filename_component(PAHO_MQTT_C_DEV_INC_DIR ${PAHO_MQTT_C_PATH}/src ABSOLUTE) -get_filename_component(PAHO_MQTT_C_STD_INC_DIR ${PAHO_MQTT_C_PATH}/include ABSOLUTE) -set(PAHO_MQTT_C_INC_DIR - ${PAHO_MQTT_C_DEV_INC_DIR} - ${PAHO_MQTT_C_STD_INC_DIR}) - -## Paho MQTT C++ include directory -get_filename_component(PAHO_MQTT_CPP_INC_DIR ${CMAKE_SOURCE_DIR}/src ABSOLUTE) - ## include directories include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -include_directories(${PAHO_MQTT_C_INC_DIR}) -include_directories(${PAHO_MQTT_CPP_INC_DIR}) - -## Paho MQTT C library directory -get_filename_component(PAHO_MQTT_C_LIB_DIR ${PAHO_MQTT_C_LIB} DIRECTORY) - -## Paho MQTT C++ library directory -get_filename_component(PAHO_MQTT_CPP_LIB_DIR ${CMAKE_BINARY_DIR}/src ABSOLUTE) - -## link directories -link_directories(${PAHO_MQTT_C_LIB_DIR}) -link_directories(${PAHO_MQTT_CPP_LIB_DIR}) ## binary files add_executable(async_publish async_publish.cpp) @@ -65,27 +38,21 @@ add_executable(pub_speed_test pub_speed_test.cpp) ## link binaries target_link_libraries(async_publish - ${PAHO_MQTT_C} ${PAHO_MQTT_CPP}) target_link_libraries(async_subscribe - ${PAHO_MQTT_C} ${PAHO_MQTT_CPP}) target_link_libraries(async_consume - ${PAHO_MQTT_C} ${PAHO_MQTT_CPP}) target_link_libraries(sync_publish - ${PAHO_MQTT_C} ${PAHO_MQTT_CPP}) target_link_libraries(sync_consume - ${PAHO_MQTT_C} ${PAHO_MQTT_CPP}) target_link_libraries(data_publish - ${PAHO_MQTT_C} ${PAHO_MQTT_CPP}) +find_package(Threads) target_link_libraries(pub_speed_test - ${PAHO_MQTT_C} ${PAHO_MQTT_CPP} - ${LIBS_THREADING}) + Threads::Threads) set(INSTALL_TARGETS async_publish @@ -102,7 +69,6 @@ if(PAHO_WITH_SSL) ## link SSL binaries target_link_libraries(ssl_publish - ${PAHO_MQTT_C} ${PAHO_MQTT_CPP}) set(INSTALL_TARGETS @@ -113,8 +79,7 @@ if(PAHO_WITH_SSL) endif() ## install binaries -install(TARGETS ${INSTALL_TARGETS} +install(TARGETS ${INSTALL_TARGETS} EXPORT PahoMqttCppSamples RUNTIME DESTINATION bin LIBRARY DESTINATION lib ) -