]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cmake: add submodule for utf8proc at v2.2.0
authorCasey Bodley <cbodley@redhat.com>
Fri, 28 Jan 2022 18:44:56 +0000 (13:44 -0500)
committerCasey Bodley <cbodley@redhat.com>
Wed, 23 Mar 2022 20:04:35 +0000 (16:04 -0400)
adds utf8proc submodule, needed by the arrow submodule in centos. add a
WITH_SYSTEM_UTF8PROC option that controls whether or not utf8proc is
built from submodule

non-system utf8proc is built as a static library to avoid conflicts with
system-provided libraries

ceph.spec.in sets WITH_SYSTEM_UTF8PROC=OFF until it's available in
centos

Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit b10364dc21d964465dc0192b1c600bb8c6963213)

.gitmodules
CMakeLists.txt
ceph.spec.in
cmake/modules/BuildUtf8proc.cmake [new file with mode: 0644]
cmake/modules/Findutf8proc.cmake [new file with mode: 0644]
src/CMakeLists.txt
src/utf8proc [new submodule]

index 5100e7d23bca3489b2c82eb1256810ecc512e876..f828bb3769ae8303b7098ae26cb09bd72730973d 100644 (file)
@@ -69,3 +69,6 @@
 [submodule "src/arrow"]
        path = src/arrow
        url = https://github.com/apache/arrow.git
