SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) PROJECT(madmutt C D) SET(PACKAGE madmutt) # Using Phobos OR Tango (can be specified from cmake command line) if (NOT CMAKE_D_USE_PHOBOS AND NOT CMAKE_D_USE_TANGO) # default to phobos message(STATUS "This application can be built with either Phobos or Tango!") message(STATUS "You did not specify a standard library -- defaulting to Phobos.") message(STATUS "If you wish to use Tango add -DCMAKE_D_USE_TANGO=True to cmake command line.") set(CMAKE_D_USE_PHOBOS True) endif (NOT CMAKE_D_USE_PHOBOS AND NOT CMAKE_D_USE_TANGO) INCLUDE(CMakeDetermineCCompiler) include(Cpkg2c) include(XConfig) ADD_DEFINITIONS(-DHAVE_CONFIG_H) ADD_DEFINITIONS(-D_GNU_SOURCE) INCLUDE_DIRECTORIES(${madmutt_BINARY_DIR} ${madmutt_SOURCE_DIR}) SET(BINDIR "${CMAKE_INSTALL_PREFIX}/bin") SET(DATADIR "${CMAKE_INSTALL_PREFIX}/share") SET(PKGDATADIR "${CMAKE_INSTALL_PREFIX}/share/madmutt") SET(PKGDOCDIR "${CMAKE_INSTALL_PREFIX}/share/doc/madmutt") SET(SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc") SET(VERSION "devel") SET(MUTTLIBS) ADD_DEFINITIONS("-DBINDIR=\\\"${BINDIR}\\\"") ADD_DEFINITIONS("-DPKGDATADIR=\\\"${PKGDATADIR}\\\"") ADD_DEFINITIONS("-DPKGDOCDIR=\\\"${PKGDOCDIR}\\\"") ADD_DEFINITIONS("-DSYSCONFDIR=\\\"${SYSCONFDIR}\\\"") ADD_DEFINITIONS("-DVERSION=\\\"${VERSION}\\\"") ADD_DEFINITIONS("-DMUTTLOCALEDIR=\\\"${DATADIR}/locale\\\"") SET(MAILPATH CACHE STRING "Where new mail is spooled") OPTION(WITH_GPGME "Use GPGME [default: on]" ON) OPTION(WITH_NNTP "Build NNTP support [default: off]") OPTION(WITH_IDN "Use GNU libidn for domain names [default: off]") OPTION(USE_FLOCK "Use flock to lock files [default: off]") OPTION(USE_FCNTL "Use fcntl to lock files [default: on]" ON) OPTION(USE_HCACHE "Enable headers caching [default: off]") FIND_FILE(SENDMAIL sendmail PATHS /usr/sbin /sbin /usr/lib DOC "path to sendmail executable" ) IF(NOT MAILPATH) IF(EXISTS /var/mail) SET(MAILPATH "/var/mail") ELSEIF(EXISTS /var/spool/mail) SET(MAILPATH "/var/spool/mail") ELSEIF(EXISTS /usr/spool/mail) SET(MAILPATH "/usr/spool/mail") ELSEIF(EXISTS /usr/mail) SET(MAILPATH "/usr/mail") ELSE(EXISTS /var/mail) MESSAGE(FATAL_ERROR "Unable to determine MAILPATH") ENDIF(EXISTS /var/mail) ENDIF(NOT MAILPATH) # headers {{{ INCLUDE(CheckIncludeFile) CHECK_INCLUDE_FILE(alloca.h HAVE_ALLOCA_H) CHECK_INCLUDE_FILE(argz.h HAVE_ARGZ_H) CHECK_INCLUDE_FILE(getopt.h HAVE_GETOPT_H) CHECK_INCLUDE_FILE(iconv.h HAVE_ICONV_H) CHECK_INCLUDE_FILE(inttypes.h HAVE_INTTYPES_H) CHECK_INCLUDE_FILE(ioctl.h HAVE_IOCTL_H) CHECK_INCLUDE_FILE(langinfo.h HAVE_LANGINFO_H) CHECK_INCLUDE_FILE(limits.h HAVE_LIMITS_H) CHECK_INCLUDE_FILE(locale.h HAVE_LOCALE_H) CHECK_INCLUDE_FILE(memory.h HAVE_MEMORY_H) CHECK_INCLUDE_FILE(ncurses.h HAVE_NCURSES_H) CHECK_INCLUDE_FILE(ncurses/ncurses.h HAVE_NCURSES_NCURSES_H) CHECK_INCLUDE_FILE(ncursesw/ncurses.h HAVE_NCURSESW_NCURSES_H) CHECK_INCLUDE_FILE(regex.h HAVE_REGEX_H) CHECK_INCLUDE_FILE(stdarg.h HAVE_STDARG_H) CHECK_INCLUDE_FILE(stddef.h HAVE_STDDEF_H) CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H) CHECK_INCLUDE_FILE(stdlib.h HAVE_STDLIB_H) CHECK_INCLUDE_FILE(string.h HAVE_STRING_H) CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H) CHECK_INCLUDE_FILE(sysexits.h HAVE_SYSEXITS_H) CHECK_INCLUDE_FILE(sys/ioctl.h HAVE_SYS_IOCTL_H) CHECK_INCLUDE_FILE(sys/param.h HAVE_SYS_PARAM_H) CHECK_INCLUDE_FILE(sys/resource.h HAVE_SYS_RESOURCE_H) CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H) CHECK_INCLUDE_FILE(sys/time.h HAVE_SYS_TIME_H) CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H) CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H) CHECK_INCLUDE_FILE(unix.h HAVE_UNIX_H) CHECK_INCLUDE_FILE(wchar.h HAVE_WCHAR_H) CHECK_INCLUDE_FILE(wctype.h HAVE_WCTYPE_H) IF(NOT HAVE_ICONV_H) MESSAGE(FATAL_ERROR "inconv.h not found") ENDIF(NOT HAVE_ICONV_H) # }}} # types {{{ INCLUDE(CheckStructMember) CHECK_STRUCT_MEMBER("struct dirent" "d_ino" "dirent.h" HAVE_DIRENT_D_INO) # }}} # functions {{{ INCLUDE (CheckFunctionExists) CHECK_FUNCTION_EXISTS(strlimit HAVE_SETRLIMIT) CHECK_FUNCTION_EXISTS(getsid HAVE_GETSID) CHECK_FUNCTION_EXISTS(setegid HAVE_SETEGID) CHECK_FUNCTION_EXISTS(getopt HAVE_GETOPT) CHECK_FUNCTION_EXISTS(nl_langinfo HAVE_LANGINFO_CODESET) # }}} # libraries {{{ INCLUDE(CheckLibraryExists) INCLUDE(FindPkgConfig) IF(HAVE_NCURSESW_NCURSES_H) SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h") LIST(APPEND MUTTLIBS -lncursesw) ELSEIF(HAVE_NCURSES_H) SET(CMAKE_REQUIRED_INCLUDES "ncurses.h") LIST(APPEND MUTTLIBS -lncurses) ELSEIF(HAVE_NCURSES_H OR HAVE_NCURSES_NCURSES_H) SET(CMAKE_REQUIRED_INCLUDES "ncurses/ncurses.h") LIST(APPEND MUTTLIBS -lncurses) ELSE(HAVE_NCURSESW_NCURSES_H) MESSAGE(FATAL_ERROR "could not find ncurses.h") ENDIF(HAVE_NCURSESW_NCURSES_H) SET(CMAKE_REQUIRED_LIBRARIES ${MUTTLIBS}) CHECK_FUNCTION_EXISTS(resizeterm HAVE_RESIZETERM) SET(CMAKE_REQUIRED_LIBRARIES) SET(CMAKE_REQUIRED_INCLUDES) pkg_search_module(LUA REQUIRED lua5.1) ADD_DEFINITIONS(${LUA_CFLAGS}) LIST(APPEND MUTTLIBS ${LUA_LDFLAGS}) IF(WITH_GPGME) XCONFIG(gpgme-config gpgme_INCDIR gpgme_LINKDIR gpgme_LDFLAGS gpgme_CFLAGS) INCLUDE_DIRECTORIES(${gpgme_INCDIR}) ADD_DEFINITIONS(${gpgme_CFLAGS}) LIST(APPEND MUTTLIBS ${gpgme_LDFLAGS}) SET(HAVE_GPGME 1) ENDIF(WITH_GPGME) XCONFIG(libgnutls-config gnutls_INCDIR gnutls_LINKDIR gnutls_LDFLAGS gnutls_CFLAGS) INCLUDE_DIRECTORIES(${gnutls_INCDIR}) ADD_DEFINITIONS(${gnutls_CFLAGS}) CHECK_INCLUDE_FILE(gnutls/openssl.h HAVE_GNUTLS_OPENSSL_H) LIST(APPEND MUTTLIBS ${gnutls_LDFLAGS}) CHECK_LIBRARY_EXISTS(sasl2 sasl_client_init "" WITH_SASL) IF(NOT WITH_SASL) MESSAGE(FATAL_ERROR "sasl2 not found") ENDIF(NOT WITH_SASL) LIST(APPEND MUTTLIBS -lsasl2) IF(WITH_IDN) pkg_search_module(IDN REQUIRED libidn) LIST(APPEND MUTTLIBS ${IDN_LDFLAGS}) SET(HAVE_LIBIDN 1) ENDIF(WITH_IDN) CHECK_LIBRARY_EXISTS(lockfile lockfile_create "" WITH_LOCKFILE) IF(NOT WITH_LOCKFILE) MESSAGE(FATAL_ERROR "lockfile not found") ENDIF(NOT WITH_LOCKFILE) LIST(APPEND MUTTLIBS -llockfile) IF(USE_HCACHE) OPTION(WITH_QDBM "Use qdbm for header caching [default: on]" ON) OPTION(WITH_GDBM "Use gdbm for header caching [default: off]") SET(USE_HCACHE) IF(WITH_QDBM) pkg_search_module(QDBM REQUIRED qdbm) ADD_DEFINITIONS(${QDBM_CFLAGS}) SET(QDBM_LDFLAGS "${QDBM_LDFLAGS}") # LIST(APPEND MUTTLIBS ${QDBM_LDFLAGS}) LIST(APPEND MUTTLIBS -lqdbm) SET(USE_HCACHE 1) SET(HAVE_QDBM 1) ENDIF(WITH_QDBM) IF(NOT USE_HCACHE AND WITH_GDBM) CHECK_LIBRARY_EXISTS(gdbm gdbm_open "" GDBM) IF(NOT GDBM) MESSAGE(FATAL_ERROR "gdbm not found") ENDIF(NOT GDBM) LIST(APPEND MUTTLIBS -lgdbm) SET(USE_HCACHE 1) SET(HAVE_GDBM 1) ENDIF(NOT USE_HCACHE AND WITH_GDBM) IF(NOT USE_HCACHE) MESSAGE(FATAL_ERROR "no backend for header caching selected") ENDIF(NOT USE_HCACHE) ENDIF(USE_HCACHE) IF(WITH_NNTP AND NOT USE_NNTP) SET(USE_NNTP 1) MESSAGE(STATUS "building NNTP support") ENDIF(WITH_NNTP AND NOT USE_NNTP) # }}} # C flags {{{ # big debug flags SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ggdb3") # Use pipes and not temp files. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe") # optimize even more SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") # let the type char be unsigned by default SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -funsigned-char") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing") # turn on all common warnings SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") # turn on extra warnings SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W") # treat warnings as errors #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wchar-subscripts") # warn about undefined preprocessor identifiers SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef") # warn about local variable shadowing another local variable SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow") # warn about casting of pointers to increased alignment requirements SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align") # make string constants const SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wwrite-strings") # warn about comparisons between signed and unsigned values SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare") # warn about unused declared stuff SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter") # warn about variable use before initialization SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wuninitialized") # warn about variables which are initialized with themselves SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winit-self") # warn about pointer arithmetic on void* and function pointers SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith") # warn about multiple declarations SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls") # warn if the format string is not a string literal #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat-nonliteral") # do not warn about zero-length formats. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format-zero-length") # missing prototypes SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes") # warn about functions without format attribute that should have one SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute") # }}} CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) # we generate some includes ADD_SUBDIRECTORY(lib-lib) ADD_SUBDIRECTORY(lib-mime) ADD_SUBDIRECTORY(lib-sys) ADD_SUBDIRECTORY(lib-ui) ADD_SUBDIRECTORY(imap) ADD_SUBDIRECTORY(lib-mx) ADD_SUBDIRECTORY(lib-lua) ADD_SUBDIRECTORY(po) MADMUTT_SOURCES(madmuttsrc madmuttgen alias.cpkg buffy.cpkg charset.cpkg crypt.cpkg score.cpkg account.c attach.c browser.c commands.c compose.c copy.c editmsg.c flags.c handler.c headers.c help.c hook.c init.c keymap.c mutt_idna.c muttlib.c mutt_sasl.c pager.c pattern.c pop.c postpone.c recvattach.c recvcmd.c send.c sendlib.c sort.c state.c thread.c main.c ) IF(WITH_NNTP) MADMUTT_SOURCES(madmuttsrc madmuttgen nntp.c ) ENDIF(WITH_NNTP) STRING(REGEX REPLACE ";" " " MUTTLIBS "${MUTTLIBS}") ADD_EXECUTABLE(madmutt ${madmuttsrc}) TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap ui lib) SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS "${MUTTLIBS}") # generate_files hack {{{ ADD_CUSTOM_COMMAND( OUTPUT ${madmutt_SOURCE_DIR}/keymap_defs.h DEPENDS ${madmutt_SOURCE_DIR}/OPS ${madmutt_SOURCE_DIR}/tools/gen_defs COMMAND ${madmutt_SOURCE_DIR}/tools/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS" ) ADD_CUSTOM_COMMAND( OUTPUT ${madmutt_SOURCE_DIR}/charset.gperf DEPENDS ${madmutt_SOURCE_DIR}/charset.def COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def" ) ADD_CUSTOM_TARGET(generate_file DEPENDS ${madmuttgen} ${madmutt_SOURCE_DIR}/keymap_defs.h ${madmutt_SOURCE_DIR}/charset.gperf ) ADD_DEPENDENCIES(generate_file generate_files) ADD_DEPENDENCIES(madmutt generate_file) # }}}