1fb93bcbb01b5e23b2e4a3931c8e612185e6a982
[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 # types {{{
99
100 INCLUDE(CheckStructMember)
101
102 CHECK_STRUCT_MEMBER("struct dirent" "d_ino" "dirent.h" HAVE_DIRENT_D_INO)
103
104 # }}}
105 # functions {{{
106 INCLUDE (CheckFunctionExists)
107
108 CHECK_FUNCTION_EXISTS(strlimit    HAVE_SETRLIMIT)
109 CHECK_FUNCTION_EXISTS(getsid      HAVE_GETSID)
110 CHECK_FUNCTION_EXISTS(isctype     HAVE_ISCTYPE)
111 CHECK_FUNCTION_EXISTS(getopt      HAVE_GETOPT)
112 CHECK_FUNCTION_EXISTS(regcomp     HAVE_REGCOMP)
113 CHECK_FUNCTION_EXISTS(iswalnum    HAVE_ISWALNUM)
114 CHECK_FUNCTION_EXISTS(iswalpha    HAVE_ISWALPHA)
115 CHECK_FUNCTION_EXISTS(iswcntrl    HAVE_ISWCNTRL)
116 CHECK_FUNCTION_EXISTS(iswdigit    HAVE_ISWDIGIT)
117 CHECK_FUNCTION_EXISTS(iswgraph    HAVE_ISWGRAPH)
118 CHECK_FUNCTION_EXISTS(iswlower    HAVE_ISWLOWER)
119 CHECK_FUNCTION_EXISTS(iswprint    HAVE_ISWPRINT)
120 CHECK_FUNCTION_EXISTS(iswpunct    HAVE_ISWPUNCT)
121 CHECK_FUNCTION_EXISTS(iswspace    HAVE_ISWSPACE)
122 CHECK_FUNCTION_EXISTS(iswupper    HAVE_ISWUPPER)
123 CHECK_FUNCTION_EXISTS(iswxdigit   HAVE_ISWXDIGIT)
124 CHECK_FUNCTION_EXISTS(towupper    HAVE_TOWUPPER)
125 CHECK_FUNCTION_EXISTS(towlower    HAVE_TOWLOWER)
126 CHECK_FUNCTION_EXISTS(nl_langinfo HAVE_LANGINFO_CODESET)
127
128 # }}}
129 # libraries {{{
130 INCLUDE(CheckLibraryExists)
131 INCLUDE(UsePkgConfig)
132
133 IF(WITH_SLANG)
134     IF(EXISTS ${CMAKE_INSTALL_PREFIX}/include/slang)
135         INCLUDE_DIRECTORIES(${CMAKE_INSTALL_PREFIX}/include/slang)
136     ELSEIF(EXISTS /usr/include/slang)
137         INCLUDE_DIRECTORIES(/usr/include/slang)
138     ENDIF(EXISTS ${CMAKE_INSTALL_PREFIX}/include/slang)
139     CHECK_LIBRARY_EXISTS(slang SLtt_get_terminfo "" USE_SLANG_CURSES)
140     IF(NOT USE_SLANG_CURSES)
141         MESSAGE(FATAL_ERROR "s-lang not found")
142     ENDIF(NOT USE_SLANG_CURSES)
143 ELSE(WITH_SLANG)
144     IF(HAVE_NCURSESW_NCURSES_H)
145         SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h")
146         SET(MUTTLIBS "${MUTTLIBS} -lncursesw")
147     ELSEIF(HAVE_NCURSES_H)
148         SET(CMAKE_REQUIRED_INCLUDES "ncurses.h")
149         SET(MUTTLIBS "${MUTTLIBS} -lncurses")
150     ELSEIF(HAVE_NCURSES_H OR HAVE_NCURSES_NCURSES_H)
151         SET(CMAKE_REQUIRED_INCLUDES "ncurses/ncurses.h")
152         SET(MUTTLIBS "${MUTTLIBS} -lncurses")
153     ELSE(HAVE_NCURSESW_NCURSES_H)
154         MESSAGE(FATAL_ERROR "could not find ncurses.h")
155     ENDIF(HAVE_NCURSESW_NCURSES_H)
156     SET(CMAKE_REQUIRED_LIBRARIES ${MUTTLIBS})
157     CHECK_FUNCTION_EXISTS(start_color        HAVE_START_COLOR)
158     CHECK_FUNCTION_EXISTS(typeahead          HAVE_TYPEAHEAD)
159     CHECK_FUNCTION_EXISTS(bkgdset            HAVE_BKGDSET)
160     CHECK_FUNCTION_EXISTS(curs_set           HAVE_CURS_SET)
161     CHECK_FUNCTION_EXISTS(meta               HAVE_META)
162     CHECK_FUNCTION_EXISTS(use_default_colors HAVE_USE_DEFAULT_COLORS)
163     CHECK_FUNCTION_EXISTS(resizeterm         HAVE_RESIZETERM)
164     SET(CMAKE_REQUIRED_LIBRARIES)
165     SET(CMAKE_REQUIRED_INCLUDES)
166 ENDIF(WITH_SLANG)
167
168 PKGCONFIG(lua5.1 lua_INCDIR lua_LINKDIR lua_LDFLAGS lua_CFLAGS)
169 MESSAGE(STATUS "found lua5.1 at: INCDIR ${lua_INCDIR}")
170 INCLUDE_DIRECTORIES(${lua_INCDIR})
171 ADD_DEFINITIONS(${lua_CFLAGS})
172 SET(MUTTLIBS "${MUTTLIBS} ${lua_LDFLAGS}")
173
174 IF(WITH_GPGME)
175     XCONFIG(gpgme-config gpgme_INCDIR gpgme_LINKDIR gpgme_LDFLAGS gpgme_CFLAGS)
176     INCLUDE_DIRECTORIES(${gpgme_INCDIR})
177     ADD_DEFINITIONS(${gpgme_CFLAGS})
178     SET(MUTTLIBS "${MUTTLIBS} ${gpgme_LDFLAGS}")
179 ENDIF(WITH_GPGME)
180
181 XCONFIG(libgnutls-config gnutls_INCDIR gnutls_LINKDIR gnutls_LDFLAGS gnutls_CFLAGS)
182 INCLUDE_DIRECTORIES(${gnutls_INCDIR})
183 ADD_DEFINITIONS(${gnutls_CFLAGS})
184 SET(MUTTLIBS "${MUTTLIBS} ${gnutls_LDFLAGS}")
185
186 CHECK_LIBRARY_EXISTS(sasl2 sasl_client_init "" WITH_SASL)
187 IF(NOT WITH_SASL)
188     MESSAGE(FATAL_ERROR "sasl2 not found")
189 ENDIF(NOT WITH_SASL)
190 SET(MUTTLIBS "${MUTTLIBS} -lsasl2")
191
192 IF(WITH_IDN)
193     PKGCONFIG(libidn idn_INCDIR idn_LINKDIR idn_LDFLAGS idn_CFLAGS)
194     SET(MUTTLIBS "${MUTTLIBS} ${idn_LDFLAGS}")
195     SET(HAVE_LIBIDN 1)
196 ENDIF(WITH_IDN)
197
198 IF(USE_HCACHE)
199     OPTION(WITH_QDBM "Use qdbm for header caching [default: on]" ON)
200     OPTION(WITH_GDBM "Use gdbm for header caching [default: off]")
201     SET(USE_HCACHE)
202
203     IF(WITH_QDBM)
204         PKGCONFIG(qdbm qdbm_INCDIR qdbm_LINKDIR qdbm_LDFLAGS qdbm_CFLAGS)
205         IF(qdbm_LDFLAGS)
206             MESSAGE(STATUS "qdbm found")
207         ELSE(qdbm_LDFLAGS)
208             MESSAGE(FATAL_ERROR "qdbm not found")
209         ENDIF(qdbm_LDFLAGS)
210         INCLUDE_DIRECTORIES(${qdbm_INCDIR})
211         ADD_DEFINITIONS(${qdbm_CFLAGS})
212         SET(MUTTLIBS "${MUTTLIBS} ${qdbm_LDFLAGS}")
213         SET(USE_HCACHE 1)
214         SET(HAVE_QDBM 1)
215     ENDIF(WITH_QDBM)
216
217     IF(NOT USE_HCACHE AND WITH_GDBM)
218         CHECK_LIBRARY_EXISTS(gdbm gdbm_open "" GDBM)
219         IF(NOT GDBM)
220             MESSAGE(FATAL_ERROR "gdbm not found")
221         ENDIF(NOT GDBM)
222         SET(MUTTLIBS "${MUTTLIBS} -lgdbm")
223         SET(USE_HCACHE 1)
224         SET(HAVE_GDBM 1)
225     ENDIF(NOT USE_HCACHE AND WITH_GDBM)
226
227     IF(NOT USE_HCACHE)
228         MESSAGE(FATAL_ERROR "no backend for header caching selected")
229     ENDIF(NOT USE_HCACHE)
230 ENDIF(USE_HCACHE)
231
232 IF(WITH_LIBESMTP)
233     SET(USE_LIBESMTP 1)
234     SET(MUTTLIBS "${MUTTLIBS} -lesmtp")
235 ENDIF(WITH_LIBESMTP)
236
237 IF(WITH_NNTP)
238     SET(USE_NNTP 1)
239     MESSAGE(STATUS "building NNTP support")
240 ENDIF(WITH_NNTP)
241
242 # }}}
243 # C flags {{{
244 # big debug flags
245 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ggdb3")
246 # Use pipes and not temp files.
247 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe")
248 # optimize even more
249 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
250 # let the type char be unsigned by default
251 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -funsigned-char")
252 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing")
253 # turn on all common warnings
254 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
255 # turn on extra warnings
256 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W")
257 # treat warnings as errors
258 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
259 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wchar-subscripts")
260 # warn about undefined preprocessor identifiers
261 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef")
262 # warn about local variable shadowing another local variable
263 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
264 # warn about casting of pointers to increased alignment requirements
265 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align")
266 # make string constants const
267 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wwrite-strings")
268 # warn about comparisons between signed and unsigned values
269 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare")
270 # warn about unused declared stuff
271 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused")
272 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
273 # warn about variable use before initialization
274 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wuninitialized")
275 # warn about variables which are initialized with themselves
276 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winit-self")
277 # warn about pointer arithmetic on void* and function pointers
278 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
279 # warn about multiple declarations
280 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
281 # warn if the format string is not a string literal
282 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat-nonliteral")
283 # do not warn about zero-length formats.
284 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format-zero-length")
285 # missing prototypes
286 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes")
287 # warn about functions without format attribute that should have one
288 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
289 # }}}
290
291 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
292
293 # we generate some includes
294 ADD_SUBDIRECTORY(lib-lib)
295 ADD_SUBDIRECTORY(lib-mime)
296 ADD_SUBDIRECTORY(lib-sys)
297 ADD_SUBDIRECTORY(lib-ui)
298 ADD_SUBDIRECTORY(imap)
299 IF(WITH_NNTP)
300     ADD_SUBDIRECTORY(nntp)
301 ENDIF(WITH_NNTP)
302 ADD_SUBDIRECTORY(lib-mx)
303 ADD_SUBDIRECTORY(lib-lua)
304
305 MADMUTT_SOURCES(madmuttsrc madmuttgen
306     alias.cpkg
307     buffy.cpkg
308     charset.cpkg
309     crypt.cpkg
310
311     account.c
312     attach.c
313     base64.c
314     browser.c
315     commands.c
316     compose.c
317     copy.c
318     editmsg.c
319     flags.c
320     from.c
321     handler.c
322     headers.c
323     help.c
324     hook.c
325     init.c
326     keymap.c
327     mutt_idna.c
328     muttlib.c
329     mutt_sasl.c
330     pager.c
331     pattern.c
332     pop.c
333     postpone.c
334     recvattach.c
335     recvcmd.c
336     remailer.c
337     score.c
338     send.c
339     sendlib.c
340     send_smtp.c
341     sort.c
342     state.c
343     thread.c
344
345     main.c
346 )
347
348 ADD_EXECUTABLE(madmutt ${madmuttsrc})
349 IF(WITH_NNTP)
350     TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap nntp ui lib)
351 ELSE(WITH_NNTP)
352     TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap ui lib)
353 ENDIF(WITH_NNTP)
354 SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS ${MUTTLIBS})
355
356 ADD_EXECUTABLE(madmutt_dotlock dotlock.c)
357 TARGET_LINK_LIBRARIES(madmutt_dotlock lib)
358
359 # generate_files hack {{{
360
361 ADD_CUSTOM_COMMAND(
362     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
363     DEPENDS ${madmutt_SOURCE_DIR}/OPS
364     COMMAND ${madmutt_SOURCE_DIR}/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h
365     COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS"
366 )
367 ADD_CUSTOM_COMMAND(
368     OUTPUT  ${madmutt_SOURCE_DIR}/charset.gperf
369     DEPENDS ${madmutt_SOURCE_DIR}/charset.def
370     COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf
371     COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def"
372 )
373 SET(__mt ${CMAKE_CURRENT_SOURCE_DIR}/lib-mime/mime-token)
374 ADD_CUSTOM_COMMAND(
375     OUTPUT ${__mt}.h
376     MAIN_DEPENDENCY ${__mt}.sh ${__mt}.def
377     COMMAND sh ${__mt}.sh ${__mt}.h < ${__mt}.def
378     COMMENT "Generating ${__mt}.h from ${__mt}.def"
379 )
380 SET(__lt ${CMAKE_CURRENT_SOURCE_DIR}/lib-lua/lua-token)
381 ADD_CUSTOM_COMMAND(
382     OUTPUT ${__lt}.h
383     MAIN_DEPENDENCY ${__lt}.gperf
384     COMMAND sh ${__lt}.gperf ${__lt}.h || \(${RM} ${__lt}.h; exit 1\)
385     COMMENT "Generating ${__lt}.h from ${__lt}.gperf"
386 )
387 SET(__lm ${CMAKE_CURRENT_SOURCE_DIR}/lib-lua/madmutt)
388 ADD_CUSTOM_COMMAND(
389     OUTPUT ${__lm}.li
390     MAIN_DEPENDENCY ${__lm}.cpkg
391     COMMAND ${madmutt_SOURCE_DIR}/tools/cpkg2c -h ${__lm}.cpkg > ${__lm}.li || \(${RM} ${__lm}.li; exit 1\)
392     COMMENT "Generating ${__lm}.li from ${__lm}.cpkg"
393 )
394 ADD_CUSTOM_TARGET(
395     generate_files
396     DEPENDS
397         ${madmuttgen}
398         ${madmutt_SOURCE_DIR}/keymap_defs.h
399         ${madmutt_SOURCE_DIR}/charset.gperf
400         ${madmutt_SOURCE_DIR}/lib-mime/mime-token.h
401         ${madmutt_SOURCE_DIR}/lib-lua/lua-token.h
402         ${madmutt_SOURCE_DIR}/lib-lua/madmutt.li
403 )
404 ADD_DEPENDENCIES(madmutt generate_files)
405
406 # }}}