Import madtty, use it to deal with colors from now on as it needs to know what is...
[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   "-lutil")
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_IDN      "Use GNU libidn for domain names [default: off]")
41
42 OPTION(USE_FLOCK     "Use flock to lock files [default: off]")
43 OPTION(USE_FCNTL     "Use fcntl to lock files [default: on]" ON)
44 OPTION(USE_HCACHE    "Enable headers caching  [default: off]")
45
46 FIND_FILE(SENDMAIL sendmail
47     PATHS /usr/sbin /sbin /usr/lib
48     DOC   "path to sendmail executable"
49 )
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(getopt      HAVE_GETOPT)
119 CHECK_FUNCTION_EXISTS(nl_langinfo HAVE_LANGINFO_CODESET)
120
121 # }}}
122 # libraries {{{
123 INCLUDE(CheckLibraryExists)
124 INCLUDE(FindPkgConfig)
125
126 IF(HAVE_NCURSESW_NCURSES_H)
127     SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h")
128     LIST(APPEND MUTTLIBS -lncursesw)
129 ELSEIF(HAVE_NCURSES_H)
130     SET(CMAKE_REQUIRED_INCLUDES "ncurses.h")
131     LIST(APPEND MUTTLIBS  -lncurses)
132 ELSEIF(HAVE_NCURSES_H OR HAVE_NCURSES_NCURSES_H)
133     SET(CMAKE_REQUIRED_INCLUDES "ncurses/ncurses.h")
134     LIST(APPEND MUTTLIBS  -lncurses)
135 ELSE(HAVE_NCURSESW_NCURSES_H)
136     MESSAGE(FATAL_ERROR "could not find ncurses.h")
137 ENDIF(HAVE_NCURSESW_NCURSES_H)
138 SET(CMAKE_REQUIRED_LIBRARIES ${MUTTLIBS})
139 CHECK_FUNCTION_EXISTS(resizeterm         HAVE_RESIZETERM)
140 SET(CMAKE_REQUIRED_LIBRARIES)
141 SET(CMAKE_REQUIRED_INCLUDES)
142
143 pkg_search_module(LUA REQUIRED lua5.1)
144 ADD_DEFINITIONS(${LUA_CFLAGS})
145 LIST(APPEND MUTTLIBS ${LUA_LDFLAGS})
146
147 IF(WITH_GPGME)
148     XCONFIG(gpgme-config gpgme_INCDIR gpgme_LINKDIR gpgme_LDFLAGS gpgme_CFLAGS)
149     INCLUDE_DIRECTORIES(${gpgme_INCDIR})
150     ADD_DEFINITIONS(${gpgme_CFLAGS})
151     LIST(APPEND MUTTLIBS ${gpgme_LDFLAGS})
152     SET(HAVE_GPGME 1)
153 ENDIF(WITH_GPGME)
154
155 XCONFIG(libgnutls-config gnutls_INCDIR gnutls_LINKDIR gnutls_LDFLAGS gnutls_CFLAGS)
156 INCLUDE_DIRECTORIES(${gnutls_INCDIR})
157 ADD_DEFINITIONS(${gnutls_CFLAGS})
158 CHECK_INCLUDE_FILE(gnutls/openssl.h  HAVE_GNUTLS_OPENSSL_H)
159 LIST(APPEND MUTTLIBS ${gnutls_LDFLAGS})
160
161 CHECK_LIBRARY_EXISTS(sasl2 sasl_client_init "" WITH_SASL)
162 IF(NOT WITH_SASL)
163     MESSAGE(FATAL_ERROR "sasl2 not found")
164 ENDIF(NOT WITH_SASL)
165 LIST(APPEND MUTTLIBS -lsasl2)
166
167 IF(WITH_IDN)
168     pkg_search_module(IDN REQUIRED libidn)
169     LIST(APPEND MUTTLIBS ${IDN_LDFLAGS})
170     SET(HAVE_LIBIDN 1)
171 ENDIF(WITH_IDN)
172
173 CHECK_LIBRARY_EXISTS(lockfile lockfile_create "" WITH_LOCKFILE)
174 IF(NOT WITH_LOCKFILE)
175     MESSAGE(FATAL_ERROR "lockfile not found")
176 ENDIF(NOT WITH_LOCKFILE)
177 LIST(APPEND MUTTLIBS -llockfile)
178
179 IF(USE_HCACHE)
180     OPTION(WITH_QDBM "Use qdbm for header caching [default: on]" ON)
181     OPTION(WITH_GDBM "Use gdbm for header caching [default: off]")
182     SET(USE_HCACHE)
183
184     IF(WITH_QDBM)
185         pkg_search_module(QDBM REQUIRED qdbm)
186         ADD_DEFINITIONS(${QDBM_CFLAGS})
187         SET(QDBM_LDFLAGS "${QDBM_LDFLAGS}")
188         # LIST(APPEND MUTTLIBS ${QDBM_LDFLAGS})
189         LIST(APPEND MUTTLIBS -lqdbm)
190         SET(USE_HCACHE 1)
191         SET(HAVE_QDBM 1)
192     ENDIF(WITH_QDBM)
193
194     IF(NOT USE_HCACHE AND WITH_GDBM)
195         CHECK_LIBRARY_EXISTS(gdbm gdbm_open "" GDBM)
196         IF(NOT GDBM)
197             MESSAGE(FATAL_ERROR "gdbm not found")
198         ENDIF(NOT GDBM)
199         LIST(APPEND MUTTLIBS -lgdbm)
200         SET(USE_HCACHE 1)
201         SET(HAVE_GDBM 1)
202     ENDIF(NOT USE_HCACHE AND WITH_GDBM)
203
204     IF(NOT USE_HCACHE)
205         MESSAGE(FATAL_ERROR "no backend for header caching selected")
206     ENDIF(NOT USE_HCACHE)
207 ENDIF(USE_HCACHE)
208
209 # }}}
210 # C flags {{{
211 # big debug flags
212 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ggdb3")
213 # Use pipes and not temp files.
214 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe")
215 # optimize even more
216 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
217 # let the type char be unsigned by default
218 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -funsigned-char")
219 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing")
220 # turn on all common warnings
221 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
222 # turn on extra warnings
223 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W")
224 # treat warnings as errors
225 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
226 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wchar-subscripts")
227 # warn about undefined preprocessor identifiers
228 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef")
229 # warn about local variable shadowing another local variable
230 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
231 # warn about casting of pointers to increased alignment requirements
232 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align")
233 # make string constants const
234 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wwrite-strings")
235 # warn about comparisons between signed and unsigned values
236 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare")
237 # warn about unused declared stuff
238 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused")
239 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
240 # warn about variable use before initialization
241 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wuninitialized")
242 # warn about variables which are initialized with themselves
243 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winit-self")
244 # warn about pointer arithmetic on void* and function pointers
245 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
246 # warn about multiple declarations
247 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
248 # warn if the format string is not a string literal
249 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat-nonliteral")
250 # do not warn about zero-length formats.
251 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format-zero-length")
252 # missing prototypes
253 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes")
254 # warn about functions without format attribute that should have one
255 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
256 # }}}
257 # D flags {{{
258 # big debug flags
259 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -ggdb3")
260 # Use pipes and not temp files.
261 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -pipe")
262 # optimize even more
263 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -O2")
264 # let the type char be unsigned by default
265 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -funsigned-char")
266 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -fstrict-aliasing")
267 # turn on all common warnings
268 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wall")
269 # turn on extra warnings
270 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -W")
271 # treat warnings as errors
272 #SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Werror")
273 # warn about local variable shadowing another local variable
274 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wshadow")
275 # warn about casting of pointers to increased alignment requirements
276 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wcast-align")
277 # warn about comparisons between signed and unsigned values
278 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wsign-compare")
279 # warn about unused declared stuff
280 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wunused")
281 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wno-unused-parameter")
282 # warn about variable use before initialization
283 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wuninitialized")
284 # }}}
285
286 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
287
288 # we generate some includes
289 ADD_SUBDIRECTORY(lib-lib)
290 ADD_SUBDIRECTORY(lib-mime)
291 ADD_SUBDIRECTORY(lib-sys)
292 ADD_SUBDIRECTORY(lib-ui)
293 ADD_SUBDIRECTORY(imap)
294 ADD_SUBDIRECTORY(lib-mx)
295 ADD_SUBDIRECTORY(lib-lua)
296 ADD_SUBDIRECTORY(po)
297
298 MADMUTT_SOURCES(madmuttsrc madmuttgen
299     alias.cpkg
300     buffy.cpkg
301     charset.cpkg
302     crypt.cpkg
303     score.cpkg
304
305     account.c
306     attach.c
307     browser.c
308     commands.c
309     compose.c
310     copy.c
311     editmsg.c
312     flags.c
313     handler.c
314     headers.c
315     help.c
316     hook.c
317     init.c
318     keymap.c
319     mutt_idna.c
320     muttlib.c
321     mutt_sasl.c
322     pager.c
323     pattern.c
324     pop.c
325     postpone.c
326     recvattach.c
327     recvcmd.c
328     send.c
329     sendlib.c
330     sort.c
331     state.c
332     thread.c
333
334     main.c
335 )
336
337 STRING(REGEX REPLACE ";" " " MUTTLIBS "${MUTTLIBS}")
338 ADD_EXECUTABLE(madmutt ${madmuttsrc})
339 TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap ui lib)
340 SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS "${MUTTLIBS}")
341
342 # generate_files hack {{{
343
344 ADD_CUSTOM_COMMAND(
345     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
346     DEPENDS ${madmutt_SOURCE_DIR}/OPS ${madmutt_SOURCE_DIR}/tools/gen_defs
347     COMMAND ${madmutt_SOURCE_DIR}/tools/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h
348     COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS"
349 )
350 ADD_CUSTOM_COMMAND(
351     OUTPUT  ${madmutt_SOURCE_DIR}/charset.gperf
352     DEPENDS ${madmutt_SOURCE_DIR}/charset.def
353     COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf
354     COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def"
355 )
356 ADD_CUSTOM_TARGET(generate_file
357     DEPENDS ${madmuttgen}
358     ${madmutt_SOURCE_DIR}/keymap_defs.h
359     ${madmutt_SOURCE_DIR}/charset.gperf
360 )
361 ADD_DEPENDENCIES(generate_file generate_files)
362 ADD_DEPENDENCIES(madmutt generate_file)
363
364 # }}}