This is an automated email from the ASF dual-hosted git repository.

gangwu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/orc.git


The following commit(s) were added to refs/heads/main by this push:
     new 3bf6ea99c ORC-1689: [C++] Generate CMake config file
3bf6ea99c is described below

commit 3bf6ea99cc35595dfa972fe955b6777ad63d1df5
Author: Gang Wu <[email protected]>
AuthorDate: Sat Apr 27 22:13:48 2024 +0800

    ORC-1689: [C++] Generate CMake config file
    
    ### What changes were proposed in this pull request?
    Generate cmake config file and install it.
    
    ### Why are the changes needed?
    It is good for downstream projects to find ORC library.
    
    ### How was this patch tested?
    Test it locally.
    
    ### Was this patch authored or co-authored using generative AI tooling?
    No.
    
    Closes #1889 from wgtmac/ORC-1689.
    
    Authored-by: Gang Wu <[email protected]>
    Signed-off-by: Gang Wu <[email protected]>
---
 CMakeLists.txt                          |   3 +
 c++/CMakeLists.txt                      |  14 +++++
 c++/include/CMakeLists.txt              |   9 +--
 c++/orcConfig.cmake.in                  | 103 ++++++++++++++++++++++++++++++++
 c++/src/CMakeLists.txt                  |  27 ++++++---
 cmake_modules/FindLZ4.cmake             |  19 +++++-
 cmake_modules/FindProtobuf.cmake        |  32 ++++++++--
 cmake_modules/FindSnappy.cmake          |  29 +++++++--
 cmake_modules/FindZLIB.cmake            |  17 ++++++
 cmake_modules/FindZSTD.cmake            |  25 ++++++++
 cmake_modules/ThirdpartyToolchain.cmake | 103 ++++++++++++++++++++++++++++++--
 11 files changed, 351 insertions(+), 30 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 294179bea..213f55721 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -155,6 +155,9 @@ endif ()
 
 enable_testing()
 
+INCLUDE(GNUInstallDirs)  # Put it before ThirdpartyToolchain to make 
CMAKE_INSTALL_LIBDIR available.
+set(ORC_INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/orc)
+
 INCLUDE(CheckSourceCompiles)
 INCLUDE(ThirdpartyToolchain)
 
diff --git a/c++/CMakeLists.txt b/c++/CMakeLists.txt
index ec06458db..38c38f7ce 100644
--- a/c++/CMakeLists.txt
+++ b/c++/CMakeLists.txt
@@ -21,3 +21,17 @@ add_subdirectory(src)
 if (BUILD_CPP_TESTS)
   add_subdirectory(test)
 endif ()
