Skip to content

Commit c75e6d5

Browse files
authored
AVRO-3088: [C++] Export CMake package config file (#3299)
* Export CMake package configuration file * AVRO-3088: [C++] Export CMake package config file * simplify generator expression * fix AvroConfig.cmake.in * do not add fmt to install interface * reword error message * remove if statement for required lib * use TARGET_NAME_IF_EXISTS
1 parent db738a7 commit c75e6d5

File tree

2 files changed

+131
-48
lines changed

2 files changed

+131
-48
lines changed

lang/c++/CMakeLists.txt

+70-48
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# specific language governing permissions and limitations
1717
# under the License.
1818
#
19-
cmake_minimum_required (VERSION 3.5)
19+
cmake_minimum_required (VERSION 3.12)
2020

2121
set (CMAKE_LEGACY_CYGWIN_WIN32 0)
2222

@@ -51,6 +51,7 @@ string(REPLACE "." ";" AVRO_VERSION ${AVRO_VERSION})
5151
list(GET AVRO_VERSION 0 AVRO_VERSION_MAJOR)
5252
list(GET AVRO_VERSION 1 AVRO_VERSION_MINOR)
5353
list(GET AVRO_VERSION 2 AVRO_VERSION_PATCH)
54+
set(AVRO_VERSION "${AVRO_VERSION_MAJOR}.${AVRO_VERSION_MINOR}.${AVRO_VERSION_PATCH}")
5455

5556
project (Avro-cpp)
5657
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR})
@@ -69,17 +70,13 @@ endif()
6970

7071
if (CMAKE_COMPILER_IS_GNUCXX)
7172
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 ()
7973
endif ()
8074

8175
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)
8380
endif ()
8481

8582
include(FetchContent)
@@ -92,30 +89,20 @@ FetchContent_Declare(
9289
)
9390
FetchContent_MakeAvailable(fmt)
9491

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.
9895
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 ()
106100

101+
# FindZLIB guarantees that ZLIB::ZLIB target exists if found
102+
# See https://cmake.org/cmake/help/latest/module/FindZLIB.html#imported-targets
107103
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})
115104

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})
119106

120107
set (AVRO_SOURCE_FILES
121108
impl/Compiler.cc impl/Node.cc impl/LogicalType.cc
@@ -136,25 +123,32 @@ set (AVRO_SOURCE_FILES
136123
)
137124

138125
add_library (avrocpp SHARED ${AVRO_SOURCE_FILES})
139-
140-
set_property (TARGET avrocpp
141-
APPEND PROPERTY COMPILE_DEFINITIONS AVRO_DYN_LINK)
142-
143126
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)
149127

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)
152130

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})
155133

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+
)
158152

159153
target_include_directories(avrocpp PUBLIC
160154
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
@@ -171,7 +165,8 @@ if (AVRO_BUILD_EXECUTABLES)
171165
target_link_libraries (precompile avrocpp_s)
172166

173167
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}")
175170
endif ()
176171

177172
if (AVRO_BUILD_TESTS)
@@ -210,7 +205,7 @@ if (AVRO_BUILD_TESTS)
210205

211206
macro (unittest name)
212207
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>)
214209
add_test (NAME ${name} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
215210
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${name})
216211
endmacro (unittest)
@@ -248,12 +243,14 @@ set (CPACK_PACKAGE_FILE_NAME "avrocpp-${AVRO_VERSION_MAJOR}")
248243
include (CPack)
249244

250245
install (TARGETS avrocpp avrocpp_s
246+
EXPORT avrocpp_targets
251247
LIBRARY DESTINATION lib
252248
ARCHIVE DESTINATION lib
253-
RUNTIME DESTINATION lib)
249+
RUNTIME DESTINATION lib
250+
INCLUDES DESTINATION include)
254251

255252
if (AVRO_BUILD_EXECUTABLES)
256-
install (TARGETS avrogencpp RUNTIME DESTINATION bin)
253+
install (TARGETS avrogencpp EXPORT avrocpp_targets RUNTIME DESTINATION bin)
257254
endif ()
258255

259256
install (DIRECTORY include/avro DESTINATION include
@@ -264,3 +261,28 @@ if (NOT CMAKE_BUILD_TYPE)
264261
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
265262
FORCE)
266263
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+
)

lang/c++/cmake/AvroConfig.cmake.in

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#
2+
# Licensed to the Apache Software Foundation (ASF) under one
3+
# or more contributor license agreements. See the NOTICE file
4+
# distributed with this work for additional information
5+
# regarding copyright ownership. The ASF licenses this file
6+
# to you under the Apache License, Version 2.0 (the
7+
# "License"); you may not use this file except in compliance
8+
# with the License. You may obtain a copy of the License at
9+
#
10+
# https://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing,
13+
# software distributed under the License is distributed on an
14+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
# KIND, either express or implied. See the License for the
16+
# specific language governing permissions and limitations
17+
# under the License.
18+
#
19+
# This config sets the following variables in your project::
20+
#
21+
# Avro_FOUND - true if Avro found on the system
22+
# Avro_VERSION - version of the found Avro
23+
#
24+
# This config sets the following targets in your project::
25+
#
26+
# Avro::avrocpp_shared
27+
# Avro::avrocpp_static
28+
29+
@PACKAGE_INIT@
30+
31+
include(CMakeFindDependencyMacro)
32+
33+
if(DEFINED CMAKE_MODULE_PATH)
34+
set(AVRO_CMAKE_MODULE_PATH_OLD ${CMAKE_MODULE_PATH})
35+
else()
36+
unset(AVRO_CMAKE_MODULE_PATH_OLD)
37+
endif()
38+
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
39+
40+
find_dependency(ZLIB REQUIRED)
41+
find_dependency(fmt REQUIRED)
42+
if(@Snappy_FOUND@)
43+
find_dependency(Snappy REQUIRED)
44+
endif()
45+
if(@Boost_FOUND@)
46+
find_dependency(Boost 1.70 REQUIRED COMPONENTS system)
47+
endif()
48+
49+
if(DEFINED AVRO_CMAKE_MODULE_PATH_OLD)
50+
set(CMAKE_MODULE_PATH ${AVRO_CMAKE_MODULE_PATH_OLD})
51+
unset(AVRO_CMAKE_MODULE_PATH_OLD)
52+
else()
53+
unset(CMAKE_MODULE_PATH)
54+
endif()
55+
56+
include("${CMAKE_CURRENT_LIST_DIR}/AvroTargets.cmake")
57+
58+
add_library(Avro::avrocpp_static ALIAS Avro::avrocpp_s)
59+
add_library(Avro::avrocpp_shared ALIAS Avro::avrocpp)
60+
61+
check_required_components(Avro)

0 commit comments

Comments
 (0)