fix line number and file.
[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(${CMAKE_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 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_LIBESMTP)
244     SET(USE_LIBESMTP 1)
245     SET(MUTTLIBS "${MUTTLIBS} -lesmtp")
246 ENDIF(WITH_LIBESMTP)
247
248 IF(WITH_NNTP AND NOT USE_NNTP)
249     SET(USE_NNTP 1)
250     MESSAGE(STATUS "building NNTP support")
251 ENDIF(WITH_NNTP AND NOT USE_NNTP)
252
253 # }}}
254 # C flags {{{
255 # big debug flags
256 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ggdb3")
257 # Use pipes and not temp files.
258 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe")
259 # optimize even more
260 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
261 # let the type char be unsigned by default
262 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -funsigned-char")
263 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing")
264 # turn on all common warnings
265 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
266 # turn on extra warnings
267 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W")
268 # treat warnings as errors
269 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
270 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wchar-subscripts")
271 # warn about undefined preprocessor identifiers
272 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef")
273 # warn about local variable shadowing another local variable
274 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
275 # warn about casting of pointers to increased alignment requirements
276 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align")
277 # make string constants const
278 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wwrite-strings")
279 # warn about comparisons between signed and unsigned values
280 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare")
281 # warn about unused declared stuff
282 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused")
283 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
284 # warn about variable use before initialization
285 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wuninitialized")
286 # warn about variables which are initialized with themselves
287 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winit-self")
288 # warn about pointer arithmetic on void* and function pointers
289 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
290 # warn about multiple declarations
291 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
292 # warn if the format string is not a string literal
293 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat-nonliteral")
294 # do not warn about zero-length formats.
295 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format-zero-length")
296 # missing prototypes
297 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes")
298 # warn about functions without format attribute that should have one
299 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
300 # }}}
301
302 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
303
304 # we generate some includes
305 ADD_SUBDIRECTORY(lib-lib)
306 ADD_SUBDIRECTORY(lib-mime)
307 ADD_SUBDIRECTORY(lib-sys)
308 ADD_SUBDIRECTORY(lib-ui)
309 ADD_SUBDIRECTORY(imap)
310 IF(WITH_NNTP)
311     ADD_SUBDIRECTORY(nntp)
312 ENDIF(WITH_NNTP)
313 ADD_SUBDIRECTORY(lib-mx)
314 ADD_SUBDIRECTORY(lib-lua)
315
316 MADMUTT_SOURCES(madmuttsrc madmuttgen
317     alias.cpkg
318     buffy.cpkg
319     charset.cpkg
320     crypt.cpkg
321     score.cpkg
322
323     account.c
324     attach.c
325     base64.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     send_smtp.c
352     sort.c
353     state.c
354     thread.c
355
356     main.c
357 )
358
359 ADD_EXECUTABLE(madmutt ${madmuttsrc})
360 IF(WITH_NNTP)
361     TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap nntp ui lib)
362 ELSE(WITH_NNTP)
363     TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap ui lib)
364 ENDIF(WITH_NNTP)
365 SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS ${MUTTLIBS})
366
367 ADD_EXECUTABLE(madmutt_dotlock dotlock.c)
368 TARGET_LINK_LIBRARIES(madmutt_dotlock lib)
369
370 # generate_files hack {{{
371
372 ADD_CUSTOM_COMMAND(
373     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
374     DEPENDS ${madmutt_SOURCE_DIR}/OPS ${madmutt_SOURCE_DIR}/gen_defs
375     COMMAND ${madmutt_SOURCE_DIR}/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h
376     COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS"
377 )
378 ADD_CUSTOM_COMMAND(
379     OUTPUT  ${madmutt_SOURCE_DIR}/charset.gperf
380     DEPENDS ${madmutt_SOURCE_DIR}/charset.def
381     COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf
382     COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def"
383 )
384 ADD_CUSTOM_TARGET(generate_file
385     DEPENDS ${madmuttgen}
386     ${madmutt_SOURCE_DIR}/keymap_defs.h
387     ${madmutt_SOURCE_DIR}/charset.gperf
388 )
389 ADD_DEPENDENCIES(generate_file generate_files)
390 ADD_DEPENDENCIES(madmutt generate_file)
391
392 # }}}