+
+# Generate cmake package configuration files
+include(CMakePackageConfigHelpers)
+configure_package_config_file(
+  orcConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/orcConfig.cmake
+  INSTALL_DESTINATION ${ORC_INSTALL_CMAKE_DIR})
+write_basic_package_version_file(
+  ${CMAKE_CURRENT_BINARY_DIR}/orcConfigVersion.cmake
+  VERSION ${ORC_VERSION}
+  COMPATIBILITY SameMajorVersion)
+install(FILES
+  ${CMAKE_CURRENT_BINARY_DIR}/orcConfig.cmake
+  ${CMAKE_CURRENT_BINARY_DIR}/orcConfigVersion.cmake
+  DESTINATION ${ORC_INSTALL_CMAKE_DIR})
diff --git a/c++/include/CMakeLists.txt b/c++/include/CMakeLists.txt
index 056d1b9fa..a9f8b4a3b 100644
--- a/c++/include/CMakeLists.txt
+++ b/c++/include/CMakeLists.txt
@@ -22,10 +22,11 @@ configure_file (
 
 install(FILES
   "${CMAKE_CURRENT_BINARY_DIR}/orc/orc-config.hh"
-  DESTINATION "include/orc"
+  DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/orc"
   )
 
 install(DIRECTORY
-        "orc/"
-        DESTINATION "include/orc"
-        FILES_MATCHING PATTERN "*.hh")
+  "orc/"
+  DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/orc"
+  FILES_MATCHING PATTERN "*.hh"
+  )
diff --git a/c++/orcConfig.cmake.in b/c++/orcConfig.cmake.in
new file mode 100644
index 000000000..49663b342
--- /dev/null
+++ b/c++/orcConfig.cmake.in
@@ -0,0 +1,103 @@
+# 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
+#
+#   http://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:
+#
+#   orc_VERSION - version of the found ORC
+#   orc_FOUND - true if ORC found on the system
+#
+# This config sets the following targets in your project:
+#
+#   orc::orc - for linked as static library
+#
+# For backward compatibility, this config also sets the following variables:
+#
+#   ORC_FOUND - same as orc_FOUND above
+#   ORC_STATIC_LIB - static library of the found ORC
+#   ORC_INCLUDE_DIR - include directory of the found ORC
+#   ORC_INCLUDE_DIRS - same as ORC_INCLUDE_DIR above
+
+@PACKAGE_INIT@
+
+set(ORC_VENDOR_DEPENDENCIES "@ORC_VENDOR_DEPENDENCIES@")
+set(ORC_SYSTEM_DEPENDENCIES "@ORC_SYSTEM_DEPENDENCIES@")
+
+if(DEFINED CMAKE_MODULE_PATH)
+  set(ORC_CMAKE_MODULE_PATH_OLD ${CMAKE_MODULE_PATH})
+else()
+  unset(ORC_CMAKE_MODULE_PATH_OLD)
+endif()
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
+
+include(CMakeFindDependencyMacro)
+foreach(dependency ${ORC_SYSTEM_DEPENDENCIES})
+  find_dependency(${dependency})
+endforeach()
+
+if(DEFINED ORC_CMAKE_MODULE_PATH_OLD)
+  set(CMAKE_MODULE_PATH ${ORC_CMAKE_MODULE_PATH_OLD})
+  unset(ORC_CMAKE_MODULE_PATH_OLD)
+else()
+  unset(CMAKE_MODULE_PATH)
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/orcTargets.cmake")
+
+get_target_property(orc_static_configurations orc::orc IMPORTED_CONFIGURATIONS)
+
+foreach(dependency ${ORC_VENDOR_DEPENDENCIES})
+  string(REPLACE "|" ";" dependency_pair ${dependency})
+  list(LENGTH dependency_pair dependency_pair_length)
+  if(NOT dependency_pair_length EQUAL 2)
+    message(FATAL_ERROR "Invalid vendor dependency: ${dependency}")
+  endif()
+  list(GET dependency_pair 0 target_name)
+  list(GET dependency_pair 1 static_lib_name)
+
+  add_library("${target_name}" STATIC IMPORTED)
+
+  foreach(CONFIGURATION ${orc_static_configurations})
+    string(TOUPPER "${CONFIGURATION}" CONFIGURATION)
+    get_target_property(orc_static_location orc::orc LOCATION_${CONFIGURATION})
+    get_filename_component(orc_lib_dir "${orc_static_location}" DIRECTORY)
+    set_property(TARGET "${target_name}"
+                 APPEND
+                 PROPERTY IMPORTED_CONFIGURATIONS ${CONFIGURATION})
+    set_target_properties("${target_name}"
+                          PROPERTIES IMPORTED_LOCATION_${CONFIGURATION}
+                                     "${orc_lib_dir}/${static_lib_name}")
+  endforeach()
+endforeach()
+
+check_required_components(orc)
+
+foreach(BUILD_TYPE_SUFFIX
+        "_RELEASE"
+        "_RELWITHDEBINFO"
+        "_MINSIZEREL"
+        "_DEBUG"
+        "")
+  if(NOT ORC_STATIC_LIB)
+    get_target_property(ORC_STATIC_LIB orc::orc 
IMPORTED_LOCATION${BUILD_TYPE_SUFFIX})
+  endif()
+endforeach()
+
+get_target_property(ORC_INCLUDE_DIR orc::orc INTERFACE_INCLUDE_DIRECTORIES)
+
+set(ORC_FOUND TRUE)
+set(ORC_VERSION ${orc_VERSION})
+set(ORC_INCLUDE_DIRS ${ORC_INCLUDE_DIR})
diff --git a/c++/src/CMakeLists.txt b/c++/src/CMakeLists.txt
index af69c7f62..5b7840301 100644
--- a/c++/src/CMakeLists.txt
+++ b/c++/src/CMakeLists.txt
@@ -202,18 +202,23 @@ endif(BUILD_ENABLE_AVX512)
 add_library (orc STATIC ${SOURCE_FILES})
 
 target_link_libraries (orc
-  orc::protobuf
-  orc::zlib
-  orc::snappy
-  orc::lz4
-  orc::zstd
-  ${LIBHDFSPP_LIBRARIES}
+  INTERFACE
+    ${ORC_INSTALL_INTERFACE_TARGETS}
+  PRIVATE
+    $<BUILD_INTERFACE:orc::protobuf>
+    $<BUILD_INTERFACE:orc::zlib>
+    $<BUILD_INTERFACE:orc::snappy>
+    $<BUILD_INTERFACE:orc::lz4>
+    $<BUILD_INTERFACE:orc::zstd>
+    $<BUILD_INTERFACE:${LIBHDFSPP_LIBRARIES}>
   )
 
 target_include_directories (orc
+  INTERFACE
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
   PUBLIC
-    ${CMAKE_SOURCE_DIR}/c++/include
-    ${CMAKE_BINARY_DIR}/c++/include
+    $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/c++/include>
+    $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/c++/include>
   PRIVATE
     ${CMAKE_CURRENT_SOURCE_DIR}
     ${CMAKE_CURRENT_BINARY_DIR}
@@ -234,4 +239,8 @@ endif ()
 
 add_dependencies(orc orc-format_ep)
 
-install(TARGETS orc DESTINATION lib)
+install(TARGETS orc EXPORT orc_targets)
+install(EXPORT orc_targets
+  DESTINATION ${ORC_INSTALL_CMAKE_DIR}
+  NAMESPACE "orc::"
+  FILE "orcTargets.cmake")
diff --git a/cmake_modules/FindLZ4.cmake b/cmake_modules/FindLZ4.cmake
index b1557f496..3b9cc7fbd 100644
--- a/cmake_modules/FindLZ4.cmake
+++ b/cmake_modules/FindLZ4.cmake
@@ -22,6 +22,16 @@
 # LZ4_STATIC_LIB: path to lz4.a
 # LZ4_FOUND: whether LZ4 has been found
 
+if (NOT LZ4_HOME)
+  if (DEFINED ENV{LZ4_HOME})
+    set (LZ4_HOME "$ENV{LZ4_HOME}")
+  elseif (LZ4_ROOT)
+    set (LZ4_HOME "${LZ4_ROOT}")
+  elseif (DEFINED ENV{LZ4_ROOT})
+    set (LZ4_HOME "$ENV{LZ4_ROOT}")
+  endif ()
+endif ()
+
 if( NOT "${LZ4_HOME}" STREQUAL "")
     file (TO_CMAKE_PATH "${LZ4_HOME}" _lz4_path)
 endif()
@@ -33,7 +43,7 @@ find_path (LZ4_INCLUDE_DIR lz4.h HINTS
   NO_DEFAULT_PATH
   PATH_SUFFIXES "include")
 
-find_library (LZ4_LIBRARY NAMES lz4 HINTS
+find_library (LZ4_LIBRARY NAMES lz4 liblz4 HINTS
   ${_lz4_path}
   PATH_SUFFIXES "lib" "lib64")
 
@@ -74,3 +84,10 @@ mark_as_advanced (
   LZ4_STATIC_LIB
   LZ4_LIBRARY
 )
+
+if(LZ4_FOUND AND NOT TARGET LZ4::lz4)
+  add_library(LZ4::lz4 UNKNOWN IMPORTED)
+  set_target_properties(LZ4::lz4
+                        PROPERTIES IMPORTED_LOCATION "${LZ4_LIBRARY}"
+                                   INTERFACE_INCLUDE_DIRECTORIES 
"${LZ4_INCLUDE_DIR}")
+endif()
diff --git a/cmake_modules/FindProtobuf.cmake b/cmake_modules/FindProtobuf.cmake
index cca7c8b87..82429a23f 100644
--- a/cmake_modules/FindProtobuf.cmake
+++ b/cmake_modules/FindProtobuf.cmake
@@ -17,7 +17,7 @@
 
 # PROTOBUF_HOME environmental variable is used to check for Protobuf headers 
and static library
 
-# PROTOBUF_FOUND is set if Protobuf is found
+# Protobuf_FOUND is set if Protobuf is found
 # PROTOBUF_INCLUDE_DIR: directory containing headers
 # PROTOBUF_LIBRARY: location of libprotobuf
 # PROTOBUF_STATIC_LIB: location of protobuf.a
@@ -25,6 +25,19 @@
 # PROTOC_STATIC_LIB: location of protoc.a
 # PROTOBUF_EXECUTABLE: location of protoc
 
+if (NOT PROTOBUF_HOME)
+  if (DEFINED ENV{PROTOBUF_HOME})
+    set (PROTOBUF_HOME "$ENV{PROTOBUF_HOME}")
+  elseif (Protobuf_ROOT)
+    set (PROTOBUF_HOME "${Protobuf_ROOT}")
+  elseif (DEFINED ENV{Protobuf_ROOT})
+    set (PROTOBUF_HOME "$ENV{Protobuf_ROOT}")
+  elseif (PROTOBUF_ROOT)
+    set (PROTOBUF_HOME "${PROTOBUF_ROOT}")
+  elseif (DEFINED ENV{PROTOBUF_ROOT})
+    set (PROTOBUF_HOME "$ENV{PROTOBUF_ROOT}")
+  endif ()
+endif ()
 
 if( NOT "${PROTOBUF_HOME}" STREQUAL "")
     file (TO_CMAKE_PATH "${PROTOBUF_HOME}" _protobuf_path)
@@ -63,7 +76,7 @@ else()
       NO_DEFAULT_PATH
       PATH_SUFFIXES "include")
 
-    find_library (PROTOBUF_LIBRARY NAMES protobuf HINTS
+    find_library (PROTOBUF_LIBRARY NAMES protobuf libprotobuf HINTS
       ${_protobuf_path}
       PATH_SUFFIXES "lib")
 
@@ -71,7 +84,7 @@ else()
       ${_protobuf_path}
       PATH_SUFFIXES "lib")
 
-    find_library (PROTOC_LIBRARY NAMES protoc HINTS
+    find_library (PROTOC_LIBRARY NAMES protoc libprotoc HINTS
       ${_protobuf_path}
       PATH_SUFFIXES "lib")
 
@@ -86,14 +99,14 @@ else()
 endif ()
 
 if (PROTOBUF_INCLUDE_DIR AND PROTOBUF_LIBRARY AND PROTOC_LIBRARY AND 
PROTOBUF_EXECUTABLE)
-  set (PROTOBUF_FOUND TRUE)
+  set (Protobuf_FOUND TRUE)
   set (PROTOBUF_LIB_NAME protobuf)
   set (PROTOC_LIB_NAME protoc)
 else ()
-  set (PROTOBUF_FOUND FALSE)
+  set (Protobuf_FOUND FALSE)
 endif ()
 
-if (PROTOBUF_FOUND)
+if (Protobuf_FOUND)
   message (STATUS "Found the Protobuf headers: ${PROTOBUF_INCLUDE_DIR}")
   message (STATUS "Found the Protobuf library: ${PROTOBUF_LIBRARY}")
   message (STATUS "Found the Protoc library: ${PROTOC_LIBRARY}")
@@ -125,3 +138,10 @@ mark_as_advanced (
   PROTOC_STATIC_LIB
   PROTOC_LIBRARY
 )
+
+if(Protobuf_FOUND AND NOT TARGET protobuf::libprotobuf)
+  add_library(protobuf::libprotobuf UNKNOWN IMPORTED)
+  set_target_properties(protobuf::libprotobuf
+                        PROPERTIES IMPORTED_LOCATION "${PROTOBUF_LIBRARY}"
+                                   INTERFACE_INCLUDE_DIRECTORIES 
"${PROTOBUF_INCLUDE_DIR}")
+endif()
diff --git a/cmake_modules/FindSnappy.cmake b/cmake_modules/FindSnappy.cmake
index f0a077380..1ad991454 100644
--- a/cmake_modules/FindSnappy.cmake
+++ b/cmake_modules/FindSnappy.cmake
@@ -20,7 +20,21 @@
 # SNAPPY_INCLUDE_DIR: directory containing headers
 # SNAPPY_LIBRARY: path to libsnappy
 # SNAPPY_STATIC_LIB: path to libsnappy.a
-# SNAPPY_FOUND: whether snappy has been found
+# Snappy_FOUND: whether snappy has been found
+
+if (NOT SNAPPY_HOME)
+  if (DEFINED ENV{SNAPPY_HOME})
+    set (SNAPPY_HOME "$ENV{SNAPPY_HOME}")
+  elseif (Snappy_ROOT)
+    set (SNAPPY_HOME "${Snappy_ROOT}")
+  elseif (DEFINED ENV{Snappy_ROOT})
+    set (SNAPPY_HOME "$ENV{Snappy_ROOT}")
+  elseif (SNAPPY_ROOT)
+    set (SNAPPY_HOME "${SNAPPY_ROOT}")
+  elseif (DEFINED ENV{SNAPPY_ROOT})
+    set (SNAPPY_HOME "$ENV{SNAPPY_ROOT}")
+  endif ()
+endif ()
 
 if( NOT "${SNAPPY_HOME}" STREQUAL "")
     file (TO_CMAKE_PATH "${SNAPPY_HOME}" _snappy_path)
@@ -42,14 +56,14 @@ find_library (SNAPPY_STATIC_LIB NAMES 
${CMAKE_STATIC_LIBRARY_PREFIX}${SNAPPY_LIB
   PATH_SUFFIXES "lib" "lib64")
 
 if (SNAPPY_INCLUDE_DIR AND SNAPPY_LIBRARY)
-  set (SNAPPY_FOUND TRUE)
+  set (Snappy_FOUND TRUE)
   set (SNAPPY_HEADER_NAME snappy.h)
   set (SNAPPY_HEADER ${SNAPPY_INCLUDE_DIR}/${SNAPPY_HEADER_NAME})
 else ()
-  set (SNAPPY_FOUND FALSE)
+  set (Snappy_FOUND FALSE)
 endif ()
 
-if (SNAPPY_FOUND)
+if (Snappy_FOUND)
   message (STATUS "Found the Snappy header: ${SNAPPY_HEADER}")
   message (STATUS "Found the Snappy library: ${SNAPPY_LIBRARY}")
   if (SNAPPY_STATIC_LIB)
@@ -74,3 +88,10 @@ mark_as_advanced (
   SNAPPY_STATIC_LIB
   SNAPPY_LIBRARY
 )
+
+if(Snappy_FOUND AND NOT TARGET Snappy::snappy)
+  add_library(Snappy::snappy UNKNOWN IMPORTED)
+  set_target_properties(Snappy::snappy
+                        PROPERTIES IMPORTED_LOCATION "${SNAPPY_LIBRARY}"
+                                   INTERFACE_INCLUDE_DIRECTORIES 
"${SNAPPY_INCLUDE_DIR}")
+endif()
diff --git a/cmake_modules/FindZLIB.cmake b/cmake_modules/FindZLIB.cmake
index 2f83a974c..374814a7f 100644
--- a/cmake_modules/FindZLIB.cmake
+++ b/cmake_modules/FindZLIB.cmake
@@ -22,6 +22,16 @@
 # ZLIB_STATIC_LIB: path to zlib.a
 # ZLIB_FOUND: whether ZLIB has been found
 
+if (NOT ZLIB_HOME)
+  if (DEFINED ENV{ZLIB_HOME})
+    set (ZLIB_HOME "$ENV{ZLIB_HOME}")
+  elseif (ZLIB_ROOT)
+    set (ZLIB_HOME "${ZLIB_ROOT}")
+  elseif (DEFINED ENV{ZLIB_ROOT})
+    set (ZLIB_HOME "$ENV{ZLIB_ROOT}")
+  endif ()
+endif ()
+
 if( NOT "${ZLIB_HOME}" STREQUAL "")
     file (TO_CMAKE_PATH "${ZLIB_HOME}" _zlib_path)
 endif()
@@ -78,3 +88,10 @@ mark_as_advanced (
   ZLIB_STATIC_LIB
   ZLIB_LIBRARY
 )
+
+if(ZLIB_FOUND AND NOT TARGET ZLIB::ZLIB)
+  add_library(ZLIB::ZLIB UNKNOWN IMPORTED)
+  set_target_properties(ZLIB::ZLIB
+                        PROPERTIES IMPORTED_LOCATION "${ZLIB_LIBRARY}"
+                                   INTERFACE_INCLUDE_DIRECTORIES 
"${ZLIB_INCLUDE_DIR}")
+endif()
diff --git a/cmake_modules/FindZSTD.cmake b/cmake_modules/FindZSTD.cmake
index 7ec197221..faa1fe935 100644
--- a/cmake_modules/FindZSTD.cmake
+++ b/cmake_modules/FindZSTD.cmake
@@ -22,6 +22,16 @@
 # ZSTD_STATIC_LIB: path to libzstd.a
 # ZSTD_FOUND: whether zstd has been found
 
+if (NOT ZSTD_HOME)
+  if (DEFINED ENV{ZSTD_HOME})
+    set (ZSTD_HOME "$ENV{ZSTD_HOME}")
+  elseif (ZSTD_ROOT)
+    set (ZSTD_HOME "${ZSTD_ROOT}")
+  elseif (DEFINED ENV{ZSTD_ROOT})
+    set (ZSTD_HOME "$ENV{ZSTD_ROOT}")
+  endif ()
+endif ()
+
 if( NOT "${ZSTD_HOME}" STREQUAL "")
   file (TO_CMAKE_PATH "${ZSTD_HOME}" _zstd_path)
 endif()
@@ -74,3 +84,18 @@ mark_as_advanced (
         ZSTD_STATIC_LIB
         ZSTD_LIBRARY
 )
+
+if(ZSTD_FOUND)
+  if(NOT TARGET zstd::libzstd_static AND ${ZSTD_STATIC_LIB})
+    add_library(zstd::libzstd_static STATIC IMPORTED)
+    set_target_properties(zstd::libzstd_static
+                          PROPERTIES IMPORTED_LOCATION "${ZSTD_STATIC_LIB}"
+                                     INTERFACE_INCLUDE_DIRECTORIES 
"${ZSTD_INCLUDE_DIR}")
+  endif()
+  if(NOT TARGET zstd::libzstd_shared AND NOT ${ZSTD_STATIC_LIB})
+    add_library(zstd::libzstd_shared SHARED IMPORTED)
+    set_target_properties(zstd::libzstd_shared
+                          PROPERTIES IMPORTED_LOCATION "${ZSTD_LIBRARY}"
+                                     INTERFACE_INCLUDE_DIRECTORIES 
"${ZSTD_INCLUDE_DIR}")
+  endif()
+endif()
diff --git a/cmake_modules/ThirdpartyToolchain.cmake 
b/cmake_modules/ThirdpartyToolchain.cmake
index c3d414e89..79324984a 100644
--- a/cmake_modules/ThirdpartyToolchain.cmake
+++ b/cmake_modules/ThirdpartyToolchain.cmake
@@ -15,6 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 
+set(ORC_VENDOR_DEPENDENCIES)
+set(ORC_SYSTEM_DEPENDENCIES)
+set(ORC_INSTALL_INTERFACE_TARGETS)
+
 set(ORC_FORMAT_VERSION "1.0.0")
 set(LZ4_VERSION "1.9.3")
 set(SNAPPY_VERSION "1.1.7")
@@ -47,22 +51,50 @@ string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_BUILD_TYPE)
 
 if (DEFINED ENV{SNAPPY_HOME})
   set (SNAPPY_HOME "$ENV{SNAPPY_HOME}")
+elseif (Snappy_ROOT)
+  set (SNAPPY_HOME "${Snappy_ROOT}")
+elseif (DEFINED ENV{Snappy_ROOT})
+  set (SNAPPY_HOME "$ENV{Snappy_ROOT}")
+elseif (SNAPPY_ROOT)
+  set (SNAPPY_HOME "${SNAPPY_ROOT}")
+elseif (DEFINED ENV{SNAPPY_ROOT})
+  set (SNAPPY_HOME "$ENV{SNAPPY_ROOT}")
 endif ()
 
 if (DEFINED ENV{ZLIB_HOME})
   set (ZLIB_HOME "$ENV{ZLIB_HOME}")
+elseif (ZLIB_ROOT)
+  set (ZLIB_HOME "${ZLIB_ROOT}")
+elseif (DEFINED ENV{ZLIB_ROOT})
+  set (ZLIB_HOME "$ENV{ZLIB_ROOT}")
 endif ()
 
 if (DEFINED ENV{LZ4_HOME})
   set (LZ4_HOME "$ENV{LZ4_HOME}")
+elseif (LZ4_ROOT)
+  set (LZ4_HOME "${LZ4_ROOT}")
+elseif (DEFINED ENV{LZ4_ROOT})
+  set (LZ4_HOME "$ENV{LZ4_ROOT}")
 endif ()
 
 if (DEFINED ENV{PROTOBUF_HOME})
   set (PROTOBUF_HOME "$ENV{PROTOBUF_HOME}")
+elseif (Protobuf_ROOT)
+  set (PROTOBUF_HOME "${Protobuf_ROOT}")
+elseif (DEFINED ENV{Protobuf_ROOT})
+  set (PROTOBUF_HOME "$ENV{Protobuf_ROOT}")
+elseif (PROTOBUF_ROOT)
+  set (PROTOBUF_HOME "${PROTOBUF_ROOT}")
+elseif (DEFINED ENV{PROTOBUF_ROOT})
+  set (PROTOBUF_HOME "$ENV{PROTOBUF_ROOT}")
 endif ()
 
 if (DEFINED ENV{ZSTD_HOME})
   set (ZSTD_HOME "$ENV{ZSTD_HOME}")
+elseif (ZSTD_ROOT)
+  set (ZSTD_HOME "${ZSTD_ROOT}")
+elseif (DEFINED ENV{ZSTD_ROOT})
+  set (ZSTD_HOME "$ENV{ZSTD_ROOT}")
 endif ()
 
 if (DEFINED ENV{GTEST_HOME})
@@ -86,10 +118,22 @@ macro (add_built_library external_project_name target_name 
link_lib include_dir)
 
   add_dependencies (${target_name} ${external_project_name})
   if (INSTALL_VENDORED_LIBS)
-    install (FILES "${link_lib}" DESTINATION "lib")
+    install (FILES "${link_lib}" DESTINATION "${CMAKE_INSTALL_LIBDIR}")
   endif ()
 endmacro ()
 
+function(provide_cmake_module MODULE_NAME)
+  set(module "${CMAKE_SOURCE_DIR}/cmake_modules/${MODULE_NAME}.cmake")
+  if(EXISTS "${module}")
+    message(STATUS "Providing CMake module for ${MODULE_NAME} as part of CMake 
package")
+    install(FILES "${module}" DESTINATION "${ORC_INSTALL_CMAKE_DIR}")
+  endif()
+endfunction()
+
+function(provide_find_module PACKAGE_NAME)
+  provide_cmake_module("Find${PACKAGE_NAME}")
+endfunction()
+
 # ----------------------------------------------------------------------
 # ORC Format
 ExternalProject_Add (orc-format_ep
@@ -107,6 +151,8 @@ ExternalProject_Add (orc-format_ep
 if (ORC_PACKAGE_KIND STREQUAL "conan")
   find_package (Snappy REQUIRED CONFIG)
   add_resolved_library (orc_snappy ${Snappy_LIBRARIES} ${Snappy_INCLUDE_DIR})
+  list (APPEND ORC_SYSTEM_DEPENDENCIES Snappy)
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:Snappy::snappy>")
 elseif (NOT "${SNAPPY_HOME}" STREQUAL "")
   find_package (Snappy REQUIRED)
   if (ORC_PREFER_STATIC_SNAPPY AND ${SNAPPY_STATIC_LIB})
@@ -114,10 +160,14 @@ elseif (NOT "${SNAPPY_HOME}" STREQUAL "")
   else ()
     add_resolved_library (orc_snappy ${SNAPPY_LIBRARY} ${SNAPPY_INCLUDE_DIR})
   endif ()
+  list (APPEND ORC_SYSTEM_DEPENDENCIES Snappy)
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:Snappy::snappy>")
+  provide_find_module (Snappy)
 else ()
   set(SNAPPY_HOME "${THIRDPARTY_DIR}/snappy_ep-install")
   set(SNAPPY_INCLUDE_DIR "${SNAPPY_HOME}/include")
-  set(SNAPPY_STATIC_LIB 
"${SNAPPY_HOME}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}snappy${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(SNAPPY_STATIC_LIB_NAME 
"${CMAKE_STATIC_LIBRARY_PREFIX}snappy${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(SNAPPY_STATIC_LIB "${SNAPPY_HOME}/lib/${SNAPPY_STATIC_LIB_NAME}")
   set(SNAPPY_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${SNAPPY_HOME}
                         -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_LIBDIR=lib)
 
@@ -132,6 +182,9 @@ else ()
     BUILD_BYPRODUCTS "${SNAPPY_STATIC_LIB}")
 
   add_built_library (snappy_ep orc_snappy ${SNAPPY_STATIC_LIB} 
${SNAPPY_INCLUDE_DIR})
+
+  list (APPEND ORC_VENDOR_DEPENDENCIES 
"orc::vendored_snappy|${SNAPPY_STATIC_LIB_NAME}")
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:orc::vendored_snappy>")
 endif ()
 
 add_library (orc::snappy ALIAS orc_snappy)
@@ -142,6 +195,8 @@ add_library (orc::snappy ALIAS orc_snappy)
 if (ORC_PACKAGE_KIND STREQUAL "conan")
   find_package (ZLIB REQUIRED CONFIG)
   add_resolved_library (orc_zlib ${ZLIB_LIBRARIES} ${ZLIB_INCLUDE_DIR})
+  list (APPEND ORC_SYSTEM_DEPENDENCIES ZLIB)
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$<INSTALL_INTERFACE:ZLIB::ZLIB>")
 elseif (NOT "${ZLIB_HOME}" STREQUAL "")
   find_package (ZLIB REQUIRED)
   if (ORC_PREFER_STATIC_ZLIB AND ${ZLIB_STATIC_LIB})
@@ -149,6 +204,9 @@ elseif (NOT "${ZLIB_HOME}" STREQUAL "")
   else ()
     add_resolved_library (orc_zlib ${ZLIB_LIBRARY} ${ZLIB_INCLUDE_DIR})
   endif ()
+  list (APPEND ORC_SYSTEM_DEPENDENCIES ZLIB)
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$<INSTALL_INTERFACE:ZLIB::ZLIB>")
+  provide_find_module (ZLIB)
 else ()
   set(ZLIB_PREFIX "${THIRDPARTY_DIR}/zlib_ep-install")
   set(ZLIB_INCLUDE_DIR "${ZLIB_PREFIX}/include")
@@ -160,7 +218,8 @@ else ()
   else ()
     set(ZLIB_STATIC_LIB_NAME z)
   endif ()
-  set(ZLIB_STATIC_LIB 
"${ZLIB_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${ZLIB_STATIC_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(ZLIB_STATIC_LIB_NAME 
"${CMAKE_STATIC_LIBRARY_PREFIX}${ZLIB_STATIC_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(ZLIB_STATIC_LIB "${ZLIB_PREFIX}/lib/${ZLIB_STATIC_LIB_NAME}")
   set(ZLIB_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${ZLIB_PREFIX}
                       -DBUILD_SHARED_LIBS=OFF)
 
@@ -175,6 +234,9 @@ else ()
     BUILD_BYPRODUCTS "${ZLIB_STATIC_LIB}")
 
   add_built_library (zlib_ep orc_zlib ${ZLIB_STATIC_LIB} ${ZLIB_INCLUDE_DIR})
+
+  list (APPEND ORC_VENDOR_DEPENDENCIES 
"orc::vendored_zlib|${ZLIB_STATIC_LIB_NAME}")
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:orc::vendored_zlib>")
 endif ()
 
 add_library (orc::zlib ALIAS orc_zlib)
@@ -185,13 +247,19 @@ add_library (orc::zlib ALIAS orc_zlib)
 if (ORC_PACKAGE_KIND STREQUAL "conan")
   find_package (ZSTD REQUIRED CONFIG)
   add_resolved_library (orc_zstd ${zstd_LIBRARIES} ${zstd_INCLUDE_DIR})
+  list (APPEND ORC_SYSTEM_DEPENDENCIES ZSTD)
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:$<IF:$<TARGET_EXISTS:zstd::libzstd_shared>,zstd::libzstd_shared,zstd::libzstd_static>>")
 elseif (NOT "${ZSTD_HOME}" STREQUAL "")
   find_package (ZSTD REQUIRED)
   if (ORC_PREFER_STATIC_ZSTD AND ${ZSTD_STATIC_LIB})
     add_resolved_library (orc_zstd ${ZSTD_STATIC_LIB} ${ZSTD_INCLUDE_DIR})
+    list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:zstd::libzstd_static>")
   else ()
     add_resolved_library (orc_zstd ${ZSTD_LIBRARY} ${ZSTD_INCLUDE_DIR})
+    list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:$<IF:$<TARGET_EXISTS:zstd::libzstd_shared>,zstd::libzstd_shared,zstd::libzstd_static>>")
   endif ()
+  list (APPEND ORC_SYSTEM_DEPENDENCIES ZSTD)
+  provide_find_module (ZSTD)
 else ()
   set(ZSTD_HOME "${THIRDPARTY_DIR}/zstd_ep-install")
   set(ZSTD_INCLUDE_DIR "${ZSTD_HOME}/include")
@@ -203,7 +271,8 @@ else ()
   else ()
     set(ZSTD_STATIC_LIB_NAME zstd)
   endif ()
-  set(ZSTD_STATIC_LIB 
"${ZSTD_HOME}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${ZSTD_STATIC_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(ZSTD_STATIC_LIB_NAME 
"${CMAKE_STATIC_LIBRARY_PREFIX}${ZSTD_STATIC_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(ZSTD_STATIC_LIB "${ZSTD_HOME}/lib/${ZSTD_STATIC_LIB_NAME}")
   set(ZSTD_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${ZSTD_HOME}
           -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_LIBDIR=lib)
 
@@ -225,6 +294,9 @@ else ()
           BUILD_BYPRODUCTS ${ZSTD_STATIC_LIB})
 
   add_built_library (zstd_ep orc_zstd ${ZSTD_STATIC_LIB} ${ZSTD_INCLUDE_DIR})
+
+  list (APPEND ORC_VENDOR_DEPENDENCIES 
"orc::vendored_zstd|${ZSTD_STATIC_LIB_NAME}")
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:orc::vendored_zstd>")
 endif ()
 
 add_library (orc::zstd ALIAS orc_zstd)
@@ -234,6 +306,8 @@ add_library (orc::zstd ALIAS orc_zstd)
 if (ORC_PACKAGE_KIND STREQUAL "conan")
   find_package (LZ4 REQUIRED CONFIG)
   add_resolved_library (orc_lz4 ${lz4_LIBRARIES} ${lz4_INCLUDE_DIR})
+  list (APPEND ORC_SYSTEM_DEPENDENCIES LZ4)
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$<INSTALL_INTERFACE:LZ4::lz4>")
 elseif (NOT "${LZ4_HOME}" STREQUAL "")
   find_package (LZ4 REQUIRED)
   if (ORC_PREFER_STATIC_LZ4 AND ${LZ4_STATIC_LIB})
@@ -241,10 +315,14 @@ elseif (NOT "${LZ4_HOME}" STREQUAL "")
   else ()
     add_resolved_library (orc_lz4 ${LZ4_LIBRARY} ${LZ4_INCLUDE_DIR})
   endif ()
+  list (APPEND ORC_SYSTEM_DEPENDENCIES LZ4)
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$<INSTALL_INTERFACE:LZ4::lz4>")
+  provide_find_module (LZ4)
 else ()
   set(LZ4_PREFIX "${THIRDPARTY_DIR}/lz4_ep-install")
   set(LZ4_INCLUDE_DIR "${LZ4_PREFIX}/include")
-  set(LZ4_STATIC_LIB 
"${LZ4_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}lz4${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(LZ4_STATIC_LIB_NAME 
"${CMAKE_STATIC_LIBRARY_PREFIX}lz4${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(LZ4_STATIC_LIB "${LZ4_PREFIX}/lib/${LZ4_STATIC_LIB_NAME}")
   set(LZ4_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LZ4_PREFIX}
                      -DCMAKE_INSTALL_LIBDIR=lib
                      -DBUILD_SHARED_LIBS=OFF)
@@ -267,6 +345,9 @@ else ()
     BUILD_BYPRODUCTS ${LZ4_STATIC_LIB})
 
   add_built_library (lz4_ep orc_lz4 ${LZ4_STATIC_LIB} ${LZ4_INCLUDE_DIR})
+
+  list (APPEND ORC_VENDOR_DEPENDENCIES 
"orc::vendored_lz4|${LZ4_STATIC_LIB_NAME}")
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:orc::vendored_lz4>")
 endif ()
 
 add_library (orc::lz4 ALIAS orc_lz4)
@@ -380,6 +461,8 @@ endif ()
 if (ORC_PACKAGE_KIND STREQUAL "conan")
   find_package (Protobuf REQUIRED CONFIG)
   add_resolved_library (orc_protobuf ${protobuf_LIBRARIES} 
${protobuf_INCLUDE_DIR})
+  list (APPEND ORC_SYSTEM_DEPENDENCIES Protobuf)
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:protobuf::libprotobuf>")
 elseif (NOT "${PROTOBUF_HOME}" STREQUAL "")
   find_package (Protobuf REQUIRED)
 
@@ -394,6 +477,10 @@ elseif (NOT "${PROTOBUF_HOME}" STREQUAL "")
   else ()
     add_resolved_library (orc_protoc ${PROTOC_LIBRARY} ${PROTOBUF_INCLUDE_DIR})
   endif ()
+
+  list (APPEND ORC_SYSTEM_DEPENDENCIES Protobuf)
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:protobuf::libprotobuf>")
+  provide_find_module (Protobuf)
 else ()
   set(PROTOBUF_PREFIX "${THIRDPARTY_DIR}/protobuf_ep-install")
   set(PROTOBUF_INCLUDE_DIR "${PROTOBUF_PREFIX}/include")
@@ -413,7 +500,8 @@ else ()
   else ()
     set(PROTOBUF_STATIC_LIB_PREFIX ${CMAKE_STATIC_LIBRARY_PREFIX})
   endif ()
-  set(PROTOBUF_STATIC_LIB 
"${PROTOBUF_PREFIX}/lib/${PROTOBUF_STATIC_LIB_PREFIX}protobuf${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(PROTOBUF_STATIC_LIB_NAME 
"${PROTOBUF_STATIC_LIB_PREFIX}protobuf${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(PROTOBUF_STATIC_LIB "${PROTOBUF_PREFIX}/lib/${PROTOBUF_STATIC_LIB_NAME}")
   set(PROTOC_STATIC_LIB 
"${PROTOBUF_PREFIX}/lib/${PROTOBUF_STATIC_LIB_PREFIX}protoc${CMAKE_STATIC_LIBRARY_SUFFIX}")
   set(PROTOBUF_EXECUTABLE 
"${PROTOBUF_PREFIX}/bin/protoc${CMAKE_EXECUTABLE_SUFFIX}")
 
@@ -432,6 +520,9 @@ else ()
 
   add_built_library (protobuf_ep orc_protobuf ${PROTOBUF_STATIC_LIB} 
${PROTOBUF_INCLUDE_DIR})
   add_built_library (protobuf_ep orc_protoc ${PROTOC_STATIC_LIB} 
${PROTOBUF_INCLUDE_DIR})
+
+  list (APPEND ORC_VENDOR_DEPENDENCIES 
"orc::vendored_protobuf|${PROTOBUF_STATIC_LIB_NAME}")
+  list (APPEND ORC_INSTALL_INTERFACE_TARGETS 
"$<INSTALL_INTERFACE:orc::vendored_protobuf>")
 endif ()
 
 add_library (orc::protobuf ALIAS orc_protobuf)

Reply via email to