Add proper dflags
[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 # D flags {{{
264 # big debug flags
265 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -ggdb3")
266 # Use pipes and not temp files.
267 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -pipe")
268 # optimize even more
269 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -O2")
270 # let the type char be unsigned by default
271 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -funsigned-char")
272 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -fstrict-aliasing")
273 # turn on all common warnings
274 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wall")
275 # turn on extra warnings
276 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -W")
277 # treat warnings as errors
278 #SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Werror")
279 # warn about local variable shadowing another local variable
280 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wshadow")
281 # warn about casting of pointers to increased alignment requirements
282 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wcast-align")
283 # warn about comparisons between signed and unsigned values
284 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wsign-compare")
285 # warn about unused declared stuff
286 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wunused")
287 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wno-unused-parameter")
288 # warn about variable use before initialization
289 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wuninitialized")
290 # }}}
291
292 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
293
294 # we generate some includes
295 ADD_SUBDIRECTORY(lib-lib)
296 ADD_SUBDIRECTORY(lib-mime)
297 ADD_SUBDIRECTORY(lib-sys)
298 ADD_SUBDIRECTORY(lib-ui)
299 ADD_SUBDIRECTORY(imap)
300 ADD_SUBDIRECTORY(lib-mx)
301 ADD_SUBDIRECTORY(lib-lua)
302 ADD_SUBDIRECTORY(po)
303
304 MADMUTT_SOURCES(madmuttsrc madmuttgen
305     alias.cpkg
306     buffy.cpkg
307     charset.cpkg
308     crypt.cpkg
309     score.cpkg
310
311     account.c
312     attach.c
313     browser.c
314     commands.c
315     compose.c
316     copy.c
317     editmsg.c
318     flags.c
319     handler.c
320     headers.c
321     help.c
322     hook.c
323     init.c
324     keymap.c
325     mutt_idna.c
326     muttlib.c
327     mutt_sasl.c
328     pager.c
329     pattern.c
330     pop.c
331     postpone.c
332     recvattach.c
333     recvcmd.c
334     send.c
335     sendlib.c
336     sort.c
337     state.c
338     thread.c
339
340     main.c
341 )
342 IF(WITH_NNTP)
343     MADMUTT_SOURCES(madmuttsrc madmuttgen
344         nntp.c
345     )
346 ENDIF(WITH_NNTP)
347
348 STRING(REGEX REPLACE ";" " " MUTTLIBS "${MUTTLIBS}")
349 ADD_EXECUTABLE(madmutt ${madmuttsrc})
350 TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap ui lib)
351 SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS "${MUTTLIBS}")
352
353 # generate_files hack {{{
354
355 ADD_CUSTOM_COMMAND(
356     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
357     DEPENDS ${madmutt_SOURCE_DIR}/OPS ${madmutt_SOURCE_DIR}/tools/gen_defs
358     COMMAND ${madmutt_SOURCE_DIR}/tools/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h
359     COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS"
360 )
361 ADD_CUSTOM_COMMAND(
362     OUTPUT  ${madmutt_SOURCE_DIR}/charset.gperf
363     DEPENDS ${madmutt_SOURCE_DIR}/charset.def
364     COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf
365     COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def"
366 )
367 ADD_CUSTOM_TARGET(generate_file
368     DEPENDS ${madmuttgen}
369     ${madmutt_SOURCE_DIR}/keymap_defs.h
370     ${madmutt_SOURCE_DIR}/charset.gperf
371 )
372 ADD_DEPENDENCIES(generate_file generate_files)
373 ADD_DEPENDENCIES(madmutt generate_file)
374
375 # }}}