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