This is an automated email from the ASF dual-hosted git repository.
thiru pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/avro.git
The following commit(s) were added to refs/heads/main by this push:
new c75e6d59f AVRO-3088: [C++] Export CMake package config file (#3299)
c75e6d59f is described below
commit c75e6d59fbacd05df666665d9c8b7e3274cf0399
Author: Gang Wu <[email protected]>
AuthorDate: Sat Feb 1 11:49:42 2025 +0800
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
---
lang/c++/CMakeLists.txt | 118 ++++++++++++++++++++++---------------
lang/c++/cmake/AvroConfig.cmake.in | 61 +++++++++++++++++++
2 files changed, 131 insertions(+), 48 deletions(-)
diff --git a/lang/c++/CMakeLists.txt b/lang/c++/CMakeLists.txt
index 47d0d42de..dacde3184 100644
--- a/lang/c++/CMakeLists.txt
+++ b/lang/c++/CMakeLists.txt
@@ -16,7 +16,7 @@
# specific language governing permissions and limitations
# under the License.
#
-cmake_minimum_required (VERSION 3.5)
+cmake_minimum_required (VERSION 3.12)
set (CMAKE_LEGACY_CYGWIN_WIN32 0)
@@ -51,6 +51,7 @@ string(REPLACE "." ";" AVRO_VERSION ${AVRO_VERSION})
list(GET AVRO_VERSION 0 AVRO_VERSION_MAJOR)
list(GET AVRO_VERSION 1 AVRO_VERSION_MINOR)
list(GET AVRO_VERSION 2 AVRO_VERSION_PATCH)
+set(AVRO_VERSION
"${AVRO_VERSION_MAJOR}.${AVRO_VERSION_MINOR}.${AVRO_VERSION_PATCH}")
project (Avro-cpp)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR})
@@ -69,17 +70,13 @@ endif()
if (CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wduplicated-cond
-Wduplicated-branches -Wlogical-op -Wuseless-cast -Wconversion -pedantic
-Werror")
-if (AVRO_ADD_PROTECTOR_FLAGS)
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fstack-protector-all
-D_GLIBCXX_DEBUG")
- # Unset _GLIBCXX_DEBUG for avrogencpp.cc because using Boost Program
Options
- # leads to linking errors when compiling with _GLIBCXX_DEBUG as described
on
- # https://stackoverflow.com/questions/19729036/
- set_source_files_properties(impl/avrogencpp.cc PROPERTIES COMPILE_FLAGS
"-U_GLIBCXX_DEBUG")
-endif ()
endif ()
if (AVRO_BUILD_TESTS OR AVRO_USE_BOOST)
- find_package (Boost 1.38 REQUIRED COMPONENTS system)
+ # Boost 1.70 and above provide a BoostConfig.cmake package configuration
file.
+ # It guarantees that Boost::system target exists if found.
+ # See https://cmake.org/cmake/help/latest/policy/CMP0167.html
+ find_package (Boost 1.70 REQUIRED CONFIG COMPONENTS system)
endif ()
include(FetchContent)
@@ -92,30 +89,20 @@ FetchContent_Declare(
)
FetchContent_MakeAvailable(fmt)
-find_package(Snappy)
-if (SNAPPY_FOUND)
- set(SNAPPY_PKG libsnappy)
+find_package(Snappy CONFIG)
+if (Snappy_FOUND)
+ # Use CONFIG mode to guarantee that Snappy::snappy target exists if found.
add_definitions(-DSNAPPY_CODEC_AVAILABLE)
- message("Enabled snappy codec")
-else (SNAPPY_FOUND)
- set(SNAPPY_PKG "")
- set(SNAPPY_LIBRARIES "")
- set(SNAPPY_INCLUDE_DIR "")
- message("Disabled snappy codec. libsnappy not found.")
-endif (SNAPPY_FOUND)
+ message("Enabled snappy codec, version: ${Snappy_VERSION}")
+else ()
+ message("Disabled snappy codec.")
+endif ()
+# FindZLIB guarantees that ZLIB::ZLIB target exists if found
+# See https://cmake.org/cmake/help/latest/module/FindZLIB.html#imported-targets
find_package(ZLIB REQUIRED)
-if (ZLIB_FOUND)
- message("Enabled zlib codec")
-else (ZLIB_FOUND)
- message(FATAL_ERROR "ZLIB is not found")
-endif (ZLIB_FOUND)
-
-add_definitions (${Boost_LIB_DIAGNOSTIC_DEFINITIONS})
-add_definitions
(-DAVRO_VERSION="${AVRO_VERSION_MAJOR}.${AVRO_VERSION_MINOR}.${AVRO_VERSION_PATCH}")
-
-include_directories (include/avro ${CMAKE_CURRENT_BINARY_DIR}
${Boost_INCLUDE_DIRS})
+include_directories (include/avro ${CMAKE_CURRENT_BINARY_DIR})
set (AVRO_SOURCE_FILES
impl/Compiler.cc impl/Node.cc impl/LogicalType.cc
@@ -136,25 +123,32 @@ set (AVRO_SOURCE_FILES
)
add_library (avrocpp SHARED ${AVRO_SOURCE_FILES})
-
-set_property (TARGET avrocpp
- APPEND PROPERTY COMPILE_DEFINITIONS AVRO_DYN_LINK)
-
add_library (avrocpp_s STATIC ${AVRO_SOURCE_FILES})
-target_include_directories(avrocpp_s PRIVATE ${SNAPPY_INCLUDE_DIR}
${ZLIB_INCLUDE_DIR})
-target_link_libraries(avrocpp_s ${Boost_LIBRARIES} ${SNAPPY_LIBRARIES}
${ZLIB_LIBRARIES} fmt::fmt-header-only)
-
-set_property (TARGET avrocpp avrocpp_s
- APPEND PROPERTY COMPILE_DEFINITIONS AVRO_SOURCE)
-set_target_properties (avrocpp PROPERTIES
- VERSION ${AVRO_VERSION_MAJOR}.${AVRO_VERSION_MINOR}.${AVRO_VERSION_PATCH})
+target_compile_definitions(avrocpp PRIVATE AVRO_SOURCE AVRO_DYN_LINK)
+target_compile_definitions(avrocpp_s PRIVATE AVRO_SOURCE)
-set_target_properties (avrocpp_s PROPERTIES
- VERSION ${AVRO_VERSION_MAJOR}.${AVRO_VERSION_MINOR}.${AVRO_VERSION_PATCH})
+set_target_properties (avrocpp PROPERTIES VERSION ${AVRO_VERSION})
+set_target_properties (avrocpp_s PROPERTIES VERSION ${AVRO_VERSION})
-target_link_libraries (avrocpp ${Boost_LIBRARIES} ${SNAPPY_LIBRARIES}
${ZLIB_LIBRARIES} fmt::fmt-header-only)
-target_include_directories(avrocpp PRIVATE ${SNAPPY_INCLUDE_DIR}
${ZLIB_INCLUDE_DIR})
+target_link_libraries(avrocpp PUBLIC
+ $<BUILD_INTERFACE:fmt::fmt-header-only>
+ $<BUILD_INTERFACE:ZLIB::ZLIB>
+ $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
+ $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system>>
+ $<INSTALL_INTERFACE:ZLIB::ZLIB>
+ $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
+ $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system>>
+)
+target_link_libraries(avrocpp_s PUBLIC
+ $<BUILD_INTERFACE:fmt::fmt-header-only>
+ $<BUILD_INTERFACE:ZLIB::ZLIB>
+ $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
+ $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system>>
+ $<INSTALL_INTERFACE:ZLIB::ZLIB>
+ $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
+ $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system>>
+)
target_include_directories(avrocpp PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
@@ -171,7 +165,8 @@ if (AVRO_BUILD_EXECUTABLES)
target_link_libraries (precompile avrocpp_s)
add_executable (avrogencpp impl/avrogencpp.cc)
- target_link_libraries (avrogencpp avrocpp_s ${Boost_LIBRARIES})
+ target_link_libraries (avrogencpp avrocpp_s)
+ target_compile_definitions(avrogencpp PRIVATE
AVRO_VERSION="${AVRO_VERSION}")
endif ()
if (AVRO_BUILD_TESTS)
@@ -210,7 +205,7 @@ if (AVRO_BUILD_TESTS)
macro (unittest name)
add_executable (${name} test/${name}.cc)
- target_link_libraries (${name} avrocpp_s ${Boost_LIBRARIES}
${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES})
+ target_link_libraries (${name} avrocpp_s Boost::system ZLIB::ZLIB
$<TARGET_NAME_IF_EXISTS:Snappy::snappy>)
add_test (NAME ${name} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${name})
endmacro (unittest)
@@ -248,12 +243,14 @@ set (CPACK_PACKAGE_FILE_NAME
"avrocpp-${AVRO_VERSION_MAJOR}")
include (CPack)
install (TARGETS avrocpp avrocpp_s
+ EXPORT avrocpp_targets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
- RUNTIME DESTINATION lib)
+ RUNTIME DESTINATION lib
+ INCLUDES DESTINATION include)
if (AVRO_BUILD_EXECUTABLES)
- install (TARGETS avrogencpp RUNTIME DESTINATION bin)
+ install (TARGETS avrogencpp EXPORT avrocpp_targets RUNTIME DESTINATION bin)
endif ()
install (DIRECTORY include/avro DESTINATION include
@@ -264,3 +261,28 @@ if (NOT CMAKE_BUILD_TYPE)
"Choose the type of build, options are: None Debug Release
RelWithDebInfo MinSizeRel."
FORCE)
endif (NOT CMAKE_BUILD_TYPE)
+
+include(CMakePackageConfigHelpers)
+
+write_basic_package_version_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/AvroConfigVersion.cmake"
+ VERSION ${AVRO_VERSION}
+ COMPATIBILITY SameMajorVersion)
+
+configure_package_config_file(
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/AvroConfig.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/AvroConfig.cmake"
+ INSTALL_DESTINATION lib/cmake/Avro
+)
+
+install(EXPORT avrocpp_targets
+ NAMESPACE Avro::
+ DESTINATION lib/cmake/Avro
+ FILE "AvroTargets.cmake"
+)
+
+install(FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/AvroConfig.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/AvroConfigVersion.cmake"
+ DESTINATION lib/cmake/Avro
+)
diff --git a/lang/c++/cmake/AvroConfig.cmake.in
b/lang/c++/cmake/AvroConfig.cmake.in
new file mode 100644
index 000000000..c7a89e29c
--- /dev/null
+++ b/lang/c++/cmake/AvroConfig.cmake.in
@@ -0,0 +1,61 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# This config sets the following variables in your project::
+#
+# Avro_FOUND - true if Avro found on the system
+# Avro_VERSION - version of the found Avro
+#
+# This config sets the following targets in your project::
+#
+# Avro::avrocpp_shared
+# Avro::avrocpp_static
+
+@PACKAGE_INIT@
+
+include(CMakeFindDependencyMacro)
+
+if(DEFINED CMAKE_MODULE_PATH)
+ set(AVRO_CMAKE_MODULE_PATH_OLD ${CMAKE_MODULE_PATH})
+else()
+ unset(AVRO_CMAKE_MODULE_PATH_OLD)
+endif()
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
+
+find_dependency(ZLIB REQUIRED)
+find_dependency(fmt REQUIRED)
+if(@Snappy_FOUND@)
+ find_dependency(Snappy REQUIRED)
+endif()
+if(@Boost_FOUND@)
+ find_dependency(Boost 1.70 REQUIRED COMPONENTS system)
+endif()
+
+if(DEFINED AVRO_CMAKE_MODULE_PATH_OLD)
+ set(CMAKE_MODULE_PATH ${AVRO_CMAKE_MODULE_PATH_OLD})
+ unset(AVRO_CMAKE_MODULE_PATH_OLD)
+else()
+ unset(CMAKE_MODULE_PATH)
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/AvroTargets.cmake")
+
+add_library(Avro::avrocpp_static ALIAS Avro::avrocpp_s)
+add_library(Avro::avrocpp_shared ALIAS Avro::avrocpp)
+
+check_required_components(Avro)