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}

Reply via email to