Force the use of libncursesw
[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_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(ncursesw/ncurses.h     HAVE_NCURSESW_NCURSES_H)
79 CHECK_INCLUDE_FILE(regex.h                HAVE_REGEX_H)
80 CHECK_INCLUDE_FILE(stdarg.h               HAVE_STDARG_H)
81 CHECK_INCLUDE_FILE(stddef.h               HAVE_STDDEF_H)
82 CHECK_INCLUDE_FILE(stdint.h               HAVE_STDINT_H)
83 CHECK_INCLUDE_FILE(stdlib.h               HAVE_STDLIB_H)
84 CHECK_INCLUDE_FILE(string.h               HAVE_STRING_H)
85 CHECK_INCLUDE_FILE(strings.h              HAVE_STRINGS_H)
86 CHECK_INCLUDE_FILE(sysexits.h             HAVE_SYSEXITS_H)
87 CHECK_INCLUDE_FILE(sys/ioctl.h            HAVE_SYS_IOCTL_H)
88 CHECK_INCLUDE_FILE(sys/param.h            HAVE_SYS_PARAM_H)
89 CHECK_INCLUDE_FILE(sys/resource.h         HAVE_SYS_RESOURCE_H)
90 CHECK_INCLUDE_FILE(sys/stat.h             HAVE_SYS_STAT_H)
91 CHECK_INCLUDE_FILE(sys/time.h             HAVE_SYS_TIME_H)
92 CHECK_INCLUDE_FILE(sys/types.h            HAVE_SYS_TYPES_H)
93 CHECK_INCLUDE_FILE(unistd.h               HAVE_UNISTD_H)
94 CHECK_INCLUDE_FILE(unix.h                 HAVE_UNIX_H)
95 CHECK_INCLUDE_FILE(wchar.h                HAVE_WCHAR_H)
96 CHECK_INCLUDE_FILE(wctype.h               HAVE_WCTYPE_H)
97
98 IF(NOT HAVE_ICONV_H)
99     MESSAGE(FATAL_ERROR "inconv.h not found")
100 ENDIF(NOT HAVE_ICONV_H)
101
102 # }}}
103 # types {{{
104
105 INCLUDE(CheckStructMember)
106
107 CHECK_STRUCT_MEMBER("struct dirent" "d_ino" "dirent.h" HAVE_DIRENT_D_INO)
108
109 # }}}
110 # functions {{{
111 INCLUDE (CheckFunctionExists)
112
113 CHECK_FUNCTION_EXISTS(strlimit    HAVE_SETRLIMIT)
114 CHECK_FUNCTION_EXISTS(getsid      HAVE_GETSID)
115 CHECK_FUNCTION_EXISTS(setegid     HAVE_SETEGID)
116 CHECK_FUNCTION_EXISTS(getopt      HAVE_GETOPT)
117 CHECK_FUNCTION_EXISTS(nl_langinfo HAVE_LANGINFO_CODESET)
118
119 # }}}
120 # libraries {{{
121 INCLUDE(CheckLibraryExists)
122 INCLUDE(FindPkgConfig)
123
124 FIND_LIBRARY(LIBUTIL NAMES util)
125 IF(NOT LIBUTIL)
126     MESSAGE(FATAL_ERROR "could not find libutil")
127 ENDIF(NOT LIBUTIL)
128 LIST(APPEND MUTTLIBS -lutil)
129
130 FIND_LIBRARY(NCURSESW NAMES ncursesw)
131 IF(NOT NCURSESW OR NOT HAVE_NCURSESW_NCURSES_H)
132     MESSAGE(FATAL_ERROR "could not libncursesw")
133 ENDIF(NOT NCURSESW OR NOT HAVE_NCURSESW_NCURSES_H)
134 SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h")
135 LIST(APPEND MUTTLIBS -lncursesw)
136
137 pkg_search_module(LUA REQUIRED lua5.1)
138 ADD_DEFINITIONS(${LUA_CFLAGS})
139 LIST(APPEND MUTTLIBS ${LUA_LDFLAGS})
140
141 IF(WITH_GPGME)
142     XCONFIG(gpgme-config gpgme_INCDIR gpgme_LINKDIR gpgme_LDFLAGS gpgme_CFLAGS)
143     INCLUDE_DIRECTORIES(${gpgme_INCDIR})
144     ADD_DEFINITIONS(${gpgme_CFLAGS})
145     LIST(APPEND MUTTLIBS ${gpgme_LDFLAGS})
146     SET(HAVE_GPGME 1)
147 ENDIF(WITH_GPGME)
148
149 XCONFIG(libgnutls-config gnutls_INCDIR gnutls_LINKDIR gnutls_LDFLAGS gnutls_CFLAGS)
150 INCLUDE_DIRECTORIES(${gnutls_INCDIR})
151 ADD_DEFINITIONS(${gnutls_CFLAGS})
152 CHECK_INCLUDE_FILE(gnutls/openssl.h  HAVE_GNUTLS_OPENSSL_H)
153 LIST(APPEND MUTTLIBS ${gnutls_LDFLAGS})
154
155 CHECK_LIBRARY_EXISTS(sasl2 sasl_client_init "" WITH_SASL)
156 IF(NOT WITH_SASL)
157     MESSAGE(FATAL_ERROR "sasl2 not found")
158 ENDIF(NOT WITH_SASL)
159 LIST(APPEND MUTTLIBS -lsasl2)
160
161 IF(WITH_IDN)
162     pkg_search_module(IDN REQUIRED libidn)
163     LIST(APPEND MUTTLIBS ${IDN_LDFLAGS})
164     SET(HAVE_LIBIDN 1)
165 ENDIF(WITH_IDN)
166
167 CHECK_LIBRARY_EXISTS(lockfile lockfile_create "" WITH_LOCKFILE)
168 IF(NOT WITH_LOCKFILE)
169     MESSAGE(FATAL_ERROR "lockfile not found")
170 ENDIF(NOT WITH_LOCKFILE)
171 LIST(APPEND MUTTLIBS -llockfile)
172
173 IF(USE_HCACHE)
174     OPTION(WITH_QDBM "Use qdbm for header caching [default: on]" ON)
175     OPTION(WITH_GDBM "Use gdbm for header caching [default: off]")
176     SET(USE_HCACHE)
177
178     IF(WITH_QDBM)
179         pkg_search_module(QDBM REQUIRED qdbm)
180         ADD_DEFINITIONS(${QDBM_CFLAGS})
181         SET(QDBM_LDFLAGS "${QDBM_LDFLAGS}")
182         # LIST(APPEND MUTTLIBS ${QDBM_LDFLAGS})
183         LIST(APPEND MUTTLIBS -lqdbm)
184         SET(USE_HCACHE 1)
185         SET(HAVE_QDBM 1)
186     ENDIF(WITH_QDBM)
187
188     IF(NOT USE_HCACHE AND WITH_GDBM)
189         CHECK_LIBRARY_EXISTS(gdbm gdbm_open "" GDBM)
190         IF(NOT GDBM)
191             MESSAGE(FATAL_ERROR "gdbm not found")
192         ENDIF(NOT GDBM)
193         LIST(APPEND MUTTLIBS -lgdbm)
194         SET(USE_HCACHE 1)
195         SET(HAVE_GDBM 1)
196     ENDIF(NOT USE_HCACHE AND WITH_GDBM)
197
198     IF(NOT USE_HCACHE)
199         MESSAGE(FATAL_ERROR "no backend for header caching selected")
200     ENDIF(NOT USE_HCACHE)
201 ENDIF(USE_HCACHE)
202
203 # }}}
204 # C flags {{{
205 # big debug flags
206 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ggdb3")
207 # Use pipes and not temp files.
208 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe")
209 # optimize even more
210 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
211 # let the type char be unsigned by default
212 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -funsigned-char")
213 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing")
214 # turn on all common warnings
215 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
216 # turn on extra warnings
217 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W")
218 # treat warnings as errors
219 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
220 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wchar-subscripts")
221 # warn about undefined preprocessor identifiers
222 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef")
223 # warn about local variable shadowing another local variable
224 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
225 # warn about casting of pointers to increased alignment requirements
226 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align")
227 # make string constants const
228 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wwrite-strings")
229 # warn about comparisons between signed and unsigned values
230 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare")
231 # warn about unused declared stuff
232 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused")
233 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
234 # warn about variable use before initialization
235 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wuninitialized")
236 # warn about variables which are initialized with themselves
237 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winit-self")
238 # warn about pointer arithmetic on void* and function pointers
239 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
240 # warn about multiple declarations
241 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
242 # warn if the format string is not a string literal
243 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat-nonliteral")
244 # do not warn about zero-length formats.
245 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format-zero-length")
246 # missing prototypes
247 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes")
248 # warn about functions without format attribute that should have one
249 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
250 # }}}
251 # D flags {{{
252 # big debug flags
253 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -ggdb3")
254 # Use pipes and not temp files.
255 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -pipe")
256 # optimize even more
257 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -O2")
258 # let the type char be unsigned by default
259 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -funsigned-char")
260 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -fstrict-aliasing")
261 # turn on all common warnings
262 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wall")
263 # turn on extra warnings
264 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -W")
265 # treat warnings as errors
266 #SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Werror")
267 # warn about local variable shadowing another local variable
268 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wshadow")
269 # warn about casting of pointers to increased alignment requirements
270 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wcast-align")
271 # warn about comparisons between signed and unsigned values
272 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wsign-compare")
273 # warn about unused declared stuff
274 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wunused")
275 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wno-unused-parameter")
276 # warn about variable use before initialization
277 SET(CMAKE_D_FLAGS "${CMAKE_D_FLAGS} -Wuninitialized")
278 # }}}
279
280 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
281
282 # we generate some includes
283 ADD_SUBDIRECTORY(lib-lib)
284 ADD_SUBDIRECTORY(lib-mime)
285 ADD_SUBDIRECTORY(lib-sys)
286 ADD_SUBDIRECTORY(lib-ui)
287 ADD_SUBDIRECTORY(imap)
288 ADD_SUBDIRECTORY(lib-mx)
289 ADD_SUBDIRECTORY(lib-lua)
290 ADD_SUBDIRECTORY(po)
291
292 MADMUTT_SOURCES(madmuttsrc madmuttgen
293     alias.cpkg
294     buffy.cpkg
295     charset.cpkg
296     crypt.cpkg
297     score.cpkg
298
299     account.c
300     attach.c
301     commands.c
302     compose.c
303     copy.c
304     editmsg.c
305     flags.c
306     handler.c
307     headers.c
308     help.c
309     hook.c
310     init.c
311     keymap.c
312     mutt_idna.c
313     muttlib.c
314     mutt_sasl.c
315     pager.c
316     pattern.c
317     pop.c
318     postpone.c
319     recvattach.c
320     recvcmd.c
321     send.c
322     sendlib.c
323     sort.c
324     state.c
325     thread.c
326
327     main.c
328 )
329
330 STRING(REGEX REPLACE ";" " " MUTTLIBS "${MUTTLIBS}")
331 ADD_EXECUTABLE(madmutt ${madmuttsrc})
332 TARGET_LINK_LIBRARIES(madmutt mime sys mx lua ui imap lib)
333 SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS "${MUTTLIBS}")
334
335 # generate_files hack {{{
336
337 ADD_CUSTOM_COMMAND(
338     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
339     DEPENDS ${madmutt_SOURCE_DIR}/OPS ${madmutt_SOURCE_DIR}/tools/gen_defs
340     COMMAND ${madmutt_SOURCE_DIR}/tools/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h
341     COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS"
342 )
343 ADD_CUSTOM_COMMAND(
344     OUTPUT  ${madmutt_SOURCE_DIR}/charset.gperf
345     DEPENDS ${madmutt_SOURCE_DIR}/charset.def
346     COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf
347     COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def"
348 )
349 ADD_CUSTOM_TARGET(generate_file
350     DEPENDS ${madmuttgen}
351     ${madmutt_SOURCE_DIR}/keymap_defs.h
352     ${madmutt_SOURCE_DIR}/charset.gperf
353 )
354 ADD_DEPENDENCIES(generate_file generate_files)
355 ADD_DEPENDENCIES(madmutt generate_file)
356
357 # }}}