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()


Reply via email to