Skip to content

Commit

Permalink
AVRO-3088: [C++] Export CMake package config file
Browse files Browse the repository at this point in the history
  • Loading branch information
wgtmac committed Jan 22, 2025
1 parent 30c1597 commit 69b9bd8
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 19 deletions.
78 changes: 59 additions & 19 deletions lang/c++/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -70,18 +70,16 @@ 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)
# Boost 1.70 and above provide a BoostConfig.cmake package configuration file.
find_package (Boost 1.70 REQUIRED CONFIG COMPONENTS system)
if (TARGET Boost::system)
message("Found Boost version: ${Boost_VERSION}")
else ()
message(FATAL_ERROR "Boost::system not found")
endif ()
endif ()

include(FetchContent)
Expand All @@ -97,22 +95,18 @@ FetchContent_MakeAvailable(fmt)
find_package(Snappy CONFIG)
if (TARGET Snappy::snappy)
add_definitions(-DSNAPPY_CODEC_AVAILABLE)
message("Enabled snappy codec")
message("Enabled snappy codec, version: ${Snappy_VERSION}")
else ()
message("Disabled snappy codec. Snappy::snappy not found.")
endif ()

find_package(ZLIB REQUIRED)
if (TARGET ZLIB::ZLIB)
message("Enabled zlib codec")
message("Enabled zlib codec, version: ${ZLIB_VERSION}")
else ()
message(FATAL_ERROR "ZLIB::ZLIB not found but required.")
endif ()

add_definitions (${Boost_LIB_DIAGNOSTIC_DEFINITIONS})

add_definitions (-DAVRO_VERSION="${AVRO_VERSION}")

include_directories (include/avro ${CMAKE_CURRENT_BINARY_DIR})

set (AVRO_SOURCE_FILES
Expand All @@ -136,14 +130,32 @@ set (AVRO_SOURCE_FILES
add_library (avrocpp SHARED ${AVRO_SOURCE_FILES})
add_library (avrocpp_s STATIC ${AVRO_SOURCE_FILES})

target_compile_definitions(avrocpp PRIVATE AVRO_SOURCE AVRO_DYN_LINK AVRO_VERSION="${AVRO_VERSION}")
target_compile_definitions(avrocpp_s PRIVATE AVRO_SOURCE AVRO_VERSION="${AVRO_VERSION}")
target_compile_definitions(avrocpp PRIVATE AVRO_SOURCE AVRO_DYN_LINK)
target_compile_definitions(avrocpp_s PRIVATE AVRO_SOURCE)

set_target_properties (avrocpp PROPERTIES VERSION ${AVRO_VERSION})
set_target_properties (avrocpp_s PROPERTIES VERSION ${AVRO_VERSION})

target_link_libraries (avrocpp $<IF:$<TARGET_EXISTS:Boost::system>,Boost::system,> $<IF:$<TARGET_EXISTS:Snappy::snappy>,Snappy::snappy,> ZLIB::ZLIB fmt::fmt-header-only)
target_link_libraries (avrocpp_s $<IF:$<TARGET_EXISTS:Boost::system>,Boost::system,> $<IF:$<TARGET_EXISTS:Snappy::snappy>,Snappy::snappy,> ZLIB::ZLIB fmt::fmt-header-only)
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:fmt::fmt-header-only>
$<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:fmt::fmt-header-only>
$<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>
Expand Down Expand Up @@ -192,6 +204,7 @@ if (AVRO_BUILD_EXECUTABLES)

add_executable (avrogencpp impl/avrogencpp.cc)
target_link_libraries (avrogencpp avrocpp_s)
target_compile_definitions(avrogencpp PRIVATE AVRO_VERSION="${AVRO_VERSION}")
endif ()

if (AVRO_BUILD_TESTS)
Expand Down Expand Up @@ -237,12 +250,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
Expand All @@ -253,3 +268,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
)
61 changes: 61 additions & 0 deletions lang/c++/cmake/AvroConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -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)
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)

0 comments on commit 69b9bd8

Please sign in to comment.