Skip to content

Commit

Permalink
Support in-source build with AWS-LC. (#82)
Browse files Browse the repository at this point in the history
  • Loading branch information
wps132230 committed May 27, 2021
1 parent 8eb3708 commit f3a4993
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 77 deletions.
23 changes: 17 additions & 6 deletions CMakeLists.txt
Expand Up @@ -83,17 +83,28 @@ else ()
file(GLOB AWS_CAL_OS_SRC
"source/unix/*.c"
)
if (USE_OPENSSL)
if (USE_OPENSSL AND NOT ANDROID)
find_package(OpenSSL REQUIRED)
set(PLATFORM_LIBS OpenSSL::Crypto dl)
set(CRYPTO_INCLUDE_DIR OPENSSL_INCLUDE_DIR)
find_package(Threads REQUIRED)
add_library(crypto UNKNOWN IMPORTED)
set_target_properties(crypto PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
set_target_properties(crypto PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}")
add_dependencies(crypto Threads::Threads)
message(STATUS "Using libcrypto from system: ${OPENSSL_CRYPTO_LIBRARY}")
elseif(NOT USE_OPENSSL AND IN_SOURCE_BUILD)
if (TARGET crypto)
message(STATUS "Using libcrypto from AWS-LC")
else()
message(FATAL_ERROR "Target crypto is not defined, failed to find libcrypto.")
endif()
else()
find_package(LibCrypto REQUIRED)
set(PLATFORM_LIBS LibCrypto::Crypto dl)
set(CRYPTO_INCLUDE_DIR LibCrypto_INCLUDE_DIR)
message(STATUS "Using automatic libcrypto: ${LibCrypto_LIBRARY}")
endif()
set(PLATFORM_LIBS crypto dl)
endif()
endif()

Expand All @@ -117,7 +128,7 @@ target_link_libraries(${PROJECT_NAME} PUBLIC ${DEP_AWS_LIBS} ${PLATFORM_LIBS})
if (BYO_CRYPTO)
target_compile_definitions(${PROJECT_NAME} PRIVATE -DBYO_CRYPTO)
elseif (NOT WIN32 AND NOT APPLE)
target_include_directories(${PROJECT_NAME} PRIVATE ${CRYPTO_INCLUDE_DIR})
target_include_directories(${PROJECT_NAME} PRIVATE $<TARGET_PROPERTY:crypto,INTERFACE_INCLUDE_DIRECTORIES>)
endif()

# Our ABI is not yet stable
Expand Down
154 changes: 83 additions & 71 deletions cmake/modules/FindLibCrypto.cmake
Expand Up @@ -15,83 +15,95 @@
# LibCrypto_SHARED_LIBRARY The path to libcrypto.so
# LibCrypto_STATIC_LIBRARY The path to libcrypto.a

find_path(LibCrypto_INCLUDE_DIR
NAMES openssl/crypto.h
HINTS
${CMAKE_PREFIX_PATH}/include
${CMAKE_INSTALL_PREFIX}/include
)
find_library(LibCrypto_SHARED_LIBRARY
NAMES libcrypto.so libcrypto.dylib
HINTS
${CMAKE_PREFIX_PATH}/build/crypto
${CMAKE_PREFIX_PATH}/build
${CMAKE_PREFIX_PATH}
${CMAKE_PREFIX_PATH}/lib64
${CMAKE_PREFIX_PATH}/lib
${CMAKE_INSTALL_PREFIX}/build/crypto
${CMAKE_INSTALL_PREFIX}/build
${CMAKE_INSTALL_PREFIX}
${CMAKE_INSTALL_PREFIX}/lib64
${CMAKE_INSTALL_PREFIX}/lib
)
find_library(LibCrypto_STATIC_LIBRARY
NAMES libcrypto.a
HINTS
${CMAKE_PREFIX_PATH}/build/crypto
${CMAKE_PREFIX_PATH}/build
${CMAKE_PREFIX_PATH}
${CMAKE_PREFIX_PATH}/lib64
${CMAKE_PREFIX_PATH}/lib
${CMAKE_INSTALL_PREFIX}/build/crypto
${CMAKE_INSTALL_PREFIX}/build
${CMAKE_INSTALL_PREFIX}
${CMAKE_INSTALL_PREFIX}/lib64
${CMAKE_INSTALL_PREFIX}/lib
)
find_package(crypto QUIET)

if (BUILD_SHARED_LIBS)
set(LibCrypto_LIBRARY ${LibCrypto_SHARED_LIBRARY})
if (crypto_FOUND)
get_target_property(crypto_INCLUDE_DIR crypto INTERFACE_INCLUDE_DIRECTORIES)
message(STATUS "aws-c-cal found target: crypto")
message(STATUS "crypto Include Dir: ${crypto_INCLUDE_DIR}")
# some versions of cmake have a super esoteric bug around capitalization differences between
# find dependency and find package, just avoid that here by setting both.
set(LIBCRYPTO_FOUND true)
set(LibCrypto_FOUND true)
else()
set(LibCrypto_LIBRARY ${LibCrypto_STATIC_LIBRARY})
endif()

find_path(LibCrypto_INCLUDE_DIR
NAMES openssl/crypto.h
HINTS
${CMAKE_PREFIX_PATH}/include
${CMAKE_INSTALL_PREFIX}/include
)
find_library(LibCrypto_SHARED_LIBRARY
NAMES libcrypto.so libcrypto.dylib
HINTS
${CMAKE_PREFIX_PATH}/build/crypto
${CMAKE_PREFIX_PATH}/build
${CMAKE_PREFIX_PATH}
${CMAKE_PREFIX_PATH}/lib64
${CMAKE_PREFIX_PATH}/lib
${CMAKE_INSTALL_PREFIX}/build/crypto
${CMAKE_INSTALL_PREFIX}/build
${CMAKE_INSTALL_PREFIX}
${CMAKE_INSTALL_PREFIX}/lib64
${CMAKE_INSTALL_PREFIX}/lib
)
find_library(LibCrypto_STATIC_LIBRARY
NAMES libcrypto.a
HINTS
${CMAKE_PREFIX_PATH}/build/crypto
${CMAKE_PREFIX_PATH}/build
${CMAKE_PREFIX_PATH}
${CMAKE_PREFIX_PATH}/lib64
${CMAKE_PREFIX_PATH}/lib
${CMAKE_INSTALL_PREFIX}/build/crypto
${CMAKE_INSTALL_PREFIX}/build
${CMAKE_INSTALL_PREFIX}
${CMAKE_INSTALL_PREFIX}/lib64
${CMAKE_INSTALL_PREFIX}/lib
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LibCrypto DEFAULT_MSG
LibCrypto_LIBRARY
LibCrypto_INCLUDE_DIR
)
if (BUILD_SHARED_LIBS)
set(LibCrypto_LIBRARY ${LibCrypto_SHARED_LIBRARY})
else()
set(LibCrypto_LIBRARY ${LibCrypto_STATIC_LIBRARY})
endif()

mark_as_advanced(
LibCrypto_ROOT_DIR
LibCrypto_INCLUDE_DIR
LibCrypto_LIBRARY
LibCrypto_SHARED_LIBRARY
LibCrypto_STATIC_LIBRARY
)

# some versions of cmake have a super esoteric bug around capitalization differences between
# find dependency and find package, just avoid that here by checking and
# setting both.
if(LibCrypto_FOUND OR LIBCRYPTO_FOUND)
set(LibCrypto_FOUND true)
set(LIBCRYPTO_FOUND true)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LibCrypto DEFAULT_MSG
LibCrypto_LIBRARY
LibCrypto_INCLUDE_DIR
)

message(STATUS "LibCrypto Include Dir: ${LibCrypto_INCLUDE_DIR}")
message(STATUS "LibCrypto Shared Lib: ${LibCrypto_SHARED_LIBRARY}")
message(STATUS "LibCrypto Static Lib: ${LibCrypto_STATIC_LIBRARY}")
if (NOT TARGET LibCrypto::Crypto AND
(EXISTS "${LibCrypto_LIBRARY}")
mark_as_advanced(
LibCrypto_ROOT_DIR
LibCrypto_INCLUDE_DIR
LibCrypto_LIBRARY
LibCrypto_SHARED_LIBRARY
LibCrypto_STATIC_LIBRARY
)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
add_library(LibCrypto::Crypto UNKNOWN IMPORTED)
set_target_properties(LibCrypto::Crypto PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${LibCrypto_INCLUDE_DIR}")
set_target_properties(LibCrypto::Crypto PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION "${LibCrypto_LIBRARY}")
add_dependencies(LibCrypto::Crypto Threads::Threads)

# some versions of cmake have a super esoteric bug around capitalization differences between
# find dependency and find package, just avoid that here by checking and
# setting both.
if(LIBCRYPTO_FOUND OR LibCrypto_FOUND)
set(LIBCRYPTO_FOUND true)
set(LibCrypto_FOUND true)

message(STATUS "LibCrypto Include Dir: ${LibCrypto_INCLUDE_DIR}")
message(STATUS "LibCrypto Shared Lib: ${LibCrypto_SHARED_LIBRARY}")
message(STATUS "LibCrypto Static Lib: ${LibCrypto_STATIC_LIBRARY}")
if (NOT TARGET crypto AND
(EXISTS "${LibCrypto_LIBRARY}")
)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
add_library(crypto UNKNOWN IMPORTED)
set_target_properties(crypto PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${LibCrypto_INCLUDE_DIR}")
set_target_properties(crypto PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION "${LibCrypto_LIBRARY}")
add_dependencies(crypto Threads::Threads)
endif()
endif()
endif()

0 comments on commit f3a4993

Please sign in to comment.