229f8320440731de277ab807a726caa90913a82a
[apps/madmutt.git] / CMakeLists.txt
1 SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
2
3 PROJECT(madmutt C D)
4 SET(PACKAGE madmutt)
5
6 # Using Phobos OR Tango (can be specified from cmake command line)
7 if (NOT CMAKE_D_USE_PHOBOS AND NOT CMAKE_D_USE_TANGO)
8         # default to phobos
9         message(STATUS "This application can be built with either Phobos or Tango!")
10         message(STATUS "You did not specify a standard library -- defaulting to Phobos.")
11         message(STATUS "If you wish to use Tango add -DCMAKE_D_USE_TANGO=True to cmake command line.")
12         set(CMAKE_D_USE_PHOBOS True)
13 endif (NOT CMAKE_D_USE_PHOBOS AND NOT CMAKE_D_USE_TANGO)
14
15 INCLUDE(CMakeDetermineCCompiler)
16 include(Cpkg2c)
17 include(XConfig)
18
19 ADD_DEFINITIONS(-DHAVE_CONFIG_H)
20 ADD_DEFINITIONS(-D_GNU_SOURCE)
21 INCLUDE_DIRECTORIES(${madmutt_BINARY_DIR} ${madmutt_SOURCE_DIR})
22
23 SET(BINDIR     "${CMAKE_INSTALL_PREFIX}/bin")
24 SET(DATADIR    "${CMAKE_INSTALL_PREFIX}/share")
25 SET(PKGDATADIR "${CMAKE_INSTALL_PREFIX}/share/madmutt")
26 SET(PKGDOCDIR  "${CMAKE_INSTALL_PREFIX}/share/doc/madmutt")
27 SET(SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc")
28 SET(VERSION    "devel")
29 SET(MUTTLIBS)
30
31 ADD_DEFINITIONS("-DBINDIR=\\\"${BINDIR}\\\"")
32 ADD_DEFINITIONS("-DPKGDATADIR=\\\"${PKGDATADIR}\\\"")
33 ADD_DEFINITIONS("-DPKGDOCDIR=\\\"${PKGDOCDIR}\\\"")
34 ADD_DEFINITIONS("-DSYSCONFDIR=\\\"${SYSCONFDIR}\\\"")
35 ADD_DEFINITIONS("-DVERSION=\\\"${VERSION}\\\"")
36 ADD_DEFINITIONS("-DMUTTLOCALEDIR=\\\"${DATADIR}/locale\\\"")
37
38 SET(MAILPATH         CACHE STRING "Where new mail is spooled")
39 OPTION(WITH_GPGME    "Use GPGME [default: on]" ON)
40 OPTION(WITH_NNTP     "Build NNTP support [default: off]")
41 OPTION(WITH_IDN      "Use GNU libidn for domain names [default: off]")
42
43 OPTION(USE_FLOCK     "Use flock to lock files [default: off]")
44 OPTION(USE_FCNTL     "Use fcntl to lock files [default: on]" ON)
45 OPTION(USE_HCACHE    "Enable headers caching  [default: off]")
46
47 FIND_FILE(SENDMAIL sendmail
48     PATHS /usr/sbin /sbin /usr/lib
49     DOC   "path to sendmail executable"
50 )
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(getopt      HAVE_GETOPT)
120 CHECK_FUNCTION_EXISTS(nl_langinfo HAVE_LANGINFO_CODESET)
121
122 # }}}
123 # libraries {{{
124 INCLUDE(CheckLibraryExists)
125 INCLUDE(FindPkgConfig)
126
127 IF(HAVE_NCURSESW_NCURSES_H)
128     SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h")
129     LIST(APPEND MUTTLIBS -lncursesw)
130 ELSEIF(HAVE_NCURSES_H)
131     SET(CMAKE_REQUIRED_INCLUDES "ncurses.h")
132     LIST(APPEND MUTTLIBS  -lncurses)
133 ELSEIF(HAVE_NCURSES_H OR HAVE_NCURSES_NCURSES_H)
134     SET(CMAKE_REQUIRED_INCLUDES "ncurses/ncurses.h")
135     LIST(APPEND MUTTLIBS  -lncurses)
136 ELSE(HAVE_NCURSESW_NCURSES_H)
137     MESSAGE(FATAL_ERROR "could not find ncurses.h")
138 ENDIF(HAVE_NCURSESW_NCURSES_H)
139 SET(CMAKE_REQUIRED_LIBRARIES ${MUTTLIBS})
140 CHECK_FUNCTION_EXISTS(resizeterm         HAVE_RESIZETERM)
141 SET(CMAKE_REQUIRED_LIBRARIES)
142 SET(CMAKE_REQUIRED_INCLUDES)
143
144 pkg_search_module(LUA REQUIRED lua5.1)
145 ADD_DEFINITIONS(${LUA_CFLAGS})
146 LIST(APPEND MUTTLIBS ${LUA_LDFLAGS})
147
148 IF(WITH_GPGME)
149     XCONFIG(gpgme-config gpgme_INCDIR gpgme_LINKDIR gpgme_LDFLAGS gpgme_CFLAGS)
150     INCLUDE_DIRECTORIES(${gpgme_INCDIR})
151     ADD_DEFINITIONS(${gpgme_CFLAGS})
152     LIST(APPEND MUTTLIBS ${gpgme_LDFLAGS})
153     SET(HAVE_GPGME 1)
154 ENDIF(WITH_GPGME)
155
156 XCONFIG(libgnutls-config gnutls_INCDIR gnutls_LINKDIR gnutls_LDFLAGS gnutls_CFLAGS)
157 INCLUDE_DIRECTORIES(${gnutls_INCDIR})
158 ADD_DEFINITIONS(${gnutls_CFLAGS})
159 CHECK_INCLUDE_FILE(gnutls/openssl.h  HAVE_GNUTLS_OPENSSL_H)
160 LIST(APPEND MUTTLIBS ${gnutls_LDFLAGS})
161
162 CHECK_LIBRARY_EXISTS(sasl2 sasl_client_init "" WITH_SASL)
163 IF(NOT WITH_SASL)
164     MESSAGE(FATAL_ERROR "sasl2 not found")
165 ENDIF(NOT WITH_SASL)
166 LIST(APPEND MUTTLIBS -lsasl2)
167
168 IF(WITH_IDN)
169     pkg_search_module(IDN REQUIRED libidn)
170     LIST(APPEND MUTTLIBS ${IDN_LDFLAGS})
171     SET(HAVE_LIBIDN 1)
172 ENDIF(WITH_IDN)
173
174 CHECK_LIBRARY_EXISTS(lockfile lockfile_create "" WITH_LOCKFILE)
175 IF(NOT WITH_LOCKFILE)
176     MESSAGE(FATAL_ERROR "lockfile not found")
177 ENDIF(NOT WITH_LOCKFILE)
178 LIST(APPEND MUTTLIBS -llockfile)
179
180 IF(USE_HCACHE)
181     OPTION(WITH_QDBM "Use qdbm for header caching [default: on]" ON)
182     OPTION(WITH_GDBM "Use gdbm for header caching [default: off]")
183     SET(USE_HCACHE)
184
185     IF(WITH_QDBM)
186         pkg_search_module(QDBM REQUIRED qdbm)
187         ADD_DEFINITIONS(${QDBM_CFLAGS})
188         SET(QDBM_LDFLAGS "${QDBM_LDFLAGS}")
189         # LIST(APPEND MUTTLIBS ${QDBM_LDFLAGS})
190         LIST(APPEND MUTTLIBS -lqdbm)
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         LIST(APPEND 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     handler.c
292     headers.c
293     help.c
294     hook.c
295     init.c
296     keymap.c
297     mutt_idna.c
298     muttlib.c
299     mutt_sasl.c
300     pager.c
301     pattern.c
302     pop.c
303     postpone.c
304     recvattach.c
305     recvcmd.c
306     send.c
307     sendlib.c
308     sort.c
309     state.c
310     thread.c
311
312     main.c
313 )
314 IF(WITH_NNTP)
315     MADMUTT_SOURCES(madmuttsrc madmuttgen
316         nntp.c
317     )
318 ENDIF(WITH_NNTP)
319
320 STRING(REGEX REPLACE ";" " " MUTTLIBS "${MUTTLIBS}")
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 # }}}