CMakeLists.txt 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. FILE(GLOB HDR_ROOT "*.hpp")
  2. FILE(GLOB HDR_MQTT "mqtt/*.hpp")
  3. SET(ROOT_INCLUDE_TARGET include)
  4. SET(ROOT_MQTT_TARGET include/mqtt)
  5. ADD_LIBRARY(${PROJECT_NAME} INTERFACE)
  6. TARGET_LINK_LIBRARIES(${PROJECT_NAME} INTERFACE Threads::Threads Boost::system Boost::date_time)
  7. IF(MQTT_USE_STATIC_OPENSSL)
  8. # Unfortunately, cmake doesn't automatically detect that statically linked openssl
  9. # requires at least two more libs to be linked. "dl" is for dynamic library linking
  10. # and zlib is for basic compression functionality.
  11. # There is currently no way to specify statically linked zlib.
  12. TARGET_LINK_LIBRARIES(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_USE_TLS}>:${CMAKE_DL_LIBS} ZLIB::ZLIB>)
  13. ENDIF()
  14. TARGET_LINK_LIBRARIES(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_USE_TLS}>:OpenSSL::SSL>)
  15. TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
  16. INTERFACE
  17. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  18. $<INSTALL_INTERFACE:${ROOT_INCLUDE_TARGET}>
  19. $<INSTALL_INTERFACE:${ROOT_MQTT_TARGET}>
  20. )
  21. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_USE_TLS}>:MQTT_USE_TLS>)
  22. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_USE_WS}>:MQTT_USE_WS>)
  23. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_USE_STR_CHECK}>:MQTT_USE_STR_CHECK>)
  24. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_USE_LOG}>:MQTT_USE_LOG>)
  25. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE MQTT_ALWAYS_SEND_REASON_CODE=$<BOOL:${MQTT_ALWAYS_SEND_REASON_CODE}>)
  26. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_STD_VARIANT}>:MQTT_STD_VARIANT>)
  27. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_STD_OPTIONAL}>:MQTT_STD_OPTIONAL>)
  28. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_STD_ANY}>:MQTT_STD_ANY>)
  29. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_STD_STRING_VIEW}>:MQTT_STD_STRING_VIEW>)
  30. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_STD_SHARED_PTR_ARRAY}>:MQTT_STD_SHARED_PTR_ARRAY>)
  31. TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} INTERFACE $<$<BOOL:${MQTT_DISABLE_LIBSTDCXX_TUPLE_ANY_WORKAROUND}>:MQTT_DISABLE_LIBSTDCXX_TUPLE_ANY_WORKAROUND>)
  32. # You might wonder why we don't simply add the list of header files to the check_deps
  33. # executable directly, and let cmake figure everything out on it's own.
  34. # The reason we can't do that is because cmake has built in rules that can't be disabled
  35. # or overridden that prevent it from ever treating a file that ends in .h as a source file.
  36. # So the work around for this problem is that we copy the header files to a different folder,
  37. # one that's owned by CMake (the binary dir), and compile the header files there to perform
  38. # the dependency checking.
  39. SET (HDR_DEPS_CHK_FOLDER "${CMAKE_BINARY_DIR}/check_deps_headers")
  40. FILE (MAKE_DIRECTORY "${HDR_DEPS_CHK_FOLDER}")
  41. LIST (APPEND CHK_MQTT)
  42. FILE (GLOB_RECURSE ALL_HPP "mqtt/*.hpp")
  43. FOREACH (HDR ${ALL_HPP})
  44. GET_FILENAME_COMPONENT (HDR_NAME ${HDR} NAME)
  45. # Of course, the FILE macro always treats the destination name as if it were a folder name
  46. # So we have to first copy the header file, and THEN rename the header file to have an
  47. # extension that cmake will treat as a source file.
  48. FILE (COPY ${HDR} DESTINATION "${HDR_DEPS_CHK_FOLDER}")
  49. FILE (RENAME "${HDR_DEPS_CHK_FOLDER}/${HDR_NAME}" "${HDR_DEPS_CHK_FOLDER}/${HDR_NAME}.cpp")
  50. LIST (APPEND CHK_MQTT "${HDR_DEPS_CHK_FOLDER}/${HDR_NAME}.cpp")
  51. ENDFOREACH ()
  52. # The EXCLUDE_FROM_ALL property prevents check_deps from being included in the default target
  53. ADD_LIBRARY(check_deps OBJECT EXCLUDE_FROM_ALL ${CHK_MQTT})
  54. # We don't need to actually run the whole compiler. We're just checking that all the includes are valid
  55. # So here we ask for only the syntax checking mode to be used.
  56. # We also don't mind that there might be unused constant variables when doing deps checking.
  57. TARGET_COMPILE_OPTIONS(check_deps PUBLIC -Wno-unused-const-variable $<IF:$<CXX_COMPILER_ID:MSVC>,/Zs,-fsyntax-only>)
  58. TARGET_LINK_LIBRARIES (check_deps PUBLIC ${PROJECT_NAME})
  59. INSTALL(FILES ${HDR_ROOT} DESTINATION ${ROOT_INCLUDE_TARGET})
  60. INSTALL(FILES ${HDR_MQTT} DESTINATION ${ROOT_MQTT_TARGET})