| 1 | cmake_minimum_required(VERSION 3.28 FATAL_ERROR) |
| 2 | |
| 3 | # Project |
| 4 | project(libi2ncommon) |
| 5 | |
| 6 | # Version settings |
| 7 | set(VERSION 2.12) |
| 8 | |
| 9 | SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}") |
| 10 | |
| 11 | # CMake |
| 12 | if("${CMAKE_BUILD_TYPE}" STREQUAL "") |
| 13 | set(CMAKE_BUILD_TYPE Debug) |
| 14 | endif("${CMAKE_BUILD_TYPE}" STREQUAL "") |
| 15 | set(CMAKE_COLOR_MAKEFILE ON) |
| 16 | |
| 17 | # Debug build |
| 18 | message("-- Build type: ${CMAKE_BUILD_TYPE}") |
| 19 | if(${CMAKE_BUILD_TYPE} STREQUAL Debug) |
| 20 | add_definitions(-DDEBUG) |
| 21 | endif(${CMAKE_BUILD_TYPE} STREQUAL Debug) |
| 22 | |
| 23 | # Enable all warnings |
| 24 | add_definitions("-Wall") |
| 25 | |
| 26 | # Set components |
| 27 | set(CPACK_COMPONENTS_ALL sharedlibs staticlibs headers) |
| 28 | set(CPACK_COMPONENT_SHAREDLIBS_DISPLAY_NAME "Shared libraries") |
| 29 | set(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C++ Headers") |
| 30 | |
| 31 | set(CPACK_COMPONENT_SHAREDLIBS_DESCRIPTION |
| 32 | "Shared library for general use.") |
| 33 | set(CPACK_COMPONENT_HEADERS_DESCRIPTION |
| 34 | "C/C++ header files.") |
| 35 | |
| 36 | set(CPACK_COMPONENT_SHAREDLIBS_GROUP "Development") |
| 37 | set(CPACK_COMPONENT_HEADERS_GROUP "Development") |
| 38 | |
| 39 | # Create suffix to eventually install in lib64 |
| 40 | IF(CMAKE_SIZEOF_VOID_P EQUAL 4) |
| 41 | SET(LIB_SUFFIX "") |
| 42 | SET(PACK_ARCH "") |
| 43 | ELSE(CMAKE_SIZEOF_VOID_P EQUAL 4) |
| 44 | SET(LIB_SUFFIX 64) |
| 45 | SET(PACK_ARCH .x86_64) |
| 46 | endif(CMAKE_SIZEOF_VOID_P EQUAL 4) |
| 47 | |
| 48 | # Package information |
| 49 | set(CPACK_PACKAGE_VERSION ${VERSION}) |
| 50 | set(CPACK_PACKAGE_CONTACT "Intra2net AG <libi2ncommon@developer.intra2net.com>") |
| 51 | set(CPACK_PACKAGE_DESCRIPTION "libi2ncommon library.") |
| 52 | set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${CPACK_PACKAGE_DESCRIPTION} |
| 53 | ) |
| 54 | # Package settings |
| 55 | set(CPACK_GENERATOR "DEB;RPM") |
| 56 | set(CPACK_CMAKE_GENERATOR "Unix Makefiles") |
| 57 | set(CPACK_PACKAGE_NAME ${PROJECT_NAME}) |
| 58 | set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}${PACK_ARCH}) |
| 59 | |
| 60 | set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/Linking-Exception.txt) |
| 61 | set(CPACK_RESOURCE_FILE_README ${CMAKE_SOURCE_DIR}/COPYING.GPL) |
| 62 | |
| 63 | set(CPACK_SOURCE_GENERATOR TGZ) |
| 64 | set(CPACK_SOURCE_IGNORE_FILES |
| 65 | "~$" |
| 66 | "\\\\.git" |
| 67 | "build" |
| 68 | "build-rpm" |
| 69 | ) |
| 70 | set(CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_FILE_NAME}) |
| 71 | |
| 72 | # "make dist" target |
| 73 | set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${VERSION}) |
| 74 | add_custom_target(dist |
| 75 | COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD |
| 76 | | bzip2 > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2 |
| 77 | WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) |
| 78 | |
| 79 | # documentation |
| 80 | option(DOCUMENTATION "Generate API documentation with Doxygen" ON) |
| 81 | find_package(Doxygen) |
| 82 | if(DOCUMENTATION AND DOXYGEN_FOUND) |
| 83 | # Set variables |
| 84 | set(PACKAGE libi2ncommon) |
| 85 | set(top_srcdir ${CMAKE_SOURCE_DIR}) |
| 86 | |
| 87 | # Find doxy config |
| 88 | message(STATUS "Doxygen found.") |
| 89 | set(DOXY_DIR "${CMAKE_SOURCE_DIR}/doc") |
| 90 | set(DOXY_CONFIG "${DOXY_DIR}/Doxyfile.in") |
| 91 | |
| 92 | # Copy doxy.config.in |
| 93 | configure_file("${DOXY_CONFIG}" "${CMAKE_BINARY_DIR}/doxy.config") |
| 94 | |
| 95 | # Create doc directory |
| 96 | add_custom_command( |
| 97 | OUTPUT ${CMAKE_BINARY_DIR}/doc |
| 98 | COMMAND rm -rf ${CMAKE_BINARY_DIR}/doc/{html,man} |
| 99 | COMMAND mkdir -p ${CMAKE_BINARY_DIR}/doc |
| 100 | DEPENDS src configlib xmllib utils test |
| 101 | ) |
| 102 | |
| 103 | # Run doxygen |
| 104 | add_custom_command( |
| 105 | OUTPUT ${CMAKE_BINARY_DIR}/doc/html/index.html |
| 106 | COMMAND ${DOXYGEN_EXECUTABLE} "${CMAKE_BINARY_DIR}/doxy.config" |
| 107 | DEPENDS "${CMAKE_BINARY_DIR}/doxy.config" "${CMAKE_BINARY_DIR}/doc" |
| 108 | WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/doc |
| 109 | ) |
| 110 | |
| 111 | add_custom_target(docs ALL DEPENDS ${CMAKE_BINARY_DIR}/doc/html/index.html) |
| 112 | |
| 113 | message(STATUS "Generating API documentation with Doxygen") |
| 114 | else(DOCUMENTATION AND DOXYGEN_FOUND) |
| 115 | message(STATUS "Not generating API documentation") |
| 116 | endif(DOCUMENTATION AND DOXYGEN_FOUND) |
| 117 | |
| 118 | # Conditional build itmes |
| 119 | option(BUILD_XMLLIB "Build xml part of libi2ncommon - needs patched libxml++" OFF) |
| 120 | if (BUILD_XMLLIB) |
| 121 | message(STATUS "Build xml library part") |
| 122 | else(BUILD_XMLLIB) |
| 123 | message(STATUS "NOT building xml library part") |
| 124 | endif(BUILD_XMLLIB) |
| 125 | |
| 126 | option(IMAP_UTF7_SUPPORT "Enable imap modified utf7 support - needs patched libiconv" OFF) |
| 127 | if (IMAP_UTF7_SUPPORT) |
| 128 | message(STATUS "Build imap modified utf7 support") |
| 129 | else(IMAP_UTF7_SUPPORT) |
| 130 | message(STATUS "NOT building imap modified utf7 support") |
| 131 | endif(IMAP_UTF7_SUPPORT) |
| 132 | |
| 133 | # Find external packages |
| 134 | include(FindPkgConfig) |
| 135 | |
| 136 | # Find Boost |
| 137 | find_package(Boost 1.44 COMPONENTS iostreams unit_test_framework thread REQUIRED) |
| 138 | |
| 139 | # Find pcrecpp |
| 140 | pkg_check_modules(PCRECPP REQUIRED libpcrecpp) |
| 141 | INCLUDE_DIRECTORIES(${PCRECPP_INCLUDE_DIRS}) |
| 142 | LINK_DIRECTORIES(${PCRECPP_LIBRARY_DIRS}) |
| 143 | |
| 144 | # Find libxml++ |
| 145 | if (BUILD_XMLLIB) |
| 146 | pkg_check_modules(XMLPP REQUIRED libxml++-2.6) |
| 147 | endif(BUILD_XMLLIB) |
| 148 | |
| 149 | # Find iconv |
| 150 | if (IMAP_UTF7_SUPPORT) |
| 151 | pkg_check_modules(ICONV REQUIRED libiconv) |
| 152 | include_directories($ICONV_INCLUDE_DIRS}) |
| 153 | link_directories(${ICONV_LIBRARY_DIRS}) |
| 154 | endif(IMAP_UTF7_SUPPORT) |
| 155 | |
| 156 | # Detect openssl - for base64 routines |
| 157 | pkg_check_modules(OPENSSL REQUIRED openssl) |
| 158 | INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIRS}) |
| 159 | LINK_DIRECTORIES(${OPENSSL_LIBRARY_DIRS}) |
| 160 | |
| 161 | # pkgconfig output |
| 162 | set(prefix ${CMAKE_INSTALL_PREFIX}) |
| 163 | set(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin) |
| 164 | set(includedir ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}) |
| 165 | set(libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) |
| 166 | |
| 167 | # construct ${BOOST_LDADD} from ${Boost_LIBRARIES} |
| 168 | # forming "-L/some/path -lboost_a -L/other/path -lboost_b" from |
| 169 | # "/some/path/libboost_a.so.3.5;/other/path/libboost_b.so" |
| 170 | set(BOOST_LDADD "") |
| 171 | FOREACH(boost_lib_full ${Boost_IOSTREAMS_LIBRARIES}) |
| 172 | get_filename_component(boost_lib_path ${boost_lib_full} PATH) |
| 173 | get_filename_component(boost_lib_file ${boost_lib_full} NAME_WE) |
| 174 | string(REGEX REPLACE "^lib(boost.+)$" "\\1" boost_lib_name ${boost_lib_file}) |
| 175 | set(BOOST_LDADD "${BOOST_LDADD} -L${boost_lib_path} -l${boost_lib_name}") |
| 176 | ENDFOREACH() |
| 177 | |
| 178 | # construct ${BOOST_CFLAGS} from ${Boost_INCLUDE_DIRS} |
| 179 | string(REGEX REPLACE ";" " -I" BOOST_CFLAGS "${Boost_INCLUDE_DIRS}") |
| 180 | set(BOOST_CFLAGS "-I${BOOST_CFLAGS}") |
| 181 | |
| 182 | # construct ${ICONV_CFLAGS} from ${ICONV_INCLUDE_DIRS} |
| 183 | string(REGEX REPLACE ";" " -I" ICONV_CFLAGS "${ICONV_INCLUDE_DIRS}") |
| 184 | set(ICONV_CFLAGS "-I${ICONV_CFLAGS}") |
| 185 | |
| 186 | configure_file(${CMAKE_SOURCE_DIR}/libi2ncommon.pc.in ${CMAKE_BINARY_DIR}/libi2ncommon.pc @ONLY) |
| 187 | configure_file(${CMAKE_SOURCE_DIR}/libi2ncommon_config.pc.in ${CMAKE_BINARY_DIR}/libi2ncommon_config.pc @ONLY) |
| 188 | configure_file(${CMAKE_SOURCE_DIR}/libi2ncommon_utils.pc.in ${CMAKE_BINARY_DIR}/libi2ncommon_utils.pc @ONLY) |
| 189 | |
| 190 | install(FILES ${CMAKE_BINARY_DIR}/libi2ncommon.pc |
| 191 | ${CMAKE_BINARY_DIR}/libi2ncommon_config.pc |
| 192 | ${CMAKE_BINARY_DIR}/libi2ncommon_utils.pc |
| 193 | DESTINATION lib${LIB_SUFFIX}/pkgconfig) |
| 194 | |
| 195 | if (BUILD_XMLLIB) |
| 196 | configure_file(${CMAKE_SOURCE_DIR}/libi2ncommon_xml.pc.in ${CMAKE_BINARY_DIR}/libi2ncommon_xml.pc @ONLY) |
| 197 | install(FILES ${CMAKE_BINARY_DIR}/libi2ncommon_xml.pc DESTINATION lib${LIB_SUFFIX}/pkgconfig) |
| 198 | endif(BUILD_XMLLIB) |
| 199 | |
| 200 | |
| 201 | include(CPack) |
| 202 | |
| 203 | # Subdirectories |
| 204 | set(CPACK_SET_DESTDIR "ON") |
| 205 | |
| 206 | add_subdirectory(src) |
| 207 | add_subdirectory(configlib) |
| 208 | add_subdirectory(utils) |
| 209 | add_subdirectory(test) |
| 210 | if (BUILD_XMLLIB) |
| 211 | add_subdirectory(xmllib) |
| 212 | endif(BUILD_XMLLIB) |