@@ -31,29 +31,49 @@ if (TARGET crypto OR TARGET AWS::crypto)
3131 set (CRYPTO_FOUND true )
3232 set (crypto_FOUND true )
3333else ()
34- find_path (crypto_INCLUDE_DIR
35- NAMES openssl/crypto.h
36- HINTS
37- " ${CMAKE_PREFIX_PATH} "
38- " ${CMAKE_INSTALL_PREFIX} "
39- PATH_SUFFIXES include
40- )
34+ if ( NOT BUILD_SHARED_LIBS AND NOT S2N_USE_CRYPTO_SHARED_LIBS)
35+ set (OPENSSL_USE_STATIC_LIBS TRUE )
36+ endif ()
37+ find_package (OpenSSL COMPONENTS Crypto QUIET )
38+ if (OpenSSL_FOUND)
39+ set (crypto_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR} )
40+ set (crypto_LIBRARY ${OPENSSL_CRYPTO_LIBRARY} )
4141
42- find_library (crypto_SHARED_LIBRARY
43- NAMES libcrypto.so libcrypto.dylib
44- HINTS
45- "${CMAKE_PREFIX_PATH} "
46- "${CMAKE_INSTALL_PREFIX} "
47- PATH_SUFFIXES build /crypto build lib64 lib
48- )
42+ # CMakeLists.txt expects the crypto_SHARED_LIBRARY/crypto_STATIC_LIBRARY variables to be
43+ # set. However, the FindOpenSSL module doesn't set separate variables depending on whether
44+ # the artifact is shared or static. And, the TYPE property isn't set on the OpenSSL::Crypto
45+ # target, so we can't use `get_target_property()` to determine this. Instead, we check for
46+ # a ".a" suffix in the artifact path.
47+ if ("${crypto_LIBRARY} " MATCHES "\\ .a$" )
48+ set (crypto_STATIC_LIBRARY "${crypto_LIBRARY} " )
49+ else ()
50+ set (crypto_SHARED_LIBRARY "${crypto_LIBRARY} " )
51+ endif ()
52+ else ()
53+ find_path (crypto_INCLUDE_DIR
54+ NAMES openssl/crypto.h
55+ HINTS
56+ "${CMAKE_PREFIX_PATH} "
57+ "${CMAKE_INSTALL_PREFIX} "
58+ PATH_SUFFIXES include
59+ )
4960
50- find_library (crypto_STATIC_LIBRARY
51- NAMES libcrypto.a
52- HINTS
53- "${CMAKE_PREFIX_PATH} "
54- "${CMAKE_INSTALL_PREFIX} "
55- PATH_SUFFIXES build /crypto build lib64 lib
56- )
61+ find_library (crypto_SHARED_LIBRARY
62+ NAMES libcrypto.so libcrypto.dylib
63+ HINTS
64+ "${CMAKE_PREFIX_PATH} "
65+ "${CMAKE_INSTALL_PREFIX} "
66+ PATH_SUFFIXES build /crypto build lib64 lib
67+ )
68+
69+ find_library (crypto_STATIC_LIBRARY
70+ NAMES libcrypto.a
71+ HINTS
72+ "${CMAKE_PREFIX_PATH} "
73+ "${CMAKE_INSTALL_PREFIX} "
74+ PATH_SUFFIXES build /crypto build lib64 lib
75+ )
76+ endif ()
5777
5878 if (NOT crypto_LIBRARY)
5979 if (BUILD_SHARED_LIBS OR S2N_USE_CRYPTO_SHARED_LIBS)
@@ -92,6 +112,12 @@ else()
92112 set (CRYPTO_FOUND true )
93113 set (crypto_FOUND true )
94114
115+ if (TARGET OpenSSL::Crypto)
116+ message (STATUS "libcrypto discovered by the FindOpenSSL module" )
117+ else ()
118+ message (STATUS "libcrypto discovered by the s2n-tls Findcrypto module" )
119+ endif ()
120+
95121 message (STATUS "LibCrypto Include Dir: ${crypto_INCLUDE_DIR} " )
96122 message (STATUS "LibCrypto Shared Lib: ${crypto_SHARED_LIBRARY} " )
97123 message (STATUS "LibCrypto Static Lib: ${crypto_STATIC_LIBRARY} " )
@@ -107,6 +133,19 @@ else()
107133 IMPORTED_LINK_INTERFACE_LANGUAGES "C"
108134 IMPORTED_LOCATION "${crypto_LIBRARY} " )
109135 add_dependencies (AWS::crypto Threads::Threads)
136+
137+ if (TARGET OpenSSL::Crypto)
138+ # The discovered libcrypto may have been configured with additional dependencies
139+ # such as zlib. If any dependencies were discovered by the FindOpenSSL module, add
140+ # them to the AWS::crypto target.
141+ get_target_property (OpenSSL_LINK_LIBRARIES OpenSSL::Crypto
142+ INTERFACE_LINK_LIBRARIES)
143+ if (OpenSSL_LINK_LIBRARIES)
144+ foreach (link_library ${OpenSSL_LINK_LIBRARIES} )
145+ target_link_libraries (AWS::crypto INTERFACE ${link_library} )
146+ endforeach ()
147+ endif ()
148+ endif ()
110149 endif ()
111150 endif ()
112151
0 commit comments