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