diff 3rdparty/vmime/CMakeLists.txt @ 0:a4671277546c tip

created the repository for the thymian project
author ferencd
date Tue, 17 Aug 2021 11:19:54 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/3rdparty/vmime/CMakeLists.txt	Tue Aug 17 11:19:54 2021 +0200
@@ -0,0 +1,1100 @@
+#
+# CMake configuration file for VMime
+#
+# Usage:
+#
+# . 'cmake -LH' to list build settings variable
+#
+# . 'cmake -G <generator>' to generate makefiles for a build system
+#   eg. cmake -G "Unix Makefiles"
+#
+# For more information, please visit:
+# http://www.cmake.org
+#
+
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8.6 FATAL_ERROR)
+
+INCLUDE(cmake/Utils.cmake)
+
+INCLUDE(CheckIncludeFiles)
+INCLUDE(CheckIncludeFileCXX)
+INCLUDE(CheckFunctionExists)
+INCLUDE(CheckSymbolExists)
+INCLUDE(CheckTypeSize)
+INCLUDE(CheckLibraryExists)
+INCLUDE(CheckCXXSourceCompiles)
+
+
+# CMake configuration
+SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY build/bin)
+SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY build/lib)
+SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY build/lib)
+
+SET(CMAKE_VERBOSE_MAKEFILE ON)
+
+
+# Project
+PROJECT(vmime)
+
+# Package version number
+SET(VMIME_VERSION_MAJOR  0)
+SET(VMIME_VERSION_MINOR  9)
+SET(VMIME_VERSION_MICRO  2)
+
+# API version number (libtool)
+#
+# Increment this number only immediately before a public release.
+# This is independent from package version number.
+#
+# See: http://www.gnu.org/software/libtool/manual.html#Libtool-versioning
+#
+# . Implementation changed (eg. bug/security fix):  REVISION++
+# . Interfaces added/removed/changed:               CURRENT++, REVISION=0
+# . Interfaces added (upward-compatible changes):   AGE++
+# . Interfaces removed:                             AGE=0
+SET(VMIME_API_VERSION_CURRENT   0)
+SET(VMIME_API_VERSION_REVISION  0)
+SET(VMIME_API_VERSION_AGE       0)
+
+
+SET(VMIME_VERSION ${VMIME_VERSION_MAJOR}.${VMIME_VERSION_MINOR}.${VMIME_VERSION_MICRO})
+SET(VMIME_API_VERSION ${VMIME_API_VERSION_CURRENT}.${VMIME_API_VERSION_REVISION}.${VMIME_API_VERSION_AGE})
+
+
+##############################################################################
+# VMime Library
+
+# Set base name
+SET(VMIME_LIBRARY_NAME vmime)
+
+# Source files
+FILE(
+	GLOB_RECURSE
+	VMIME_LIBRARY_SRC_FILES
+	${CMAKE_CURRENT_SOURCE_DIR}/src/vmime/*.cpp
+)
+
+FILE(
+	GLOB_RECURSE
+	VMIME_LIBRARY_INCLUDE_FILES
+	${CMAKE_CURRENT_SOURCE_DIR}/src/vmime/*.hpp
+)
+
+LIST(APPEND VMIME_LIBRARY_GENERATED_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/vmime/config.hpp")
+
+INCLUDE_DIRECTORIES(
+	${CMAKE_CURRENT_SOURCE_DIR}          # for "contrib/"
+	${CMAKE_CURRENT_SOURCE_DIR}/src      # for "vmime/
+)
+
+INCLUDE(GenerateExportHeader)
+ADD_COMPILER_EXPORT_FLAGS()
+
+# Shared library
+OPTION(
+	VMIME_BUILD_SHARED_LIBRARY
+	"Build shared library"
+	ON
+)
+
+IF(VMIME_BUILD_SHARED_LIBRARY)
+
+	ADD_LIBRARY(
+		${VMIME_LIBRARY_NAME}
+		SHARED
+		${VMIME_LIBRARY_SRC_FILES}
+		${VMIME_LIBRARY_INCLUDE_FILES}
+	)
+
+	GENERATE_EXPORT_HEADER(
+		${VMIME_LIBRARY_NAME}
+		BASE_NAME VMIME
+		STATIC_DEFINE VMIME_STATIC
+		EXPORT_FILE_NAME export-shared.hpp
+	)
+
+	FILE(
+		COPY
+		${CMAKE_CURRENT_BINARY_DIR}/export-shared.hpp
+		DESTINATION
+		${PROJECT_SOURCE_DIR}/src/vmime
+	)
+
+	LIST(APPEND VMIME_LIBRARY_GENERATED_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/vmime/export-shared.hpp")
+
+	SET_TARGET_PROPERTIES(
+		${VMIME_LIBRARY_NAME}
+		PROPERTIES
+		VERSION    "${VMIME_API_VERSION}"
+		SOVERSION  "${VMIME_API_VERSION_CURRENT}"
+		COMPILE_FLAGS -DVMIME_SHARED
+	)
+
+ENDIF()
+
+# Static library
+#
+# Note: cannot have two targets with the same name so the static version has
+# '-static' appended and then the name of the output file is set separately.
+OPTION(
+	VMIME_BUILD_STATIC_LIBRARY
+	"Build static library"
+	ON
+)
+
+IF(VMIME_BUILD_STATIC_LIBRARY)
+
+	ADD_LIBRARY(
+		${VMIME_LIBRARY_NAME}-static
+		STATIC
+		${VMIME_LIBRARY_SRC_FILES}
+		${VMIME_LIBRARY_INCLUDE_FILES}
+	)
+
+	GENERATE_EXPORT_HEADER(
+		${VMIME_LIBRARY_NAME}-static
+		BASE_NAME VMIME
+		STATIC_DEFINE VMIME_STATIC
+		EXPORT_FILE_NAME export-static.hpp
+	)
+
+	FILE(
+		COPY
+		${CMAKE_CURRENT_BINARY_DIR}/export-static.hpp
+		DESTINATION
+		${PROJECT_SOURCE_DIR}/src/vmime
+	)
+
+	LIST(APPEND VMIME_LIBRARY_GENERATED_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/vmime/export-static.hpp")
+
+	SET_TARGET_PROPERTIES(
+		${VMIME_LIBRARY_NAME}-static
+		PROPERTIES
+		OUTPUT_NAME  ${VMIME_LIBRARY_NAME}
+		COMPILE_FLAGS -DVMIME_STATIC
+	)
+
+ENDIF()
+
+# Ensure at least one type of library (either shared or static) is build
+IF(NOT(VMIME_BUILD_SHARED_LIBRARY OR VMIME_BUILD_STATIC_LIBRARY))
+	MESSAGE(FATAL_ERROR "You should select at least one library to build (either VMIME_BUILD_SHARED_LIBRARY or VMIME_BUILD_STATIC_LIBRARY must be set to YES.")
+ENDIF()
+
+# These next two lines are required but it is unclear exactly what they do.
+# The CMake FAQ mentions they are necessary and it does not work otherwise.
+IF(VMIME_BUILD_SHARED_LIBRARY)
+	SET_TARGET_PROPERTIES(${VMIME_LIBRARY_NAME} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+ENDIF()
+IF(VMIME_BUILD_STATIC_LIBRARY)
+	SET_TARGET_PROPERTIES(${VMIME_LIBRARY_NAME}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+ENDIF()
+
+SET(CMAKE_INSTALL_LIBDIR lib CACHE PATH "Output directory for libraries")
+
+# Automatically set lib suffix
+IF(UNIX AND NOT APPLE AND NOT CMAKE_CROSSCOMPILING AND NOT EXISTS "/etc/debian_version")
+	IF(CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT LIB_SUFFIX)
+		# ...only if LIB_SUFFIX is not defined...
+		IF(NOT DEFINED LIB_SUFFIX)
+			# ...and if CMAKE_INSTALL_LIBDIR does not already contain the suffix
+			IF(NOT "${CMAKE_INSTALL_LIBDIR}" MATCHES ".*64.*")
+				SET(LIB_SUFFIX 64)
+			ENDIF()
+		ENDIF()
+	ENDIF()
+ENDIF()
+
+# Determine library installation dir, in this order:
+#   1) use VMIME_INSTALL_LIBDIR if set
+#   2) use LIB_INSTALL_DIR if defined
+#   3) use CMAKE_INSTALL_LIBDIR if set
+#      if it is a relative path, prepend CMAKE_INSTALL_PREFIX to it
+#   4) use CMAKE_INSTALL_PREFIX/lib
+IF(NOT DEFINED VMIME_INSTALL_LIBDIR)
+	IF(DEFINED LIB_INSTALL_DIR)
+		SET(VMIME_INSTALL_LIBDIR ${LIB_INSTALL_DIR})
+	# respect CMAKE_INSTALL_LIBDIR if set
+	ELSEIF(DEFINED CMAKE_INSTALL_LIBDIR)
+		SET(VMIME_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
+		IF(IS_ABSOLUTE ${VMIME_INSTALL_LIBDIR})
+			SET(VMIME_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR}${LIB_SUFFIX})
+		ELSE()
+			SET(VMIME_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}${LIB_SUFFIX})
+		ENDIF()
+	ELSE()
+		SET(VMIME_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
+	ENDIF()
+ENDIF()
+
+# Installation of libraries
+IF(VMIME_BUILD_SHARED_LIBRARY)
+	INSTALL(
+		TARGETS ${VMIME_LIBRARY_NAME}
+		LIBRARY DESTINATION "${VMIME_INSTALL_LIBDIR}" COMPONENT sharedlibs
+		ARCHIVE DESTINATION "${VMIME_INSTALL_LIBDIR}" COMPONENT sharedlibs
+	)
+ENDIF()
+
+IF(VMIME_BUILD_STATIC_LIBRARY)
+	INSTALL(
+		TARGETS ${VMIME_LIBRARY_NAME}-static
+		LIBRARY DESTINATION "${VMIME_INSTALL_LIBDIR}" COMPONENT staticlibs
+		ARCHIVE DESTINATION "${VMIME_INSTALL_LIBDIR}" COMPONENT staticlibs
+	)
+ENDIF()
+
+# Installation of header files
+INSTALL_HEADERS_WITH_DIRECTORY(VMIME_LIBRARY_INCLUDE_FILES headers src/)
+INSTALL_HEADERS_WITH_DIRECTORY(VMIME_LIBRARY_GENERATED_INCLUDE_FILES headers src/)
+
+#INSTALL(
+#	FILES ${VMIME_LIBRARY_INCLUDE_FILES}
+#	DESTINATION include
+#	COMPONENT headers
+#)
+
+
+##############################################################################
+# Tests
+
+OPTION(
+	VMIME_BUILD_TESTS
+	"Build unit tests (this will create a 'run-tests' binary)"
+	OFF
+)
+
+IF(VMIME_BUILD_TESTS)
+
+	ENABLE_TESTING()
+
+	INCLUDE(cmake/FindCppUnit.cmake)
+	INCLUDE_DIRECTORIES(${CPPUNIT_INCLUDE_DIR})
+
+	FILE(
+		GLOB_RECURSE
+		VMIME_TESTS_SRC_FILES
+		${CMAKE_SOURCE_DIR}/tests/*Test.cpp
+	)
+
+	ADD_LIBRARY(
+		test-runner
+		${CMAKE_SOURCE_DIR}/tests/testRunner.cpp ${CMAKE_SOURCE_DIR}/tests/testUtils.cpp
+	)
+
+	# Build one file for each test
+	FOREACH(VMIME_TEST_SRC_FILE ${VMIME_TESTS_SRC_FILES})
+
+		# "/path/to/vmime/tests/module/testFile.cpp" --> "module_testFile"
+		GET_FILENAME_COMPONENT(VMIME_TEST_SRC_PATH "${VMIME_TEST_SRC_FILE}" PATH)
+		STRING(REPLACE "${CMAKE_SOURCE_DIR}" "" VMIME_TEST_SRC_PATH "${VMIME_TEST_SRC_PATH}")
+		GET_FILENAME_COMPONENT(VMIME_TEST_NAME "${VMIME_TEST_SRC_FILE}" NAME_WE)
+		SET(VMIME_TEST_NAME "${VMIME_TEST_SRC_PATH}/${VMIME_TEST_NAME}")
+		STRING(REPLACE "/" "_" VMIME_TEST_NAME "${VMIME_TEST_NAME}")
+		STRING(REPLACE "_tests_" "" VMIME_TEST_NAME "${VMIME_TEST_NAME}")
+
+		ADD_EXECUTABLE(
+			${VMIME_TEST_NAME}
+			${VMIME_TEST_SRC_FILE}
+		)
+
+		TARGET_LINK_LIBRARIES(
+			${VMIME_TEST_NAME}
+			${VMIME_LIBRARY_NAME}
+			${CPPUNIT_LIBRARY} test-runner
+		)
+
+		ADD_DEPENDENCIES(
+			${VMIME_TEST_NAME}
+			${VMIME_LIBRARY_NAME}
+		)
+
+		ADD_TEST(
+			${VMIME_TEST_NAME}
+			${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${VMIME_TEST_NAME}
+		)
+
+	ENDFOREACH()
+
+	# Build one file for all tests
+	ADD_EXECUTABLE(
+		"run-tests"
+		${VMIME_TESTS_SRC_FILES}
+	)
+
+	TARGET_LINK_LIBRARIES(
+		"run-tests"
+		${VMIME_LIBRARY_NAME}
+		${CPPUNIT_LIBRARY} test-runner
+	)
+
+	ADD_DEPENDENCIES(
+		"run-tests"
+		${VMIME_LIBRARY_NAME}
+	)
+
+ENDIF()
+
+
+##############################################################################
+# Examples
+
+OPTION(
+	VMIME_BUILD_SAMPLES
+	"Build samples (in 'examples' directory)"
+	ON
+)
+
+
+##############################################################################
+# Packaging / Distribution
+
+# Package information
+SET(VMIME_PACKAGE_NAME         ${VMIME_LIBRARY_NAME})
+SET(VMIME_PACKAGE_VERSION      ${VMIME_VERSION})
+SET(VMIME_PACKAGE_CONTACT      "Vincent Richard <vincent@vmime.org>")
+SET(VMIME_PACKAGE_DESCRIPTION  "VMime C++ Mail Library (http://www.vmime.org)")
+
+SET(CPACK_PACKAGE_NAME                 "${VMIME_PACKAGE_NAME}")
+SET(CPACK_PACKAGE_CONTACT              "${VMIME_PACKAGE_CONTACT}")
+SET(CPACK_PACKAGE_DESCRIPTION          "${VMIME_PACKAGE_DESCRIPTION}")
+SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY  "${CPACK_PACKAGE_DESCRIPTION}")
+SET(CPACK_PACKAGE_VERSION              "${VMIME_PACKAGE_VERSION}")
+
+# Package settings
+SET(CPACK_RESOURCE_FILE_LICENSE        ${CMAKE_SOURCE_DIR}/COPYING)
+
+IF(APPLE)
+	# CPack/PackageManager won't allow file without recognized extension
+	# to be used as license file.
+	CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/COPYING" "${CMAKE_BINARY_DIR}/COPYING.txt" COPYONLY)
+	SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_BINARY_DIR}/COPYING.txt")
+ELSE()
+	SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
+ENDIF(APPLE)
+
+SET(CPACK_SOURCE_GENERATOR             TGZ)
+SET(CPACK_SOURCE_IGNORE_FILES          "\\\\.git;~$;build/")
+SET(CPACK_SOURCE_PACKAGE_FILE_NAME     ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION})
+
+# Set components
+SET(CPACK_COMPONENTS_ALL sharedlibs staticlibs headers)
+
+SET(CPACK_COMPONENT_SHAREDLIBS_DISPLAY_NAME "Shared libraries")
+SET(CPACK_COMPONENT_SHAREDLIBS_DESCRIPTION
+	"Shared library for general use.")
+
+SET(CPACK_COMPONENT_STATICLIBS_DISPLAY_NAME "Static libraries")
+SET(CPACK_COMPONENT_STATICLIBS_DESCRIPTION
+	"Static library, good if you want to embed VMime in your application.")
+
+SET(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C++ Headers")
+SET(CPACK_COMPONENT_HEADERS_DESCRIPTION
+	"C/C++ header files.")
+
+SET(CPACK_COMPONENT_SHAREDLIBS_GROUP "Development")
+SET(CPACK_COMPONENT_STATICLIBS_GROUP "Development")
+SET(CPACK_COMPONENT_HEADERS_GROUP    "Development")
+SET(CPACK_COMPONENT_GROUP_DEVELOPMENT_DESCRIPTION "")
+
+# Make a target "dist" to generate tarball
+SET(ARCHIVE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION})
+
+ADD_CUSTOM_TARGET(
+	dist
+	COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD
+	| bzip2 > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2
+	WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+)
+
+# PkgConfig
+SET(prefix      ${CMAKE_INSTALL_PREFIX})
+SET(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin)
+SET(includedir  ${CMAKE_INSTALL_PREFIX}/include/vmime)
+SET(libdir      ${VMIME_INSTALL_LIBDIR})
+
+SET(VMIME_PKGCONFIG_LIBS     "")
+SET(VMIME_PKGCONFIG_CFLAGS   "")
+SET(VMIME_PKGCONFIG_REQUIRES "")
+
+
+##############################################################################
+# Build type
+
+IF(NOT CMAKE_BUILD_TYPE)
+	SET(
+		CMAKE_BUILD_TYPE
+		"Debug"
+		CACHE STRING
+		"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
+		FORCE
+	)
+ENDIF(NOT CMAKE_BUILD_TYPE)
+
+# Set a default build type for single-configuration
+# CMake generators if no build type is set.
+IF(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
+	SET(CMAKE_BUILD_TYPE Debug)
+ENDIF()
+
+# Debug build
+MESSAGE("-- Build type: ${CMAKE_BUILD_TYPE}")
+IF(${CMAKE_BUILD_TYPE} STREQUAL Debug)
+	ADD_DEFINITIONS(-DDEBUG)
+ENDIF(${CMAKE_BUILD_TYPE} STREQUAL Debug)
+
+
+IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
+	SET(VMIME_DEBUG 1)
+ELSE()
+	SET(VMIME_DEBUG 0)
+ENDIF()
+
+
+##############################################################################
+# Test endianness and basic type sizes
+
+INCLUDE(TestBigEndian)
+TEST_BIG_ENDIAN(BIGENDIAN)
+
+IF(BIGENDIAN EQUAL 0)
+	set(VMIME_BYTE_ORDER_BIG_ENDIAN     0)
+	set(VMIME_BYTE_ORDER_LITTLE_ENDIAN  1)
+ELSE(BIGENDIAN EQUAL 0)
+	SET(VMIME_BYTE_ORDER_BIG_ENDIAN     1)
+	SET(VMIME_BYTE_ORDER_LITTLE_ENDIAN  0)
+ENDIF(BIGENDIAN EQUAL 0)
+
+
+CHECK_INCLUDE_FILE_CXX(cstdint VMIME_HAVE_CSTDINT)
+
+CHECK_TYPE_SIZE("char"      SIZEOF_CHAR)
+CHECK_TYPE_SIZE("short"     SIZEOF_SHORT)
+CHECK_TYPE_SIZE("int"       SIZEOF_INT)
+CHECK_TYPE_SIZE("long"      SIZEOF_LONG)
+CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
+CHECK_TYPE_SIZE("__int64"   SIZEOF___INT64)
+
+SET(CMAKE_EXTRA_INCLUDE_FILES cstdint)
+CHECK_TYPE_SIZE("int64_t"   SIZEOF_INT64_T)
+SET(CMAKE_EXTRA_INCLUDE_FILES)
+
+
+IF(SIZEOF_CHAR EQUAL 1)
+	SET(VMIME_8BIT_TYPE "char")
+ELSE()
+	MESSAGE(FATAL_ERROR "Cannot determine 8-bit type")
+ENDIF()
+
+IF(SIZEOF_INT EQUAL 2)
+	SET(VMIME_16BIT_TYPE "int")
+ELSE()
+	IF(SIZEOF_SHORT EQUAL 2)
+		SET(VMIME_16BIT_TYPE "short")
+	ELSE()
+		MESSAGE(FATAL_ERROR "Cannot determine 16-bit type")
+	ENDIF()
+ENDIF()
+
+IF(SIZEOF_INT EQUAL 4)
+	SET(VMIME_32BIT_TYPE "int")
+ELSE()
+	IF(SIZEOF_LONG EQUAL 4)
+		SET(VMIME_32BIT_TYPE "long")
+	ELSE()
+		IF(SIZEOF_LONG_LONG EQUAL 4)
+			SET(VMIME_32BIT_TYPE "long long")
+		ELSE()
+			MESSAGE(FATAL_ERROR "Cannot determine 32-bit type")
+		ENDIF()
+	ENDIF()
+ENDIF()
+
+IF(SIZEOF_INT EQUAL 8)
+	SET(VMIME_64BIT_TYPE "int")
+ELSE()
+	IF(SIZEOF_LONG EQUAL 8)
+		SET(VMIME_64BIT_TYPE "long")
+	ELSE()
+		IF(SIZEOF_LONG_LONG EQUAL 8)
+			SET(VMIME_64BIT_TYPE "long long")
+		ELSE()
+			IF(SIZEOF_INT64_T EQUAL 8)
+				SET(VMIME_64BIT_TYPE "int64_t")
+			ELSE()
+				IF(SIZEOF___INT64 EQUAL 8)
+					SET(VMIME_64BIT_TYPE "__int64")
+				ELSE()
+					MESSAGE(FATAL_ERROR "Cannot determine 64-bit type")
+				ENDIF()
+			ENDIF()
+		ENDIF()
+	ENDIF()
+ENDIF()
+
+
+INCLUDE(cmake/TargetArch.cmake)
+TARGET_ARCHITECTURE(CMAKE_TARGET_ARCHITECTURES)
+
+CHECK_TYPE_SIZE(size_t VMIME_HAVE_SIZE_T)
+
+
+##############################################################################
+# Sendmail path
+
+FOREACH (SENDMAIL_PATH /usr/sbin/sendmail /usr/lib/sendmail /usr/bin/sendmail /bin/sendmail /var/qmail/bin/qmail-inject /bin/cgimail)
+	IF(EXISTS ${SENDMAIL_PATH})
+		MESSAGE(STATUS "Sendmail binary found at ${SENDMAIL_PATH}")
+		SET(VMIME_DEFAULT_SENDMAIL_PATH ${SENDMAIL_PATH})
+	ENDIF()
+ENDFOREACH(SENDMAIL_PATH)
+
+SET(
+	VMIME_SENDMAIL_PATH
+	${VMIME_DEFAULT_SENDMAIL_PATH}
+	CACHE
+	STRING
+	"Specifies the path to sendmail binary"
+)
+
+
+##############################################################################
+# Messaging features
+
+# Module
+OPTION(
+	VMIME_HAVE_MESSAGING_FEATURES
+	"Enable messaging features (connection to IMAP, POP3, SMTP...)"
+	ON
+)
+
+# Protocols
+OPTION(
+	VMIME_HAVE_MESSAGING_PROTO_POP3
+	"Enable POP3 protocol"
+	ON
+)
+
+OPTION(
+	VMIME_HAVE_MESSAGING_PROTO_SMTP
+	"Enable SMTP protocol"
+	ON
+)
+
+OPTION(
+	VMIME_HAVE_MESSAGING_PROTO_IMAP
+	"Enable IMAP protocol"
+	ON
+)
+
+OPTION(
+	VMIME_HAVE_MESSAGING_PROTO_MAILDIR
+	"Enable Maildir protocol"
+	ON
+)
+
+OPTION(
+	VMIME_HAVE_MESSAGING_PROTO_SENDMAIL
+	"Enable Sendmail protocol"
+	ON
+)
+
+
+##############################################################################
+# File-system features
+
+OPTION(
+	VMIME_HAVE_FILESYSTEM_FEATURES
+	"Enable file-system features (required for file attachments and Maildir)"
+	ON
+)
+
+
+##############################################################################
+# SASL support
+
+INCLUDE(cmake/FindGSasl.cmake)
+
+OPTION(
+	VMIME_HAVE_SASL_SUPPORT
+	"Enable SASL support (requires GNU SASL library)"
+	ON
+)
+
+IF(VMIME_HAVE_SASL_SUPPORT)
+
+	INCLUDE_DIRECTORIES(
+		${INCLUDE_DIRECTORIES}
+		${GSASL_INCLUDE_DIR}
+	)
+
+	IF(VMIME_BUILD_SHARED_LIBRARY)
+		TARGET_LINK_LIBRARIES(
+			${VMIME_LIBRARY_NAME}
+			${TARGET_LINK_LIBRARIES}
+			${GSASL_LIBRARIES}
+		)
+	ENDIF()
+
+	SET(VMIME_PKGCONFIG_REQUIRES "${VMIME_PKGCONFIG_REQUIRES} libgsasl")
+
+ENDIF()
+
+
+##############################################################################
+# SSL/TLS support
+
+INCLUDE(FindGnuTLS)
+INCLUDE(FindOpenSSL)
+
+SET(CMAKE_REQUIRED_LIBRARIES "${GNUTLS_LIBRARY}")
+CHECK_FUNCTION_EXISTS(gnutls_priority_set_direct VMIME_HAVE_GNUTLS_PRIORITY_FUNCS)
+
+
+OPTION(
+	VMIME_HAVE_TLS_SUPPORT
+	"SSL/TLS support (requires either GNU TLS or OpenSSL library)"
+	ON
+)
+
+SET(
+	VMIME_TLS_SUPPORT_LIB
+	"gnutls"
+	CACHE
+	STRING
+	"Library to use for SSL/TLS conversion"
+)
+SET_PROPERTY(
+	CACHE
+	VMIME_TLS_SUPPORT_LIB
+	PROPERTY STRINGS gnutls openssl
+)
+
+
+IF(VMIME_HAVE_TLS_SUPPORT)
+
+	IF(VMIME_TLS_SUPPORT_LIB STREQUAL "gnutls")
+
+		INCLUDE_DIRECTORIES(
+			${INCLUDE_DIRECTORIES}
+			${GNUTLS_INCLUDE_DIR}
+		)
+
+		LINK_DIRECTORIES(
+			${LINK_DIRECTORIES}
+			${GNUTLS_LIBRARY_DIRS}
+		)
+
+		IF(VMIME_BUILD_SHARED_LIBRARY)
+			TARGET_LINK_LIBRARIES(
+				${VMIME_LIBRARY_NAME}
+				${TARGET_LINK_LIBRARIES}
+				${GNUTLS_LIBRARY}
+			)
+		ENDIF()
+
+		SET(VMIME_PKGCONFIG_REQUIRES "${VMIME_PKGCONFIG_REQUIRES} gnutls")
+
+		SET(VMIME_TLS_SUPPORT_LIB_IS_GNUTLS "ON")
+		SET(VMIME_TLS_SUPPORT_LIB_IS_OPENSSL "OFF")
+
+	ELSEIF(VMIME_TLS_SUPPORT_LIB STREQUAL "openssl")
+
+		INCLUDE_DIRECTORIES(
+			${INCLUDE_DIRECTORIES}
+			${OPENSSL_INCLUDE_DIR}
+		)
+
+		IF(VMIME_BUILD_SHARED_LIBRARY)
+			TARGET_LINK_LIBRARIES(
+				${VMIME_LIBRARY_NAME}
+				${TARGET_LINK_LIBRARIES}
+				${OPENSSL_LIBRARIES}
+			)
+		ENDIF()
+
+		SET(VMIME_PKGCONFIG_REQUIRES "${VMIME_PKGCONFIG_REQUIRES} openssl")
+
+		SET(VMIME_TLS_SUPPORT_LIB_IS_GNUTLS "OFF")
+		SET(VMIME_TLS_SUPPORT_LIB_IS_OPENSSL "ON")
+
+	ELSE()
+
+		MESSAGE(FATAL_ERROR "TLS support is enabled, but no TLS/SSL library was selected/found")
+
+	ENDIF()
+
+ENDIF(VMIME_HAVE_TLS_SUPPORT)
+
+
+##############################################################################
+# Charset conversion library
+
+INCLUDE(cmake/FindIconv.cmake)
+INCLUDE(cmake/FindICU.cmake)
+
+FIND_PACKAGE(ICU QUIET)
+
+IF(WIN32)
+	SET(VMIME_CHARSETCONV_LIB_DETECTED "win")
+ELSEIF(ICU_LIBRARIES)
+	SET(VMIME_CHARSETCONV_LIB_DETECTED "icu")
+ELSEIF(ICONV_FOUND)
+	SET(VMIME_CHARSETCONV_LIB_DETECTED "iconv")
+ENDIF()
+
+SET(
+	VMIME_CHARSETCONV_LIB
+	"${VMIME_CHARSETCONV_LIB_DETECTED}"
+	CACHE
+	STRING
+	"Library to use for charset conversion"
+)
+SET_PROPERTY(
+	CACHE
+	VMIME_CHARSETCONV_LIB
+	PROPERTY STRINGS win iconv icu
+)
+
+
+IF(VMIME_CHARSETCONV_LIB STREQUAL "iconv")
+
+	INCLUDE_DIRECTORIES(
+		${INCLUDE_DIRECTORIES}
+		${ICONV_INCLUDE_DIR}
+	)
+
+	IF(VMIME_BUILD_SHARED_LIBRARY)
+		TARGET_LINK_LIBRARIES(
+			${VMIME_LIBRARY_NAME}
+			${TARGET_LINK_LIBRARIES}
+			${ICONV_LIBRARIES}
+		)
+	ENDIF()
+
+	SET(VMIME_PKGCONFIG_LIBS "${VMIME_PKGCONFIG_LIBS} ${ICONV_LIBRARIES}")
+	SET(VMIME_PKGCONFIG_CFLAGS "${VMIME_PKGCONFIG_CFLAGS} -I${ICONV_INCLUDE_DIR}")
+
+	SET(VMIME_CHARSETCONV_LIB_IS_ICONV "ON")
+	SET(VMIME_CHARSETCONV_LIB_IS_ICU "OFF")
+	SET(VMIME_CHARSETCONV_LIB_IS_WIN "OFF")
+
+ELSEIF(VMIME_CHARSETCONV_LIB STREQUAL "icu")
+
+	INCLUDE_DIRECTORIES(
+		${INCLUDE_DIRECTORIES}
+		${ICU_INCLUDE_DIRS}
+	)
+
+	IF(VMIME_BUILD_SHARED_LIBRARY)
+		TARGET_LINK_LIBRARIES(
+			${VMIME_LIBRARY_NAME}
+			${TARGET_LINK_LIBRARIES}
+			${ICU_LIBRARIES}
+		)
+	ENDIF()
+
+	SET(VMIME_PKGCONFIG_LIBS "${VMIME_PKGCONFIG_LIBS} ${ICU_LIBRARIES}")
+	SET(VMIME_PKGCONFIG_CFLAGS "${VMIME_PKGCONFIG_CFLAGS} -I${ICU_INCLUDE_DIRS}")
+
+	SET(VMIME_CHARSETCONV_LIB_IS_ICONV "OFF")
+	SET(VMIME_CHARSETCONV_LIB_IS_ICU "ON")
+	SET(VMIME_CHARSETCONV_LIB_IS_WIN "OFF")
+
+ELSEIF(VMIME_CHARSETCONV_LIB STREQUAL "win")
+
+	SET(VMIME_CHARSETCONV_LIB_IS_ICONV "OFF")
+	SET(VMIME_CHARSETCONV_LIB_IS_ICU "OFF")
+	SET(VMIME_CHARSETCONV_LIB_IS_WIN "ON")
+
+ELSE()
+
+	MESSAGE(FATAL_ERROR "No charset conversion library was selected/found")
+
+ENDIF()
+
+
+##############################################################################
+# Language features
+
+# C++11
+INCLUDE(cmake/cmake-cxx11/Modules/CheckCXX11Features.cmake)
+
+# Smart pointers
+#
+# If a C++11-compliant compiler is available and supports std::shared_ptr<>,
+# use the standard implementation. Else, use boost::shared_ptr<>.
+# In any case, let the user override the choice with VMIME_SHARED_PTR_USE_CXX
+# and VMIME_SHARED_PTR_USE_BOOST variables.
+
+CHECK_CXX_SOURCE_COMPILES(
+	"
+	#include <memory>
+	struct A { int foo; };
+	int main() {
+		std::shared_ptr <A> a = std::make_shared <A>();
+		return 0;
+	}
+	"
+	VMIME_HAS_CXX11_SHARED_PTR
+)
+
+IF(NOT VMIME_SHARED_PTR_USE_CXX AND NOT VMIME_SHARED_PTR_USE_BOOST)
+	IF(CXX11_COMPILER_FLAGS AND VMIME_HAS_CXX11_SHARED_PTR)
+		# If std::shared_ptr<> is available, use it by default
+		SET(VMIME_SHARED_PTR_USE_CXX_DEFAULT     ON)
+		SET(VMIME_SHARED_PTR_USE_BOOST_DEFAULT  OFF)
+	ELSE()
+		# Else, set default to boost::shared_ptr<>
+		SET(VMIME_SHARED_PTR_USE_CXX_DEFAULT    OFF)
+		SET(VMIME_SHARED_PTR_USE_BOOST_DEFAULT   ON)
+	ENDIF()
+ENDIF()
+
+OPTION(
+	VMIME_SHARED_PTR_USE_CXX
+	"Use standard std::shared_ptr<> (requires a C++11 compiler)"
+	${VMIME_SHARED_PTR_USE_CXX_DEFAULT}
+)
+
+OPTION(
+	VMIME_SHARED_PTR_USE_BOOST
+	"Use boost::shared_ptr<> (requires Boost)"
+	${VMIME_SHARED_PTR_USE_BOOST_DEFAULT}
+)
+
+IF(VMIME_SHARED_PTR_USE_CXX AND VMIME_SHARED_PTR_USE_BOOST)
+	MESSAGE(FATAL_ERROR "Options VMIME_SHARED_PTR_USE_CXX and VMIME_SHARED_PTR_USE_BOOST are mutually exclusive (select one or the other, but not both!)")
+ENDIF()
+
+IF(VMIME_SHARED_PTR_USE_CXX)
+
+	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX11_COMPILER_FLAGS}")
+
+	IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+		SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
+	ENDIF()
+
+	MESSAGE(STATUS "Checking support for shared_ptr<>: built-in (C++11)")
+
+ELSEIF(VMIME_SHARED_PTR_USE_BOOST)
+
+	# Depends on Boost library if C++11 is not supported
+	FIND_PACKAGE(Boost)
+
+	IF(Boost_FOUND)
+		INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
+	ELSE()
+		MESSAGE(FATAL_ERROR "Boost library is required for shared_ptr<>, unless you compile using C++11")
+	ENDIF()
+
+	MESSAGE(STATUS "Checking support for shared_ptr<>: boost library")
+
+ELSE()
+
+	MESSAGE(FATAL_ERROR "No implementation for shared_ptr<> was selected/found")
+
+ENDIF()
+
+
+##############################################################################
+# Platform
+
+SET(VMIME_PLATFORM_IS_POSIX OFF)
+SET(VMIME_PLATFORM_IS_WINDOWS OFF)
+
+IF(WIN32)
+	SET(VMIME_PLATFORM_IS_WINDOWS ON)
+ELSE()
+	SET(VMIME_PLATFORM_IS_POSIX ON)
+ENDIF()
+
+
+##############################################################################
+# Platform-specific checks
+
+CHECK_FUNCTION_EXISTS(gmtime_s VMIME_HAVE_GMTIME_S)
+CHECK_FUNCTION_EXISTS(gmtime_r VMIME_HAVE_GMTIME_R)
+CHECK_FUNCTION_EXISTS(localtime_s VMIME_HAVE_LOCALTIME_S)
+CHECK_FUNCTION_EXISTS(localtime_r VMIME_HAVE_LOCALTIME_R)
+CHECK_FUNCTION_EXISTS(strcpy_s VMIME_HAVE_STRCPY_S)
+
+
+##############################################################################
+# Windows-specific checks
+
+IF(WIN32)
+
+	# Winsock
+	CHECK_LIBRARY_EXISTS("ws2_32" getch "${CMAKE_LIBRARY_PATH}" VMIME_HAVE_LIBWS2_32)
+
+	IF(VMIME_HAVE_LIBWS2_32)
+		IF(VMIME_BUILD_SHARED_LIBRARY)
+			TARGET_LINK_LIBRARIES(
+				${VMIME_LIBRARY_NAME}
+				${TARGET_LINK_LIBRARIES}
+				"ws2_32"
+			)
+		ELSE()
+			SET(VMIME_PKGCONFIG_LIBS "${VMIME_PKGCONFIG_LIBS} -lws2_32")
+		ENDIF()
+	ENDIF()
+
+	# MLang
+	CHECK_INCLUDE_FILES(Mlang.h VMIME_HAVE_MLANG_H)
+	CHECK_LIBRARY_EXISTS("mlang" ConvertINetString "${CMAKE_LIBRARY_PATH}" VMIME_HAVE_MLANG_LIB)
+
+	IF(VMIME_HAVE_MLANG_H)
+		IF(VMIME_HAVE_MLANG_LIB)
+			SET(VMIME_HAVE_MLANG ON)
+
+			IF(VMIME_BUILD_SHARED_LIBRARY)
+				TARGET_LINK_LIBRARIES(
+					${VMIME_LIBRARY_NAME}
+					${TARGET_LINK_LIBRARIES}
+					"mlang"
+				)
+			ENDIF()
+		ENDIF()
+	ENDIF()
+
+ENDIF()
+
+
+##############################################################################
+# POSIX-specific checks
+
+CHECK_FUNCTION_EXISTS(getaddrinfo VMIME_HAVE_GETADDRINFO)
+CHECK_FUNCTION_EXISTS(getnameinfo VMIME_HAVE_GETNAMEINFO)
+
+CHECK_FUNCTION_EXISTS(gettid VMIME_HAVE_GETTID)
+CHECK_FUNCTION_EXISTS(syscall VMIME_HAVE_SYSCALL)
+CHECK_SYMBOL_EXISTS(SYS_gettid sys/syscall.h VMIME_HAVE_SYSCALL_GETTID)
+
+FIND_PACKAGE(Threads)
+
+IF(VMIME_BUILD_SHARED_LIBRARY)
+	TARGET_LINK_LIBRARIES(
+		${VMIME_LIBRARY_NAME}
+		${TARGET_LINK_LIBRARIES}
+		${CMAKE_THREAD_LIBS_INIT}
+	)
+ENDIF()
+
+FIND_LIBRARY(PTHREAD_LIB pthread)
+
+IF(PTHREAD_LIB)
+	SET(VMIME_HAVE_PTHREAD 1)
+
+	IF(VMIME_BUILD_SHARED_LIBRARY)
+		TARGET_LINK_LIBRARIES(
+			${VMIME_LIBRARY_NAME}
+			${TARGET_LINK_LIBRARIES}
+			${PTHREAD_LIB}
+		)
+	ENDIF()
+ELSE(PTHREAD_LIB)
+	SET(VMIME_HAVE_PTHREAD 0)
+ENDIF(PTHREAD_LIB)
+
+
+##############################################################################
+# Additional compiler flags
+
+IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+
+	SET(
+		CMAKE_CXX_FLAGS
+		"${CMAKE_CXX_FLAGS} -D_REENTRANT=1 -W -Wall -pedantic -Warray-bounds-pointer-arithmetic -Wold-style-cast -Wconversion -Wcast-align -Wno-sign-conversion"
+		CACHE STRING
+		"g++ Compiler Flags"
+		FORCE
+	)
+
+	SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
+	SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
+	SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
+
+	#SET(CMAKE_EXE_LINKER_FLAGS "-s")
+
+ELSE()
+
+	IF(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
+
+		SET(
+			CMAKE_CXX_FLAGS
+			"${CMAKE_CXX_FLAGS} -D_REENTRANT=1 -W -Wall -pedantic -Wpointer-arith -Wold-style-cast -Wconversion -Wcast-align -Wno-long-long"
+			CACHE STRING
+			"g++ Compiler Flags"
+			FORCE
+		)
+
+		SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
+		SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
+		SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
+
+		#SET(CMAKE_EXE_LINKER_FLAGS "-s")
+
+	ENDIF()
+
+ENDIF()
+
+
+##############################################################################
+# Documentation
+
+OPTION(
+	VMIME_BUILD_DOCUMENTATION
+	"Build documentation"
+	ON
+)
+
+IF(VMIME_BUILD_DOCUMENTATION)
+	FIND_PACKAGE(Doxygen)
+
+	IF(DOXYGEN_FOUND)
+		CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/Doxyfile.in ${CMAKE_BINARY_DIR}/Doxyfile @ONLY)
+
+		# Make a target so that documentation can be generated by running "make doc"
+		ADD_CUSTOM_TARGET(
+			doc
+			${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile
+			WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+			COMMENT "Generating API documentation with Doxygen" VERBATIM
+		)
+	ENDIF(DOXYGEN_FOUND)
+ENDIF(VMIME_BUILD_DOCUMENTATION)
+
+##############################################################################
+# Sanity checks
+
+# Maildir protocol is available only if file-system features are enabled
+IF(VMIME_HAVE_MESSAGING_FEATURES AND VMIME_HAVE_MESSAGING_PROTO_MAILDIR AND NOT VMIME_HAVE_FILESYSTEM_FEATURES)
+	MESSAGE(FATAL_ERROR "Maildir protocol requires file-system support (VMIME_HAVE_FILESYSTEM_FEATURES must be set to ON).")
+ENDIF()
+
+# Path to 'sendmail' must be specified if Sendmail protocol is enabled
+IF(VMIME_HAVE_MESSAGING_PROTO_SENDMAIL)
+	IF(NOT VMIME_SENDMAIL_PATH OR VMIME_SENDMAIL_PATH STREQUAL "")
+		MESSAGE(FATAL_ERROR "Enabling Sendmail protocol requires that you specify path to 'sendmail' binary.")
+	ENDIF()
+ENDIF()
+
+
+##############################################################################
+# Build examples
+
+IF(VMIME_BUILD_SAMPLES)
+	ADD_SUBDIRECTORY(examples)
+ENDIF()
+
+
+# Set our configure file
+CONFIGURE_FILE(cmake/config.hpp.cmake ${CMAKE_SOURCE_DIR}/src/vmime/config.hpp)
+
+# PkgConfig post-configuration
+CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/vmime.pc.in ${CMAKE_BINARY_DIR}/vmime.pc @ONLY)
+INSTALL(FILES ${CMAKE_BINARY_DIR}/vmime.pc DESTINATION "${VMIME_INSTALL_LIBDIR}/pkgconfig" COMPONENT headers)
+
+INCLUDE(CPack)
+