diff options
Diffstat (limited to '')
-rw-r--r-- | cmake/Modules/FindCRYPTO.cmake | 185 | ||||
-rw-r--r-- | cmakeconfig.h.in | 14 |
2 files changed, 181 insertions, 18 deletions
diff --git a/cmake/Modules/FindCRYPTO.cmake b/cmake/Modules/FindCRYPTO.cmake index 453c651..25846f3 100644 --- a/cmake/Modules/FindCRYPTO.cmake +++ b/cmake/Modules/FindCRYPTO.cmake @@ -2,23 +2,186 @@ # Try to find libcrypto. # -# Try to find the header -find_path(CRYPTO_INCLUDE_DIR openssl/crypto.h) +# +# 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) -# Try to find the library -find_library(CRYPTO_LIBRARY crypto) + # + # 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() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(CRYPTO DEFAULT_MSG - CRYPTO_INCLUDE_DIR - CRYPTO_LIBRARY + CRYPTO_INCLUDE_DIRS + CRYPTO_LIBRARIES ) mark_as_advanced( - CRYPTO_INCLUDE_DIR - CRYPTO_LIBRARY + CRYPTO_INCLUDE_DIRS + CRYPTO_LIBRARIES ) - -set(CRYPTO_INCLUDE_DIRS ${CRYPTO_INCLUDE_DIR}) -set(CRYPTO_LIBRARIES ${CRYPTO_LIBRARY}) diff --git a/cmakeconfig.h.in b/cmakeconfig.h.in index 02a4a35..0bd1e96 100644 --- a/cmakeconfig.h.in +++ b/cmakeconfig.h.in @@ -39,9 +39,6 @@ /* Define to 1 if you have the `EVP_DecryptInit_ex' function. */ #cmakedefine HAVE_EVP_DECRYPTINIT_EX 1 -/* Define to 1 if you have the <fcntl.h> header file. */ -#cmakedefine HAVE_FCNTL_H 1 - /* Define to 1 if you have the `fork' function. */ #cmakedefine HAVE_FORK 1 @@ -60,7 +57,7 @@ /* Define to 1 if you have the `cap-ng' library (-lcap-ng). */ #cmakedefine HAVE_LIBCAP_NG 1 -/* Define to 1 if you have the `crypto' library (-lcrypto). */ +/* Define to 1 if you have a usable `crypto' library (-lcrypto). */ #cmakedefine HAVE_LIBCRYPTO 1 /* Define to 1 if you have the `rpc' library (-lrpc). */ @@ -75,9 +72,6 @@ /* Define to 1 if you have the `openat' function. */ #cmakedefine HAVE_OPENAT 1 -/* Define to 1 if you have the <openssl/evp.h> header file. */ -#cmakedefine HAVE_OPENSSL_EVP_H 1 - /* define if the OS provides AF_INET6 and struct in6_addr */ #cmakedefine HAVE_OS_IPV6_SUPPORT 1 @@ -246,6 +240,12 @@ /* Define to the version of this package. */ #cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@" +/* The size of `time_t', as computed by sizeof. */ +#cmakedefine SIZEOF_TIME_T @SIZEOF_TIME_T@ + +/* The size of `void *', as computed by sizeof. */ +#cmakedefine SIZEOF_VOID_P @SIZEOF_VOID_P@ + /* Define to 1 if you have the ANSI C header files. */ #cmakedefine STDC_HEADERS 1 |