comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:a4671277546c
1 #
2 # CMake configuration file for VMime
3 #
4 # Usage:
5 #
6 # . 'cmake -LH' to list build settings variable
7 #
8 # . 'cmake -G <generator>' to generate makefiles for a build system
9 # eg. cmake -G "Unix Makefiles"
10 #
11 # For more information, please visit:
12 # http://www.cmake.org
13 #
14
15 CMAKE_MINIMUM_REQUIRED(VERSION 2.8.6 FATAL_ERROR)
16
17 INCLUDE(cmake/Utils.cmake)
18
19 INCLUDE(CheckIncludeFiles)
20 INCLUDE(CheckIncludeFileCXX)
21 INCLUDE(CheckFunctionExists)
22 INCLUDE(CheckSymbolExists)
23 INCLUDE(CheckTypeSize)
24 INCLUDE(CheckLibraryExists)
25 INCLUDE(CheckCXXSourceCompiles)
26
27
28 # CMake configuration
29 SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY build/bin)
30 SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY build/lib)
31 SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY build/lib)
32
33 SET(CMAKE_VERBOSE_MAKEFILE ON)
34
35
36 # Project
37 PROJECT(vmime)
38
39 # Package version number
40 SET(VMIME_VERSION_MAJOR 0)
41 SET(VMIME_VERSION_MINOR 9)
42 SET(VMIME_VERSION_MICRO 2)
43
44 # API version number (libtool)
45 #
46 # Increment this number only immediately before a public release.
47 # This is independent from package version number.
48 #
49 # See: http://www.gnu.org/software/libtool/manual.html#Libtool-versioning
50 #
51 # . Implementation changed (eg. bug/security fix): REVISION++
52 # . Interfaces added/removed/changed: CURRENT++, REVISION=0
53 # . Interfaces added (upward-compatible changes): AGE++
54 # . Interfaces removed: AGE=0
55 SET(VMIME_API_VERSION_CURRENT 0)
56 SET(VMIME_API_VERSION_REVISION 0)
57 SET(VMIME_API_VERSION_AGE 0)
58
59
60 SET(VMIME_VERSION ${VMIME_VERSION_MAJOR}.${VMIME_VERSION_MINOR}.${VMIME_VERSION_MICRO})
61 SET(VMIME_API_VERSION ${VMIME_API_VERSION_CURRENT}.${VMIME_API_VERSION_REVISION}.${VMIME_API_VERSION_AGE})
62
63
64 ##############################################################################
65 # VMime Library
66
67 # Set base name
68 SET(VMIME_LIBRARY_NAME vmime)
69
70 # Source files
71 FILE(
72 GLOB_RECURSE
73 VMIME_LIBRARY_SRC_FILES
74 ${CMAKE_CURRENT_SOURCE_DIR}/src/vmime/*.cpp
75 )
76
77 FILE(
78 GLOB_RECURSE
79 VMIME_LIBRARY_INCLUDE_FILES
80 ${CMAKE_CURRENT_SOURCE_DIR}/src/vmime/*.hpp
81 )
82
83 LIST(APPEND VMIME_LIBRARY_GENERATED_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/vmime/config.hpp")
84
85 INCLUDE_DIRECTORIES(
86 ${CMAKE_CURRENT_SOURCE_DIR} # for "contrib/"
87 ${CMAKE_CURRENT_SOURCE_DIR}/src # for "vmime/
88 )
89
90 INCLUDE(GenerateExportHeader)
91 ADD_COMPILER_EXPORT_FLAGS()
92
93 # Shared library
94 OPTION(
95 VMIME_BUILD_SHARED_LIBRARY
96 "Build shared library"
97 ON
98 )
99
100 IF(VMIME_BUILD_SHARED_LIBRARY)
101
102 ADD_LIBRARY(
103 ${VMIME_LIBRARY_NAME}
104 SHARED
105 ${VMIME_LIBRARY_SRC_FILES}
106 ${VMIME_LIBRARY_INCLUDE_FILES}
107 )
108
109 GENERATE_EXPORT_HEADER(
110 ${VMIME_LIBRARY_NAME}
111 BASE_NAME VMIME
112 STATIC_DEFINE VMIME_STATIC
113 EXPORT_FILE_NAME export-shared.hpp
114 )
115
116 FILE(
117 COPY
118 ${CMAKE_CURRENT_BINARY_DIR}/export-shared.hpp
119 DESTINATION
120 ${PROJECT_SOURCE_DIR}/src/vmime
121 )
122
123 LIST(APPEND VMIME_LIBRARY_GENERATED_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/vmime/export-shared.hpp")
124
125 SET_TARGET_PROPERTIES(
126 ${VMIME_LIBRARY_NAME}
127 PROPERTIES
128 VERSION "${VMIME_API_VERSION}"
129 SOVERSION "${VMIME_API_VERSION_CURRENT}"
130 COMPILE_FLAGS -DVMIME_SHARED
131 )
132
133 ENDIF()
134
135 # Static library
136 #
137 # Note: cannot have two targets with the same name so the static version has
138 # '-static' appended and then the name of the output file is set separately.
139 OPTION(
140 VMIME_BUILD_STATIC_LIBRARY
141 "Build static library"
142 ON
143 )
144
145 IF(VMIME_BUILD_STATIC_LIBRARY)
146
147 ADD_LIBRARY(
148 ${VMIME_LIBRARY_NAME}-static
149 STATIC
150 ${VMIME_LIBRARY_SRC_FILES}
151 ${VMIME_LIBRARY_INCLUDE_FILES}
152 )
153
154 GENERATE_EXPORT_HEADER(
155 ${VMIME_LIBRARY_NAME}-static
156 BASE_NAME VMIME
157 STATIC_DEFINE VMIME_STATIC
158 EXPORT_FILE_NAME export-static.hpp
159 )
160
161 FILE(
162 COPY
163 ${CMAKE_CURRENT_BINARY_DIR}/export-static.hpp
164 DESTINATION
165 ${PROJECT_SOURCE_DIR}/src/vmime
166 )
167
168 LIST(APPEND VMIME_LIBRARY_GENERATED_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/vmime/export-static.hpp")
169
170 SET_TARGET_PROPERTIES(
171 ${VMIME_LIBRARY_NAME}-static
172 PROPERTIES
173 OUTPUT_NAME ${VMIME_LIBRARY_NAME}
174 COMPILE_FLAGS -DVMIME_STATIC
175 )
176
177 ENDIF()
178
179 # Ensure at least one type of library (either shared or static) is build
180 IF(NOT(VMIME_BUILD_SHARED_LIBRARY OR VMIME_BUILD_STATIC_LIBRARY))
181 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.")
182 ENDIF()
183
184 # These next two lines are required but it is unclear exactly what they do.
185 # The CMake FAQ mentions they are necessary and it does not work otherwise.
186 IF(VMIME_BUILD_SHARED_LIBRARY)
187 SET_TARGET_PROPERTIES(${VMIME_LIBRARY_NAME} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
188 ENDIF()
189 IF(VMIME_BUILD_STATIC_LIBRARY)
190 SET_TARGET_PROPERTIES(${VMIME_LIBRARY_NAME}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
191 ENDIF()
192
193 SET(CMAKE_INSTALL_LIBDIR lib CACHE PATH "Output directory for libraries")
194
195 # Automatically set lib suffix
196 IF(UNIX AND NOT APPLE AND NOT CMAKE_CROSSCOMPILING AND NOT EXISTS "/etc/debian_version")
197 IF(CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT LIB_SUFFIX)
198 # ...only if LIB_SUFFIX is not defined...
199 IF(NOT DEFINED LIB_SUFFIX)
200 # ...and if CMAKE_INSTALL_LIBDIR does not already contain the suffix
201 IF(NOT "${CMAKE_INSTALL_LIBDIR}" MATCHES ".*64.*")
202 SET(LIB_SUFFIX 64)
203 ENDIF()
204 ENDIF()
205 ENDIF()
206 ENDIF()
207
208 # Determine library installation dir, in this order:
209 # 1) use VMIME_INSTALL_LIBDIR if set
210 # 2) use LIB_INSTALL_DIR if defined
211 # 3) use CMAKE_INSTALL_LIBDIR if set
212 # if it is a relative path, prepend CMAKE_INSTALL_PREFIX to it
213 # 4) use CMAKE_INSTALL_PREFIX/lib
214 IF(NOT DEFINED VMIME_INSTALL_LIBDIR)
215 IF(DEFINED LIB_INSTALL_DIR)
216 SET(VMIME_INSTALL_LIBDIR ${LIB_INSTALL_DIR})
217 # respect CMAKE_INSTALL_LIBDIR if set
218 ELSEIF(DEFINED CMAKE_INSTALL_LIBDIR)
219 SET(VMIME_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
220 IF(IS_ABSOLUTE ${VMIME_INSTALL_LIBDIR})
221 SET(VMIME_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR}${LIB_SUFFIX})
222 ELSE()
223 SET(VMIME_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}${LIB_SUFFIX})
224 ENDIF()
225 ELSE()
226 SET(VMIME_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
227 ENDIF()
228 ENDIF()
229
230 # Installation of libraries
231 IF(VMIME_BUILD_SHARED_LIBRARY)
232 INSTALL(
233 TARGETS ${VMIME_LIBRARY_NAME}
234 LIBRARY DESTINATION "${VMIME_INSTALL_LIBDIR}" COMPONENT sharedlibs
235 ARCHIVE DESTINATION "${VMIME_INSTALL_LIBDIR}" COMPONENT sharedlibs
236 )
237 ENDIF()
238
239 IF(VMIME_BUILD_STATIC_LIBRARY)
240 INSTALL(
241 TARGETS ${VMIME_LIBRARY_NAME}-static
242 LIBRARY DESTINATION "${VMIME_INSTALL_LIBDIR}" COMPONENT staticlibs
243 ARCHIVE DESTINATION "${VMIME_INSTALL_LIBDIR}" COMPONENT staticlibs
244 )
245 ENDIF()
246
247 # Installation of header files
248 INSTALL_HEADERS_WITH_DIRECTORY(VMIME_LIBRARY_INCLUDE_FILES headers src/)
249 INSTALL_HEADERS_WITH_DIRECTORY(VMIME_LIBRARY_GENERATED_INCLUDE_FILES headers src/)
250
251 #INSTALL(
252 # FILES ${VMIME_LIBRARY_INCLUDE_FILES}
253 # DESTINATION include
254 # COMPONENT headers
255 #)
256
257
258 ##############################################################################
259 # Tests
260
261 OPTION(
262 VMIME_BUILD_TESTS
263 "Build unit tests (this will create a 'run-tests' binary)"
264 OFF
265 )
266
267 IF(VMIME_BUILD_TESTS)
268
269 ENABLE_TESTING()
270
271 INCLUDE(cmake/FindCppUnit.cmake)
272 INCLUDE_DIRECTORIES(${CPPUNIT_INCLUDE_DIR})
273
274 FILE(
275 GLOB_RECURSE
276 VMIME_TESTS_SRC_FILES
277 ${CMAKE_SOURCE_DIR}/tests/*Test.cpp
278 )
279
280 ADD_LIBRARY(
281 test-runner
282 ${CMAKE_SOURCE_DIR}/tests/testRunner.cpp ${CMAKE_SOURCE_DIR}/tests/testUtils.cpp
283 )
284
285 # Build one file for each test
286 FOREACH(VMIME_TEST_SRC_FILE ${VMIME_TESTS_SRC_FILES})
287
288 # "/path/to/vmime/tests/module/testFile.cpp" --> "module_testFile"
289 GET_FILENAME_COMPONENT(VMIME_TEST_SRC_PATH "${VMIME_TEST_SRC_FILE}" PATH)
290 STRING(REPLACE "${CMAKE_SOURCE_DIR}" "" VMIME_TEST_SRC_PATH "${VMIME_TEST_SRC_PATH}")
291 GET_FILENAME_COMPONENT(VMIME_TEST_NAME "${VMIME_TEST_SRC_FILE}" NAME_WE)
292 SET(VMIME_TEST_NAME "${VMIME_TEST_SRC_PATH}/${VMIME_TEST_NAME}")
293 STRING(REPLACE "/" "_" VMIME_TEST_NAME "${VMIME_TEST_NAME}")
294 STRING(REPLACE "_tests_" "" VMIME_TEST_NAME "${VMIME_TEST_NAME}")
295
296 ADD_EXECUTABLE(
297 ${VMIME_TEST_NAME}
298 ${VMIME_TEST_SRC_FILE}
299 )
300
301 TARGET_LINK_LIBRARIES(
302 ${VMIME_TEST_NAME}
303 ${VMIME_LIBRARY_NAME}
304 ${CPPUNIT_LIBRARY} test-runner
305 )
306
307 ADD_DEPENDENCIES(
308 ${VMIME_TEST_NAME}
309 ${VMIME_LIBRARY_NAME}
310 )
311
312 ADD_TEST(
313 ${VMIME_TEST_NAME}
314 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${VMIME_TEST_NAME}
315 )
316
317 ENDFOREACH()
318
319 # Build one file for all tests
320 ADD_EXECUTABLE(
321 "run-tests"
322 ${VMIME_TESTS_SRC_FILES}
323 )
324
325 TARGET_LINK_LIBRARIES(
326 "run-tests"
327 ${VMIME_LIBRARY_NAME}
328 ${CPPUNIT_LIBRARY} test-runner
329 )
330
331 ADD_DEPENDENCIES(
332 "run-tests"
333 ${VMIME_LIBRARY_NAME}
334 )
335
336 ENDIF()
337
338
339 ##############################################################################
340 # Examples
341
342 OPTION(
343 VMIME_BUILD_SAMPLES
344 "Build samples (in 'examples' directory)"
345 ON
346 )
347
348
349 ##############################################################################
350 # Packaging / Distribution
351
352 # Package information
353 SET(VMIME_PACKAGE_NAME ${VMIME_LIBRARY_NAME})
354 SET(VMIME_PACKAGE_VERSION ${VMIME_VERSION})
355 SET(VMIME_PACKAGE_CONTACT "Vincent Richard <vincent@vmime.org>")
356 SET(VMIME_PACKAGE_DESCRIPTION "VMime C++ Mail Library (http://www.vmime.org)")
357
358 SET(CPACK_PACKAGE_NAME "${VMIME_PACKAGE_NAME}")
359 SET(CPACK_PACKAGE_CONTACT "${VMIME_PACKAGE_CONTACT}")
360 SET(CPACK_PACKAGE_DESCRIPTION "${VMIME_PACKAGE_DESCRIPTION}")
361 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${CPACK_PACKAGE_DESCRIPTION}")
362 SET(CPACK_PACKAGE_VERSION "${VMIME_PACKAGE_VERSION}")
363
364 # Package settings
365 SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/COPYING)
366
367 IF(APPLE)
368 # CPack/PackageManager won't allow file without recognized extension
369 # to be used as license file.
370 CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/COPYING" "${CMAKE_BINARY_DIR}/COPYING.txt" COPYONLY)
371 SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_BINARY_DIR}/COPYING.txt")
372 ELSE()
373 SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
374 ENDIF(APPLE)
375
376 SET(CPACK_SOURCE_GENERATOR TGZ)
377 SET(CPACK_SOURCE_IGNORE_FILES "\\\\.git;~$;build/")
378 SET(CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION})
379
380 # Set components
381 SET(CPACK_COMPONENTS_ALL sharedlibs staticlibs headers)
382
383 SET(CPACK_COMPONENT_SHAREDLIBS_DISPLAY_NAME "Shared libraries")
384 SET(CPACK_COMPONENT_SHAREDLIBS_DESCRIPTION
385 "Shared library for general use.")
386
387 SET(CPACK_COMPONENT_STATICLIBS_DISPLAY_NAME "Static libraries")
388 SET(CPACK_COMPONENT_STATICLIBS_DESCRIPTION
389 "Static library, good if you want to embed VMime in your application.")
390
391 SET(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C++ Headers")
392 SET(CPACK_COMPONENT_HEADERS_DESCRIPTION
393 "C/C++ header files.")
394
395 SET(CPACK_COMPONENT_SHAREDLIBS_GROUP "Development")
396 SET(CPACK_COMPONENT_STATICLIBS_GROUP "Development")
397 SET(CPACK_COMPONENT_HEADERS_GROUP "Development")
398 SET(CPACK_COMPONENT_GROUP_DEVELOPMENT_DESCRIPTION "")
399
400 # Make a target "dist" to generate tarball
401 SET(ARCHIVE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION})
402
403 ADD_CUSTOM_TARGET(
404 dist
405 COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD
406 | bzip2 > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2
407 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
408 )
409
410 # PkgConfig
411 SET(prefix ${CMAKE_INSTALL_PREFIX})
412 SET(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin)
413 SET(includedir ${CMAKE_INSTALL_PREFIX}/include/vmime)
414 SET(libdir ${VMIME_INSTALL_LIBDIR})
415
416 SET(VMIME_PKGCONFIG_LIBS "")
417 SET(VMIME_PKGCONFIG_CFLAGS "")
418 SET(VMIME_PKGCONFIG_REQUIRES "")
419
420
421 ##############################################################################
422 # Build type
423
424 IF(NOT CMAKE_BUILD_TYPE)
425 SET(
426 CMAKE_BUILD_TYPE
427 "Debug"
428 CACHE STRING
429 "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
430 FORCE
431 )
432 ENDIF(NOT CMAKE_BUILD_TYPE)
433
434 # Set a default build type for single-configuration
435 # CMake generators if no build type is set.
436 IF(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
437 SET(CMAKE_BUILD_TYPE Debug)
438 ENDIF()
439
440 # Debug build
441 MESSAGE("-- Build type: ${CMAKE_BUILD_TYPE}")
442 IF(${CMAKE_BUILD_TYPE} STREQUAL Debug)
443 ADD_DEFINITIONS(-DDEBUG)
444 ENDIF(${CMAKE_BUILD_TYPE} STREQUAL Debug)
445
446
447 IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
448 SET(VMIME_DEBUG 1)
449 ELSE()
450 SET(VMIME_DEBUG 0)
451 ENDIF()
452
453
454 ##############################################################################
455 # Test endianness and basic type sizes
456
457 INCLUDE(TestBigEndian)
458 TEST_BIG_ENDIAN(BIGENDIAN)
459
460 IF(BIGENDIAN EQUAL 0)
461 set(VMIME_BYTE_ORDER_BIG_ENDIAN 0)
462 set(VMIME_BYTE_ORDER_LITTLE_ENDIAN 1)
463 ELSE(BIGENDIAN EQUAL 0)
464 SET(VMIME_BYTE_ORDER_BIG_ENDIAN 1)
465 SET(VMIME_BYTE_ORDER_LITTLE_ENDIAN 0)
466 ENDIF(BIGENDIAN EQUAL 0)
467
468
469 CHECK_INCLUDE_FILE_CXX(cstdint VMIME_HAVE_CSTDINT)
470
471 CHECK_TYPE_SIZE("char" SIZEOF_CHAR)
472 CHECK_TYPE_SIZE("short" SIZEOF_SHORT)
473 CHECK_TYPE_SIZE("int" SIZEOF_INT)
474 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
475 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
476 CHECK_TYPE_SIZE("__int64" SIZEOF___INT64)
477
478 SET(CMAKE_EXTRA_INCLUDE_FILES cstdint)
479 CHECK_TYPE_SIZE("int64_t" SIZEOF_INT64_T)
480 SET(CMAKE_EXTRA_INCLUDE_FILES)
481
482
483 IF(SIZEOF_CHAR EQUAL 1)
484 SET(VMIME_8BIT_TYPE "char")
485 ELSE()
486 MESSAGE(FATAL_ERROR "Cannot determine 8-bit type")
487 ENDIF()
488
489 IF(SIZEOF_INT EQUAL 2)
490 SET(VMIME_16BIT_TYPE "int")
491 ELSE()
492 IF(SIZEOF_SHORT EQUAL 2)
493 SET(VMIME_16BIT_TYPE "short")
494 ELSE()
495 MESSAGE(FATAL_ERROR "Cannot determine 16-bit type")
496 ENDIF()
497 ENDIF()
498
499 IF(SIZEOF_INT EQUAL 4)
500 SET(VMIME_32BIT_TYPE "int")
501 ELSE()
502 IF(SIZEOF_LONG EQUAL 4)
503 SET(VMIME_32BIT_TYPE "long")
504 ELSE()
505 IF(SIZEOF_LONG_LONG EQUAL 4)
506 SET(VMIME_32BIT_TYPE "long long")
507 ELSE()
508 MESSAGE(FATAL_ERROR "Cannot determine 32-bit type")
509 ENDIF()
510 ENDIF()
511 ENDIF()
512
513 IF(SIZEOF_INT EQUAL 8)
514 SET(VMIME_64BIT_TYPE "int")
515 ELSE()
516 IF(SIZEOF_LONG EQUAL 8)
517 SET(VMIME_64BIT_TYPE "long")
518 ELSE()
519 IF(SIZEOF_LONG_LONG EQUAL 8)
520 SET(VMIME_64BIT_TYPE "long long")
521 ELSE()
522 IF(SIZEOF_INT64_T EQUAL 8)
523 SET(VMIME_64BIT_TYPE "int64_t")
524 ELSE()
525 IF(SIZEOF___INT64 EQUAL 8)
526 SET(VMIME_64BIT_TYPE "__int64")
527 ELSE()
528 MESSAGE(FATAL_ERROR "Cannot determine 64-bit type")
529 ENDIF()
530 ENDIF()
531 ENDIF()
532 ENDIF()
533 ENDIF()
534
535
536 INCLUDE(cmake/TargetArch.cmake)
537 TARGET_ARCHITECTURE(CMAKE_TARGET_ARCHITECTURES)
538
539 CHECK_TYPE_SIZE(size_t VMIME_HAVE_SIZE_T)
540
541
542 ##############################################################################
543 # Sendmail path
544
545 FOREACH (SENDMAIL_PATH /usr/sbin/sendmail /usr/lib/sendmail /usr/bin/sendmail /bin/sendmail /var/qmail/bin/qmail-inject /bin/cgimail)
546 IF(EXISTS ${SENDMAIL_PATH})
547 MESSAGE(STATUS "Sendmail binary found at ${SENDMAIL_PATH}")
548 SET(VMIME_DEFAULT_SENDMAIL_PATH ${SENDMAIL_PATH})
549 ENDIF()
550 ENDFOREACH(SENDMAIL_PATH)
551
552 SET(
553 VMIME_SENDMAIL_PATH
554 ${VMIME_DEFAULT_SENDMAIL_PATH}
555 CACHE
556 STRING
557 "Specifies the path to sendmail binary"
558 )
559
560
561 ##############################################################################
562 # Messaging features
563
564 # Module
565 OPTION(
566 VMIME_HAVE_MESSAGING_FEATURES
567 "Enable messaging features (connection to IMAP, POP3, SMTP...)"
568 ON
569 )
570
571 # Protocols
572 OPTION(
573 VMIME_HAVE_MESSAGING_PROTO_POP3
574 "Enable POP3 protocol"
575 ON
576 )
577
578 OPTION(
579 VMIME_HAVE_MESSAGING_PROTO_SMTP
580 "Enable SMTP protocol"
581 ON
582 )
583
584 OPTION(
585 VMIME_HAVE_MESSAGING_PROTO_IMAP
586 "Enable IMAP protocol"
587 ON
588 )
589
590 OPTION(
591 VMIME_HAVE_MESSAGING_PROTO_MAILDIR
592 "Enable Maildir protocol"
593 ON
594 )
595
596 OPTION(
597 VMIME_HAVE_MESSAGING_PROTO_SENDMAIL
598 "Enable Sendmail protocol"
599 ON
600 )
601
602
603 ##############################################################################
604 # File-system features
605
606 OPTION(
607 VMIME_HAVE_FILESYSTEM_FEATURES
608 "Enable file-system features (required for file attachments and Maildir)"
609 ON
610 )
611
612
613 ##############################################################################
614 # SASL support
615
616 INCLUDE(cmake/FindGSasl.cmake)
617
618 OPTION(
619 VMIME_HAVE_SASL_SUPPORT
620 "Enable SASL support (requires GNU SASL library)"
621 ON
622 )
623
624 IF(VMIME_HAVE_SASL_SUPPORT)
625
626 INCLUDE_DIRECTORIES(
627 ${INCLUDE_DIRECTORIES}
628 ${GSASL_INCLUDE_DIR}
629 )
630
631 IF(VMIME_BUILD_SHARED_LIBRARY)
632 TARGET_LINK_LIBRARIES(
633 ${VMIME_LIBRARY_NAME}
634 ${TARGET_LINK_LIBRARIES}
635 ${GSASL_LIBRARIES}
636 )
637 ENDIF()
638
639 SET(VMIME_PKGCONFIG_REQUIRES "${VMIME_PKGCONFIG_REQUIRES} libgsasl")
640
641 ENDIF()
642
643
644 ##############################################################################
645 # SSL/TLS support
646
647 INCLUDE(FindGnuTLS)
648 INCLUDE(FindOpenSSL)
649
650 SET(CMAKE_REQUIRED_LIBRARIES "${GNUTLS_LIBRARY}")
651 CHECK_FUNCTION_EXISTS(gnutls_priority_set_direct VMIME_HAVE_GNUTLS_PRIORITY_FUNCS)
652
653
654 OPTION(
655 VMIME_HAVE_TLS_SUPPORT
656 "SSL/TLS support (requires either GNU TLS or OpenSSL library)"
657 ON
658 )
659
660 SET(
661 VMIME_TLS_SUPPORT_LIB
662 "gnutls"
663 CACHE
664 STRING
665 "Library to use for SSL/TLS conversion"
666 )
667 SET_PROPERTY(
668 CACHE
669 VMIME_TLS_SUPPORT_LIB
670 PROPERTY STRINGS gnutls openssl
671 )
672
673
674 IF(VMIME_HAVE_TLS_SUPPORT)
675
676 IF(VMIME_TLS_SUPPORT_LIB STREQUAL "gnutls")
677
678 INCLUDE_DIRECTORIES(
679 ${INCLUDE_DIRECTORIES}
680 ${GNUTLS_INCLUDE_DIR}
681 )
682
683 LINK_DIRECTORIES(
684 ${LINK_DIRECTORIES}
685 ${GNUTLS_LIBRARY_DIRS}
686 )
687
688 IF(VMIME_BUILD_SHARED_LIBRARY)
689 TARGET_LINK_LIBRARIES(
690 ${VMIME_LIBRARY_NAME}
691 ${TARGET_LINK_LIBRARIES}
692 ${GNUTLS_LIBRARY}
693 )
694 ENDIF()
695
696 SET(VMIME_PKGCONFIG_REQUIRES "${VMIME_PKGCONFIG_REQUIRES} gnutls")
697
698 SET(VMIME_TLS_SUPPORT_LIB_IS_GNUTLS "ON")
699 SET(VMIME_TLS_SUPPORT_LIB_IS_OPENSSL "OFF")
700
701 ELSEIF(VMIME_TLS_SUPPORT_LIB STREQUAL "openssl")
702
703 INCLUDE_DIRECTORIES(
704 ${INCLUDE_DIRECTORIES}
705 ${OPENSSL_INCLUDE_DIR}
706 )
707
708 IF(VMIME_BUILD_SHARED_LIBRARY)
709 TARGET_LINK_LIBRARIES(
710 ${VMIME_LIBRARY_NAME}
711 ${TARGET_LINK_LIBRARIES}
712 ${OPENSSL_LIBRARIES}
713 )
714 ENDIF()
715
716 SET(VMIME_PKGCONFIG_REQUIRES "${VMIME_PKGCONFIG_REQUIRES} openssl")
717
718 SET(VMIME_TLS_SUPPORT_LIB_IS_GNUTLS "OFF")
719 SET(VMIME_TLS_SUPPORT_LIB_IS_OPENSSL "ON")
720
721 ELSE()
722
723 MESSAGE(FATAL_ERROR "TLS support is enabled, but no TLS/SSL library was selected/found")
724
725 ENDIF()
726
727 ENDIF(VMIME_HAVE_TLS_SUPPORT)
728
729
730 ##############################################################################
731 # Charset conversion library
732
733 INCLUDE(cmake/FindIconv.cmake)
734 INCLUDE(cmake/FindICU.cmake)
735
736 FIND_PACKAGE(ICU QUIET)
737
738 IF(WIN32)
739 SET(VMIME_CHARSETCONV_LIB_DETECTED "win")
740 ELSEIF(ICU_LIBRARIES)
741 SET(VMIME_CHARSETCONV_LIB_DETECTED "icu")
742 ELSEIF(ICONV_FOUND)
743 SET(VMIME_CHARSETCONV_LIB_DETECTED "iconv")
744 ENDIF()
745
746 SET(
747 VMIME_CHARSETCONV_LIB
748 "${VMIME_CHARSETCONV_LIB_DETECTED}"
749 CACHE
750 STRING
751 "Library to use for charset conversion"
752 )
753 SET_PROPERTY(
754 CACHE
755 VMIME_CHARSETCONV_LIB
756 PROPERTY STRINGS win iconv icu
757 )
758
759
760 IF(VMIME_CHARSETCONV_LIB STREQUAL "iconv")
761
762 INCLUDE_DIRECTORIES(
763 ${INCLUDE_DIRECTORIES}
764 ${ICONV_INCLUDE_DIR}
765 )
766
767 IF(VMIME_BUILD_SHARED_LIBRARY)
768 TARGET_LINK_LIBRARIES(
769 ${VMIME_LIBRARY_NAME}
770 ${TARGET_LINK_LIBRARIES}
771 ${ICONV_LIBRARIES}
772 )
773 ENDIF()
774
775 SET(VMIME_PKGCONFIG_LIBS "${VMIME_PKGCONFIG_LIBS} ${ICONV_LIBRARIES}")
776 SET(VMIME_PKGCONFIG_CFLAGS "${VMIME_PKGCONFIG_CFLAGS} -I${ICONV_INCLUDE_DIR}")
777
778 SET(VMIME_CHARSETCONV_LIB_IS_ICONV "ON")
779 SET(VMIME_CHARSETCONV_LIB_IS_ICU "OFF")
780 SET(VMIME_CHARSETCONV_LIB_IS_WIN "OFF")
781
782 ELSEIF(VMIME_CHARSETCONV_LIB STREQUAL "icu")
783
784 INCLUDE_DIRECTORIES(
785 ${INCLUDE_DIRECTORIES}
786 ${ICU_INCLUDE_DIRS}
787 )
788
789 IF(VMIME_BUILD_SHARED_LIBRARY)
790 TARGET_LINK_LIBRARIES(
791 ${VMIME_LIBRARY_NAME}
792 ${TARGET_LINK_LIBRARIES}
793 ${ICU_LIBRARIES}
794 )
795 ENDIF()
796
797 SET(VMIME_PKGCONFIG_LIBS "${VMIME_PKGCONFIG_LIBS} ${ICU_LIBRARIES}")
798 SET(VMIME_PKGCONFIG_CFLAGS "${VMIME_PKGCONFIG_CFLAGS} -I${ICU_INCLUDE_DIRS}")
799
800 SET(VMIME_CHARSETCONV_LIB_IS_ICONV "OFF")
801 SET(VMIME_CHARSETCONV_LIB_IS_ICU "ON")
802 SET(VMIME_CHARSETCONV_LIB_IS_WIN "OFF")
803
804 ELSEIF(VMIME_CHARSETCONV_LIB STREQUAL "win")
805
806 SET(VMIME_CHARSETCONV_LIB_IS_ICONV "OFF")
807 SET(VMIME_CHARSETCONV_LIB_IS_ICU "OFF")
808 SET(VMIME_CHARSETCONV_LIB_IS_WIN "ON")
809
810 ELSE()
811
812 MESSAGE(FATAL_ERROR "No charset conversion library was selected/found")
813
814 ENDIF()
815
816
817 ##############################################################################
818 # Language features
819
820 # C++11
821 INCLUDE(cmake/cmake-cxx11/Modules/CheckCXX11Features.cmake)
822
823 # Smart pointers
824 #
825 # If a C++11-compliant compiler is available and supports std::shared_ptr<>,
826 # use the standard implementation. Else, use boost::shared_ptr<>.
827 # In any case, let the user override the choice with VMIME_SHARED_PTR_USE_CXX
828 # and VMIME_SHARED_PTR_USE_BOOST variables.
829
830 CHECK_CXX_SOURCE_COMPILES(
831 "
832 #include <memory>
833 struct A { int foo; };
834 int main() {
835 std::shared_ptr <A> a = std::make_shared <A>();
836 return 0;
837 }
838 "
839 VMIME_HAS_CXX11_SHARED_PTR
840 )
841
842 IF(NOT VMIME_SHARED_PTR_USE_CXX AND NOT VMIME_SHARED_PTR_USE_BOOST)
843 IF(CXX11_COMPILER_FLAGS AND VMIME_HAS_CXX11_SHARED_PTR)
844 # If std::shared_ptr<> is available, use it by default
845 SET(VMIME_SHARED_PTR_USE_CXX_DEFAULT ON)
846 SET(VMIME_SHARED_PTR_USE_BOOST_DEFAULT OFF)
847 ELSE()
848 # Else, set default to boost::shared_ptr<>
849 SET(VMIME_SHARED_PTR_USE_CXX_DEFAULT OFF)
850 SET(VMIME_SHARED_PTR_USE_BOOST_DEFAULT ON)
851 ENDIF()
852 ENDIF()
853
854 OPTION(
855 VMIME_SHARED_PTR_USE_CXX
856 "Use standard std::shared_ptr<> (requires a C++11 compiler)"
857 ${VMIME_SHARED_PTR_USE_CXX_DEFAULT}
858 )
859
860 OPTION(
861 VMIME_SHARED_PTR_USE_BOOST
862 "Use boost::shared_ptr<> (requires Boost)"
863 ${VMIME_SHARED_PTR_USE_BOOST_DEFAULT}
864 )
865
866 IF(VMIME_SHARED_PTR_USE_CXX AND VMIME_SHARED_PTR_USE_BOOST)
867 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!)")
868 ENDIF()
869
870 IF(VMIME_SHARED_PTR_USE_CXX)
871
872 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX11_COMPILER_FLAGS}")
873
874 IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
875 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
876 ENDIF()
877
878 MESSAGE(STATUS "Checking support for shared_ptr<>: built-in (C++11)")
879
880 ELSEIF(VMIME_SHARED_PTR_USE_BOOST)
881
882 # Depends on Boost library if C++11 is not supported
883 FIND_PACKAGE(Boost)
884
885 IF(Boost_FOUND)
886 INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
887 ELSE()
888 MESSAGE(FATAL_ERROR "Boost library is required for shared_ptr<>, unless you compile using C++11")
889 ENDIF()
890
891 MESSAGE(STATUS "Checking support for shared_ptr<>: boost library")
892
893 ELSE()
894
895 MESSAGE(FATAL_ERROR "No implementation for shared_ptr<> was selected/found")
896
897 ENDIF()
898
899
900 ##############################################################################
901 # Platform
902
903 SET(VMIME_PLATFORM_IS_POSIX OFF)
904 SET(VMIME_PLATFORM_IS_WINDOWS OFF)
905
906 IF(WIN32)
907 SET(VMIME_PLATFORM_IS_WINDOWS ON)
908 ELSE()
909 SET(VMIME_PLATFORM_IS_POSIX ON)
910 ENDIF()
911
912
913 ##############################################################################
914 # Platform-specific checks
915
916 CHECK_FUNCTION_EXISTS(gmtime_s VMIME_HAVE_GMTIME_S)
917 CHECK_FUNCTION_EXISTS(gmtime_r VMIME_HAVE_GMTIME_R)
918 CHECK_FUNCTION_EXISTS(localtime_s VMIME_HAVE_LOCALTIME_S)
919 CHECK_FUNCTION_EXISTS(localtime_r VMIME_HAVE_LOCALTIME_R)
920 CHECK_FUNCTION_EXISTS(strcpy_s VMIME_HAVE_STRCPY_S)
921
922
923 ##############################################################################
924 # Windows-specific checks
925
926 IF(WIN32)
927
928 # Winsock
929 CHECK_LIBRARY_EXISTS("ws2_32" getch "${CMAKE_LIBRARY_PATH}" VMIME_HAVE_LIBWS2_32)
930
931 IF(VMIME_HAVE_LIBWS2_32)
932 IF(VMIME_BUILD_SHARED_LIBRARY)
933 TARGET_LINK_LIBRARIES(
934 ${VMIME_LIBRARY_NAME}
935 ${TARGET_LINK_LIBRARIES}
936 "ws2_32"
937 )
938 ELSE()
939 SET(VMIME_PKGCONFIG_LIBS "${VMIME_PKGCONFIG_LIBS} -lws2_32")
940 ENDIF()
941 ENDIF()
942
943 # MLang
944 CHECK_INCLUDE_FILES(Mlang.h VMIME_HAVE_MLANG_H)
945 CHECK_LIBRARY_EXISTS("mlang" ConvertINetString "${CMAKE_LIBRARY_PATH}" VMIME_HAVE_MLANG_LIB)
946
947 IF(VMIME_HAVE_MLANG_H)
948 IF(VMIME_HAVE_MLANG_LIB)
949 SET(VMIME_HAVE_MLANG ON)
950
951 IF(VMIME_BUILD_SHARED_LIBRARY)
952 TARGET_LINK_LIBRARIES(
953 ${VMIME_LIBRARY_NAME}
954 ${TARGET_LINK_LIBRARIES}
955 "mlang"
956 )
957 ENDIF()
958 ENDIF()
959 ENDIF()
960
961 ENDIF()
962
963
964 ##############################################################################
965 # POSIX-specific checks
966
967 CHECK_FUNCTION_EXISTS(getaddrinfo VMIME_HAVE_GETADDRINFO)
968 CHECK_FUNCTION_EXISTS(getnameinfo VMIME_HAVE_GETNAMEINFO)
969
970 CHECK_FUNCTION_EXISTS(gettid VMIME_HAVE_GETTID)
971 CHECK_FUNCTION_EXISTS(syscall VMIME_HAVE_SYSCALL)
972 CHECK_SYMBOL_EXISTS(SYS_gettid sys/syscall.h VMIME_HAVE_SYSCALL_GETTID)
973
974 FIND_PACKAGE(Threads)
975
976 IF(VMIME_BUILD_SHARED_LIBRARY)
977 TARGET_LINK_LIBRARIES(
978 ${VMIME_LIBRARY_NAME}
979 ${TARGET_LINK_LIBRARIES}
980 ${CMAKE_THREAD_LIBS_INIT}
981 )
982 ENDIF()
983
984 FIND_LIBRARY(PTHREAD_LIB pthread)
985
986 IF(PTHREAD_LIB)
987 SET(VMIME_HAVE_PTHREAD 1)
988
989 IF(VMIME_BUILD_SHARED_LIBRARY)
990 TARGET_LINK_LIBRARIES(
991 ${VMIME_LIBRARY_NAME}
992 ${TARGET_LINK_LIBRARIES}
993 ${PTHREAD_LIB}
994 )
995 ENDIF()
996 ELSE(PTHREAD_LIB)
997 SET(VMIME_HAVE_PTHREAD 0)
998 ENDIF(PTHREAD_LIB)
999
1000
1001 ##############################################################################
1002 # Additional compiler flags
1003
1004 IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
1005
1006 SET(
1007 CMAKE_CXX_FLAGS
1008 "${CMAKE_CXX_FLAGS} -D_REENTRANT=1 -W -Wall -pedantic -Warray-bounds-pointer-arithmetic -Wold-style-cast -Wconversion -Wcast-align -Wno-sign-conversion"
1009 CACHE STRING
1010 "g++ Compiler Flags"
1011 FORCE
1012 )
1013
1014 SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
1015 SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
1016 SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
1017
1018 #SET(CMAKE_EXE_LINKER_FLAGS "-s")
1019
1020 ELSE()
1021
1022 IF(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
1023
1024 SET(
1025 CMAKE_CXX_FLAGS
1026 "${CMAKE_CXX_FLAGS} -D_REENTRANT=1 -W -Wall -pedantic -Wpointer-arith -Wold-style-cast -Wconversion -Wcast-align -Wno-long-long"
1027 CACHE STRING
1028 "g++ Compiler Flags"
1029 FORCE
1030 )
1031
1032 SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
1033 SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
1034 SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
1035
1036 #SET(CMAKE_EXE_LINKER_FLAGS "-s")
1037
1038 ENDIF()
1039
1040 ENDIF()
1041
1042
1043 ##############################################################################
1044 # Documentation
1045
1046 OPTION(
1047 VMIME_BUILD_DOCUMENTATION
1048 "Build documentation"
1049 ON
1050 )
1051
1052 IF(VMIME_BUILD_DOCUMENTATION)
1053 FIND_PACKAGE(Doxygen)
1054
1055 IF(DOXYGEN_FOUND)
1056 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/Doxyfile.in ${CMAKE_BINARY_DIR}/Doxyfile @ONLY)
1057
1058 # Make a target so that documentation can be generated by running "make doc"
1059 ADD_CUSTOM_TARGET(
1060 doc
1061 ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile
1062 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
1063 COMMENT "Generating API documentation with Doxygen" VERBATIM
1064 )
1065 ENDIF(DOXYGEN_FOUND)
1066 ENDIF(VMIME_BUILD_DOCUMENTATION)
1067
1068 ##############################################################################
1069 # Sanity checks
1070
1071 # Maildir protocol is available only if file-system features are enabled
1072 IF(VMIME_HAVE_MESSAGING_FEATURES AND VMIME_HAVE_MESSAGING_PROTO_MAILDIR AND NOT VMIME_HAVE_FILESYSTEM_FEATURES)
1073 MESSAGE(FATAL_ERROR "Maildir protocol requires file-system support (VMIME_HAVE_FILESYSTEM_FEATURES must be set to ON).")
1074 ENDIF()
1075
1076 # Path to 'sendmail' must be specified if Sendmail protocol is enabled
1077 IF(VMIME_HAVE_MESSAGING_PROTO_SENDMAIL)
1078 IF(NOT VMIME_SENDMAIL_PATH OR VMIME_SENDMAIL_PATH STREQUAL "")
1079 MESSAGE(FATAL_ERROR "Enabling Sendmail protocol requires that you specify path to 'sendmail' binary.")
1080 ENDIF()
1081 ENDIF()
1082
1083
1084 ##############################################################################
1085 # Build examples
1086
1087 IF(VMIME_BUILD_SAMPLES)
1088 ADD_SUBDIRECTORY(examples)
1089 ENDIF()
1090
1091
1092 # Set our configure file
1093 CONFIGURE_FILE(cmake/config.hpp.cmake ${CMAKE_SOURCE_DIR}/src/vmime/config.hpp)
1094
1095 # PkgConfig post-configuration
1096 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/vmime.pc.in ${CMAKE_BINARY_DIR}/vmime.pc @ONLY)
1097 INSTALL(FILES ${CMAKE_BINARY_DIR}/vmime.pc DESTINATION "${VMIME_INSTALL_LIBDIR}/pkgconfig" COMPONENT headers)
1098
1099 INCLUDE(CPack)
1100