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