EXIT AUTOCRAP \o/
[apps/madmutt.git] / CMakeLists.txt
1 PROJECT(madmutt C)
2 SET(CMAKE_MODULE_PATH  ${madmutt_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
3
4 # TODO {{{
5 # USE_SETGID
6 # DOTLOCK_{GROUP,PERMISSION}
7 # HAVE_DIRENT_D_INO
8 # }}}
9
10 INCLUDE(CMakeDetermineCCompiler)
11 include(Cpkg2c)
12 include(XConfig)
13
14 ADD_DEFINITIONS(-DHAVE_CONFIG_H)
15 ADD_DEFINITIONS(-D_GNU_SOURCE)
16 INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR} ${madmutt_SOURCE_DIR})
17
18 SET(BINDIR     "${CMAKE_INSTALL_PREFIX}/bin")
19 SET(PKGDATADIR "${CMAKE_INSTALL_PREFIX}/share/madmutt")
20 SET(PKGDOCDIR  "${CMAKE_INSTALL_PREFIX}/share/doc/madmutt")
21 SET(SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc")
22 SET(VERSION    "devel")
23 SET(MUTTLIBS   "")
24
25 ADD_DEFINITIONS("-DBINDIR=\\\"${BINDIR}\\\"")
26 ADD_DEFINITIONS("-DPKGDATADIR=\\\"${PKGDATADIR}\\\"")
27 ADD_DEFINITIONS("-DPKGDOCDIR=\\\"${PKGDOCDIR}\\\"")
28 ADD_DEFINITIONS("-DSYSCONFDIR=\\\"${SYSCONFDIR}\\\"")
29 ADD_DEFINITIONS("-DVERSION=\\\"${VERSION}\\\"")
30
31 OPTION(WITH_MAILPATH "Where new mail is spooled")
32 OPTION(WITH_GPGME    "Use GPGME [default: on]" ON)
33 OPTION(WITH_NNTP     "Build NNTP support [default: off]")
34 OPTION(WITH_IDN      "Use GNU libidn for domain names [default: off]")
35 OPTION(WITH_LIBESMTP "Use libESMTP [default: off]")
36 OPTION(WITH_SLANG    "Use S-Lang instead of ncurses [default:off]")
37
38 OPTION(USE_FLOCK     "Use flock to lock files [default: off]")
39 OPTION(USE_FCNTL     "Use fcntl to lock files [default: on]" ON)
40 OPTION(USE_HCACHE    "Enable headers caching  [default: off]")
41
42 FIND_FILE(GPERF gperf)
43 FIND_FILE(SENDMAIL sendmail PATHS /usr/sbin /sbin /usr/lib)
44 FIND_FILE(MIXMASTER mixmaster)
45
46 IF(WITH_MAILPATH)
47     SET(MAILPATH ${WITH_MAILPATH})
48 ELSEIF(EXISTS /var/mail)
49     SET(MAILPATH "/var/mail")
50 ELSEIF(EXISTS /var/spool/mail)
51     SET(MAILPATH "/var/spool/mail")
52 ELSEIF(EXISTS /usr/spool/mail)
53     SET(MAILPATH "/usr/spool/mail")
54 ELSEIF(EXISTS /usr/mail)
55     SET(MAILPATH "/usr/mail")
56 ENDIF(WITH_MAILPATH)
57
58 # headers {{{
59 INCLUDE(CheckIncludeFile)
60
61 CHECK_INCLUDE_FILE(alloca.h               HAVE_ALLOCA_H)
62 CHECK_INCLUDE_FILE(argz.h                 HAVE_ARGZ_H)
63 CHECK_INCLUDE_FILE(getopt.h               HAVE_GETOPT_H)
64 CHECK_INCLUDE_FILE(iconv.h                HAVE_ICONV_H)
65 CHECK_INCLUDE_FILE(inttypes.h             HAVE_INTTYPES_H)
66 CHECK_INCLUDE_FILE(ioctl.h                HAVE_IOCTL_H)
67 CHECK_INCLUDE_FILE(langinfo.h             HAVE_LANGINFO_H)
68 CHECK_INCLUDE_FILE(limits.h               HAVE_LIMITS_H)
69 CHECK_INCLUDE_FILE(locale.h               HAVE_LOCALE_H)
70 CHECK_INCLUDE_FILE(memory.h               HAVE_MEMORY_H)
71 CHECK_INCLUDE_FILE(ncurses.h              HAVE_NCURSES_H)
72 CHECK_INCLUDE_FILE(ncurses/ncurses.h      HAVE_NCURSES_NCURSES_H)
73 CHECK_INCLUDE_FILE(ncursesw/ncurses.h     HAVE_NCURSESW_NCURSES_H)
74 CHECK_INCLUDE_FILE(regex.h                HAVE_REGEX_H)
75 CHECK_INCLUDE_FILE(stdarg.h               HAVE_STDARG_H)
76 CHECK_INCLUDE_FILE(stddef.h               HAVE_STDDEF_H)
77 CHECK_INCLUDE_FILE(stdint.h               HAVE_STDINT_H)
78 CHECK_INCLUDE_FILE(stdlib.h               HAVE_STDLIB_H)
79 CHECK_INCLUDE_FILE(string.h               HAVE_STRING_H)
80 CHECK_INCLUDE_FILE(strings.h              HAVE_STRINGS_H)
81 CHECK_INCLUDE_FILE(sysexits.h             HAVE_SYSEXITS_H)
82 CHECK_INCLUDE_FILE(sys/ioctl.h            HAVE_SYS_IOCTL_H)
83 CHECK_INCLUDE_FILE(sys/param.h            HAVE_SYS_PARAM_H)
84 CHECK_INCLUDE_FILE(sys/resource.h         HAVE_SYS_RESOURCE_H)
85 CHECK_INCLUDE_FILE(sys/stat.h             HAVE_SYS_STAT_H)
86 CHECK_INCLUDE_FILE(sys/time.h             HAVE_SYS_TIME_H)
87 CHECK_INCLUDE_FILE(sys/types.h            HAVE_SYS_TYPES_H)
88 CHECK_INCLUDE_FILE(unistd.h               HAVE_UNISTD_H)
89 CHECK_INCLUDE_FILE(unix.h                 HAVE_UNIX_H)
90 CHECK_INCLUDE_FILE(wchar.h                HAVE_WCHAR_H)
91 CHECK_INCLUDE_FILE(wctype.h               HAVE_WCTYPE_H)
92
93 IF(NOT HAVE_ICONV_H)
94     MESSAGE(FATAL_ERROR "inconv.h not found")
95 ENDIF(NOT HAVE_ICONV_H)
96
97 # }}}
98 # functions {{{
99 INCLUDE (CheckFunctionExists)
100
101 CHECK_FUNCTION_EXISTS(strlimit    HAVE_SETRLIMIT)
102 CHECK_FUNCTION_EXISTS(getsid      HAVE_GETSID)
103 CHECK_FUNCTION_EXISTS(isctype     HAVE_ISCTYPE)
104 CHECK_FUNCTION_EXISTS(getopt      HAVE_GETOPT)
105 CHECK_FUNCTION_EXISTS(regcomp     HAVE_REGCOMP)
106 CHECK_FUNCTION_EXISTS(iswalnum    HAVE_ISWALNUM)
107 CHECK_FUNCTION_EXISTS(iswalpha    HAVE_ISWALPHA)
108 CHECK_FUNCTION_EXISTS(iswcntrl    HAVE_ISWCNTRL)
109 CHECK_FUNCTION_EXISTS(iswdigit    HAVE_ISWDIGIT)
110 CHECK_FUNCTION_EXISTS(iswgraph    HAVE_ISWGRAPH)
111 CHECK_FUNCTION_EXISTS(iswlower    HAVE_ISWLOWER)
112 CHECK_FUNCTION_EXISTS(iswprint    HAVE_ISWPRINT)
113 CHECK_FUNCTION_EXISTS(iswpunct    HAVE_ISWPUNCT)
114 CHECK_FUNCTION_EXISTS(iswspace    HAVE_ISWSPACE)
115 CHECK_FUNCTION_EXISTS(iswupper    HAVE_ISWUPPER)
116 CHECK_FUNCTION_EXISTS(iswxdigit   HAVE_ISWXDIGIT)
117 CHECK_FUNCTION_EXISTS(towupper    HAVE_TOWUPPER)
118 CHECK_FUNCTION_EXISTS(towlower    HAVE_TOWLOWER)
119 CHECK_FUNCTION_EXISTS(nl_langinfo HAVE_LANGINFO_CODESET)
120
121 # }}}
122 # libraries {{{
123 INCLUDE(CheckLibraryExists)
124 INCLUDE(UsePkgConfig)
125
126 IF(WITH_SLANG)
127     IF(EXISTS ${CMAKE_INSTALL_PREFIX}/include/slang)
128         INCLUDE_DIRECTORIES(${CMAKE_INSTALL_PREFIX}/include/slang)
129     ELSEIF(EXISTS /usr/include/slang)
130         INCLUDE_DIRECTORIES(/usr/include/slang)
131     ENDIF(EXISTS ${CMAKE_INSTALL_PREFIX}/include/slang)
132     CHECK_LIBRARY_EXISTS(slang SLtt_get_terminfo "" USE_SLANG_CURSES)
133     IF(NOT USE_SLANG_CURSES)
134         MESSAGE(FATAL_ERROR "s-lang not found")
135     ENDIF(NOT USE_SLANG_CURSES)
136 ELSE(WITH_SLANG)
137     IF(HAVE_NCURSESW_NCURSES_H)
138         SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h")
139         SET(MUTTLIBS "${MUTTLIBS} -lncursesw")
140     ELSEIF(HAVE_NCURSES_H)
141         SET(CMAKE_REQUIRED_INCLUDES "ncurses.h")
142         SET(MUTTLIBS "${MUTTLIBS} -lncurses")
143     ELSEIF(HAVE_NCURSES_H OR HAVE_NCURSES_NCURSES_H)
144         SET(CMAKE_REQUIRED_INCLUDES "ncurses/ncurses.h")
145         SET(MUTTLIBS "${MUTTLIBS} -lncurses")
146     ELSE(HAVE_NCURSESW_NCURSES_H)
147         MESSAGE(FATAL_ERROR "could not find ncurses.h")
148     ENDIF(HAVE_NCURSESW_NCURSES_H)
149     SET(CMAKE_REQUIRED_LIBRARIES ${MUTTLIBS})
150     CHECK_FUNCTION_EXISTS(start_color        HAVE_START_COLOR)
151     CHECK_FUNCTION_EXISTS(typeahead          HAVE_TYPEAHEAD)
152     CHECK_FUNCTION_EXISTS(bkgdset            HAVE_BKGDSET)
153     CHECK_FUNCTION_EXISTS(curs_set           HAVE_CURS_SET)
154     CHECK_FUNCTION_EXISTS(meta               HAVE_META)
155     CHECK_FUNCTION_EXISTS(use_default_colors HAVE_USE_DEFAULT_COLORS)
156     CHECK_FUNCTION_EXISTS(resizeterm         HAVE_RESIZETERM)
157     SET(CMAKE_REQUIRED_LIBRARIES)
158     SET(CMAKE_REQUIRED_INCLUDES)
159 ENDIF(WITH_SLANG)
160
161 PKGCONFIG(lua5.1 lua_INCDIR lua_LINKDIR lua_LDFLAGS lua_CFLAGS)
162 MESSAGE(STATUS "found lua5.1 at: INCDIR ${lua_INCDIR}")
163 INCLUDE_DIRECTORIES(${lua_INCDIR})
164 ADD_DEFINITIONS(${lua_CFLAGS})
165 SET(MUTTLIBS "${MUTTLIBS} ${lua_LDFLAGS}")
166
167 IF(WITH_GPGME)
168     XCONFIG(gpgme-config gpgme_INCDIR gpgme_LINKDIR gpgme_LDFLAGS gpgme_CFLAGS)
169     INCLUDE_DIRECTORIES(${gpgme_INCDIR})
170     ADD_DEFINITIONS(${gpgme_CFLAGS})
171     SET(MUTTLIBS "${MUTTLIBS} ${gpgme_LDFLAGS}")
172 ENDIF(WITH_GPGME)
173
174 XCONFIG(libgnutls-config gnutls_INCDIR gnutls_LINKDIR gnutls_LDFLAGS gnutls_CFLAGS)
175 INCLUDE_DIRECTORIES(${gnutls_INCDIR})
176 ADD_DEFINITIONS(${gnutls_CFLAGS})
177 SET(MUTTLIBS "${MUTTLIBS} ${gnutls_LDFLAGS}")
178
179 CHECK_LIBRARY_EXISTS(sasl2 sasl_client_init "" WITH_SASL)
180 IF(NOT WITH_SASL)
181     MESSAGE(FATAL_ERROR "sasl2 not found")
182 ENDIF(NOT WITH_SASL)
183 SET(MUTTLIBS "${MUTTLIBS} -lsasl2")
184
185 IF(WITH_IDN)
186     PKGCONFIG(libidn idn_INCDIR idn_LINKDIR idn_LDFLAGS idn_CFLAGS)
187     SET(MUTTLIBS "${MUTTLIBS} ${idn_LDFLAGS}")
188     SET(HAVE_LIBIDN 1)
189 ENDIF(WITH_IDN)
190
191 IF(USE_HCACHE)
192     OPTION(WITH_QDBM "Use qdbm for header caching [default: on]" ON)
193     OPTION(WITH_GDBM "Use gdbm for header caching [default: off]")
194     SET(USE_HCACHE)
195
196     IF(WITH_QDBM)
197         PKGCONFIG(qdbm qdbm_INCDIR qdbm_LINKDIR qdbm_LDFLAGS qdbm_CFLAGS)
198         IF(qdbm_LDFLAGS)
199             MESSAGE(STATUS "qdbm found")
200         ELSE(qdbm_LDFLAGS)
201             MESSAGE(FATAL_ERROR "qdbm not found")
202         ENDIF(qdbm_LDFLAGS)
203         INCLUDE_DIRECTORIES(${qdbm_INCDIR})
204         ADD_DEFINITIONS(${qdbm_CFLAGS})
205         SET(MUTTLIBS "${MUTTLIBS} ${qdbm_LDFLAGS}")
206         SET(USE_HCACHE 1)
207         SET(HAVE_QDBM 1)
208     ENDIF(WITH_QDBM)
209
210     IF(NOT USE_HCACHE AND WITH_GDBM)
211         CHECK_LIBRARY_EXISTS(gdbm gdbm_open "" GDBM)
212         IF(NOT GDBM)
213             MESSAGE(FATAL_ERROR "gdbm not found")
214         ENDIF(NOT GDBM)
215         SET(MUTTLIBS "${MUTTLIBS} -lgdbm")
216         SET(USE_HCACHE 1)
217         SET(HAVE_GDBM 1)
218     ENDIF(NOT USE_HCACHE AND WITH_GDBM)
219
220     IF(NOT USE_HCACHE)
221         MESSAGE(FATAL_ERROR "no backend for header caching selected")
222     ENDIF(NOT USE_HCACHE)
223 ENDIF(USE_HCACHE)
224
225 IF(WITH_LIBESMTP)
226     SET(USE_LIBESMTP 1)
227     SET(MUTTLIBS "${MUTTLIBS} -lesmtp")
228 ENDIF(WITH_LIBESMTP)
229
230 IF(WITH_NNTP)
231     SET(USE_NNTP 1)
232     MESSAGE(STATUS "building NNTP support")
233 ENDIF(WITH_NNTP)
234
235 # }}}
236 # C flags {{{
237 # big debug flags
238 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ggdb3")
239 # Use pipes and not temp files.
240 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe")
241 # optimize even more
242 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
243 # let the type char be unsigned by default
244 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -funsigned-char")
245 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing")
246 # turn on all common warnings
247 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
248 # turn on extra warnings
249 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W")
250 # treat warnings as errors
251 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
252 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wchar-subscripts")
253 # warn about undefined preprocessor identifiers
254 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef")
255 # warn about local variable shadowing another local variable
256 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
257 # warn about casting of pointers to increased alignment requirements
258 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align")
259 # make string constants const
260 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wwrite-strings")
261 # warn about comparisons between signed and unsigned values
262 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare")
263 # warn about unused declared stuff
264 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused")
265 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
266 # warn about variable use before initialization
267 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wuninitialized")
268 # warn about variables which are initialized with themselves
269 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winit-self")
270 # warn about pointer arithmetic on void* and function pointers
271 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
272 # warn about multiple declarations
273 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
274 # warn if the format string is not a string literal
275 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat-nonliteral")
276 # do not warn about zero-length formats.
277 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format-zero-length")
278 # missing prototypes
279 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes")
280 # warn about functions without format attribute that should have one
281 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
282 # }}}
283
284 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
285
286 # we generate some includes
287 ADD_SUBDIRECTORY(lib-lib)
288 ADD_SUBDIRECTORY(lib-mime)
289 ADD_SUBDIRECTORY(lib-sys)
290 ADD_SUBDIRECTORY(lib-ui)
291 ADD_SUBDIRECTORY(imap)
292 IF(WITH_NNTP)
293     ADD_SUBDIRECTORY(nntp)
294 ENDIF(WITH_NNTP)
295 ADD_SUBDIRECTORY(lib-mx)
296 ADD_SUBDIRECTORY(lib-lua)
297
298 MADMUTT_SOURCES(madmuttsrc madmuttgen
299     alias.cpkg
300     buffy.cpkg
301     charset.cpkg
302     crypt.cpkg
303
304     account.c
305     attach.c
306     base64.c
307     browser.c
308     commands.c
309     compose.c
310     copy.c
311     editmsg.c
312     flags.c
313     from.c
314     handler.c
315     headers.c
316     help.c
317     hook.c
318     init.c
319     keymap.c
320     mutt_idna.c
321     muttlib.c
322     mutt_sasl.c
323     pager.c
324     pattern.c
325     pop.c
326     postpone.c
327     recvattach.c
328     recvcmd.c
329     remailer.c
330     score.c
331     send.c
332     sendlib.c
333     send_smtp.c
334     sort.c
335     state.c
336     thread.c
337
338     main.c
339 )
340
341 ADD_EXECUTABLE(madmutt ${madmuttsrc})
342 IF(WITH_NNTP)
343     TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap nntp ui lib)
344 ELSE(WITH_NNTP)
345     TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap ui lib)
346 ENDIF(WITH_NNTP)
347 SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS ${MUTTLIBS})
348
349 ADD_EXECUTABLE(madmutt_dotlock dotlock.c)
350 TARGET_LINK_LIBRARIES(madmutt_dotlock lib)
351
352 # generate_files hack {{{
353
354 ADD_CUSTOM_COMMAND(
355     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
356     DEPENDS ${madmutt_SOURCE_DIR}/OPS
357     COMMAND ${madmutt_SOURCE_DIR}/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h
358     COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS"
359 )
360 ADD_CUSTOM_COMMAND(
361     OUTPUT  ${madmutt_SOURCE_DIR}/charset.gperf
362     DEPENDS ${madmutt_SOURCE_DIR}/charset.def
363     COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf
364     COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def"
365 )
366 SET(__mt ${CMAKE_CURRENT_SOURCE_DIR}/lib-mime/mime-token)
367 ADD_CUSTOM_COMMAND(
368     OUTPUT ${__mt}.h
369     MAIN_DEPENDENCY ${__mt}.sh ${__mt}.def
370     COMMAND sh ${__mt}.sh ${__mt}.h < ${__mt}.def
371     COMMENT "Generating ${__mt}.h from ${__mt}.def"
372 )
373 SET(__lt ${CMAKE_CURRENT_SOURCE_DIR}/lib-lua/lua-token)
374 ADD_CUSTOM_COMMAND(
375     OUTPUT ${__lt}.h
376     MAIN_DEPENDENCY ${__lt}.gperf
377     COMMAND sh ${__lt}.gperf ${__lt}.h || \(${RM} ${__lt}.h; exit 1\)
378     COMMENT "Generating ${__lt}.h from ${__lt}.gperf"
379 )
380 SET(__lm ${CMAKE_CURRENT_SOURCE_DIR}/lib-lua/madmutt)
381 ADD_CUSTOM_COMMAND(
382     OUTPUT ${__lm}.li
383     MAIN_DEPENDENCY ${__lm}.cpkg
384     COMMAND ${madmutt_SOURCE_DIR}/tools/cpkg2c -h ${__lm}.cpkg > ${__lm}.li || \(${RM} ${__lm}.li; exit 1\)
385     COMMENT "Generating ${__lm}.li from ${__lm}.cpkg"
386 )
387 ADD_CUSTOM_TARGET(
388     generate_files
389     DEPENDS
390         ${madmuttgen}
391         ${madmutt_SOURCE_DIR}/keymap_defs.h
392         ${madmutt_SOURCE_DIR}/charset.gperf
393         ${madmutt_SOURCE_DIR}/lib-mime/mime-token.h
394         ${madmutt_SOURCE_DIR}/lib-lua/lua-token.h
395         ${madmutt_SOURCE_DIR}/lib-lua/madmutt.li
396 )
397 ADD_DEPENDENCIES(madmutt generate_files)
398
399 # }}}