16
16
# specific language governing permissions and limitations
17
17
# under the License.
18
18
#
19
- cmake_minimum_required (VERSION 3.5 )
19
+ cmake_minimum_required (VERSION 3.12 )
20
20
21
21
set (CMAKE_LEGACY_CYGWIN_WIN32 0)
22
22
@@ -51,6 +51,7 @@ string(REPLACE "." ";" AVRO_VERSION ${AVRO_VERSION})
51
51
list (GET AVRO_VERSION 0 AVRO_VERSION_MAJOR)
52
52
list (GET AVRO_VERSION 1 AVRO_VERSION_MINOR)
53
53
list (GET AVRO_VERSION 2 AVRO_VERSION_PATCH)
54
+ set (AVRO_VERSION "${AVRO_VERSION_MAJOR} .${AVRO_VERSION_MINOR} .${AVRO_VERSION_PATCH} " )
54
55
55
56
project (Avro-cpp)
56
57
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR} )
@@ -69,17 +70,13 @@ endif()
69
70
70
71
if (CMAKE_COMPILER_IS_GNUCXX)
71
72
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wuseless-cast -Wconversion -pedantic -Werror" )
72
- if (AVRO_ADD_PROTECTOR_FLAGS)
73
- set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fstack-protector-all -D_GLIBCXX_DEBUG" )
74
- # Unset _GLIBCXX_DEBUG for avrogencpp.cc because using Boost Program Options
75
- # leads to linking errors when compiling with _GLIBCXX_DEBUG as described on
76
- # https://stackoverflow.com/questions/19729036/
77
- set_source_files_properties (impl/avrogencpp.cc PROPERTIES COMPILE_FLAGS "-U_GLIBCXX_DEBUG" )
78
- endif ()
79
73
endif ()
80
74
81
75
if (AVRO_BUILD_TESTS OR AVRO_USE_BOOST)
82
- find_package (Boost 1.38 REQUIRED COMPONENTS system )
76
+ # Boost 1.70 and above provide a BoostConfig.cmake package configuration file.
77
+ # It guarantees that Boost::system target exists if found.
78
+ # See https://cmake.org/cmake/help/latest/policy/CMP0167.html
79
+ find_package (Boost 1.70 REQUIRED CONFIG COMPONENTS system )
83
80
endif ()
84
81
85
82
include (FetchContent)
@@ -92,30 +89,20 @@ FetchContent_Declare(
92
89
)
93
90
FetchContent_MakeAvailable(fmt)
94
91
95
- find_package (Snappy)
96
- if (SNAPPY_FOUND )
97
- set (SNAPPY_PKG libsnappy)
92
+ find_package (Snappy CONFIG )
93
+ if (Snappy_FOUND )
94
+ # Use CONFIG mode to guarantee that Snappy::snappy target exists if found.
98
95
add_definitions (-DSNAPPY_CODEC_AVAILABLE)
99
- message ("Enabled snappy codec" )
100
- else (SNAPPY_FOUND)
101
- set (SNAPPY_PKG "" )
102
- set (SNAPPY_LIBRARIES "" )
103
- set (SNAPPY_INCLUDE_DIR "" )
104
- message ("Disabled snappy codec. libsnappy not found." )
105
- endif (SNAPPY_FOUND)
96
+ message ("Enabled snappy codec, version: ${Snappy_VERSION} " )
97
+ else ()
98
+ message ("Disabled snappy codec." )
99
+ endif ()
106
100
101
+ # FindZLIB guarantees that ZLIB::ZLIB target exists if found
102
+ # See https://cmake.org/cmake/help/latest/module/FindZLIB.html#imported-targets
107
103
find_package (ZLIB REQUIRED)
108
- if (ZLIB_FOUND)
109
- message ("Enabled zlib codec" )
110
- else (ZLIB_FOUND)
111
- message (FATAL_ERROR "ZLIB is not found" )
112
- endif (ZLIB_FOUND)
113
-
114
- add_definitions (${Boost_LIB_DIAGNOSTIC_DEFINITIONS} )
115
104
116
- add_definitions (-DAVRO_VERSION="${AVRO_VERSION_MAJOR} .${AVRO_VERSION_MINOR} .${AVRO_VERSION_PATCH} " )
117
-
118
- include_directories (include /avro ${CMAKE_CURRENT_BINARY_DIR} ${Boost_INCLUDE_DIRS} )
105
+ include_directories (include /avro ${CMAKE_CURRENT_BINARY_DIR} )
119
106
120
107
set (AVRO_SOURCE_FILES
121
108
impl/Compiler.cc impl/Node.cc impl/LogicalType.cc
@@ -136,25 +123,32 @@ set (AVRO_SOURCE_FILES
136
123
)
137
124
138
125
add_library (avrocpp SHARED ${AVRO_SOURCE_FILES} )
139
-
140
- set_property (TARGET avrocpp
141
- APPEND PROPERTY COMPILE_DEFINITIONS AVRO_DYN_LINK)
142
-
143
126
add_library (avrocpp_s STATIC ${AVRO_SOURCE_FILES} )
144
- target_include_directories (avrocpp_s PRIVATE ${SNAPPY_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} )
145
- target_link_libraries (avrocpp_s ${Boost_LIBRARIES} ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} fmt::fmt-header-only)
146
-
147
- set_property (TARGET avrocpp avrocpp_s
148
- APPEND PROPERTY COMPILE_DEFINITIONS AVRO_SOURCE)
149
127
150
- set_target_properties (avrocpp PROPERTIES
151
- VERSION ${AVRO_VERSION_MAJOR} . ${AVRO_VERSION_MINOR} . ${AVRO_VERSION_PATCH} )
128
+ target_compile_definitions (avrocpp PRIVATE AVRO_SOURCE AVRO_DYN_LINK)
129
+ target_compile_definitions (avrocpp_s PRIVATE AVRO_SOURCE )
152
130
153
- set_target_properties (avrocpp_s PROPERTIES
154
- VERSION ${AVRO_VERSION_MAJOR} . ${AVRO_VERSION_MINOR} . ${AVRO_VERSION_PATCH } )
131
+ set_target_properties (avrocpp PROPERTIES VERSION ${AVRO_VERSION} )
132
+ set_target_properties (avrocpp_s PROPERTIES VERSION ${AVRO_VERSION } )
155
133
156
- target_link_libraries (avrocpp ${Boost_LIBRARIES} ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} fmt::fmt-header-only)
157
- target_include_directories (avrocpp PRIVATE ${SNAPPY_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} )
134
+ target_link_libraries (avrocpp PUBLIC
135
+ $<BUILD_INTERFACE:fmt::fmt-header-only>
136
+ $<BUILD_INTERFACE:ZLIB::ZLIB>
137
+ $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
138
+ $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system >>
139
+ $<INSTALL_INTERFACE:ZLIB::ZLIB>
140
+ $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
141
+ $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system >>
142
+ )
143
+ target_link_libraries (avrocpp_s PUBLIC
144
+ $<BUILD_INTERFACE:fmt::fmt-header-only>
145
+ $<BUILD_INTERFACE:ZLIB::ZLIB>
146
+ $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
147
+ $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system >>
148
+ $<INSTALL_INTERFACE:ZLIB::ZLIB>
149
+ $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
150
+ $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system >>
151
+ )
158
152
159
153
target_include_directories (avrocpp PUBLIC
160
154
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /include >
@@ -171,7 +165,8 @@ if (AVRO_BUILD_EXECUTABLES)
171
165
target_link_libraries (precompile avrocpp_s)
172
166
173
167
add_executable (avrogencpp impl/avrogencpp.cc)
174
- target_link_libraries (avrogencpp avrocpp_s ${Boost_LIBRARIES} )
168
+ target_link_libraries (avrogencpp avrocpp_s)
169
+ target_compile_definitions (avrogencpp PRIVATE AVRO_VERSION="${AVRO_VERSION} " )
175
170
endif ()
176
171
177
172
if (AVRO_BUILD_TESTS)
@@ -210,7 +205,7 @@ if (AVRO_BUILD_TESTS)
210
205
211
206
macro (unittest name )
212
207
add_executable (${name} test /${name} .cc)
213
- target_link_libraries (${name} avrocpp_s ${Boost_LIBRARIES} ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} )
208
+ target_link_libraries (${name} avrocpp_s Boost:: system ZLIB::ZLIB $<TARGET_NAME_IF_EXISTS:Snappy::snappy> )
214
209
add_test (NAME ${name} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
215
210
COMMAND ${CMAKE_CURRENT_BINARY_DIR} /${name} )
216
211
endmacro (unittest)
@@ -248,12 +243,14 @@ set (CPACK_PACKAGE_FILE_NAME "avrocpp-${AVRO_VERSION_MAJOR}")
248
243
include (CPack)
249
244
250
245
install (TARGETS avrocpp avrocpp_s
246
+ EXPORT avrocpp_targets
251
247
LIBRARY DESTINATION lib
252
248
ARCHIVE DESTINATION lib
253
- RUNTIME DESTINATION lib)
249
+ RUNTIME DESTINATION lib
250
+ INCLUDES DESTINATION include )
254
251
255
252
if (AVRO_BUILD_EXECUTABLES)
256
- install (TARGETS avrogencpp RUNTIME DESTINATION bin)
253
+ install (TARGETS avrogencpp EXPORT avrocpp_targets RUNTIME DESTINATION bin)
257
254
endif ()
258
255
259
256
install (DIRECTORY include /avro DESTINATION include
@@ -264,3 +261,28 @@ if (NOT CMAKE_BUILD_TYPE)
264
261
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
265
262
FORCE)
266
263
endif (NOT CMAKE_BUILD_TYPE )
264
+
265
+ include (CMakePackageConfigHelpers)
266
+
267
+ write_basic_package_version_file(
268
+ "${CMAKE_CURRENT_BINARY_DIR} /AvroConfigVersion.cmake"
269
+ VERSION ${AVRO_VERSION}
270
+ COMPATIBILITY SameMajorVersion)
271
+
272
+ configure_package_config_file(
273
+ "${CMAKE_CURRENT_SOURCE_DIR} /cmake/AvroConfig.cmake.in"
274
+ "${CMAKE_CURRENT_BINARY_DIR} /AvroConfig.cmake"
275
+ INSTALL_DESTINATION lib/cmake/Avro
276
+ )
277
+
278
+ install (EXPORT avrocpp_targets
279
+ NAMESPACE Avro::
280
+ DESTINATION lib/cmake/Avro
281
+ FILE "AvroTargets.cmake"
282
+ )
283
+
284
+ install (FILES
285
+ "${CMAKE_CURRENT_BINARY_DIR} /AvroConfig.cmake"
286
+ "${CMAKE_CURRENT_BINARY_DIR} /AvroConfigVersion.cmake"
287
+ DESTINATION lib/cmake/Avro
288
+ )
0 commit comments