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
     pbkdf2.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_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.3.14 SOVERSION 9)

	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)

if(UNIX)
    add_custom_target(polarssl
        DEPENDS mbedtls # TODO: and mbedtls_static is shared is defined
        COMMAND ${CMAKE_SOURCE_DIR}/scripts/polarssl_symlinks.sh ${CMAKE_BINARY_DIR}/library
        )

    if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY)
        add_dependencies(polarssl mbedtls_static)
    endif()

    add_custom_target(polarssl-clean
        COMMAND make clean
        COMMAND rm -f ${CMAKE_BINARY_DIR}/library/libpolarssl.*
        )

    add_custom_target(polarssl-install
        COMMAND make install
        COMMAND ${CMAKE_SOURCE_DIR}/scripts/polarssl_symlinks.sh ${DESTDIR}/${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}
        )
endif(UNIX)
