Add tokyocabinet support
[apps/madmutt.git] / CMakeLists.txt
1 SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
2
3 PROJECT(madmutt C D)
4 SET(PACKAGE madmutt)
5
6 # Using Phobos OR Tango (can be specified from cmake command line)
7 if (NOT CMAKE_D_USE_PHOBOS AND NOT CMAKE_D_USE_TANGO)
8     # default to phobos
9     message(STATUS "This application can be built with either Phobos or Tango!")
10     message(STATUS "You did not specify a standard library -- defaulting to Phobos.")
11     message(STATUS "If you wish to use Tango add -DCMAKE_D_USE_TANGO=True to cmake command line.")
12     set(CMAKE_D_USE_PHOBOS True)
13 endif (NOT CMAKE_D_USE_PHOBOS AND NOT CMAKE_D_USE_TANGO)
14
15 include(Cpkg2c)
16 include(XConfig)
17
18 ADD_DEFINITIONS(-DHAVE_CONFIG_H)
19 ADD_DEFINITIONS(-D_GNU_SOURCE)
20 INCLUDE_DIRECTORIES(${madmutt_BINARY_DIR} ${madmutt_SOURCE_DIR})
21
22 SET(BINDIR     "${CMAKE_INSTALL_PREFIX}/bin")
23 SET(DATADIR    "${CMAKE_INSTALL_PREFIX}/share")
24 SET(PKGDATADIR "${CMAKE_INSTALL_PREFIX}/share/madmutt")
25 SET(PKGDOCDIR  "${CMAKE_INSTALL_PREFIX}/share/doc/madmutt")
26 SET(SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc")
27 SET(VERSION    "devel")
28 SET(MUTTLIBS   "")
29
30 ADD_DEFINITIONS("-DBINDIR=\\\"${BINDIR}\\\"")
31 ADD_DEFINITIONS("-DPKGDATADIR=\\\"${PKGDATADIR}\\\"")
32 ADD_DEFINITIONS("-DPKGDOCDIR=\\\"${PKGDOCDIR}\\\"")
33 ADD_DEFINITIONS("-DSYSCONFDIR=\\\"${SYSCONFDIR}\\\"")
34 ADD_DEFINITIONS("-DVERSION=\\\"${VERSION}\\\"")
35 ADD_DEFINITIONS("-DMUTTLOCALEDIR=\\\"${DATADIR}/locale\\\"")
36
37 SET(MAILPATH         CACHE STRING "Where new mail is spooled")
38 OPTION(WITH_GPGME    "Use GPGME [default: on]" ON)
39 OPTION(WITH_IDN      "Use GNU libidn for domain names [default: off]")
40
41 OPTION(USE_FLOCK     "Use flock to lock files [default: off]")
42 OPTION(USE_FCNTL     "Use fcntl to lock files [default: on]" ON)
43 OPTION(USE_HCACHE    "Enable headers caching  [default: off]")
44
45 FIND_FILE(SENDMAIL sendmail
46     PATHS /usr/sbin /sbin /usr/lib
47     DOC   "path to sendmail executable"
48 )
49
50 IF(NOT MAILPATH)
51     IF(EXISTS /var/mail)
52         SET(MAILPATH "/var/mail")
53     ELSEIF(EXISTS /var/spool/mail)
54         SET(MAILPATH "/var/spool/mail")
55     ELSEIF(EXISTS /usr/spool/mail)
56         SET(MAILPATH "/usr/spool/mail")
57     ELSEIF(EXISTS /usr/mail)
58         SET(MAILPATH "/usr/mail")
59     ELSE(EXISTS /var/mail)
60         MESSAGE(FATAL_ERROR "Unable to determine MAILPATH")
61     ENDIF(EXISTS /var/mail)
62 ENDIF(NOT MAILPATH)
63
64 # headers {{{
65 INCLUDE(CheckIncludeFile)
66
67 CHECK_INCLUDE_FILE(alloca.h               HAVE_ALLOCA_H)
68 CHECK_INCLUDE_FILE(argz.h                 HAVE_ARGZ_H)
69 CHECK_INCLUDE_FILE(getopt.h               HAVE_GETOPT_H)
70 CHECK_INCLUDE_FILE(iconv.h                HAVE_ICONV_H)
71 CHECK_INCLUDE_FILE(inttypes.h             HAVE_INTTYPES_H)
72 CHECK_INCLUDE_FILE(ioctl.h                HAVE_IOCTL_H)
73 CHECK_INCLUDE_FILE(langinfo.h             HAVE_LANGINFO_H)
74 CHECK_INCLUDE_FILE(limits.h               HAVE_LIMITS_H)
75 CHECK_INCLUDE_FILE(locale.h               HAVE_LOCALE_H)
76 CHECK_INCLUDE_FILE(memory.h               HAVE_MEMORY_H)
77 CHECK_INCLUDE_FILE(ncursesw/ncurses.h     HAVE_NCURSESW_NCURSES_H)
78 CHECK_INCLUDE_FILE(regex.h                HAVE_REGEX_H)
79 CHECK_INCLUDE_FILE(stdarg.h               HAVE_STDARG_H)
80 CHECK_INCLUDE_FILE(stddef.h               HAVE_STDDEF_H)
81 CHECK_INCLUDE_FILE(stdint.h               HAVE_STDINT_H)
82 CHECK_INCLUDE_FILE(stdlib.h               HAVE_STDLIB_H)
83 CHECK_INCLUDE_FILE(string.h               HAVE_STRING_H)
84 CHECK_INCLUDE_FILE(strings.h              HAVE_STRINGS_H)
85 CHECK_INCLUDE_FILE(sysexits.h             HAVE_SYSEXITS_H)
86 CHECK_INCLUDE_FILE(sys/ioctl.h            HAVE_SYS_IOCTL_H)
87 CHECK_INCLUDE_FILE(sys/param.h            HAVE_SYS_PARAM_H)
88 CHECK_INCLUDE_FILE(sys/resource.h         HAVE_SYS_RESOURCE_H)
89 CHECK_INCLUDE_FILE(sys/stat.h             HAVE_SYS_STAT_H)
90 CHECK_INCLUDE_FILE(sys/time.h             HAVE_SYS_TIME_H)
91 CHECK_INCLUDE_FILE(sys/types.h            HAVE_SYS_TYPES_H)
92 CHECK_INCLUDE_FILE(unistd.h               HAVE_UNISTD_H)
93 CHECK_INCLUDE_FILE(unix.h                 HAVE_UNIX_H)
94 CHECK_INCLUDE_FILE(wchar.h                HAVE_WCHAR_H)
95 CHECK_INCLUDE_FILE(wctype.h               HAVE_WCTYPE_H)
96
97 IF(NOT HAVE_ICONV_H)
98     MESSAGE(FATAL_ERROR "inconv.h not found")
99 ENDIF(NOT HAVE_ICONV_H)
100
101 # }}}
102 # types {{{
103
104 INCLUDE(CheckStructMember)
105
106 CHECK_STRUCT_MEMBER("struct dirent" "d_ino" "dirent.h" HAVE_DIRENT_D_INO)
107
108 # }}}
109 # functions {{{
110 INCLUDE (CheckFunctionExists)
111
112 CHECK_FUNCTION_EXISTS(strlimit    HAVE_SETRLIMIT)
113 CHECK_FUNCTION_EXISTS(getsid      HAVE_GETSID)
114 CHECK_FUNCTION_EXISTS(setegid     HAVE_SETEGID)
115 CHECK_FUNCTION_EXISTS(getopt      HAVE_GETOPT)
116 CHECK_FUNCTION_EXISTS(nl_langinfo HAVE_LANGINFO_CODESET)
117
118 # }}}
119 # libraries {{{
120 INCLUDE(CheckLibraryExists)
121 INCLUDE(FindPkgConfig)
122
123 FIND_LIBRARY(LIBUTIL NAMES util)
124 IF(NOT LIBUTIL)
125     MESSAGE(FATAL_ERROR "could not find libutil")
126 ENDIF(NOT LIBUTIL)
127 LIST(APPEND MUTTLIBS -lutil)
128
129 FIND_LIBRARY(NCURSESW NAMES ncursesw)
130 IF(NOT NCURSESW OR NOT HAVE_NCURSESW_NCURSES_H)
131     MESSAGE(FATAL_ERROR "could not libncursesw")
132 ENDIF(NOT NCURSESW OR NOT HAVE_NCURSESW_NCURSES_H)
133 SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h")
134 LIST(APPEND MUTTLIBS -lncursesw)
135
136 pkg_search_module(LUA REQUIRED lua5.1)
137 ADD_DEFINITIONS(${LUA_CFLAGS})
138 LIST(APPEND MUTTLIBS ${LUA_LDFLAGS})
139
140 IF(WITH_GPGME)
141     XCONFIG(gpgme-config gpgme_INCDIR gpgme_LINKDIR gpgme_LDFLAGS gpgme_CFLAGS)
142     INCLUDE_DIRECTORIES(${gpgme_INCDIR})
143     ADD_DEFINITIONS(${gpgme_CFLAGS})
144     LIST(APPEND MUTTLIBS ${gpgme_LDFLAGS})
145     SET(HAVE_GPGME 1)
146 ENDIF(WITH_GPGME)
147
148 XCONFIG(libgnutls-config gnutls_INCDIR gnutls_LINKDIR gnutls_LDFLAGS gnutls_CFLAGS)
149 INCLUDE_DIRECTORIES(${gnutls_INCDIR})
150 ADD_DEFINITIONS(${gnutls_CFLAGS})
151 CHECK_INCLUDE_FILE(gnutls/openssl.h  HAVE_GNUTLS_OPENSSL_H)
152 LIST(APPEND MUTTLIBS ${gnutls_LDFLAGS})
153
154 CHECK_LIBRARY_EXISTS(sasl2 sasl_client_init "" WITH_SASL)
155 IF(NOT WITH_SASL)
156     MESSAGE(FATAL_ERROR "sasl2 not found")
157 ENDIF(NOT WITH_SASL)
158 LIST(APPEND MUTTLIBS -lsasl2)
159
160 IF(WITH_IDN)
161     pkg_search_module(IDN REQUIRED libidn)
162     LIST(APPEND MUTTLIBS ${IDN_LDFLAGS})
163     SET(HAVE_LIBIDN 1)
164 ENDIF(WITH_IDN)
165
166 CHECK_LIBRARY_EXISTS(lockfile lockfile_create "" WITH_LOCKFILE)
167 IF(NOT WITH_LOCKFILE)
168     MESSAGE(FATAL_ERROR "lockfile not found")
169 ENDIF(NOT WITH_LOCKFILE)
170 LIST(APPEND MUTTLIBS -llockfile)
171
172 IF(USE_HCACHE)
173     OPTION(WITH_TC   "Use tokyocabinet for header caching [default: on]" ON)
174     OPTION(WITH_QDBM "Use qdbm for header caching [default: off]" OFF)
175     OPTION(WITH_GDBM "Use gdbm for header caching [default: off]")
176     SET(USE_HCACHE)
177
178     if(WITH_TC)
179         pkg_search_module(TC REQUIRED tokyocabinet)
180         ADD_DEFINITIONS(${TC_CFLAGS})
181         LIST(APPEND MUTTLIBS ${TC_LDFLAGS})
182         SET(USE_HCACHE 1)
183         SET(HAVE_TOKYOCABINET 1)
184     ENDIF(WITH_TC)
185     IF(WITH_QDBM)
186         pkg_search_module(QDBM REQUIRED qdbm)
187         ADD_DEFINITIONS(${QDBM_CFLAGS})
188         SET(QDBM_LDFLAGS "${QDBM_LDFLAGS}")
189         # LIST(APPEND MUTTLIBS ${QDBM_LDFLAGS})
190         LIST(APPEND MUTTLIBS -lqdbm)
191         SET(USE_HCACHE 1)
192         SET(HAVE_QDBM 1)
193     ENDIF(WITH_QDBM)
194
195     IF(NOT USE_HCACHE AND WITH_GDBM)
196         CHECK_LIBRARY_EXISTS(gdbm gdbm_open "" GDBM)
197         IF(NOT GDBM)
198             MESSAGE(FATAL_ERROR "gdbm not found")
199         ENDIF(NOT GDBM)
200         LIST(APPEND MUTTLIBS -lgdbm)
201         SET(USE_HCACHE 1)
202         SET(HAVE_GDBM 1)
203     ENDIF(NOT USE_HCACHE AND WITH_GDBM)
204
205     IF(NOT USE_HCACHE)
206         MESSAGE(FATAL_ERROR "no backend for header caching selected")
207     ENDIF(NOT USE_HCACHE)
208 ENDIF(USE_HCACHE)
209
210 # }}}
211 # C flags {{{
212 # big debug flags
213 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ggdb3")
214 # Use pipes and not temp files.
215 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe")
216 # optimize even more
217 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
218 # let the type char be unsigned by default
219 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -funsigned-char")
220 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing")
221 # turn on all common warnings
222 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
223 # turn on extra warnings
224 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W")
225 # treat warnings as errors
226 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
227 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wchar-subscripts")
228 # warn about undefined preprocessor identifiers
229 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef")
230 # warn about local variable shadowing another local variable
231 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
232 # warn about casting of pointers to increased alignment requirements
233 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align")
234 # make string constants const
235 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wwrite-strings")
236 # warn about comparisons between signed and unsigned values
237 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare")
238 # warn about unused declared stuff
239 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused")
240 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
241 # warn about variable use before initialization
242 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wuninitialized")
243 # warn about variables which are initialized with themselves
244 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winit-self")
245 # warn about pointer arithmetic on void* and function pointers
246 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
247 # warn about multiple declarations
248 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
249 # warn if the format string is not a string literal
250 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat-nonliteral")
251 # do not warn about zero-length formats.
252 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format-zero-length")
253 # missing prototypes
254 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes")
255 # warn about functions without format attribute that should have one
256 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
257 # }}}
258 # D flags {{{
259 # big debug flags
260 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -ggdb3")
261 # Use pipes and not temp files.
262 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -pipe")
263 # optimize even more
264 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -O2")
265 # let the type char be unsigned by default
266 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -funsigned-char")
267 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -fstrict-aliasing")
268 # turn on all common warnings
269 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wall")
270 # turn on extra warnings
271 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -W")
272 # treat warnings as errors
273 #SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Werror")
274 # warn about local variable shadowing another local variable
275 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wshadow")
276 # warn about casting of pointers to increased alignment requirements
277 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wcast-align")
278 # warn about comparisons between signed and unsigned values
279 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wsign-compare")
280 # warn about unused declared stuff
281 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wunused")
282 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wno-unused-parameter")
283 # warn about variable use before initialization
284 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wuninitialized")
285 # let's read GPGME's Reference Manual
286 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FILE_OFFSET_BITS=64")
287 # }}}
288
289 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
290
291 # we generate some includes
292 ADD_SUBDIRECTORY(lib-lib)
293 ADD_SUBDIRECTORY(lib-mime)
294 ADD_SUBDIRECTORY(lib-sys)
295 ADD_SUBDIRECTORY(lib-ui)
296 ADD_SUBDIRECTORY(imap)
297 ADD_SUBDIRECTORY(lib-mx)
298 ADD_SUBDIRECTORY(lib-lua)
299 ADD_SUBDIRECTORY(po)
300
301 MADMUTT_SOURCES(madmuttsrc madmuttgen
302     alias.cpkg
303     buffy.cpkg
304     charset.cpkg
305     crypt.cpkg
306     score.cpkg
307
308     account.c
309     attach.c
310     commands.c
311     compose.c
312     copy.c
313     editmsg.c
314     flags.c
315     handler.c
316     headers.c
317     help.c
318     hook.c
319     init.c
320     keymap.c
321     mutt_idna.c
322     muttlib.c
323     mutt_sasl.c
324     pager.c
325     pattern.c
326     pop.c
327     postpone.c
328     recvattach.c
329     recvcmd.c
330     send.c
331     sendlib.c
332     sort.c
333     state.c
334     thread.c
335
336     main.c
337 )
338
339 STRING(REGEX REPLACE ";" " " MUTTLIBS "${MUTTLIBS}")
340 ADD_EXECUTABLE(madmutt ${madmuttsrc})
341 TARGET_LINK_LIBRARIES(madmutt mime sys mx lua ui imap lib)
342 SET_TARGET_PROPERTIES(madmutt PROPERTIES
343     LINK_FLAGS "${MUTTLIBS}"
344     #    LINKER_LANGUAGE D
345 )
346
347 # generate_files hack {{{
348
349 ADD_CUSTOM_COMMAND(
350     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
351     DEPENDS ${madmutt_SOURCE_DIR}/OPS ${madmutt_SOURCE_DIR}/tools/gen_defs
352     COMMAND ${madmutt_SOURCE_DIR}/tools/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h
353     COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS"
354 )
355 ADD_CUSTOM_COMMAND(
356     OUTPUT  ${madmutt_SOURCE_DIR}/charset.gperf
357     DEPENDS ${madmutt_SOURCE_DIR}/charset.def
358     COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf
359     COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def"
360 )
361 ADD_CUSTOM_TARGET(generate_file
362     DEPENDS ${madmuttgen}
363     ${madmutt_SOURCE_DIR}/keymap_defs.h
364     ${madmutt_SOURCE_DIR}/charset.gperf
365 )
366 ADD_DEPENDENCIES(generate_file generate_files)
367 ADD_DEPENDENCIES(madmutt generate_file)
368
369 # }}}