get rid of slang
[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
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(SENDMAIL sendmail
43     PATHS /usr/sbin /sbin /usr/lib
44     DOC   "path to sendmail executable"
45 )
46 FIND_FILE(MIXMASTER mixmaster DOC "path to mixmaster")
47 IF(NOT MIXMASTER)
48     SET(MIXMASTER "mixmaster")
49 ENDIF(NOT MIXMASTER)
50
51 IF(NOT MAILPATH)
52     IF(EXISTS /var/mail)
53         SET(MAILPATH "/var/mail")
54     ELSEIF(EXISTS /var/spool/mail)
55         SET(MAILPATH "/var/spool/mail")
56     ELSEIF(EXISTS /usr/spool/mail)
57         SET(MAILPATH "/usr/spool/mail")
58     ELSEIF(EXISTS /usr/mail)
59         SET(MAILPATH "/usr/mail")
60     ELSE(EXISTS /var/mail)
61         MESSAGE(FATAL_ERROR "Unable to determine MAILPATH")
62     ENDIF(EXISTS /var/mail)
63 ENDIF(NOT MAILPATH)
64
65 # headers {{{
66 INCLUDE(CheckIncludeFile)
67
68 CHECK_INCLUDE_FILE(alloca.h               HAVE_ALLOCA_H)
69 CHECK_INCLUDE_FILE(argz.h                 HAVE_ARGZ_H)
70 CHECK_INCLUDE_FILE(getopt.h               HAVE_GETOPT_H)
71 CHECK_INCLUDE_FILE(iconv.h                HAVE_ICONV_H)
72 CHECK_INCLUDE_FILE(inttypes.h             HAVE_INTTYPES_H)
73 CHECK_INCLUDE_FILE(ioctl.h                HAVE_IOCTL_H)
74 CHECK_INCLUDE_FILE(langinfo.h             HAVE_LANGINFO_H)
75 CHECK_INCLUDE_FILE(limits.h               HAVE_LIMITS_H)
76 CHECK_INCLUDE_FILE(locale.h               HAVE_LOCALE_H)
77 CHECK_INCLUDE_FILE(memory.h               HAVE_MEMORY_H)
78 CHECK_INCLUDE_FILE(ncurses.h              HAVE_NCURSES_H)
79 CHECK_INCLUDE_FILE(ncurses/ncurses.h      HAVE_NCURSES_NCURSES_H)
80 CHECK_INCLUDE_FILE(ncursesw/ncurses.h     HAVE_NCURSESW_NCURSES_H)
81 CHECK_INCLUDE_FILE(regex.h                HAVE_REGEX_H)
82 CHECK_INCLUDE_FILE(stdarg.h               HAVE_STDARG_H)
83 CHECK_INCLUDE_FILE(stddef.h               HAVE_STDDEF_H)
84 CHECK_INCLUDE_FILE(stdint.h               HAVE_STDINT_H)
85 CHECK_INCLUDE_FILE(stdlib.h               HAVE_STDLIB_H)
86 CHECK_INCLUDE_FILE(string.h               HAVE_STRING_H)
87 CHECK_INCLUDE_FILE(strings.h              HAVE_STRINGS_H)
88 CHECK_INCLUDE_FILE(sysexits.h             HAVE_SYSEXITS_H)
89 CHECK_INCLUDE_FILE(sys/ioctl.h            HAVE_SYS_IOCTL_H)
90 CHECK_INCLUDE_FILE(sys/param.h            HAVE_SYS_PARAM_H)
91 CHECK_INCLUDE_FILE(sys/resource.h         HAVE_SYS_RESOURCE_H)
92 CHECK_INCLUDE_FILE(sys/stat.h             HAVE_SYS_STAT_H)
93 CHECK_INCLUDE_FILE(sys/time.h             HAVE_SYS_TIME_H)
94 CHECK_INCLUDE_FILE(sys/types.h            HAVE_SYS_TYPES_H)
95 CHECK_INCLUDE_FILE(unistd.h               HAVE_UNISTD_H)
96 CHECK_INCLUDE_FILE(unix.h                 HAVE_UNIX_H)
97 CHECK_INCLUDE_FILE(wchar.h                HAVE_WCHAR_H)
98 CHECK_INCLUDE_FILE(wctype.h               HAVE_WCTYPE_H)
99
100 IF(NOT HAVE_ICONV_H)
101     MESSAGE(FATAL_ERROR "inconv.h not found")
102 ENDIF(NOT HAVE_ICONV_H)
103
104 # }}}
105 # types {{{
106
107 INCLUDE(CheckStructMember)
108
109 CHECK_STRUCT_MEMBER("struct dirent" "d_ino" "dirent.h" HAVE_DIRENT_D_INO)
110
111 # }}}
112 # functions {{{
113 INCLUDE (CheckFunctionExists)
114
115 CHECK_FUNCTION_EXISTS(strlimit    HAVE_SETRLIMIT)
116 CHECK_FUNCTION_EXISTS(getsid      HAVE_GETSID)
117 CHECK_FUNCTION_EXISTS(setegid     HAVE_SETEGID)
118 CHECK_FUNCTION_EXISTS(isctype     HAVE_ISCTYPE)
119 CHECK_FUNCTION_EXISTS(getopt      HAVE_GETOPT)
120 CHECK_FUNCTION_EXISTS(regcomp     HAVE_REGCOMP)
121 CHECK_FUNCTION_EXISTS(iswalnum    HAVE_ISWALNUM)
122 CHECK_FUNCTION_EXISTS(iswalpha    HAVE_ISWALPHA)
123 CHECK_FUNCTION_EXISTS(iswcntrl    HAVE_ISWCNTRL)
124 CHECK_FUNCTION_EXISTS(iswdigit    HAVE_ISWDIGIT)
125 CHECK_FUNCTION_EXISTS(iswgraph    HAVE_ISWGRAPH)
126 CHECK_FUNCTION_EXISTS(iswlower    HAVE_ISWLOWER)
127 CHECK_FUNCTION_EXISTS(iswprint    HAVE_ISWPRINT)
128 CHECK_FUNCTION_EXISTS(iswpunct    HAVE_ISWPUNCT)
129 CHECK_FUNCTION_EXISTS(iswspace    HAVE_ISWSPACE)
130 CHECK_FUNCTION_EXISTS(iswupper    HAVE_ISWUPPER)
131 CHECK_FUNCTION_EXISTS(iswxdigit   HAVE_ISWXDIGIT)
132 CHECK_FUNCTION_EXISTS(towupper    HAVE_TOWUPPER)
133 CHECK_FUNCTION_EXISTS(towlower    HAVE_TOWLOWER)
134 CHECK_FUNCTION_EXISTS(nl_langinfo HAVE_LANGINFO_CODESET)
135
136 # }}}
137 # libraries {{{
138 INCLUDE(CheckLibraryExists)
139 INCLUDE(UsePkgConfig)
140
141 IF(HAVE_NCURSESW_NCURSES_H)
142     SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h")
143     SET(MUTTLIBS "${MUTTLIBS} -lncursesw")
144 ELSEIF(HAVE_NCURSES_H)
145     SET(CMAKE_REQUIRED_INCLUDES "ncurses.h")
146     SET(MUTTLIBS "${MUTTLIBS} -lncurses")
147 ELSEIF(HAVE_NCURSES_H OR HAVE_NCURSES_NCURSES_H)
148     SET(CMAKE_REQUIRED_INCLUDES "ncurses/ncurses.h")
149     SET(MUTTLIBS "${MUTTLIBS} -lncurses")
150 ELSE(HAVE_NCURSESW_NCURSES_H)
151     MESSAGE(FATAL_ERROR "could not find ncurses.h")
152 ENDIF(HAVE_NCURSESW_NCURSES_H)
153 SET(CMAKE_REQUIRED_LIBRARIES ${MUTTLIBS})
154 CHECK_FUNCTION_EXISTS(start_color        HAVE_START_COLOR)
155 CHECK_FUNCTION_EXISTS(typeahead          HAVE_TYPEAHEAD)
156 CHECK_FUNCTION_EXISTS(bkgdset            HAVE_BKGDSET)
157 CHECK_FUNCTION_EXISTS(curs_set           HAVE_CURS_SET)
158 CHECK_FUNCTION_EXISTS(meta               HAVE_META)
159 CHECK_FUNCTION_EXISTS(use_default_colors HAVE_USE_DEFAULT_COLORS)
160 CHECK_FUNCTION_EXISTS(resizeterm         HAVE_RESIZETERM)
161 SET(CMAKE_REQUIRED_LIBRARIES)
162 SET(CMAKE_REQUIRED_INCLUDES)
163
164 PKGCONFIG(lua5.1 lua_INCDIR lua_LINKDIR lua_LDFLAGS lua_CFLAGS)
165 MESSAGE(STATUS "found lua5.1 at: INCDIR ${lua_INCDIR}")
166 INCLUDE_DIRECTORIES(${lua_INCDIR})
167 ADD_DEFINITIONS(${lua_CFLAGS})
168 SET(MUTTLIBS "${MUTTLIBS} ${lua_LDFLAGS}")
169
170 IF(WITH_GPGME)
171     XCONFIG(gpgme-config gpgme_INCDIR gpgme_LINKDIR gpgme_LDFLAGS gpgme_CFLAGS)
172     INCLUDE_DIRECTORIES(${gpgme_INCDIR})
173     ADD_DEFINITIONS(${gpgme_CFLAGS})
174     SET(MUTTLIBS "${MUTTLIBS} ${gpgme_LDFLAGS}")
175     SET(HAVE_GPGME 1)
176 ENDIF(WITH_GPGME)
177
178 XCONFIG(libgnutls-config gnutls_INCDIR gnutls_LINKDIR gnutls_LDFLAGS gnutls_CFLAGS)
179 INCLUDE_DIRECTORIES(${gnutls_INCDIR})
180 ADD_DEFINITIONS(${gnutls_CFLAGS})
181 CHECK_INCLUDE_FILE(gnutls/openssl.h  HAVE_GNUTLS_OPENSSL_H)
182 SET(MUTTLIBS "${MUTTLIBS} ${gnutls_LDFLAGS}")
183
184 CHECK_LIBRARY_EXISTS(sasl2 sasl_client_init "" WITH_SASL)
185 IF(NOT WITH_SASL)
186     MESSAGE(FATAL_ERROR "sasl2 not found")
187 ENDIF(NOT WITH_SASL)
188 SET(MUTTLIBS "${MUTTLIBS} -lsasl2")
189
190 IF(WITH_IDN)
191     PKGCONFIG(libidn idn_INCDIR idn_LINKDIR idn_LDFLAGS idn_CFLAGS)
192     SET(MUTTLIBS "${MUTTLIBS} ${idn_LDFLAGS}")
193     SET(HAVE_LIBIDN 1)
194 ENDIF(WITH_IDN)
195
196 IF(USE_HCACHE)
197     OPTION(WITH_QDBM "Use qdbm for header caching [default: on]" ON)
198     OPTION(WITH_GDBM "Use gdbm for header caching [default: off]")
199     SET(USE_HCACHE)
200
201     IF(WITH_QDBM)
202         PKGCONFIG(qdbm qdbm_INCDIR qdbm_LINKDIR qdbm_LDFLAGS qdbm_CFLAGS)
203         IF(qdbm_LDFLAGS)
204             MESSAGE(STATUS "qdbm found")
205         ELSE(qdbm_LDFLAGS)
206             MESSAGE(FATAL_ERROR "qdbm not found")
207         ENDIF(qdbm_LDFLAGS)
208         INCLUDE_DIRECTORIES(${qdbm_INCDIR})
209         ADD_DEFINITIONS(${qdbm_CFLAGS})
210         SET(MUTTLIBS "${MUTTLIBS} ${qdbm_LDFLAGS}")
211         SET(USE_HCACHE 1)
212         SET(HAVE_QDBM 1)
213     ENDIF(WITH_QDBM)
214
215     IF(NOT USE_HCACHE AND WITH_GDBM)
216         CHECK_LIBRARY_EXISTS(gdbm gdbm_open "" GDBM)
217         IF(NOT GDBM)
218             MESSAGE(FATAL_ERROR "gdbm not found")
219         ENDIF(NOT GDBM)
220         SET(MUTTLIBS "${MUTTLIBS} -lgdbm")
221         SET(USE_HCACHE 1)
222         SET(HAVE_GDBM 1)
223     ENDIF(NOT USE_HCACHE AND WITH_GDBM)
224
225     IF(NOT USE_HCACHE)
226         MESSAGE(FATAL_ERROR "no backend for header caching selected")
227     ENDIF(NOT USE_HCACHE)
228 ENDIF(USE_HCACHE)
229
230 IF(WITH_NNTP AND NOT USE_NNTP)
231     SET(USE_NNTP 1)
232     MESSAGE(STATUS "building NNTP support")
233 ENDIF(WITH_NNTP AND NOT USE_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 ADD_SUBDIRECTORY(lib-mx)
293 ADD_SUBDIRECTORY(lib-lua)
294 ADD_SUBDIRECTORY(po)
295
296 MADMUTT_SOURCES(madmuttsrc madmuttgen
297     alias.cpkg
298     buffy.cpkg
299     charset.cpkg
300     crypt.cpkg
301     score.cpkg
302
303     account.c
304     attach.c
305     browser.c
306     commands.c
307     compose.c
308     copy.c
309     editmsg.c
310     flags.c
311     from.c
312     handler.c
313     headers.c
314     help.c
315     hook.c
316     init.c
317     keymap.c
318     mutt_idna.c
319     muttlib.c
320     mutt_sasl.c
321     pager.c
322     pattern.c
323     pop.c
324     postpone.c
325     recvattach.c
326     recvcmd.c
327     remailer.c
328     send.c
329     sendlib.c
330     sort.c
331     state.c
332     thread.c
333
334     main.c
335 )
336 IF(WITH_NNTP)
337     MADMUTT_SOURCES(madmuttsrc madmuttgen
338         nntp.c
339     )
340 ENDIF(WITH_NNTP)
341
342 ADD_EXECUTABLE(madmutt ${madmuttsrc})
343 TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap ui lib)
344 SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS ${MUTTLIBS})
345
346 ADD_EXECUTABLE(madmutt_dotlock dotlock.c)
347 TARGET_LINK_LIBRARIES(madmutt_dotlock lib)
348
349 # generate_files hack {{{
350
351 ADD_CUSTOM_COMMAND(
352     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
353     DEPENDS ${madmutt_SOURCE_DIR}/OPS ${madmutt_SOURCE_DIR}/tools/gen_defs
354     COMMAND ${madmutt_SOURCE_DIR}/tools/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h
355     COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS"
356 )
357 ADD_CUSTOM_COMMAND(
358     OUTPUT  ${madmutt_SOURCE_DIR}/charset.gperf
359     DEPENDS ${madmutt_SOURCE_DIR}/charset.def
360     COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf
361     COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def"
362 )
363 ADD_CUSTOM_TARGET(generate_file
364     DEPENDS ${madmuttgen}
365     ${madmutt_SOURCE_DIR}/keymap_defs.h
366     ${madmutt_SOURCE_DIR}/charset.gperf
367 )
368 ADD_DEPENDENCIES(generate_file generate_files)
369 ADD_DEPENDENCIES(madmutt generate_file)
370
371 # }}}