summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cmake/Modules/FindCRYPTO.cmake185
-rw-r--r--cmakeconfig.h.in14
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