Author: brane
Date: Mon May 26 06:59:13 2025
New Revision: 1925805

URL: http://svn.apache.org/viewvc?rev=1925805&view=rev
Log:
In the CMake build, simplify building on macOS with Homebrew or MacPorts.

* CMakeLists.txt: On macOS only, search for Homebrew xor MacPorts packages.
  (APR_ROOT, APRUtil_ROOT, OPENSSL_ROOT_DIR, ZLIB_ROOT): Declare these options.
  (BROTLI_ROOT): Rename from option BROTLI.
  (GSSAPI_ROOT): Rename from option GSSAPI.
  (USE_HOMEBREW, USE_MACPORTS): New, platform-specific options.

* build/SerfMacOS.cmake: New file with helper functions to find MacPorts
   and Homebrew packages.

* build/FindAPR.cmake,
  build/FindAPRUtil.cmake: Use the linker flags returned from the config
   script in the target interface attributes. MacPorts build fails without
   that, as some libraries are squirreled away in subdirectories of '.../lib'.

Added:
    serf/trunk/build/SerfMacOS.cmake
Modified:
    serf/trunk/CMakeLists.txt
    serf/trunk/build/FindAPR.cmake
    serf/trunk/build/FindAPRUtil.cmake

Modified: serf/trunk/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/serf/trunk/CMakeLists.txt?rev=1925805&r1=1925804&r2=1925805&view=diff
==============================================================================
--- serf/trunk/CMakeLists.txt (original)
+++ serf/trunk/CMakeLists.txt Mon May 26 06:59:13 2025
@@ -26,6 +26,8 @@
 # APRUtil_ROOT      - Path to APR-Util's install area
 # OPENSSL_ROOT_DIR  - Path to OpenSSL's install area
 # ZLIB_ROOT         - Path to zlib's install area
+# BROTLI_ROOT       - Path to Brotli's install area
+# GSSAPI_ROOT       - Path to GSSAPI's install area
 # ===================================================================
 
 cmake_minimum_required(VERSION 3.12)
@@ -47,13 +49,19 @@ message(WARNING
         "has not been tested on many supported platforms.")
 
 
+# Build dependencies
+option(APR_ROOT:PATH "Path to APR's install area" "")
+option(APRUtil_ROOT:PATH "Path to APR-Util's install area" "")
+option(OPENSSL_ROOT_DIR:PATH "Path to OpenSSL's install area" "")
+option(ZLIB_ROOT:PATH "Path to zlib's install area" "")
+option(BROTLI_ROOT:PATH "Path to GSSAPI's install area" "")
+option(GSSAPI_ROOT:PATH "Path to GSSAPI's install area" "")
+
 # Build options
 option(DEBUG "Enable debugging info and strict compile warnings" OFF)
 option(SKIP_SHARED "Disable building shared Serf libraries" OFF)
 option(SKIP_STATIC "Disable building static Serf libraries" OFF)
 option(LIBDIR "Install directory for architecture-dependent libraries" "")
-option(GSSAPI "Path to GSSAPI's install area" "")
-option(BROTLI "Path to Brotli's install area" "")
 option(DISABLE_LOGGING "Disable the logging framework at compile time" OFF)
 option(SKIP_TESTS "Disable building the unit tests and utilities" OFF)
 option(ENABLE_SLOW_TESTS "Enable long-running unit tests" OFF)
