This is an automated email from the ASF dual-hosted git repository.
mgrigorov 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 2943fe1398 AVRO-4168: [C++] Make static and shared libs optional
(#3435)
2943fe1398 is described below
commit 2943fe1398339e45012c48a12c5b73b245903d32
Author: Aaron Barany <[email protected]>
AuthorDate: Wed Aug 27 08:08:19 2025 -0700
AVRO-4168: [C++] Make static and shared libs optional (#3435)
---
lang/c++/CMakeLists.txt | 90 ++++++++++++++++++++++++++-----------------------
1 file changed, 47 insertions(+), 43 deletions(-)
diff --git a/lang/c++/CMakeLists.txt b/lang/c++/CMakeLists.txt
index 6bdef2da84..90bcc20823 100644
--- a/lang/c++/CMakeLists.txt
+++ b/lang/c++/CMakeLists.txt
@@ -58,8 +58,14 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
${CMAKE_SOURCE_DIR})
option(AVRO_BUILD_EXECUTABLES "Build executables" ON)
option(AVRO_BUILD_TESTS "Build tests" ON)
+option(AVRO_BUILD_SHARED "Build shared library" ON)
+option(AVRO_BUILD_STATIC "Build static library" ON)
option(AVRO_USE_BOOST "Use Boost" OFF)
+if (NOT AVRO_BUILD_STATIC AND NOT AVRO_BUILD_SHARED)
+ message (FATAL_ERROR "At least one of AVRO_BUILD_STATIC or
AVRO_BUILD_SHARED must be ON.")
+endif ()
+
if (WIN32 AND NOT CYGWIN AND NOT MSYS)
add_definitions (/EHa)
add_definitions (
@@ -135,54 +141,52 @@ set (AVRO_SOURCE_FILES
impl/CustomAttributes.cc
)
-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)
-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 PUBLIC
- $<BUILD_INTERFACE:fmt::fmt-header-only>
- $<BUILD_INTERFACE:ZLIB::ZLIB>
- $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
-
$<$<BOOL:${zstd_FOUND}>:$<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:${ZSTD_TARGET}>>>
- $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system>>
- $<INSTALL_INTERFACE:ZLIB::ZLIB>
- $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
-
$<$<BOOL:${zstd_FOUND}>:$<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:${ZSTD_TARGET}>>>
- $<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>>
-
$<$<BOOL:${zstd_FOUND}>:$<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:${ZSTD_TARGET}>>>
- $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system>>
- $<INSTALL_INTERFACE:ZLIB::ZLIB>
- $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
-
$<$<BOOL:${zstd_FOUND}>:$<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:${ZSTD_TARGET}>>>
- $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system>>
-)
+function (setup_avro_lib target lib_type)
+ add_library (${target} ${lib_type} ${AVRO_SOURCE_FILES})
+ target_compile_definitions (${target} PRIVATE AVRO_SOURCE)
+ if (lib_type STREQUAL SHARED)
+ target_compile_definitions (${target} PUBLIC AVRO_DYN_LINK)
+ endif ()
+ set_target_properties (${target} PROPERTIES VERSION ${AVRO_VERSION})
+ target_link_libraries (${target} PUBLIC
+ $<BUILD_INTERFACE:fmt::fmt-header-only>
+ $<BUILD_INTERFACE:ZLIB::ZLIB>
+ $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
+
$<$<BOOL:${zstd_FOUND}>:$<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:${ZSTD_TARGET}>>>
+ $<BUILD_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system>>
+ $<INSTALL_INTERFACE:ZLIB::ZLIB>
+ $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Snappy::snappy>>
+
$<$<BOOL:${zstd_FOUND}>:$<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:${ZSTD_TARGET}>>>
+ $<INSTALL_INTERFACE:$<TARGET_NAME_IF_EXISTS:Boost::system>>
+ )
+ target_include_directories (${target} PUBLIC
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+ $<INSTALL_INTERFACE:include>
+ )
+endfunction (setup_avro_lib)
-target_include_directories(avrocpp PUBLIC
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
- $<INSTALL_INTERFACE:include>
-)
-target_include_directories(avrocpp_s PUBLIC
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
- $<INSTALL_INTERFACE:include>
-)
+set (AVRO_INSTALL_LIBS)
+
+if (AVRO_BUILD_SHARED)
+ setup_avro_lib (avrocpp SHARED)
+ list (APPEND AVRO_INSTALL_LIBS avrocpp)
+ set (AVRO_LINK_LIB avrocpp)
+endif ()
+
+if (AVRO_BUILD_STATIC)
+ setup_avro_lib (avrocpp_s STATIC)
+ list (APPEND AVRO_INSTALL_LIBS avrocpp_s)
+ # Static takes precedence for linking if both are set.
+ set (AVRO_LINK_LIB avrocpp_s)
+endif ()
if (AVRO_BUILD_EXECUTABLES)
add_executable (precompile test/precompile.cc)
- target_link_libraries (precompile avrocpp_s)
+ target_link_libraries (precompile ${AVRO_LINK_LIB})
add_executable (avrogencpp impl/avrogencpp.cc)
- target_link_libraries (avrogencpp avrocpp_s)
+ target_link_libraries (avrogencpp ${AVRO_LINK_LIB})
target_compile_definitions(avrogencpp PRIVATE
AVRO_VERSION="${AVRO_VERSION}")
endif ()
@@ -222,7 +226,7 @@ if (AVRO_BUILD_TESTS)
macro (unittest name)
add_executable (${name} test/${name}.cc)
- target_link_libraries (${name} avrocpp_s Boost::system ZLIB::ZLIB
$<TARGET_NAME_IF_EXISTS:Snappy::snappy>
$<$<BOOL:${zstd_FOUND}>:$<TARGET_NAME_IF_EXISTS:${ZSTD_TARGET}>>)
+ target_link_libraries (${name} ${AVRO_LINK_LIB} Boost::system
ZLIB::ZLIB $<TARGET_NAME_IF_EXISTS:Snappy::snappy>
$<$<BOOL:${zstd_FOUND}>:$<TARGET_NAME_IF_EXISTS:${ZSTD_TARGET}>>)
add_test (NAME ${name} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${name})
endmacro (unittest)
@@ -259,7 +263,7 @@ set (CPACK_PACKAGE_FILE_NAME
"avrocpp-${AVRO_VERSION_MAJOR}")
include (CPack)
-install (TARGETS avrocpp avrocpp_s
+install (TARGETS ${AVRO_INSTALL_LIBS}
EXPORT avrocpp_targets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}