-
Notifications
You must be signed in to change notification settings - Fork 277
/
CMakeLists.txt
145 lines (124 loc) · 5 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
cmake_minimum_required(VERSION 3.5)
project(MQTT-C VERSION 1.1.2 LANGUAGES C)
# MQTT-C build options
option(MQTT_C_OpenSSL_SUPPORT "Build MQTT-C with OpenSSL support?" OFF)
option(MQTT_C_MbedTLS_SUPPORT "Build MQTT-C with mbed TLS support?" OFF)
option(MQTT_C_BearSSL_SUPPORT "Build MQTT-C with Bear SSL support?" OFF)
option(MQTT_C_EXAMPLES "Build MQTT-C examples?" ON)
option(MQTT_C_INSTALL_EXAMPLES "Install MQTT-C examples?" OFF)
option(MQTT_C_TESTS "Build MQTT-C tests?" OFF)
list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# MQTT-C library
add_library(mqttc STATIC
src/mqtt_pal.c
src/mqtt.c
)
target_include_directories(mqttc PUBLIC include)
target_link_libraries(mqttc PUBLIC
$<$<C_COMPILER_ID:MSVC>:ws2_32>
)
if(MQTT_C_BearSSL_SUPPORT)
set(bearssl_root "$ENV{BEARSSL_ROOT}")
set(bearssl_include "${bearssl_root}/include")
find_file(bearinc NAMES bearssl.h PATHS "${bearssl_include}")
if ("${bearinc}" STREQUAL "bearinc-NOTFOUND")
MESSAGE(FATAL_ERROR "BEARSSL_ROOT does not contain include/bearssl.h")
endif()
set(bearssl_lib "${bearssl_root}/lib")
find_library(bearlib NAMES libbearssl.a bearssl.lib PATHS "{bearssl_lib}")
if("${bearlib}" STREQUAL "bearlib-NOTFOUND")
MESSAGE(FATAL_ERROR "BEARSSL_ROOT does not contain lib with bearssl library")
endif()
get_filename_component(bearinc "${bearinc}" DIRECTORY)
get_filename_component(bearlib2 "${bearlib}" DIRECTORY)
target_include_directories(mqttc PUBLIC bearsslinc)
target_link_libraries(mqttc INTERFACE "${bearlib}")
target_compile_definitions(mqttc PUBLIC MQTT_USE_BEARSSL)
endif()
# Configure with OpenSSL support
if(MQTT_C_OpenSSL_SUPPORT)
find_package(OpenSSL REQUIRED)
target_link_libraries(mqttc INTERFACE OpenSSL::SSL)
target_include_directories(mqttc PUBLIC ${OPENSSL_INCLUDE_DIR})
target_compile_definitions(mqttc PUBLIC MQTT_USE_BIO)
endif()
# Configure with mbed TLS support
if(MQTT_C_MbedTLS_SUPPORT)
find_package(MbedTLS REQUIRED)
target_include_directories(mqttc PUBLIC ${MBEDTLS_INCLUDE_DIRS})
target_link_libraries(mqttc INTERFACE ${MBEDTLS_LIBRARY})
target_compile_definitions(mqttc PUBLIC MQTT_USE_MBEDTLS)
endif()
# Build examples
if(MQTT_C_EXAMPLES)
find_package(Threads REQUIRED)
if(MQTT_C_OpenSSL_SUPPORT)
if(MSVC)
add_executable(bio_publisher examples/bio_publisher_win.c)
add_executable(openssl_publisher examples/openssl_publisher_win.c)
else()
add_executable(bio_publisher examples/bio_publisher.c)
add_executable(openssl_publisher examples/openssl_publisher.c)
endif()
if(MQTT_C_INSTALL_EXAMPLES)
install(TARGETS bio_publisher openssl_publisher)
endif()
target_link_libraries(bio_publisher Threads::Threads mqttc)
target_link_libraries(openssl_publisher Threads::Threads mqttc)
elseif(MQTT_C_MbedTLS_SUPPORT)
add_executable(mbedtls_publisher examples/mbedtls_publisher.c)
target_link_libraries(mbedtls_publisher Threads::Threads mqttc ${MBEDX509_LIBRARY} ${MBEDCRYPTO_LIBRARY})
if(MQTT_C_INSTALL_EXAMPLES)
install(TARGETS mbedtls_publisher)
endif()
elseif(MQTT_C_BearSSL_SUPPORT)
add_executable(bearssl_publisher examples/bearssl_publisher.c)
target_link_libraries(bearssl_publisher mqttc bearssl)
if(MQTT_C_INSTALL_EXAMPLES)
install(TARGETS bearssl_publisher)
endif()
else()
add_executable(simple_publisher examples/simple_publisher.c)
target_link_libraries(simple_publisher Threads::Threads mqttc)
if(MQTT_C_INSTALL_EXAMPLES)
install(TARGETS simple_publisher)
endif()
endif()
# Always install subscriber targets
add_executable(simple_subscriber examples/simple_subscriber.c)
target_link_libraries(simple_subscriber Threads::Threads mqttc)
add_executable(reconnect_subscriber examples/reconnect_subscriber.c)
target_link_libraries(reconnect_subscriber Threads::Threads mqttc)
if(MQTT_C_INSTALL_EXAMPLES)
install(TARGETS simple_subscriber reconnect_subscriber)
endif()
endif()
# Build tests
if(MQTT_C_TESTS)
find_path(CMOCKA_INCLUDE_DIR cmocka.h)
find_library(CMOCKA_LIBRARY cmocka)
if((NOT CMOCKA_INCLUDE_DIR) OR (NOT CMOCKA_LIBRARY))
message(FATAL_ERROR "Failed to find cmocka! Add cmocka's install prefix to CMAKE_PREFIX_PATH to resolve this error.")
endif()
add_executable(tests tests.c)
target_link_libraries(tests ${CMOCKA_LIBRARY} mqttc)
target_include_directories(tests PRIVATE ${CMOCKA_INCLUDE_DIR})
endif()
# Handle multi-lib linux systems correctly and allow custom installation locations.
if(UNIX)
include(GNUInstallDirs)
mark_as_advanced(CLEAR
CMAKE_INSTALL_BINDIR
CMAKE_INSTALL_LIBDIR
CMAKE_INSTALL_INCLUDEDIR)
else()
set(CMAKE_INSTALL_LIBDIR "lib")
set(CMAKE_INSTALL_INCLUDEDIR "include")
endif()
# Install includes and library
install(TARGETS mqttc
DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(DIRECTORY include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})