+[submodule "src/utf8proc"]
+       path = src/utf8proc
+       url = https://github.com/JuliaStrings/utf8proc
index 305ae035121af7489f9f9c8d6627a37428812b8b..6f2baf61da5adb64dda10398d57620ce91e1832b 100644 (file)
@@ -402,6 +402,8 @@ option(WITH_RADOSGW_LUA_PACKAGES "Rados Gateway's support for dynamically adding
 option(WITH_RADOSGW_DBSTORE "DBStore backend for Rados Gateway" ON)
 option(WITH_RADOSGW_SELECT_PARQUET "Support for s3 select on parquet objects" ON)
 
+option(WITH_SYSTEM_UTF8PROC "Use system-provided utf8proc" ON)
+
 if(WITH_RADOSGW)
   find_package(EXPAT REQUIRED)
   find_package(OATH REQUIRED)
index 4d74d613c96836abcfc6585986f0346b5d9bb0aa..d1e22170989753f2f2373f07ce259de1cd12cb1c 100644 (file)
@@ -262,7 +262,6 @@ BuildRequires:  libzbd-devel
 %endif
 BuildRequires:  thrift-devel >= 0.13.0
 BuildRequires:  re2-devel
-BuildRequires:  utf8proc-devel >= 2.2.0
 %if 0%{with jaeger}
 BuildRequires:  bison
 BuildRequires:  flex
@@ -1337,6 +1336,7 @@ cmake .. \
 %if 0%{?rhel}
     -DWITH_FMT_HEADER_ONLY:BOOL=ON \
 %endif
+    -DWITH_SYSTEM_UTF8PROC:BOOL=OFF \
     -DWITH_GRAFANA:BOOL=ON
 
 %if %{with cmake_verbose_logging}
diff --git a/cmake/modules/BuildUtf8proc.cmake b/cmake/modules/BuildUtf8proc.cmake
new file mode 100644 (file)
index 0000000..3f74a9b
--- /dev/null
@@ -0,0 +1,69 @@
+# utf8proc is a dependency of the arrow submodule
+
+function(build_utf8proc)
+  # only build static version
+  list(APPEND utf8proc_CMAKE_ARGS -DBUILD_SHARED_LIBS=OFF)
+
+  # cmake doesn't properly handle arguments containing ";", such as
+  # CMAKE_PREFIX_PATH, for which reason we'll have to use some other separator.
+  string(REPLACE ";" "!" CMAKE_PREFIX_PATH_ALT_SEP "${CMAKE_PREFIX_PATH}")
+  list(APPEND utf8proc_CMAKE_ARGS -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_ALT_SEP})
+  if(CMAKE_TOOLCHAIN_FILE)
+    list(APPEND utf8proc_CMAKE_ARGS
+         -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE})
+  endif()
+
+  list(APPEND utf8proc_CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER})
+  list(APPEND utf8proc_CMAKE_ARGS -DCMAKE_AR=${CMAKE_AR})
+  list(APPEND utf8proc_CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE})
+
+  set(utf8proc_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/utf8proc")
+  set(utf8proc_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/utf8proc")
+
+  set(utf8proc_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/utf8proc/install")
+  list(APPEND utf8proc_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${utf8proc_INSTALL_PREFIX})
+
+  # expose the install path as utf8proc_ROOT for find_package()
+  set(utf8proc_ROOT "${utf8proc_INSTALL_PREFIX}" PARENT_SCOPE)
+
+  set(utf8proc_INSTALL_LIBDIR "lib") # force lib so we don't have to guess between lib/lib64
+  list(APPEND utf8proc_CMAKE_ARGS -DCMAKE_INSTALL_LIBDIR=${utf8proc_INSTALL_LIBDIR})
+  set(utf8proc_LIBRARY_DIR "${utf8proc_INSTALL_PREFIX}/${utf8proc_INSTALL_LIBDIR}")
+
+  set(utf8proc_LIBRARY "${utf8proc_LIBRARY_DIR}/libutf8proc.a")
+
+  set(utf8proc_INCLUDE_DIR "${utf8proc_INSTALL_PREFIX}/include")
+  # this include directory won't exist until the install step, but the
+  # imported target needs it early for INTERFACE_INCLUDE_DIRECTORIES
+  file(MAKE_DIRECTORY "${utf8proc_INCLUDE_DIR}")
+
+  set(utf8proc_BYPRODUCTS ${utf8proc_LIBRARY})
+
+  if(CMAKE_MAKE_PROGRAM MATCHES "make")
+    # try to inherit command line arguments passed by parent "make" job
+    set(make_cmd $(MAKE))
+  else()
+    set(make_cmd ${CMAKE_COMMAND} --build <BINARY_DIR>)
+  endif()
+
+  # we use an external project and copy the sources to bin directory to ensure
+  # that object files are built outside of the source tree.
+  include(ExternalProject)
+  ExternalProject_Add(utf8proc_ext
+    SOURCE_DIR "${utf8proc_SOURCE_DIR}"
+    CMAKE_ARGS ${utf8proc_CMAKE_ARGS}
+    BINARY_DIR "${utf8proc_BINARY_DIR}"
+    BUILD_COMMAND "${make_cmd}"
+    BUILD_BYPRODUCTS "${utf8proc_BYPRODUCTS}"
+    INSTALL_DIR "${utf8proc_INSTALL_PREFIX}"
+    DEPENDS "${utf8proc_DEPENDS}"
+    LIST_SEPARATOR !)
+
+  add_library(utf8proc::utf8proc STATIC IMPORTED)
+  add_dependencies(utf8proc::utf8proc utf8proc_ext)
+  set_target_properties(utf8proc::utf8proc PROPERTIES
+    INTERFACE_INCLUDE_DIRECTORIES "${utf8proc_INCLUDE_DIR}"
+    INTERFACE_LINK_LIBRARIES "${utf8proc_INTERFACE_LINK_LIBRARIES}"
+    IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
+    IMPORTED_LOCATION "${utf8proc_LIBRARY}")
+endfunction()
diff --git a/cmake/modules/Findutf8proc.cmake b/cmake/modules/Findutf8proc.cmake
new file mode 100644 (file)
index 0000000..2d390ba
--- /dev/null
@@ -0,0 +1,99 @@
+# 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.
+
+# note: cbodley copied this from the Arrow repo and removed ARROW variables
+
+function(extract_utf8proc_version)
+  if(utf8proc_INCLUDE_DIR)
+    file(READ "${utf8proc_INCLUDE_DIR}/utf8proc.h" UTF8PROC_H_CONTENT)
+
+    string(REGEX MATCH "#define UTF8PROC_VERSION_MAJOR [0-9]+"
+                 UTF8PROC_MAJOR_VERSION_DEFINITION "${UTF8PROC_H_CONTENT}")
+    string(REGEX MATCH "#define UTF8PROC_VERSION_MINOR [0-9]+"
+                 UTF8PROC_MINOR_VERSION_DEFINITION "${UTF8PROC_H_CONTENT}")
+    string(REGEX MATCH "#define UTF8PROC_VERSION_PATCH [0-9]+"
+                 UTF8PROC_PATCH_VERSION_DEFINITION "${UTF8PROC_H_CONTENT}")
+
+    string(REGEX MATCH "[0-9]+$" UTF8PROC_MAJOR_VERSION
+                 "${UTF8PROC_MAJOR_VERSION_DEFINITION}")
+    string(REGEX MATCH "[0-9]+$" UTF8PROC_MINOR_VERSION
+                 "${UTF8PROC_MINOR_VERSION_DEFINITION}")
+    string(REGEX MATCH "[0-9]+$" UTF8PROC_PATCH_VERSION
+                 "${UTF8PROC_PATCH_VERSION_DEFINITION}")
+    set(utf8proc_VERSION
+        "${UTF8PROC_MAJOR_VERSION}.${UTF8PROC_MINOR_VERSION}.${UTF8PROC_PATCH_VERSION}"
+        PARENT_SCOPE)
+  else()
+    set(utf8proc_VERSION
+        ""
+        PARENT_SCOPE)
+  endif()
+endfunction(extract_utf8proc_version)
+
+if(NOT utf8proc_USE_STATIC_LIB)
+  set(utf8proc_LIB_NAMES)
+  if(CMAKE_IMPORT_LIBRARY_SUFFIX)
+    list(APPEND utf8proc_LIB_NAMES
+         "${CMAKE_IMPORT_LIBRARY_PREFIX}utf8proc${CMAKE_IMPORT_LIBRARY_SUFFIX}")
+  endif()
+  list(APPEND utf8proc_LIB_NAMES
+       "${CMAKE_SHARED_LIBRARY_PREFIX}utf8proc${CMAKE_SHARED_LIBRARY_SUFFIX}")
+else()
+  if(MSVC AND NOT DEFINED utf8proc_MSVC_STATIC_LIB_SUFFIX)
+    set(utf8proc_MSVC_STATIC_LIB_SUFFIX "_static")
+  endif()
+  set(utf8proc_STATIC_LIB_SUFFIX
+      "${utf8proc_MSVC_STATIC_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}")
+  set(utf8proc_LIB_NAMES
+      "${CMAKE_STATIC_LIBRARY_PREFIX}utf8proc${utf8proc_STATIC_LIB_SUFFIX}")
+endif()
+
+if(utf8proc_ROOT)
+  find_library(utf8proc_LIB
+               NAMES ${utf8proc_LIB_NAMES}
+               PATHS ${utf8proc_ROOT}
+               PATH_SUFFIXES lib lib64
+               NO_DEFAULT_PATH)
+  find_path(utf8proc_INCLUDE_DIR
+            NAMES utf8proc.h
+            PATHS ${utf8proc_ROOT}
+            NO_DEFAULT_PATH
+            PATH_SUFFIXES include)
+  extract_utf8proc_version()
+else()
+  find_library(utf8proc_LIB
+               NAMES ${utf8proc_LIB_NAMES}
+               PATH_SUFFIXES lib lib64)
+  find_path(utf8proc_INCLUDE_DIR
+            NAMES utf8proc.h
+            PATH_SUFFIXES include)
+  extract_utf8proc_version()
+endif()
+
+find_package_handle_standard_args(
+  utf8proc
+  REQUIRED_VARS utf8proc_LIB utf8proc_INCLUDE_DIR
+  VERSION_VAR utf8proc_VERSION)
+
+if(utf8proc_FOUND)
+  set(utf8proc_FOUND TRUE)
+  add_library(utf8proc::utf8proc UNKNOWN IMPORTED)
+  set_target_properties(utf8proc::utf8proc
+                        PROPERTIES IMPORTED_LOCATION "${utf8proc_LIB}"
+                                   INTERFACE_INCLUDE_DIRECTORIES
+                                   "${utf8proc_INCLUDE_DIR}")
+endif()
index 3118d2f64fa300e5d01fc8b81ee069e15ed628c4..b3366c6bec5cdfc0364a0d6f99aa8e9831c8b715 100644 (file)
@@ -856,8 +856,17 @@ if(WITH_KVS)
 endif(WITH_KVS)
 
 if(WITH_RADOSGW)
-  if(WITH_RADOSGW_SELECT_PARQUET AND NOT WITH_SYSTEM_ARROW)
-    find_package(thrift 0.13 REQUIRED) # a dependency of arrow
+  if(WITH_RADOSGW_SELECT_PARQUET)
+    # find arrow's dependencies
+    if (WITH_SYSTEM_UTF8PROC)
+      find_package(utf8proc 2.2.0 REQUIRED)
+    else()
+      include(BuildUtf8proc)
+      build_utf8proc()
+    endif()
+    find_package(thrift 0.13 REQUIRED)
+
+    # TODO: WITH_SYSTEM_ARROW
     include(BuildArrow)
     build_arrow()
   endif()
diff --git a/src/utf8proc b/src/utf8proc
new file mode 160000 (submodule)
index 0000000..97ef668
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 97ef668b312b96382714dbb8eaac4affce0816e6