workaround a stupid issue in how decoding is performed in mutt *sigh*
[apps/madmutt.git] / CMakeLists.txt
index c72e2ae..68bcb36 100644 (file)
@@ -1,19 +1,23 @@
-PROJECT(madmutt C)
+SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
+
+PROJECT(madmutt C D)
 SET(PACKAGE madmutt)
-SET(CMAKE_MODULE_PATH  ${madmutt_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
 
-# TODO {{{
-# USE_SETGID
-# DOTLOCK_{GROUP,PERMISSION}
-# }}}
+# 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(${CMAKE_BINARY_DIR} ${madmutt_SOURCE_DIR})
+INCLUDE_DIRECTORIES(${madmutt_BINARY_DIR} ${madmutt_SOURCE_DIR})
 
 SET(BINDIR     "${CMAKE_INSTALL_PREFIX}/bin")
 SET(DATADIR    "${CMAKE_INSTALL_PREFIX}/share")
@@ -32,23 +36,13 @@ 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_LIBESMTP "Use libESMTP [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)
@@ -77,8 +71,6 @@ 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)
@@ -117,120 +109,82 @@ 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}")
+INCLUDE(FindPkgConfig)
+
+FIND_LIBRARY(LIBUTIL NAMES util)
+IF(NOT LIBUTIL)
+    MESSAGE(FATAL_ERROR "could not find libutil")
+ENDIF(NOT LIBUTIL)
+LIST(APPEND MUTTLIBS -lutil)
+
+FIND_LIBRARY(NCURSESW NAMES ncursesw)
+IF(NOT NCURSESW OR NOT HAVE_NCURSESW_NCURSES_H)
+    MESSAGE(FATAL_ERROR "could not libncursesw")
+ENDIF(NOT NCURSESW OR NOT HAVE_NCURSESW_NCURSES_H)
+SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h")
+LIST(APPEND MUTTLIBS -lncursesw)
+
+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})
-    SET(MUTTLIBS "${MUTTLIBS} ${gpgme_LDFLAGS}")
+    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})
-SET(MUTTLIBS "${MUTTLIBS} ${gnutls_LDFLAGS}")
+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)
-SET(MUTTLIBS "${MUTTLIBS} -lsasl2")
+LIST(APPEND MUTTLIBS -lsasl2)
 
 IF(WITH_IDN)
-    PKGCONFIG(libidn idn_INCDIR idn_LINKDIR idn_LDFLAGS idn_CFLAGS)
-    SET(MUTTLIBS "${MUTTLIBS} ${idn_LDFLAGS}")
+    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_TC   "Use tokyocabinet 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}")
+    if(WITH_TC)
+        pkg_search_module(TC REQUIRED tokyocabinet)
+        ADD_DEFINITIONS(${TC_CFLAGS})
+        LIST(APPEND MUTTLIBS ${TC_LDFLAGS})
         SET(USE_HCACHE 1)
-        SET(HAVE_QDBM 1)
-    ENDIF(WITH_QDBM)
+        SET(HAVE_TOKYOCABINET 1)
+    ENDIF(WITH_TC)
 
     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")
+        LIST(APPEND MUTTLIBS -lgdbm)
         SET(USE_HCACHE 1)
         SET(HAVE_GDBM 1)
     ENDIF(NOT USE_HCACHE AND WITH_GDBM)
@@ -240,16 +194,6 @@ IF(USE_HCACHE)
     ENDIF(NOT USE_HCACHE)
 ENDIF(USE_HCACHE)
 
-IF(WITH_LIBESMTP)
-    SET(USE_LIBESMTP 1)
-    SET(MUTTLIBS "${MUTTLIBS} -lesmtp")
-ENDIF(WITH_LIBESMTP)
-
-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
@@ -298,6 +242,36 @@ 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")
 # }}}
+# D flags {{{
+# big debug flags
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -ggdb3")
+# Use pipes and not temp files.
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -pipe")
+# optimize even more
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -O2")
+# let the type char be unsigned by default
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -funsigned-char")
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -fstrict-aliasing")
+# turn on all common warnings
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wall")
+# turn on extra warnings
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -W")
+# treat warnings as errors
+#SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Werror")
+# warn about local variable shadowing another local variable
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wshadow")
+# warn about casting of pointers to increased alignment requirements
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wcast-align")
+# warn about comparisons between signed and unsigned values
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wsign-compare")
+# warn about unused declared stuff
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wunused")
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wno-unused-parameter")
+# warn about variable use before initialization
+SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wuninitialized")
+# let's read GPGME's Reference Manual
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FILE_OFFSET_BITS=64")
+# }}}
 
 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
 
@@ -307,28 +281,24 @@ ADD_SUBDIRECTORY(lib-mime)
 ADD_SUBDIRECTORY(lib-sys)
 ADD_SUBDIRECTORY(lib-ui)
 ADD_SUBDIRECTORY(imap)
-IF(WITH_NNTP)
-    ADD_SUBDIRECTORY(nntp)
-ENDIF(WITH_NNTP)
 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
-    base64.c
-    browser.c
     commands.c
     compose.c
     copy.c
     editmsg.c
     flags.c
-    from.c
     handler.c
     headers.c
     help.c
@@ -344,11 +314,8 @@ MADMUTT_SOURCES(madmuttsrc madmuttgen
     postpone.c
     recvattach.c
     recvcmd.c
-    remailer.c
-    score.c
     send.c
     sendlib.c
-    send_smtp.c
     sort.c
     state.c
     thread.c
@@ -356,23 +323,20 @@ MADMUTT_SOURCES(madmuttsrc madmuttgen
     main.c
 )
 
+STRING(REGEX REPLACE ";" " " MUTTLIBS "${MUTTLIBS}")
 ADD_EXECUTABLE(madmutt ${madmuttsrc})
-IF(WITH_NNTP)
-    TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap nntp ui lib)
-ELSE(WITH_NNTP)
-    TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap ui lib)
-ENDIF(WITH_NNTP)
-SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS ${MUTTLIBS})
-
-ADD_EXECUTABLE(madmutt_dotlock dotlock.c)
-TARGET_LINK_LIBRARIES(madmutt_dotlock lib)
+TARGET_LINK_LIBRARIES(madmutt mime sys mx lua ui imap lib)
+SET_TARGET_PROPERTIES(madmutt PROPERTIES
+    LINK_FLAGS "${MUTTLIBS}"
+    #    LINKER_LANGUAGE D
+)
 
 # generate_files hack {{{
 
 ADD_CUSTOM_COMMAND(
     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
-    DEPENDS ${madmutt_SOURCE_DIR}/OPS ${madmutt_SOURCE_DIR}/gen_defs
-    COMMAND ${madmutt_SOURCE_DIR}/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${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(