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