1# original file from obs-studio:
2#  https://github.com/obsproject/obs-studio
3#  /cmake/Modules/FindMbedTLS.cmake
4#
5# Once done these will be defined:
6#
7#  LIBMBEDTLS_FOUND
8#  LIBMBEDTLS_INCLUDE_DIRS
9#  LIBMBEDTLS_LIBRARIES
10#
11# For use in OBS:
12#
13#  MBEDTLS_INCLUDE_DIR
14
15find_package(PkgConfig QUIET)
16if (PKG_CONFIG_FOUND)
17	pkg_check_modules(_MBEDTLS QUIET mbedtls)
18endif()
19
20if(CMAKE_SIZEOF_VOID_P EQUAL 8)
21	set(_lib_suffix 64)
22else()
23	set(_lib_suffix 32)
24endif()
25
26# If we're on MacOS or Linux, please try to statically-link mbedtls.
27if(STATIC_MBEDTLS AND (APPLE OR UNIX))
28	set(_MBEDTLS_LIBRARIES libmbedtls.a)
29	set(_MBEDCRYPTO_LIBRARIES libmbedcrypto.a)
30	set(_MBEDX509_LIBRARIES libmbedx509.a)
31endif()
32
33find_path(MBEDTLS_INCLUDE_DIR
34	NAMES mbedtls/ssl.h
35	HINTS
36		${MBEDTLS_PREFIX}
37	PATHS
38		/usr/include /usr/local/include /opt/local/include /sw/include
39	PATH_SUFFIXES
40		include)
41
42find_library(MBEDTLS_LIB
43	NAMES ${_MBEDTLS_LIBRARIES} mbedtls libmbedtls
44	HINTS
45		${MBEDTLS_PREFIX}
46	PATHS
47		/usr/lib /usr/local/lib /opt/local/lib /sw/lib
48	PATH_SUFFIXES
49		lib${_lib_suffix} lib
50		libs${_lib_suffix} libs
51		bin${_lib_suffix} bin
52		../lib${_lib_suffix} ../lib
53		../libs${_lib_suffix} ../libs
54		../bin${_lib_suffix} ../bin)
55
56find_library(MBEDCRYPTO_LIB
57	NAMES ${_MBEDCRYPTO_LIBRARIES} mbedcrypto libmbedcrypto
58	HINTS
59		${MBEDTLS_PREFIX}
60	PATHS
61		/usr/lib /usr/local/lib /opt/local/lib /sw/lib
62	PATH_SUFFIXES
63		lib${_lib_suffix} lib
64		libs${_lib_suffix} libs
65		bin${_lib_suffix} bin
66		../lib${_lib_suffix} ../lib
67		../libs${_lib_suffix} ../libs
68		../bin${_lib_suffix} ../bin)
69
70find_library(MBEDX509_LIB
71	NAMES ${_MBEDX509_LIBRARIES} mbedx509 libmbedx509
72	HINTS
73		${MBEDTLS_PREFIX}
74	PATHS
75		/usr/lib /usr/local/lib /opt/local/lib /sw/lib
76	PATH_SUFFIXES
77		lib${_lib_suffix} lib
78		libs${_lib_suffix} libs
79		bin${_lib_suffix} bin
80		../lib${_lib_suffix} ../lib
81		../libs${_lib_suffix} ../libs
82		../bin${_lib_suffix} ../bin)
83
84# Sometimes mbedtls is split between three libs, and sometimes it isn't.
85# If it isn't, let's check if the symbols we need are all in MBEDTLS_LIB.
86if(MBEDTLS_LIB AND NOT MBEDCRYPTO_LIB AND NOT MBEDX509_LIB)
87	set(CMAKE_REQUIRED_LIBRARIES ${MBEDTLS_LIB})
88	set(CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIR})
89	check_symbol_exists(mbedtls_x509_crt_init "mbedtls/x509_crt.h" MBEDTLS_INCLUDES_X509)
90	check_symbol_exists(mbedtls_sha256_init "mbedtls/sha256.h" MBEDTLS_INCLUDES_CRYPTO)
91	unset(CMAKE_REQUIRED_INCLUDES)
92	unset(CMAKE_REQUIRED_LIBRARIES)
93endif()
94
95# If we find all three libraries, then go ahead.
96if(MBEDTLS_LIB AND MBEDCRYPTO_LIB AND MBEDX509_LIB)
97	set(LIBMBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR})
98	set(LIBMBEDTLS_LIBRARIES ${MBEDTLS_LIB} ${MBEDCRYPTO_LIB} ${MBEDX509_LIB})
99	set(MBEDTLS_INCLUDE_DIRS ${LIBMBEDTLS_INCLUDE_DIRS})
100	set(MBEDTLS_LIBRARIES ${LIBMBEDTLS_LIBRARIES})
101
102# Otherwise, if we find MBEDTLS_LIB, and it has both CRYPTO and x509
103# within the single lib (i.e. a windows build environment), then also
104# feel free to go ahead.
105elseif(MBEDTLS_LIB AND MBEDTLS_INCLUDES_CRYPTO AND MBEDTLS_INCLUDES_X509)
106	set(LIBMBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR})
107	set(LIBMBEDTLS_LIBRARIES ${MBEDTLS_LIB})
108	set(MBEDTLS_INCLUDE_DIRS ${LIBMBEDTLS_INCLUDE_DIRS})
109	set(MBEDTLS_LIBRARIES ${LIBMBEDTLS_LIBRARIES})
110endif()
111
112# Now we've accounted for the 3-vs-1 library case:
113include(FindPackageHandleStandardArgs)
114find_package_handle_standard_args(MbedTLS DEFAULT_MSG MBEDTLS_LIBRARIES MBEDTLS_INCLUDE_DIRS)
115mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARIES MBEDTLS_INCLUDE_DIRS)
116