From: Casey Bodley Date: Fri, 28 Jan 2022 18:44:56 +0000 (-0500) Subject: cmake: add submodule for utf8proc at v2.2.0 X-Git-Tag: v17.2.0~18^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bdd8ff6675b6f454c2fa99235a9027e01bf3b64b;p=ceph.git cmake: add submodule for utf8proc at v2.2.0 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 (cherry picked from commit b10364dc21d964465dc0192b1c600bb8c6963213) --- diff --git a/.gitmodules b/.gitmodules index 5100e7d23bca..f828bb3769ae 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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 diff --git a/CMakeLists.txt b/CMakeLists.txt index 305ae035121a..6f2baf61da5a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/ceph.spec.in b/ceph.spec.in index 4d74d613c968..d1e221709897 100644 --- a/ceph.spec.in +++ b/ceph.spec.in @@ -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 index 000000000000..3f74a9b46f9d --- /dev/null +++ b/cmake/modules/BuildUtf8proc.cmake @@ -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 ) + 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 index 000000000000..2d390ba9915e --- /dev/null +++ b/cmake/modules/Findutf8proc.cmake @@ -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() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3118d2f64fa3..b3366c6bec5c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 index 000000000000..97ef668b312b --- /dev/null +++ b/src/utf8proc @@ -0,0 +1 @@ +Subproject commit 97ef668b312b96382714dbb8eaac4affce0816e6