PROJECT(madmutt C) SET(PACKAGE madmutt) SET(CMAKE_MODULE_PATH ${madmutt_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) # TODO {{{ # USE_SETGID # DOTLOCK_{GROUP,PERMISSION} # }}} 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(WITH_SLANG "Use S-Lang instead of ncurses [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" ) FIND_FILE(MIXMASTER mixmaster DOC "path to mixmaster") IF(NOT MIXMASTER) SET(MIXMASTER "mixmaster") ENDIF(NOT MIXMASTER) 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(isctype HAVE_ISCTYPE) CHECK_FUNCTION_EXISTS(getopt HAVE_GETOPT) CHECK_FUNCTION_EXISTS(regcomp HAVE_REGCOMP) CHECK_FUNCTION_EXISTS(iswalnum HAVE_ISWALNUM) CHECK_FUNCTION_EXISTS(iswalpha HAVE_ISWALPHA) CHECK_FUNCTION_EXISTS(iswcntrl HAVE_ISWCNTRL) CHECK_FUNCTION_EXISTS(iswdigit HAVE_ISWDIGIT) CHECK_FUNCTION_EXISTS(iswgraph HAVE_ISWGRAPH) CHECK_FUNCTION_EXISTS(iswlower HAVE_ISWLOWER) CHECK_FUNCTION_EXISTS(iswprint HAVE_ISWPRINT) CHECK_FUNCTION_EXISTS(iswpunct HAVE_ISWPUNCT) CHECK_FUNCTION_EXISTS(iswspace HAVE_ISWSPACE) CHECK_FUNCTION_EXISTS(iswupper HAVE_ISWUPPER) CHECK_FUNCTION_EXISTS(iswxdigit HAVE_ISWXDIGIT) CHECK_FUNCTION_EXISTS(towupper HAVE_TOWUPPER) CHECK_FUNCTION_EXISTS(towlower HAVE_TOWLOWER) CHECK_FUNCTION_EXISTS(nl_langinfo HAVE_LANGINFO_CODESET) # }}} # libraries {{{ INCLUDE(CheckLibraryExists) INCLUDE(UsePkgConfig) IF(WITH_SLANG) IF(EXISTS ${CMAKE_INSTALL_PREFIX}/include/slang) INCLUDE_DIRECTORIES(${CMAKE_INSTALL_PREFIX}/include/slang) ELSEIF(EXISTS /usr/include/slang) INCLUDE_DIRECTORIES(/usr/include/slang) ENDIF(EXISTS ${CMAKE_INSTALL_PREFIX}/include/slang) CHECK_LIBRARY_EXISTS(slang SLtt_get_terminfo "" USE_SLANG_CURSES) IF(NOT USE_SLANG_CURSES) MESSAGE(FATAL_ERROR "s-lang not found") ENDIF(NOT USE_SLANG_CURSES) ELSE(WITH_SLANG) IF(HAVE_NCURSESW_NCURSES_H) SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h") SET(MUTTLIBS "${MUTTLIBS} -lncursesw") ELSEIF(HAVE_NCURSES_H) SET(CMAKE_REQUIRED_INCLUDES "ncurses.h") SET(MUTTLIBS "${MUTTLIBS} -lncurses") ELSEIF(HAVE_NCURSES_H OR HAVE_NCURSES_NCURSES_H) SET(CMAKE_REQUIRED_INCLUDES "ncurses/ncurses.h") SET(MUTTLIBS "${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(start_color HAVE_START_COLOR) CHECK_FUNCTION_EXISTS(typeahead HAVE_TYPEAHEAD) CHECK_FUNCTION_EXISTS(bkgdset HAVE_BKGDSET) CHECK_FUNCTION_EXISTS(curs_set HAVE_CURS_SET) CHECK_FUNCTION_EXISTS(meta HAVE_META) CHECK_FUNCTION_EXISTS(use_default_colors HAVE_USE_DEFAULT_COLORS) CHECK_FUNCTION_EXISTS(resizeterm HAVE_RESIZETERM) SET(CMAKE_REQUIRED_LIBRARIES) SET(CMAKE_REQUIRED_INCLUDES) ENDIF(WITH_SLANG) PKGCONFIG(lua5.1 lua_INCDIR lua_LINKDIR lua_LDFLAGS lua_CFLAGS) MESSAGE(STATUS "found lua5.1 at: INCDIR ${lua_INCDIR}") INCLUDE_DIRECTORIES(${lua_INCDIR}) ADD_DEFINITIONS(${lua_CFLAGS}) SET(MUTTLIBS "${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}) SET(MUTTLIBS "${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) SET(MUTTLIBS "${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) SET(MUTTLIBS "${MUTTLIBS} -lsasl2") IF(WITH_IDN) PKGCONFIG(libidn idn_INCDIR idn_LINKDIR idn_LDFLAGS idn_CFLAGS) SET(MUTTLIBS "${MUTTLIBS} ${idn_LDFLAGS}") SET(HAVE_LIBIDN 1) ENDIF(WITH_IDN) 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) PKGCONFIG(qdbm qdbm_INCDIR qdbm_LINKDIR qdbm_LDFLAGS qdbm_CFLAGS) IF(qdbm_LDFLAGS) MESSAGE(STATUS "qdbm found") ELSE(qdbm_LDFLAGS) MESSAGE(FATAL_ERROR "qdbm not found") ENDIF(qdbm_LDFLAGS) INCLUDE_DIRECTORIES(${qdbm_INCDIR}) ADD_DEFINITIONS(${qdbm_CFLAGS}) SET(MUTTLIBS "${MUTTLIBS} ${qdbm_LDFLAGS}") 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) SET(MUTTLIBS "${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) 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 from.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 remailer.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) ADD_EXECUTABLE(madmutt ${madmuttsrc}) TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap ui lib) SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS ${MUTTLIBS}) ADD_EXECUTABLE(madmutt_dotlock dotlock.c) TARGET_LINK_LIBRARIES(madmutt_dotlock lib) # 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) # }}}