#
# Were we told where to look for libcrypto?
#
if(NOT CRYPTO_ROOT)
#
# No.
#
# First, try looking for it with pkg-config, if we have it.
#
find_package(PkgConfig)
#
# Homebrew's pkg-config does not, by default, look for
# pkg-config files for packages it has installed.
# Furthermore, at least for OpenSSL, they appear to be
# dumped in package-specific directories whose paths are
# not only package-specific but package-version-specific.
#
# So the only way to find openssl is to get the value of
# PKG_CONFIG_PATH from "brew --env openssl" and add that
# to PKG_CONFIG_PATH. (No, we can't just assume it's under
# /usr/local; Homebrew have conveniently chosen to put it
# under /opt/homebrew on ARM.)
#
# That's the nice thing about Homebrew - it makes things easier!
# Thanks!
#
find_program(BREW brew)
if(BREW)
#
# We have Homebrew.
# Get the pkg-config directory for openssl.
#
execute_process(COMMAND "${BREW}" "--env" "--plain" "openssl"
RESULT_VARIABLE BREW_RESULT
OUTPUT_VARIABLE BREW_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(BREW_RESULT EQUAL 0)
#
# brew --env --plain openssl succeeded.
# Split its output into a list, one entry per line.
#
string(REGEX MATCHALL "[^\n\r]+" BREW_OUTPUT_LINES "${BREW_OUTPUT}")
#
# Find the line that begins with "PKG_CONFIG_PATH: ", and extract
# the path following that.
#
foreach(LINE IN LISTS BREW_OUTPUT_LINES)
if(LINE MATCHES "PKG_CONFIG_PATH: \(.*\)")
string(REGEX REPLACE "PKG_CONFIG_PATH: \(.*\)"
"\\1" OPENSSL_PKGCONFIG_DIR
${LINE})
endif()
endforeach()
endif()
endif()
#
# Save the current value of the PKG_CONFIG_PATH environment
# variable.
#
set(SAVE_PKG_CONFIG_PATH $ENV{PKG_CONFIG_PATH})
#
# If we got an additional pkg-config directory from Homebrew, add
# it to the PKG_CONFIG_PATH environment variable.
#
if(OPENSSL_PKGCONFIG_DIR)
set(ENV{PKG_CONFIG_PATH} "${OPENSSL_PKGCONFIG_DIR}:$ENV{PKG_CONFIG_PATH}")
endif()
#
# Use pkg-config to find libcrypto.
#
pkg_check_modules(CRYPTO libcrypto)
#
# Revert the change to PKG_CONFIG_PATH.
#
set(ENV{PKG_CONFIG_PATH} "${SAVE_PKG_CONFIG_PATH}")
#
# Did pkg-config find it?
#
if(CRYPTO_FOUND)
#
# This "helpfully" supplies CRYPTO_LIBRARIES as a bunch of
# library names - not paths - and CRYPTO_LIBRARY_DIRS as
# a bunch of directories.
#
# CMake *really* doesn't like the notion of specifying "here are
# the directories in which to look for libraries" except in
# find_library() calls; it *really* prefers using full paths to
# library files, rather than library names.
#
# Find the libraries and add their full paths.
#
set(CRYPTO_LIBRARY_FULLPATHS)
foreach(_lib IN LISTS CRYPTO_LIBRARIES)
#
# Try to find this library, so we get its full path.
#
find_library(_libfullpath ${_lib} HINTS ${CRYPTO_LIBRARY_DIRS})
list(APPEND CRYPTO_LIBRARY_FULLPATHS ${_libfullpath})
endforeach()
set(CRYPTO_LIBRARIES "${CRYPTO_LIBRARY_FULLPATHS}")
else()
#
# No. If we have Homebrew installed, see if it's in Homebrew.
#
if(BREW)
#
# The brew man page lies when it speaks of
# $BREW --prefix --installed <formula>
# outputting nothing. In Homebrew 3.3.16,
# it produces output regardless of whether
# the formula is installed or not, so we
# send the standard output and error to
# the bit bucket.
#
# libcrypto isn't a formula, openssl is a formula.
#
execute_process(COMMAND "${BREW}" "--prefix" "--installed" "openssl"
RESULT_VARIABLE BREW_RESULT
OUTPUT_QUIET
)
if(BREW_RESULT EQUAL 0)
#
# Yes. Get the include directory and library
# directory. (No, we can't just assume it's
# under /usr/local; Homebrew have conveniently
# chosen to put it under /opt/homebrew on ARM.)
#
execute_process(COMMAND "${BREW}" "--prefix" "openssl"
RESULT_VARIABLE BREW_RESULT
OUTPUT_VARIABLE OPENSSL_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(CRYPTO_INCLUDE_DIRS "${OPENSSL_PATH}/include")
#
# Search for the libcrypto library under lib.
#
find_library(CRYPTO_LIBRARIES crypto
PATHS "${OPENSSL_PATH}/lib"
NO_DEFAULT_PATH)
endif()
endif()
endif()
endif()
#
# Have we found it with pkg-config or Homebrew?
#
if(NOT CRYPTO_INCLUDE_DIRS)
#
# No.
# Try to find the openss/evp.h header.
# We search for that header to make sure that it's installed (if
# it's just a shared library for the benefit of existing
# programs, that's not useful).
#
find_path(CRYPTO_INCLUDE_DIRS openssl/evp.h)
#
# Try to find the library.
#
find_library(CRYPTO_LIBRARIES crypto)
endif()