CMakeLists.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. #*******************************************************************************
  2. # Copyright (c) 2015, 2024 logi.cals GmbH, Frank Pagliughi <fpagliughi@mindspring.com> 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. ## compilation/linkage settings
  19. configure_file(VersionInfo.h.in
  20. ${CMAKE_BINARY_DIR}/VersionInfo.h
  21. @ONLY
  22. )
  23. set(common_src
  24. MQTTTime.c
  25. MQTTProtocolClient.c
  26. Clients.c
  27. utf-8.c
  28. MQTTPacket.c
  29. MQTTPacketOut.c
  30. Messages.c
  31. Tree.c
  32. Socket.c
  33. Log.c
  34. MQTTPersistence.c
  35. Thread.c
  36. MQTTProtocolOut.c
  37. MQTTPersistenceDefault.c
  38. SocketBuffer.c
  39. LinkedList.c
  40. MQTTProperties.c
  41. MQTTReasonCodes.c
  42. Base64.c
  43. SHA1.c
  44. WebSocket.c
  45. Proxy.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. if(PAHO_WITH_LIBRESSL)
  55. set(LIBS_SYSTEM ws2_32 crypt32 rpcrt4 bcrypt)
  56. else()
  57. set(LIBS_SYSTEM ws2_32 crypt32 rpcrt4)
  58. endif()
  59. elseif(UNIX)
  60. if(CMAKE_SYSTEM_NAME MATCHES "Linux")
  61. set(LIBS_SYSTEM c dl pthread rt)
  62. # anl is only available with glibc so check if it is found before using
  63. # it or build will fail on uclibc or musl
  64. find_library(LIB_ANL anl)
  65. if(LIB_ANL)
  66. set(LIBS_SYSTEM "${LIBS_SYSTEM}" anl)
  67. endif()
  68. if(PAHO_WITH_LIBUUID)
  69. set(LIBS_SYSTEM "${LIBS_SYSTEM}" uuid)
  70. endif()
  71. add_definitions(-D_GNU_SOURCE -fvisibility=hidden)
  72. elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
  73. set(LIBS_SYSTEM c dl)
  74. elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  75. set(LIBS_SYSTEM compat pthread)
  76. elseif(CMAKE_SYSTEM_NAME MATCHES "QNX")
  77. set(LIBS_SYSTEM c)
  78. else()
  79. set(LIBS_SYSTEM c pthread)
  80. endif()
  81. endif()
  82. if(PAHO_BUILD_SHARED)
  83. # common compilation for libpaho-mqtt3c and libpaho-mqtt3a
  84. add_library(common_obj OBJECT ${common_src})
  85. set_target_properties(common_obj PROPERTIES POSITION_INDEPENDENT_CODE ON)
  86. target_compile_definitions(common_obj PRIVATE PAHO_MQTT_EXPORTS=1)
  87. add_executable(MQTTVersion MQTTVersion.c)
  88. target_compile_definitions(MQTTVersion PUBLIC PAHO_MQTT_IMPORTS=1)
  89. endif()
  90. if(PAHO_BUILD_STATIC)
  91. add_library(common_obj_static OBJECT ${common_src})
  92. set_target_properties(common_obj_static PROPERTIES POSITION_INDEPENDENT_CODE ON)
  93. target_compile_definitions(common_obj_static PRIVATE PAHO_MQTT_STATIC=1)
  94. endif()
  95. if(PAHO_BUILD_SHARED)
  96. add_library(paho-mqtt3c SHARED
  97. $<TARGET_OBJECTS:common_obj>
  98. MQTTClient.c
  99. )
  100. add_library(paho-mqtt3a SHARED
  101. $<TARGET_OBJECTS:common_obj>
  102. MQTTAsync.c
  103. MQTTAsyncUtils.c
  104. )
  105. add_library(eclipse-paho-mqtt-c::paho-mqtt3c ALIAS paho-mqtt3c)
  106. add_library(eclipse-paho-mqtt-c::paho-mqtt3a ALIAS paho-mqtt3a)
  107. target_link_libraries(paho-mqtt3c ${LIBS_SYSTEM})
  108. target_link_libraries(paho-mqtt3a ${LIBS_SYSTEM})
  109. target_link_libraries(MQTTVersion paho-mqtt3a paho-mqtt3c ${LIBS_SYSTEM})
  110. set_target_properties(paho-mqtt3c paho-mqtt3a PROPERTIES
  111. VERSION ${PROJECT_VERSION}
  112. SOVERSION ${PROJECT_VERSION_MAJOR}
  113. COMPILE_DEFINITIONS "PAHO_MQTT_EXPORTS=1"
  114. )
  115. if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  116. set(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
  117. set(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
  118. elseif(NOT WIN32)
  119. set(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
  120. set(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
  121. endif()
  122. if(NOT WIN32)
  123. set_target_properties(paho-mqtt3c PROPERTIES
  124. LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}"
  125. )
  126. set_target_properties(paho-mqtt3a PROPERTIES
  127. LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}"
  128. )
  129. endif()
  130. foreach(TARGET paho-mqtt3c paho-mqtt3a)
  131. target_include_directories(${TARGET}
  132. PUBLIC
  133. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  134. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  135. PRIVATE
  136. ${CMAKE_BINARY_DIR})
  137. endforeach()
  138. install(TARGETS paho-mqtt3c paho-mqtt3a
  139. EXPORT eclipse-paho-mqtt-cTargets
  140. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  141. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  142. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  143. )
  144. install(TARGETS MQTTVersion
  145. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  146. )
  147. endif()
  148. if(PAHO_BUILD_STATIC)
  149. add_library(paho-mqtt3c-static STATIC
  150. $<TARGET_OBJECTS:common_obj_static>
  151. MQTTClient.c
  152. )
  153. add_library(paho-mqtt3a-static STATIC
  154. $<TARGET_OBJECTS:common_obj_static>
  155. MQTTAsync.c
  156. MQTTAsyncUtils.c
  157. )
  158. add_library(eclipse-paho-mqtt-c::paho-mqtt3c-static ALIAS paho-mqtt3c-static)
  159. add_library(eclipse-paho-mqtt-c::paho-mqtt3a-static ALIAS paho-mqtt3a-static)
  160. target_link_libraries(paho-mqtt3c-static ${LIBS_SYSTEM})
  161. target_link_libraries(paho-mqtt3a-static ${LIBS_SYSTEM})
  162. if(NOT WIN32)
  163. set_target_properties(paho-mqtt3c-static PROPERTIES OUTPUT_NAME paho-mqtt3c)
  164. set_target_properties(paho-mqtt3a-static PROPERTIES OUTPUT_NAME paho-mqtt3a)
  165. endif()
  166. set_target_properties(paho-mqtt3c-static paho-mqtt3a-static PROPERTIES
  167. VERSION ${PROJECT_VERSION}
  168. SOVERSION ${PROJECT_VERSION_MAJOR}
  169. COMPILE_DEFINITIONS "PAHO_MQTT_STATIC=1"
  170. )
  171. foreach(TARGET paho-mqtt3c-static paho-mqtt3a-static)
  172. target_include_directories(${TARGET}
  173. PUBLIC
  174. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  175. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  176. PRIVATE
  177. ${CMAKE_BINARY_DIR})
  178. endforeach()
  179. if(NOT PAHO_BUILD_SHARED)
  180. install(TARGETS paho-mqtt3c-static paho-mqtt3a-static
  181. EXPORT eclipse-paho-mqtt-cTargets
  182. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  183. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  184. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  185. )
  186. else()
  187. install(TARGETS paho-mqtt3c-static paho-mqtt3a-static
  188. EXPORT eclipse-paho-mqtt-cTargets
  189. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  190. )
  191. endif()
  192. endif()
  193. install(
  194. FILES
  195. MQTTAsync.h
  196. MQTTClient.h
  197. MQTTClientPersistence.h
  198. MQTTProperties.h
  199. MQTTReasonCodes.h
  200. MQTTSubscribeOpts.h
  201. MQTTExportDeclarations.h
  202. DESTINATION
  203. ${CMAKE_INSTALL_INCLUDEDIR}
  204. )
  205. if(PAHO_WITH_SSL OR PAHO_WITH_LIBRESSL)
  206. if(PAHO_WITH_LIBRESSL)
  207. find_package(LibreSSL REQUIRED)
  208. set(SSL_LIBRARY_NAME LibreSSL)
  209. set(SSL_INCLUDE_DIR ${LIBRESSL_INCLUDE_DIR})
  210. set(SSL_ROOT_DIR ${LIBRESSL_ROOT_DIR})
  211. else()
  212. find_package(OpenSSL REQUIRED)
  213. set(SSL_LIBRARY_NAME OpenSSL)
  214. set(SSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR})
  215. set(SSL_ROOT_DIR ${OPENSSL_ROOT_DIR})
  216. endif()
  217. message(STATUS "Using ${SSL_LIBRARY_NAME} with headers at ${SSL_INCLUDE_DIR}")
  218. if(PAHO_BUILD_SHARED)
  219. ## common compilation for libpaho-mqtt3cs and libpaho-mqtt3as
  220. ## Note: SSL libraries must be recompiled due to ifdefs
  221. add_library(common_ssl_obj OBJECT ${common_src})
  222. target_include_directories(common_ssl_obj PUBLIC ${SSL_INCLUDE_DIR})
  223. set_property(TARGET common_ssl_obj PROPERTY POSITION_INDEPENDENT_CODE ON)
  224. target_compile_definitions(common_ssl_obj PRIVATE OPENSSL=1 PAHO_MQTT_EXPORTS=1)
  225. add_library(paho-mqtt3cs SHARED
  226. $<TARGET_OBJECTS:common_ssl_obj>
  227. MQTTClient.c
  228. SSLSocket.c
  229. )
  230. add_library(paho-mqtt3as SHARED
  231. $<TARGET_OBJECTS:common_ssl_obj>
  232. MQTTAsync.c
  233. MQTTAsyncUtils.c
  234. SSLSocket.c
  235. )
  236. add_library(eclipse-paho-mqtt-c::paho-mqtt3cs ALIAS paho-mqtt3cs)
  237. add_library(eclipse-paho-mqtt-c::paho-mqtt3as ALIAS paho-mqtt3as)
  238. set_target_properties(paho-mqtt3cs paho-mqtt3as PROPERTIES
  239. VERSION ${PROJECT_VERSION}
  240. SOVERSION ${PROJECT_VERSION_MAJOR}
  241. COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_EXPORTS=1"
  242. )
  243. if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  244. set(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
  245. set(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
  246. elseif(NOT WIN32)
  247. set(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
  248. set(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
  249. endif()
  250. if(NOT WIN32)
  251. set_target_properties(paho-mqtt3cs PROPERTIES
  252. LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}"
  253. )
  254. set_target_properties(paho-mqtt3as PROPERTIES
  255. LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}")
  256. endif()
  257. foreach(TARGET paho-mqtt3cs paho-mqtt3as)
  258. target_include_directories(${TARGET}
  259. PUBLIC
  260. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  261. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  262. PRIVATE
  263. ${CMAKE_BINARY_DIR}
  264. )
  265. target_link_libraries(${TARGET}
  266. PUBLIC
  267. ${SSL_LIBRARY_NAME}::SSL ${SSL_LIBRARY_NAME}::Crypto ${LIBS_SYSTEM}
  268. )
  269. endforeach()
  270. install(TARGETS paho-mqtt3cs paho-mqtt3as
  271. EXPORT eclipse-paho-mqtt-cTargets
  272. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  273. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  274. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  275. )
  276. endif()
  277. if(PAHO_BUILD_STATIC)
  278. ## common compilation for libpaho-mqtt3cs and libpaho-mqtt3as
  279. ## Note: SSL libraries must be recompiled due ifdefs
  280. add_library(common_ssl_obj_static OBJECT ${common_src})
  281. target_include_directories(common_ssl_obj_static PUBLIC ${SSL_INCLUDE_DIR})
  282. set_property(TARGET common_ssl_obj_static PROPERTY POSITION_INDEPENDENT_CODE ON)
  283. target_compile_definitions(common_ssl_obj_static PRIVATE OPENSSL=1 PAHO_MQTT_STATIC=1)
  284. add_library(paho-mqtt3cs-static STATIC
  285. $<TARGET_OBJECTS:common_ssl_obj_static>
  286. MQTTClient.c
  287. SSLSocket.c
  288. )
  289. add_library(paho-mqtt3as-static STATIC
  290. $<TARGET_OBJECTS:common_ssl_obj_static>
  291. MQTTAsync.c
  292. MQTTAsyncUtils.c
  293. SSLSocket.c
  294. )
  295. add_library(eclipse-paho-mqtt-c::paho-mqtt3cs-static ALIAS paho-mqtt3cs-static)
  296. add_library(eclipse-paho-mqtt-c::paho-mqtt3as-static ALIAS paho-mqtt3as-static)
  297. set_target_properties(paho-mqtt3cs-static paho-mqtt3as-static PROPERTIES
  298. VERSION ${PROJECT_VERSION}
  299. SOVERSION ${PROJECT_VERSION_MAJOR}
  300. COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_STATIC=1"
  301. )
  302. if(NOT WIN32)
  303. set_target_properties(paho-mqtt3cs-static PROPERTIES OUTPUT_NAME paho-mqtt3cs)
  304. set_target_properties(paho-mqtt3as-static PROPERTIES OUTPUT_NAME paho-mqtt3as)
  305. endif()
  306. if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  307. set(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
  308. set(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
  309. elseif(NOT WIN32)
  310. set(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
  311. set(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
  312. endif()
  313. if(NOT WIN32)
  314. set_target_properties(paho-mqtt3cs-static PROPERTIES
  315. LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}"
  316. )
  317. set_target_properties(paho-mqtt3as-static PROPERTIES
  318. LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}"
  319. )
  320. endif()
  321. if(NOT PAHO_BUILD_SHARED)
  322. install(TARGETS paho-mqtt3cs-static paho-mqtt3as-static
  323. EXPORT eclipse-paho-mqtt-cTargets
  324. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  325. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  326. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  327. )
  328. else()
  329. install(TARGETS paho-mqtt3cs-static paho-mqtt3as-static
  330. EXPORT eclipse-paho-mqtt-cTargets
  331. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  332. )
  333. endif()
  334. foreach(TARGET paho-mqtt3cs-static paho-mqtt3as-static)
  335. target_include_directories(${TARGET}
  336. PUBLIC
  337. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  338. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  339. PRIVATE
  340. ${CMAKE_BINARY_DIR}
  341. )
  342. target_link_libraries(${TARGET}
  343. PUBLIC
  344. ${SSL_LIBRARY_NAME}::SSL ${SSL_LIBRARY_NAME}::Crypto ${LIBS_SYSTEM}
  345. )
  346. endforeach()
  347. endif()
  348. endif()
  349. install(EXPORT eclipse-paho-mqtt-cTargets
  350. FILE eclipse-paho-mqtt-cConfig.cmake
  351. NAMESPACE eclipse-paho-mqtt-c::
  352. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/eclipse-paho-mqtt-c
  353. )
  354. include(CMakePackageConfigHelpers)
  355. write_basic_package_version_file("eclipse-paho-mqtt-cConfigVersion.cmake"
  356. VERSION ${CLIENT_VERSION}
  357. COMPATIBILITY SameMajorVersion
  358. )
  359. install(
  360. FILES
  361. "${CMAKE_CURRENT_BINARY_DIR}/eclipse-paho-mqtt-cConfigVersion.cmake"
  362. DESTINATION
  363. ${CMAKE_INSTALL_LIBDIR}/cmake/eclipse-paho-mqtt-c
  364. )
  365. # Base64 test
  366. add_executable(Base64Test EXCLUDE_FROM_ALL Base64.c Base64.h)
  367. target_compile_definitions(Base64Test PUBLIC BASE64_TEST)
  368. if(PAHO_WITH_SSL OR PAHO_WITH_LIBRESSL)
  369. add_executable(Base64TestOpenSSL EXCLUDE_FROM_ALL Base64.c Base64.h )
  370. target_link_libraries(Base64TestOpenSSL ${SSL_LIBRARY_NAME}::SSL ${SSL_LIBRARY_NAME}::Crypto)
  371. target_compile_definitions(Base64TestOpenSSL PUBLIC BASE64_TEST OPENSSL=1)
  372. endif()
  373. # SHA1 test
  374. add_executable(Sha1Test EXCLUDE_FROM_ALL SHA1.c SHA1.h)
  375. target_compile_definitions(Sha1Test PUBLIC SHA1_TEST)
  376. if(PAHO_WITH_SSL OR PAHO_WITH_LIBRESSL)
  377. add_executable(Sha1TestOpenSSL EXCLUDE_FROM_ALL SHA1.c SHA1.h)
  378. target_link_libraries(Sha1TestOpenSSL ${SSL_LIBRARY_NAME}::SSL ${SSL_LIBRARY_NAME}::Crypto)
  379. target_compile_definitions(Sha1TestOpenSSL PUBLIC SHA1_TEST OPENSSL=1)
  380. endif()