@@ -62,11 +70,17 @@ option(ENABLE_SLOW_TESTS "Enable long-ru
 option(APR_STATIC "Windows: Link with static APR/-Util libraries" OFF)
 option(EXPAT "Windows: optional path to Expat's install area for APR_STATIC" 
"")
 option(RELATIVE_RPATH "macOS: Use @rpath in installed shared library" OFF)
+option(USE_HOMEBREW "macOS: Use dependencies from Homebrew" OFF)
+option(USE_MACPORTS "macOS: Use dependencies from MacPorts" OFF)
 
 if(SKIP_SHARED AND SKIP_STATIC)
   message(FATAL_ERROR "You have disabled both shared and static library 
builds.")
 endif()
 
+if(USE_HOMEBREW AND USE_MACPORTS)
+  message(FATAL_ERROR "You requested both Homebrew and McPorts dependencies.")
+endif()
+
 # Initialize the build type if it was not set on the command line.
 if(NOT CMAKE_BUILD_TYPE)
   if(DEBUG)
@@ -79,6 +93,20 @@ endif()
 include(SerfPlatform)
 include(SerfWindowsToolkit)
 
+# On the Mac: Use dependencies from Homebrew or MacPorts
+if(USE_HOMEBREW OR USE_MACPORTS)
+  if(SERF_DARWIN)
+    include(SerfMacOS)
+    serf_macos_find_packages()
+  else()
+    if(USE_HOMEBREW)
+      message(WARNING "option USE_HOMEBREW is not implemented on this 
platform")
+    endif()
+    if(USE_MACPORTS)
+      message(WARNING "option USE_MACPORTS is not implemented on this 
platform")
+    endif()
+  endif(SERF_DARWIN)
+endif(USE_HOMEBREW OR USE_MACPORTS)
 
 # Public headers
 list(APPEND HEADERS
@@ -178,12 +206,12 @@ endif(SERF_WINDOWS)
 
 
 # Process build options for dependency search
-if(GSSAPI)
-  message(WARNING "option GSSAPI is not implemented")
+if(BROTLI_ROOT)
+  message(WARNING "option BROTLI_ROOT is not implemented")
 endif()
 
-if(BROTLI)
-  message(WARNING "option BROTLI is not implemented")
+if(GSSAPI_ROOT)
+  message(WARNING "option GSSAPI_ROOT is not implemented")
 endif()
 
 if(SERF_WINDOWS)

Modified: serf/trunk/build/FindAPR.cmake
URL: 
http://svn.apache.org/viewvc/serf/trunk/build/FindAPR.cmake?rev=1925805&r1=1925804&r2=1925805&view=diff
==============================================================================
--- serf/trunk/build/FindAPR.cmake (original)
+++ serf/trunk/build/FindAPR.cmake Mon May 26 06:59:13 2025
@@ -216,6 +216,7 @@ if(NOT _apru_include_only_utilities)
 
     _apr_invoke(APR_CFLAGS     "(^| )-(g|O)[^ ]*" --cppflags --cflags)
     _apr_invoke(APR_INCLUDES   "(^| )-I"          --includes)
+    _apr_invoke(APR_LDFLAGS    ""                 --ldflags)
     _apr_invoke(APR_LIBRARIES  ""                 --link-ld)
     _apr_invoke(APR_EXTRALIBS  ""                 --libs)
     _apr_invoke(APR_VERSION    ""                 --version)
@@ -260,7 +261,7 @@ if(NOT _apru_include_only_utilities)
       add_library(APR::APR UNKNOWN IMPORTED)
       set_target_properties(APR::APR PROPERTIES
         INTERFACE_INCLUDE_DIRECTORIES "${APR_INCLUDES}"
-        INTERFACE_LINK_LIBRARIES "${APR_EXTRALIBS};${_apr_extra}"
+        INTERFACE_LINK_LIBRARIES 
"${APR_LDFLAGS};${APR_EXTRALIBS};${_apr_extra}"
         IMPORTED_LOCATION "${_apr_library}")
 
     endif()   # NOT Windows

Modified: serf/trunk/build/FindAPRUtil.cmake
URL: 
http://svn.apache.org/viewvc/serf/trunk/build/FindAPRUtil.cmake?rev=1925805&r1=1925804&r2=1925805&view=diff
==============================================================================
--- serf/trunk/build/FindAPRUtil.cmake (original)
+++ serf/trunk/build/FindAPRUtil.cmake Mon May 26 06:59:13 2025
@@ -189,7 +189,7 @@ else(APR_CONTAINS_APRUTIL)
         INTERFACE_INCLUDE_DIRECTORIES "${APRUTIL_INCLUDES}"
         IMPORTED_LOCATION "${_apu_library}")
       target_link_libraries(APR::APRUTIL
-          INTERFACE ${APRUTIL_EXTRALIBS};${_apu_extra})
+          INTERFACE ${APRUTIL_LDFLAGS};${APRUTIL_EXTRALIBS};${_apu_extra})
     endif()   # NOT Windows
   endif(APRUTIL_FOUND)
 

Added: serf/trunk/build/SerfMacOS.cmake
URL: 
http://svn.apache.org/viewvc/serf/trunk/build/SerfMacOS.cmake?rev=1925805&view=auto
==============================================================================
--- serf/trunk/build/SerfMacOS.cmake (added)
+++ serf/trunk/build/SerfMacOS.cmake Mon May 26 06:59:13 2025
@@ -0,0 +1,150 @@
+# ===================================================================
+#   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)
+
+# macOS: Find packages installed in Homebrew or MacPorts.
+
+macro(serf_macos__check_package_manager_)
+  if(USE_HOMEBREW)
+    serf_macos__check_homebrew_()
+  endif()
+  if(USE_MACPORTS)
+    serf_macos__check_macports_()
+  endif()
+endmacro(serf_macos__check_package_manager_)
+
+macro(serf_macos__find_package_ package variable docstring)
+  if(USE_HOMEBREW)
+    serf_macos__find_homebrew_package_("${package}" "${variable}" 
"${docstring}")
+  endif()
+  if(USE_MACPORTS)
+    serf_macos__find_macports_package_("${package}" "${variable}" 
"${docstring}")
+  endif()
+endmacro(serf_macos__find_package_)
+
+function(serf_macos_find_packages)
+  serf_macos__check_package_manager_()
+  serf_macos__find_package_("apr" APR_ROOT "Path to APR's install area")
+  serf_macos__find_package_("apr-util" APRUtil_ROOT "Path to APR-Util's 
install area")
+  serf_macos__find_package_("openssl" OPENSSL_ROOT_DIR "Path to OpenSSL's 
install area")
+  if(USE_MACPORTS)
+    # NOTE: MacPorts uses its own version of zlib. Homebrew tends to use
+    #       the system zlib, so we won't even look for the Homebrew version.
+    #       The user can always override that on the command line.
+    serf_macos__find_package_("zlib" ZLIB_ROOT "Path to zlib's install area")
+  endif()
+  serf_macos__find_package_("brotli" BROTLI_ROOT "Path to GSSAPI's install 
area")
+  serf_macos__find_package_("gssapi" GSSAPI_ROOT "Path to GSSAPI's install 
area")
+endfunction()
+
+#
+# Homebrew
+#
+function(serf_macos__check_homebrew_)
+  if(NOT DEFINED SERF_MACOS__HAS_HOMEBREW_)
+    execute_process(COMMAND "brew" "--version"
+                    ERROR_VARIABLE shutup
+                    OUTPUT_VARIABLE version
+                    RESULT_VARIABLE failed)
+    if(NOT failed)
+      execute_process(COMMAND "brew" "--prefix"
+                      ERROR_VARIABLE shutup
+                      OUTPUT_VARIABLE prefix
+                      RESULT_VARIABLE failed)
+    endif()
+    if(failed)
+      set(SERF_MACOS__HAS_HOMEBREW_ FALSE PARENT_SCOPE)
+      message(WARNING "Homebrew was not found")
+    else()
+      string(STRIP "${version}" version)
+      string(STRIP "${prefix}" prefix)
+      message(STATUS "Found ${version} at ${prefix}")
+      set(SERF_MACOS__HAS_HOMEBREW_ TRUE PARENT_SCOPE)
+    endif()
+  endif()
+endfunction(serf_macos__check_homebrew_)
+
+function(serf_macos__find_homebrew_package_ package variable docstring)
+  # Don't override user's provided values.
+  if("${${variable}}" STREQUAL "" AND ${SERF_MACOS__HAS_HOMEBREW_})
+    execute_process(COMMAND "brew" "--prefix" "--installed" "${package}"
+                    ERROR_VARIABLE shutup
+                    OUTPUT_VARIABLE prefix
+                    RESULT_VARIABLE failed)
+    if(failed)
+      message(STATUS "Homebrew: not found: ${package}")
+    else()
+      string(STRIP "${prefix}" prefix)
+      message(STATUS "Homebrew: found ${package} at ${prefix}")
+      set(${variable} "${prefix}" CACHE PATH "${docstring}" FORCE)
+    endif()
+  endif()
+endfunction(serf_macos__find_homebrew_package_)
+
+#
+# MacPorts
+#
+function(serf_macos__check_macports_)
+  if(NOT DEFINED SERF_MACOS__HAS_MACPORTS_)
+    execute_process(COMMAND "port" "version"
+                    ERROR_VARIABLE shutup
+                    OUTPUT_VARIABLE version
+                    RESULT_VARIABLE failed)
+    if(NOT failed)
+      execute_process(COMMAND "which" "port"
+                      ERROR_VARIABLE shutup
+                      OUTPUT_VARIABLE prefix
+                      RESULT_VARIABLE failed)
+    endif()
+    if(failed)
+      set(SERF_MACOS__HAS_MACPORTS_ FALSE PARENT_SCOPE)
+      message(WARNING "MacPorts was not found")
+    else()
+      string(REPLACE "Version:" "" version "${version}")
+      string(STRIP "${version}" version)
+      cmake_path(SET prefix_path NORMALIZE ${prefix})
+      cmake_path(GET prefix_path PARENT_PATH prefix_path)
+      cmake_path(GET prefix_path PARENT_PATH prefix_path)
+      cmake_path(NATIVE_PATH prefix_path prefix)
+      message(STATUS "Found MacPorts ${version} at ${prefix}")
+      set(SERF_MACOS__HAS_MACPORTS_ TRUE PARENT_SCOPE)
+      set(SERF_MACOS__MACPORTS_ROOT_ "${prefix}" PARENT_SCOPE)
+    endif()
+  endif()
+endfunction(serf_macos__check_macports_)
+
+function(serf_macos__find_macports_package_ package variable docstring)
+  # Don't override user's provided values.
+  if("${${variable}}" STREQUAL "" AND ${SERF_MACOS__HAS_MACPORTS_})
+    ##!message(WARNING "MacPorts dependencies are not implemented 
(${package})")
+    execute_process(COMMAND "port" "echo" "active" "and" "name:^${package}$"
+                    ERROR_VARIABLE shutup
+                    OUTPUT_VARIABLE output
+                    RESULT_VARIABLE failed)
+    if(failed OR "${output}" STREQUAL "")
+      message(STATUS "MacPorts: not found: ${package}")
+    else()
+      # TODO: Invoke "port contents ${package}" and calculate the common
+      #       prefix of the installed files instead?
+      message(STATUS "MacPorts: found ${package} at 
${SERF_MACOS__MACPORTS_ROOT_}")
+      set(${variable} "${SERF_MACOS__MACPORTS_ROOT_}" CACHE PATH 
"${docstring}" FORCE)
+    endif()
+  endif()
+endfunction(serf_macos__find_macports_package_)


Reply via email to