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