option(USE_STATIC_MBEDTLS_LIBRARY "Build mbed TLS static library." ON)
option(USE_SHARED_MBEDTLS_LIBRARY "Build mbed TLS shared library." OFF)
option(LINK_WITH_PTHREAD "Explicitly link mbed TLS library to pthread." OFF)

set(src
     aes.c
     aesni.c
     arc4.c
     asn1parse.c
     asn1write.c
     base64.c
     bignum.c
     blowfish.c
     camellia.c
     ccm.c
     certs.c
     cipher.c
     cipher_wrap.c
     ctr_drbg.c
     debug.c
     des.c
     dhm.c
     ecp.c
     ecp_curves.c
     ecdh.c
     ecdsa.c
     entropy.c
     entropy_poll.c
     error.c
     gcm.c
     havege.c
     hmac_drbg.c
     md.c
     md_wrap.c
     md2.c
     md4.c
     md5.c
     memory_buffer_alloc.c
     net.c
     oid.c
     padlock.c
     pem.c
     pkcs5.c
     pkcs11.c
     pkcs12.c
     pk.c
     pk_wrap.c
     pkparse.c
     pkwrite.c
     platform.c
     ripemd160.c
     rsa.c
     sha1.c
     sha256.c
     sha512.c
     ssl_cache.c
     ssl_cookie.c
     ssl_ticket.c
     ssl_ciphersuites.c
     ssl_cli.c
     ssl_srv.c
     ssl_tls.c
     threading.c
     timing.c
     version.c
     version_features.c
     x509.c
     x509_crt.c
     x509_crl.c
     x509_csr.c
     x509_create.c
     x509write_crt.c
     x509write_csr.c
     xtea.c
)

if(WIN32)
set(libs ws2_32)
endif(WIN32)

if(CMAKE_COMPILER_IS_GNUCC)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes")
endif(CMAKE_COMPILER_IS_GNUCC)

if(CMAKE_COMPILER_IS_CLANG)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes -Wdocumentation -Wno-documentation-deprecated-sync -Wunreachable-code")
endif(CMAKE_COMPILER_IS_CLANG)

if (NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY)
	message(FATAL_ERROR "Need to choose static or shared mbedtls build!")
endif(NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY)

if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY)
	# if we build both static an shared, then let
	# tests and programs link to the shared lib target
	set(mbedtls_static_target "mbedtls_static")
elseif(USE_STATIC_MBEDTLS_LIBRARY)
	set(mbedtls_static_target "mbedtls")
endif()

if(USE_STATIC_MBEDTLS_LIBRARY)
	add_library(${mbedtls_static_target} STATIC ${src})
	set_target_properties(${mbedtls_static_target} PROPERTIES OUTPUT_NAME mbedtls)
	target_link_libraries(${mbedtls_static_target} ${libs})

	if(ZLIB_FOUND)
		target_link_libraries(${mbedtls_static_target} ${ZLIB_LIBRARIES})
	endif(ZLIB_FOUND)

	if(LINK_WITH_PTHREAD)
        target_link_libraries(${mbedtls_static_target} pthread)
	endif()

	install(TARGETS ${mbedtls_static_target}
			DESTINATION ${LIB_INSTALL_DIR}
			PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
endif()

if(USE_SHARED_MBEDTLS_LIBRARY)
	add_library(mbedtls SHARED ${src})
	set_target_properties(mbedtls PROPERTIES VERSION 1.4.0 SOVERSION 8)

	target_link_libraries(mbedtls ${libs})

	if(ZLIB_FOUND)
		target_link_libraries(mbedtls ${ZLIB_LIBRARIES})
	endif(ZLIB_FOUND)

	if(LINK_WITH_PTHREAD)
        target_link_libraries(mbedtls pthread)
	endif()

	install(TARGETS mbedtls
			DESTINATION ${LIB_INSTALL_DIR}
			PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
endif(USE_SHARED_MBEDTLS_LIBRARY)
