Author: brane
Date: Fri May 30 12:32:38 2025
New Revision: 1925977
URL: http://svn.apache.org/viewvc?rev=1925977&view=rev
Log:
Add support for Brotli to the CMake build.
* CMakeLists.txt: Remove the warning about the BROTLI_ROOT option not being
implemented. Instead, find the package and add some checks.
* build/FindBrotli.cmake: New.
Added:
serf/trunk/build/FindBrotli.cmake
Modified:
serf/trunk/CMakeLists.txt
Modified: serf/trunk/CMakeLists.txt
URL:
http://svn.apache.org/viewvc/serf/trunk/CMakeLists.txt?rev=1925977&r1=1925976&r2=1925977&view=diff
==============================================================================
--- serf/trunk/CMakeLists.txt (original)
+++ serf/trunk/CMakeLists.txt Fri May 30 12:32:38 2025
@@ -206,10 +206,6 @@ endif(SERF_WINDOWS)
# Process build options for dependency search
-if(BROTLI_ROOT)
- message(WARNING "option BROTLI_ROOT is not implemented")
-endif()
-
if(SERF_WINDOWS)
if(EXPAT)
set(PC_EXPAT_INCLUDE_DIRS "${EXPAT}/include")
@@ -228,14 +224,16 @@ find_package(APR REQUIRED)
find_package(APRUtil REQUIRED)
# Find optional dependencies
+find_package(BROTLI)
find_package(GSSAPI)
-if(GSSAPI_FOUND)
- add_definitions("-DSERF_HAVE_GSSAPI")
-endif()
# Calculate the set of private and public targets
set(SERF_PRIVATE_TARGETS OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
+if(BROTLI_FOUND)
+ list(APPEND SERF_PRIVATE_TARGETS BROTLI::DECODE)
+endif()
if(GSSAPI_FOUND)
+ add_definitions("-DSERF_HAVE_GSSAPI")
list(APPEND SERF_PRIVATE_TARGETS KRB5::GSSAPI)
endif()
@@ -272,6 +270,10 @@ CheckFunctionMacro("SSL_library_init" "S
"${OPENSSL_INCLUDE_DIR}" ${OPENSSL_LIBRARIES}
${SERF_STANDARD_LIBRARIES})
CheckHeader("stdbool.h" "HAVE_STDBOOL_H=1")
CheckType("OSSL_HANDSHAKE_STATE" "openssl/ssl.h"
"SERF_HAVE_OSSL_HANDSHAKE_STATE" ${OPENSSL_INCLUDE_DIR})
+if(BROTLI_FOUND)
+ CheckType("BrotliDecoderResult" "brotli/decode.h"
"SERF_HAVE_BROTLI_DECODE_H" ${BROTLI_INCLUDES})
+ CheckFunction("BrotliDecoderTakeOutput" "SERF_HAVE_BROTLI" BROTLI::DECODE
${SERF_STANDARD_LIBRARIES})
+endif()
if(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang"))
set(CC_LIKE_GNUC TRUE)
Added: serf/trunk/build/FindBrotli.cmake
URL:
http://svn.apache.org/viewvc/serf/trunk/build/FindBrotli.cmake?rev=1925977&view=auto
==============================================================================
--- serf/trunk/build/FindBrotli.cmake (added)
+++ serf/trunk/build/FindBrotli.cmake Fri May 30 12:32:38 2025
@@ -0,0 +1,121 @@
+# ===================================================================
+# 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.
+# ===================================================================
+
+cmake_minimum_required(VERSION 3.12)
+
+include(GNUInstallDirs)
+set(BROTLI_FOUND FALSE)
+
+function(_get_brotli_version)
+ if(DEFINED BROTLI_ROOT)
+ get_filename_component(BROTLI_ROOT "${BROTLI_ROOT}" REALPATH)
+ find_program(brotli NAMES "brotli"
+ PATHS
+ "${BROTLI_ROOT}/bin"
+ "${BROTLI_ROOT}/${CMAKE_INSTALL_BINDIR}"
+ NO_DEFAULT_PATH)
+ else()
+ find_program(brotli NAMES "brotli")
+ endif()
+
+ if(NOT "${brotli}" STREQUAL "brotli-NOTFOUND")
+ execute_process(COMMAND "${brotli}" "--version"
+ OUTPUT_VARIABLE output
+ RESULT_VARIABLE failed)
+ if(failed)
+ message(STATUS "failed: ${brotli} --version")
+ set(BROTLI_VERSION "unknown" PARENT_SCOPE)
+ else()
+ string(REPLACE "brotli" "" output "${output}")
+ string(STRIP "${output}" output)
+ set(BROTLI_VERSION "${output}" PARENT_SCOPE)
+ endif()
+ endif()
+endfunction(_get_brotli_version)
+
+function(_get_brotli_includes_libs)
+ if(DEFINED BROTLI_ROOT)
+ find_path(includes "decode.h"
+ PATHS "${BROTLI_ROOT}"
+ PATH_SUFFIXES
+ "include/brotli"
+ "${CMAKE_INSTALL_INCLUDEDIR}/brotli}"
+ NO_DEFAULT_PATH)
+ get_filename_component(includes "${includes}" DIRECTORY)
+ find_library(common_lib "brotlicommon"
+ PATHS "${BROTLI_ROOT}"
+ PATH_SUFFIXES "lib" "${CMAKE_INSTALL_LIBDIR}"
+ NO_DEFAULT_PATH)
+ find_library(decode_lib "brotlidec"
+ PATHS "${BROTLI_ROOT}"
+ PATH_SUFFIXES "lib" "${CMAKE_INSTALL_LIBDIR}"
+ NO_DEFAULT_PATH)
+ find_library(encode_lib "brotlienc"
+ PATHS "${BROTLI_ROOT}"
+ PATH_SUFFIXES "lib" "${CMAKE_INSTALL_LIBDIR}"
+ NO_DEFAULT_PATH)
+ else()
+ find_path(includes "decode.h"
+ PATH_SUFFIXES
+ "include/brotli"
+ "${CMAKE_INSTALL_INCLUDEDIR}/brotli}")
+ get_filename_component(includes "${includes}" DIRECTORY)
+ find_library(common_lib "brotlicommon")
+ find_library(decode_lib "brotlidec")
+ find_library(encode_lib "brotlienc")
+ endif()
+ set(BROTLI_INCLUDES "${includes}" PARENT_SCOPE)
+ set(BROTLI_COMMON_LIBRARY "${common_lib}" PARENT_SCOPE)
+ set(BROTLI_DECODE_LIBRARY "${decode_lib}" PARENT_SCOPE)
+ set(BROTLI_ENCODE_LIBRARY "${encode_lib}" PARENT_SCOPE)
+endfunction(_get_brotli_includes_libs)
+
+_get_brotli_version()
+_get_brotli_includes_libs()
+if(NOT EXISTS "${BROTLI_INCLUDES}/brotli/decode.h"
+ OR NOT EXISTS "${BROTLI_INCLUDES}/brotli/encode.h"
+ OR NOT EXISTS "${BROTLI_INCLUDES}/brotli/types.h")
+ message(STATUS "Could NOT find Brotli (missing headers)")
+else()
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(BROTLI
+ REQUIRED_VARS BROTLI_COMMON_LIBRARY
+ BROTLI_DECODE_LIBRARY
+ BROTLI_ENCODE_LIBRARY
+ BROTLI_INCLUDES
+ VERSION_VAR BROTLI_VERSION)
+ if(BROTLI_FOUND)
+ add_library(BROTLI::COMMON UNKNOWN IMPORTED)
+ set_target_properties(BROTLI::COMMON PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDES}"
+ IMPORTED_LOCATION "${BROTLI_COMMON_LIBRARY}")
+
+ add_library(BROTLI::DECODE UNKNOWN IMPORTED)
+ set_target_properties(BROTLI::DECODE PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDES}"
+ INTERFACE_LINK_LIBRARIES BROTLI::COMMON
+ IMPORTED_LOCATION "${BROTLI_DECODE_LIBRARY}")
+
+ add_library(BROTLI::ENCODE UNKNOWN IMPORTED)
+ set_target_properties(BROTLI::ENCODE PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDES}"
+ INTERFACE_LINK_LIBRARIES BROTLI::COMMON
+ IMPORTED_LOCATION "${BROTLI_ENCODE_LIBRARY}")
+ endif()
+endif()