# # Try to find libcrypto. # # # 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 # 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() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(CRYPTO DEFAULT_MSG CRYPTO_INCLUDE_DIRS CRYPTO_LIBRARIES ) mark_as_advanced( CRYPTO_INCLUDE_DIRS CRYPTO_LIBRARIES )