CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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. Proxy.c
  47. )
  48. IF (NOT PAHO_HIGH_PERFORMANCE)
  49. SET(common_src ${common_src}
  50. StackTrace.c
  51. Heap.c
  52. )
  53. ENDIF()
  54. IF (WIN32)
  55. SET(LIBS_SYSTEM ws2_32 crypt32 RpcRT4)
  56. ELSEIF (UNIX)
  57. IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
  58. SET(LIBS_SYSTEM c dl pthread rt)
  59. # anl is only available with glibc so check if it is found before using
  60. # it or build will fail on uclibc or musl
  61. FIND_LIBRARY(LIB_ANL anl)
  62. IF(LIB_ANL)
  63. SET(LIBS_SYSTEM "${LIBS_SYSTEM}" anl)
  64. ENDIF()
  65. ADD_DEFINITIONS(-D_GNU_SOURCE -fvisibility=hidden)
  66. ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Android")
  67. SET(LIBS_SYSTEM c dl)
  68. ELSEIF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  69. SET(LIBS_SYSTEM compat pthread)
  70. ELSE()
  71. SET(LIBS_SYSTEM c pthread)
  72. ENDIF()
  73. ENDIF()
  74. IF (PAHO_BUILD_SHARED)
  75. # common compilation for libpaho-mqtt3c and libpaho-mqtt3a
  76. ADD_LIBRARY(common_obj OBJECT ${common_src})
  77. SET_TARGET_PROPERTIES(common_obj PROPERTIES
  78. POSITION_INDEPENDENT_CODE ON
  79. COMPILE_DEFINITIONS "PAHO_MQTT_EXPORTS=1")
  80. ADD_EXECUTABLE(MQTTVersion MQTTVersion.c)
  81. SET_TARGET_PROPERTIES(MQTTVersion PROPERTIES
  82. POSITION_INDEPENDENT_CODE ON
  83. COMPILE_DEFINITIONS "PAHO_MQTT_IMPORTS=1")
  84. ENDIF()
  85. IF (PAHO_BUILD_STATIC)
  86. ADD_LIBRARY(common_obj_static OBJECT ${common_src})
  87. SET_TARGET_PROPERTIES(common_obj_static PROPERTIES
  88. POSITION_INDEPENDENT_CODE ON
  89. COMPILE_DEFINITIONS "PAHO_MQTT_STATIC=1")
  90. ENDIF()
  91. IF (PAHO_BUILD_SHARED)
  92. ADD_LIBRARY(paho-mqtt3c SHARED $<TARGET_OBJECTS:common_obj> MQTTClient.c)
  93. ADD_LIBRARY(paho-mqtt3a SHARED $<TARGET_OBJECTS:common_obj> MQTTAsync.c MQTTAsyncUtils.c)
  94. TARGET_LINK_LIBRARIES(paho-mqtt3c ${LIBS_SYSTEM})
  95. TARGET_LINK_LIBRARIES(paho-mqtt3a ${LIBS_SYSTEM})
  96. TARGET_LINK_LIBRARIES(MQTTVersion paho-mqtt3a paho-mqtt3c ${LIBS_SYSTEM})
  97. SET_TARGET_PROPERTIES(
  98. paho-mqtt3c paho-mqtt3a PROPERTIES
  99. VERSION ${CLIENT_VERSION}
  100. SOVERSION ${PAHO_VERSION_MAJOR}
  101. COMPILE_DEFINITIONS "PAHO_MQTT_EXPORTS=1")
  102. IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  103. SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
  104. SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
  105. ELSEIF (NOT WIN32)
  106. SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
  107. SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
  108. ENDIF()
  109. IF (NOT WIN32)
  110. SET_TARGET_PROPERTIES(
  111. paho-mqtt3c PROPERTIES
  112. LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}")
  113. SET_TARGET_PROPERTIES(
  114. paho-mqtt3a PROPERTIES
  115. LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}")
  116. ENDIF()
  117. FOREACH(TARGET paho-mqtt3c paho-mqtt3a)
  118. TARGET_INCLUDE_DIRECTORIES(${TARGET}
  119. PUBLIC
  120. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  121. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  122. PRIVATE
  123. ${CMAKE_BINARY_DIR})
  124. ENDFOREACH()
  125. INSTALL(TARGETS paho-mqtt3c paho-mqtt3a
  126. EXPORT eclipse-paho-mqtt-cTargets
  127. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  128. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  129. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  130. INSTALL(TARGETS MQTTVersion
  131. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  132. ENDIF()
  133. IF (PAHO_BUILD_STATIC)
  134. ADD_LIBRARY(paho-mqtt3c-static STATIC $<TARGET_OBJECTS:common_obj_static> MQTTClient.c)
  135. ADD_LIBRARY(paho-mqtt3a-static STATIC $<TARGET_OBJECTS:common_obj_static> MQTTAsync.c MQTTAsyncUtils.c)
  136. TARGET_LINK_LIBRARIES(paho-mqtt3c-static ${LIBS_SYSTEM})
  137. TARGET_LINK_LIBRARIES(paho-mqtt3a-static ${LIBS_SYSTEM})
  138. IF (NOT WIN32)
  139. SET_TARGET_PROPERTIES(paho-mqtt3c-static PROPERTIES OUTPUT_NAME paho-mqtt3c)
  140. SET_TARGET_PROPERTIES(paho-mqtt3a-static PROPERTIES OUTPUT_NAME paho-mqtt3a)
  141. ENDIF()
  142. SET_TARGET_PROPERTIES(
  143. paho-mqtt3c-static paho-mqtt3a-static PROPERTIES
  144. VERSION ${CLIENT_VERSION}
  145. SOVERSION ${PAHO_VERSION_MAJOR}
  146. COMPILE_DEFINITIONS "PAHO_MQTT_STATIC=1")
  147. FOREACH(TARGET paho-mqtt3c-static paho-mqtt3a-static)
  148. TARGET_INCLUDE_DIRECTORIES(${TARGET}
  149. PUBLIC
  150. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  151. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  152. PRIVATE
  153. ${CMAKE_BINARY_DIR})
  154. ENDFOREACH()
  155. IF (NOT PAHO_BUILD_SHARED)
  156. INSTALL(TARGETS paho-mqtt3c-static paho-mqtt3a-static
  157. EXPORT eclipse-paho-mqtt-cTargets
  158. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  159. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  160. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  161. ELSE()
  162. INSTALL(TARGETS paho-mqtt3c-static paho-mqtt3a-static
  163. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
  164. ENDIF()
  165. ENDIF()
  166. INSTALL(FILES MQTTAsync.h MQTTClient.h MQTTClientPersistence.h MQTTProperties.h MQTTReasonCodes.h MQTTSubscribeOpts.h MQTTExportDeclarations.h
  167. DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  168. IF (PAHO_WITH_SSL)
  169. SET(OPENSSL_ROOT_DIR "" CACHE PATH "Directory containing OpenSSL libraries and includes")
  170. find_package(OpenSSL REQUIRED)
  171. IF (PAHO_BUILD_SHARED)
  172. ## common compilation for libpaho-mqtt3cs and libpaho-mqtt3as
  173. ## Note: SSL libraries must be recompiled due ifdefs
  174. ADD_LIBRARY(common_ssl_obj OBJECT ${common_src})
  175. TARGET_INCLUDE_DIRECTORIES(common_ssl_obj PUBLIC ${OPENSSL_INCLUDE_DIR})
  176. SET_PROPERTY(TARGET common_ssl_obj PROPERTY POSITION_INDEPENDENT_CODE ON)
  177. SET_PROPERTY(TARGET common_ssl_obj PROPERTY COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_EXPORTS=1")
  178. ADD_LIBRARY(paho-mqtt3cs SHARED $<TARGET_OBJECTS:common_ssl_obj> MQTTClient.c SSLSocket.c)
  179. ADD_LIBRARY(paho-mqtt3as SHARED $<TARGET_OBJECTS:common_ssl_obj> MQTTAsync.c MQTTAsyncUtils.c SSLSocket.c)
  180. SET_TARGET_PROPERTIES(
  181. paho-mqtt3cs paho-mqtt3as PROPERTIES
  182. VERSION ${CLIENT_VERSION}
  183. SOVERSION ${PAHO_VERSION_MAJOR}
  184. COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_EXPORTS=1")
  185. IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  186. SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
  187. SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
  188. ELSEIF (NOT WIN32)
  189. SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
  190. SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
  191. ENDIF()
  192. IF (NOT WIN32)
  193. SET_TARGET_PROPERTIES(
  194. paho-mqtt3cs PROPERTIES
  195. LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}")
  196. SET_TARGET_PROPERTIES(
  197. paho-mqtt3as PROPERTIES
  198. LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}")
  199. ENDIF()
  200. FOREACH(TARGET paho-mqtt3cs paho-mqtt3as)
  201. TARGET_INCLUDE_DIRECTORIES(${TARGET}
  202. PUBLIC
  203. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  204. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  205. PRIVATE
  206. ${CMAKE_BINARY_DIR})
  207. TARGET_LINK_LIBRARIES(${TARGET}
  208. PUBLIC
  209. OpenSSL::SSL OpenSSL::Crypto ${LIBS_SYSTEM})
  210. ENDFOREACH()
  211. INSTALL(TARGETS paho-mqtt3cs paho-mqtt3as
  212. EXPORT eclipse-paho-mqtt-cTargets
  213. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  214. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  215. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  216. ENDIF()
  217. IF (PAHO_BUILD_STATIC)
  218. ## common compilation for libpaho-mqtt3cs and libpaho-mqtt3as
  219. ## Note: SSL libraries must be recompiled due ifdefs
  220. ADD_LIBRARY(common_ssl_obj_static OBJECT ${common_src})
  221. TARGET_INCLUDE_DIRECTORIES(common_ssl_obj_static PUBLIC ${OPENSSL_INCLUDE_DIR})
  222. SET_PROPERTY(TARGET common_ssl_obj_static PROPERTY POSITION_INDEPENDENT_CODE ON)
  223. SET_PROPERTY(TARGET common_ssl_obj_static PROPERTY COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_STATIC=1")
  224. ADD_LIBRARY(paho-mqtt3cs-static STATIC $<TARGET_OBJECTS:common_ssl_obj_static> MQTTClient.c SSLSocket.c)
  225. ADD_LIBRARY(paho-mqtt3as-static STATIC $<TARGET_OBJECTS:common_ssl_obj_static> MQTTAsync.c MQTTAsyncUtils.c SSLSocket.c)
  226. SET_TARGET_PROPERTIES(
  227. paho-mqtt3cs-static paho-mqtt3as-static PROPERTIES
  228. VERSION ${CLIENT_VERSION}
  229. SOVERSION ${PAHO_VERSION_MAJOR}
  230. COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_STATIC=1")
  231. IF (NOT WIN32)
  232. SET_TARGET_PROPERTIES(paho-mqtt3cs-static PROPERTIES OUTPUT_NAME paho-mqtt3cs)
  233. SET_TARGET_PROPERTIES(paho-mqtt3as-static PROPERTIES OUTPUT_NAME paho-mqtt3as)
  234. ENDIF()
  235. IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  236. SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
  237. SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
  238. ELSEIF (NOT WIN32)
  239. SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
  240. SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
  241. ENDIF()
  242. IF (NOT WIN32)
  243. SET_TARGET_PROPERTIES(
  244. paho-mqtt3cs-static PROPERTIES
  245. LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}")
  246. SET_TARGET_PROPERTIES(
  247. paho-mqtt3as-static PROPERTIES
  248. LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}")
  249. ENDIF()
  250. IF (NOT PAHO_BUILD_SHARED)
  251. INSTALL(TARGETS paho-mqtt3cs-static paho-mqtt3as-static
  252. EXPORT eclipse-paho-mqtt-cTargets
  253. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  254. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  255. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  256. ELSE()
  257. INSTALL(TARGETS paho-mqtt3cs-static paho-mqtt3as-static
  258. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
  259. ENDIF()
  260. FOREACH(TARGET paho-mqtt3cs-static paho-mqtt3as-static)
  261. TARGET_INCLUDE_DIRECTORIES(${TARGET}
  262. PUBLIC
  263. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  264. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  265. PRIVATE
  266. ${CMAKE_BINARY_DIR})
  267. TARGET_LINK_LIBRARIES(${TARGET}
  268. PUBLIC
  269. OpenSSL::SSL OpenSSL::Crypto ${LIBS_SYSTEM})
  270. ENDFOREACH()
  271. ENDIF()
  272. ENDIF()
  273. INSTALL(EXPORT eclipse-paho-mqtt-cTargets
  274. FILE eclipse-paho-mqtt-cConfig.cmake
  275. NAMESPACE eclipse-paho-mqtt-c::
  276. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/eclipse-paho-mqtt-c)
  277. INCLUDE(CMakePackageConfigHelpers)
  278. WRITE_BASIC_PACKAGE_VERSION_FILE("eclipse-paho-mqtt-cConfigVersion.cmake"
  279. VERSION ${CLIENT_VERSION}
  280. COMPATIBILITY SameMajorVersion)
  281. INSTALL(FILES
  282. "${CMAKE_CURRENT_BINARY_DIR}/eclipse-paho-mqtt-cConfigVersion.cmake"
  283. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/eclipse-paho-mqtt-c)
  284. # Base64 test
  285. ADD_EXECUTABLE( Base64Test EXCLUDE_FROM_ALL Base64.c Base64.h )
  286. TARGET_COMPILE_DEFINITIONS( Base64Test PUBLIC "-DBASE64_TEST" )
  287. IF (PAHO_WITH_SSL)
  288. ADD_EXECUTABLE( Base64TestOpenSSL EXCLUDE_FROM_ALL Base64.c Base64.h )
  289. TARGET_LINK_LIBRARIES( Base64TestOpenSSL OpenSSL::SSL OpenSSL::Crypto)
  290. TARGET_COMPILE_DEFINITIONS( Base64TestOpenSSL PUBLIC "-DBASE64_TEST -DOPENSSL=1" )
  291. ENDIF (PAHO_WITH_SSL)
  292. # SHA1 test
  293. ADD_EXECUTABLE( Sha1Test EXCLUDE_FROM_ALL SHA1.c SHA1.h )
  294. TARGET_COMPILE_DEFINITIONS( Sha1Test PUBLIC "-DSHA1_TEST" )
  295. IF (PAHO_WITH_SSL)
  296. ADD_EXECUTABLE( Sha1TestOpenSSL EXCLUDE_FROM_ALL SHA1.c SHA1.h )
  297. TARGET_LINK_LIBRARIES( Sha1TestOpenSSL OpenSSL::SSL OpenSSL::Crypto)
  298. TARGET_COMPILE_DEFINITIONS( Sha1TestOpenSSL PUBLIC "-DSHA1_TEST -DOPENSSL=1" )
  299. ENDIF (PAHO_WITH_SSL)