CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. #*******************************************************************************
  2. # Copyright (c) 2015, 2020 logi.cals GmbH and others
  3. #
  4. # All rights reserved. This program and the accompanying materials
  5. # are made available under the terms of the Eclipse Public License v2.0
  6. # and Eclipse Distribution License v1.0 which accompany this distribution.
  7. #
  8. # The Eclipse Public License is available at
  9. # https://www.eclipse.org/legal/epl-2.0/
  10. # and the Eclipse Distribution License is available at
  11. # http://www.eclipse.org/org/documents/edl-v10.php.
  12. #
  13. # Contributors:
  14. # Rainer Poisel - initial version
  15. # Ian Craggs (IBM Corp.) - merge master
  16. # Ian Craggs - update for MQTTV5 support
  17. #*******************************************************************************/
  18. # Note: on OS X you should install XCode and the associated command-line tools
  19. ## compilation/linkage settings
  20. CONFIGURE_FILE(VersionInfo.h.in
  21. ${CMAKE_BINARY_DIR}/VersionInfo.h
  22. @ONLY
  23. )
  24. SET(common_src
  25. MQTTTime.c
  26. MQTTProtocolClient.c
  27. Clients.c
  28. utf-8.c
  29. MQTTPacket.c
  30. MQTTPacketOut.c
  31. Messages.c
  32. Tree.c
  33. Socket.c
  34. Log.c
  35. MQTTPersistence.c
  36. Thread.c
  37. MQTTProtocolOut.c
  38. MQTTPersistenceDefault.c
  39. SocketBuffer.c
  40. LinkedList.c
  41. MQTTProperties.c
  42. MQTTReasonCodes.c
  43. Base64.c
  44. SHA1.c
  45. WebSocket.c
  46. )
  47. IF (NOT PAHO_HIGH_PERFORMANCE)
  48. SET(common_src ${common_src}
  49. StackTrace.c
  50. Heap.c
  51. )
  52. ENDIF()
  53. IF (WIN32)
  54. SET(LIBS_SYSTEM ws2_32 crypt32 RpcRT4)
  55. ELSEIF (UNIX)
  56. IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
  57. SET(LIBS_SYSTEM c dl pthread rt)
  58. # anl is only available with glibc so check if it is found before using
  59. # it or build will fail on uclibc or musl
  60. FIND_LIBRARY(LIB_ANL anl)
  61. IF(LIB_ANL)
  62. SET(LIBS_SYSTEM "${LIBS_SYSTEM}" anl)
  63. ENDIF()
  64. ADD_DEFINITIONS(-D_GNU_SOURCE -fvisibility=hidden)
  65. ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Android")
  66. SET(LIBS_SYSTEM c dl)
  67. ELSEIF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  68. SET(LIBS_SYSTEM compat pthread)
  69. ELSE()
  70. SET(LIBS_SYSTEM c pthread)
  71. ENDIF()
  72. ENDIF()
  73. IF (PAHO_BUILD_SHARED)
  74. # common compilation for libpaho-mqtt3c and libpaho-mqtt3a
  75. ADD_LIBRARY(common_obj OBJECT ${common_src})
  76. SET_TARGET_PROPERTIES(common_obj PROPERTIES
  77. POSITION_INDEPENDENT_CODE ON
  78. COMPILE_DEFINITIONS "PAHO_MQTT_EXPORTS=1")
  79. ADD_EXECUTABLE(MQTTVersion MQTTVersion.c)
  80. SET_TARGET_PROPERTIES(MQTTVersion PROPERTIES
  81. POSITION_INDEPENDENT_CODE ON
  82. COMPILE_DEFINITIONS "PAHO_MQTT_IMPORTS=1")
  83. ENDIF()
  84. IF (PAHO_BUILD_STATIC)
  85. ADD_LIBRARY(common_obj_static OBJECT ${common_src})
  86. SET_TARGET_PROPERTIES(common_obj_static PROPERTIES
  87. POSITION_INDEPENDENT_CODE ON
  88. COMPILE_DEFINITIONS "PAHO_MQTT_STATIC=1")
  89. ENDIF()
  90. IF (PAHO_BUILD_SHARED)
  91. ADD_LIBRARY(paho-mqtt3c SHARED $<TARGET_OBJECTS:common_obj> MQTTClient.c)
  92. ADD_LIBRARY(paho-mqtt3a SHARED $<TARGET_OBJECTS:common_obj> MQTTAsync.c MQTTAsyncUtils.c)
  93. TARGET_LINK_LIBRARIES(paho-mqtt3c ${LIBS_SYSTEM})
  94. TARGET_LINK_LIBRARIES(paho-mqtt3a ${LIBS_SYSTEM})
  95. TARGET_LINK_LIBRARIES(MQTTVersion paho-mqtt3a paho-mqtt3c ${LIBS_SYSTEM})
  96. SET_TARGET_PROPERTIES(
  97. paho-mqtt3c paho-mqtt3a PROPERTIES
  98. VERSION ${CLIENT_VERSION}
  99. SOVERSION ${PAHO_VERSION_MAJOR}
  100. COMPILE_DEFINITIONS "PAHO_MQTT_EXPORTS=1")
  101. IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  102. SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
  103. SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
  104. ELSEIF (NOT WIN32)
  105. SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
  106. SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
  107. ENDIF()
  108. IF (NOT WIN32)
  109. SET_TARGET_PROPERTIES(
  110. paho-mqtt3c PROPERTIES
  111. LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}")
  112. SET_TARGET_PROPERTIES(
  113. paho-mqtt3a PROPERTIES
  114. LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}")
  115. ENDIF()
  116. FOREACH(TARGET paho-mqtt3c paho-mqtt3a)
  117. TARGET_INCLUDE_DIRECTORIES(${TARGET}
  118. PUBLIC
  119. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  120. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  121. PRIVATE
  122. ${CMAKE_BINARY_DIR})
  123. ENDFOREACH()
  124. INSTALL(TARGETS paho-mqtt3c paho-mqtt3a
  125. EXPORT eclipse-paho-mqtt-cTargets
  126. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  127. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  128. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  129. INSTALL(TARGETS MQTTVersion
  130. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  131. ENDIF()
  132. IF (PAHO_BUILD_STATIC)
  133. ADD_LIBRARY(paho-mqtt3c-static STATIC $<TARGET_OBJECTS:common_obj_static> MQTTClient.c)
  134. ADD_LIBRARY(paho-mqtt3a-static STATIC $<TARGET_OBJECTS:common_obj_static> MQTTAsync.c MQTTAsyncUtils.c)
  135. TARGET_LINK_LIBRARIES(paho-mqtt3c-static ${LIBS_SYSTEM})
  136. TARGET_LINK_LIBRARIES(paho-mqtt3a-static ${LIBS_SYSTEM})
  137. IF (NOT WIN32)
  138. SET_TARGET_PROPERTIES(paho-mqtt3c-static PROPERTIES OUTPUT_NAME paho-mqtt3c)
  139. SET_TARGET_PROPERTIES(paho-mqtt3a-static PROPERTIES OUTPUT_NAME paho-mqtt3a)
  140. ENDIF()
  141. SET_TARGET_PROPERTIES(
  142. paho-mqtt3c-static paho-mqtt3a-static PROPERTIES
  143. VERSION ${CLIENT_VERSION}
  144. SOVERSION ${PAHO_VERSION_MAJOR}
  145. COMPILE_DEFINITIONS "PAHO_MQTT_STATIC=1")
  146. FOREACH(TARGET paho-mqtt3c-static paho-mqtt3a-static)
  147. TARGET_INCLUDE_DIRECTORIES(${TARGET}
  148. PUBLIC
  149. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  150. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  151. PRIVATE
  152. ${CMAKE_BINARY_DIR})
  153. ENDFOREACH()
  154. IF (NOT PAHO_BUILD_SHARED)
  155. INSTALL(TARGETS paho-mqtt3c-static paho-mqtt3a-static
  156. EXPORT eclipse-paho-mqtt-cTargets
  157. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  158. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  159. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  160. ELSE()
  161. INSTALL(TARGETS paho-mqtt3c-static paho-mqtt3a-static
  162. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
  163. ENDIF()
  164. ENDIF()
  165. INSTALL(FILES MQTTAsync.h MQTTClient.h MQTTClientPersistence.h MQTTProperties.h MQTTReasonCodes.h MQTTSubscribeOpts.h MQTTExportDeclarations.h
  166. DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  167. IF (PAHO_WITH_SSL)
  168. SET(OPENSSL_ROOT_DIR "" CACHE PATH "Directory containing OpenSSL libraries and includes")
  169. find_package(OpenSSL REQUIRED)
  170. IF (PAHO_BUILD_SHARED)
  171. ## common compilation for libpaho-mqtt3cs and libpaho-mqtt3as
  172. ## Note: SSL libraries must be recompiled due ifdefs
  173. ADD_LIBRARY(common_ssl_obj OBJECT ${common_src})
  174. TARGET_INCLUDE_DIRECTORIES(common_ssl_obj PUBLIC ${OPENSSL_INCLUDE_DIR})
  175. SET_PROPERTY(TARGET common_ssl_obj PROPERTY POSITION_INDEPENDENT_CODE ON)
  176. SET_PROPERTY(TARGET common_ssl_obj PROPERTY COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_EXPORTS=1")
  177. ADD_LIBRARY(paho-mqtt3cs SHARED $<TARGET_OBJECTS:common_ssl_obj> MQTTClient.c SSLSocket.c)
  178. ADD_LIBRARY(paho-mqtt3as SHARED $<TARGET_OBJECTS:common_ssl_obj> MQTTAsync.c MQTTAsyncUtils.c SSLSocket.c)
  179. SET_TARGET_PROPERTIES(
  180. paho-mqtt3cs paho-mqtt3as PROPERTIES
  181. VERSION ${CLIENT_VERSION}
  182. SOVERSION ${PAHO_VERSION_MAJOR}
  183. COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_EXPORTS=1")
  184. IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  185. SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
  186. SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
  187. ELSEIF (NOT WIN32)
  188. SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
  189. SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
  190. ENDIF()
  191. IF (NOT WIN32)
  192. SET_TARGET_PROPERTIES(
  193. paho-mqtt3cs PROPERTIES
  194. LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}")
  195. SET_TARGET_PROPERTIES(
  196. paho-mqtt3as PROPERTIES
  197. LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}")
  198. ENDIF()
  199. FOREACH(TARGET paho-mqtt3cs paho-mqtt3as)
  200. TARGET_INCLUDE_DIRECTORIES(${TARGET}
  201. PUBLIC
  202. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  203. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  204. PRIVATE
  205. ${CMAKE_BINARY_DIR})
  206. TARGET_LINK_LIBRARIES(${TARGET}
  207. PUBLIC
  208. OpenSSL::SSL OpenSSL::Crypto ${LIBS_SYSTEM})
  209. ENDFOREACH()
  210. INSTALL(TARGETS paho-mqtt3cs paho-mqtt3as
  211. EXPORT eclipse-paho-mqtt-cTargets
  212. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  213. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  214. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  215. ENDIF()
  216. IF (PAHO_BUILD_STATIC)
  217. ## common compilation for libpaho-mqtt3cs and libpaho-mqtt3as
  218. ## Note: SSL libraries must be recompiled due ifdefs
  219. ADD_LIBRARY(common_ssl_obj_static OBJECT ${common_src})
  220. TARGET_INCLUDE_DIRECTORIES(common_ssl_obj_static PUBLIC ${OPENSSL_INCLUDE_DIR})
  221. SET_PROPERTY(TARGET common_ssl_obj_static PROPERTY POSITION_INDEPENDENT_CODE ON)
  222. SET_PROPERTY(TARGET common_ssl_obj_static PROPERTY COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_STATIC=1")
  223. ADD_LIBRARY(paho-mqtt3cs-static STATIC $<TARGET_OBJECTS:common_ssl_obj_static> MQTTClient.c SSLSocket.c)
  224. ADD_LIBRARY(paho-mqtt3as-static STATIC $<TARGET_OBJECTS:common_ssl_obj_static> MQTTAsync.c MQTTAsyncUtils.c SSLSocket.c)
  225. SET_TARGET_PROPERTIES(
  226. paho-mqtt3cs-static paho-mqtt3as-static PROPERTIES
  227. VERSION ${CLIENT_VERSION}
  228. SOVERSION ${PAHO_VERSION_MAJOR}
  229. COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_STATIC=1")
  230. IF (NOT WIN32)
  231. SET_TARGET_PROPERTIES(paho-mqtt3cs-static PROPERTIES OUTPUT_NAME paho-mqtt3cs)
  232. SET_TARGET_PROPERTIES(paho-mqtt3as-static PROPERTIES OUTPUT_NAME paho-mqtt3as)
  233. ENDIF()
  234. IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  235. SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
  236. SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
  237. ELSEIF (NOT WIN32)
  238. SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
  239. SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
  240. ENDIF()
  241. IF (NOT WIN32)
  242. SET_TARGET_PROPERTIES(
  243. paho-mqtt3cs-static PROPERTIES
  244. LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}")
  245. SET_TARGET_PROPERTIES(
  246. paho-mqtt3as-static PROPERTIES
  247. LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}")
  248. ENDIF()
  249. IF (NOT PAHO_BUILD_SHARED)
  250. INSTALL(TARGETS paho-mqtt3cs-static paho-mqtt3as-static
  251. EXPORT eclipse-paho-mqtt-cTargets
  252. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  253. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  254. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  255. ELSE()
  256. INSTALL(TARGETS paho-mqtt3cs-static paho-mqtt3as-static
  257. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
  258. ENDIF()
  259. FOREACH(TARGET paho-mqtt3cs-static paho-mqtt3as-static)
  260. TARGET_INCLUDE_DIRECTORIES(${TARGET}
  261. PUBLIC
  262. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  263. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  264. PRIVATE
  265. ${CMAKE_BINARY_DIR})
  266. TARGET_LINK_LIBRARIES(${TARGET}
  267. PUBLIC
  268. OpenSSL::SSL OpenSSL::Crypto ${LIBS_SYSTEM})
  269. ENDFOREACH()
  270. ENDIF()
  271. ENDIF()
  272. INSTALL(EXPORT eclipse-paho-mqtt-cTargets
  273. FILE eclipse-paho-mqtt-cConfig.cmake
  274. NAMESPACE eclipse-paho-mqtt-c::
  275. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/eclipse-paho-mqtt-c)
  276. INCLUDE(CMakePackageConfigHelpers)
  277. WRITE_BASIC_PACKAGE_VERSION_FILE("eclipse-paho-mqtt-cConfigVersion.cmake"
  278. VERSION ${CLIENT_VERSION}
  279. COMPATIBILITY SameMajorVersion)
  280. INSTALL(FILES
  281. "${CMAKE_CURRENT_BINARY_DIR}/eclipse-paho-mqtt-cConfigVersion.cmake"
  282. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/eclipse-paho-mqtt-c)
  283. # Base64 test
  284. ADD_EXECUTABLE( Base64Test EXCLUDE_FROM_ALL Base64.c Base64.h )
  285. TARGET_COMPILE_DEFINITIONS( Base64Test PUBLIC "-DBASE64_TEST" )
  286. IF (PAHO_WITH_SSL)
  287. ADD_EXECUTABLE( Base64TestOpenSSL EXCLUDE_FROM_ALL Base64.c Base64.h )
  288. TARGET_LINK_LIBRARIES( Base64TestOpenSSL OpenSSL::SSL OpenSSL::Crypto)
  289. TARGET_COMPILE_DEFINITIONS( Base64TestOpenSSL PUBLIC "-DBASE64_TEST -DOPENSSL=1" )
  290. ENDIF (PAHO_WITH_SSL)
  291. # SHA1 test
  292. ADD_EXECUTABLE( Sha1Test EXCLUDE_FROM_ALL SHA1.c SHA1.h )
  293. TARGET_COMPILE_DEFINITIONS( Sha1Test PUBLIC "-DSHA1_TEST" )
  294. IF (PAHO_WITH_SSL)
  295. ADD_EXECUTABLE( Sha1TestOpenSSL EXCLUDE_FROM_ALL SHA1.c SHA1.h )
  296. TARGET_LINK_LIBRARIES( Sha1TestOpenSSL OpenSSL::SSL OpenSSL::Crypto)
  297. TARGET_COMPILE_DEFINITIONS( Sha1TestOpenSSL PUBLIC "-DSHA1_TEST -DOPENSSL=1" )
  298. ENDIF (PAHO_WITH_SSL)