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