minor fixes
[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 FIND_FILE(MIXMASTER mixmaster DOC "path to mixmaster")
47 IF(NOT MIXMASTER)
48     SET(MIXMASTER "mixmaster")
49 ENDIF(NOT MIXMASTER)
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(UsePkgConfig)
125
126 IF(HAVE_NCURSESW_NCURSES_H)
127     SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h")
128     SET(MUTTLIBS "${MUTTLIBS} -lncursesw")
129 ELSEIF(HAVE_NCURSES_H)
130     SET(CMAKE_REQUIRED_INCLUDES "ncurses.h")
131     SET(MUTTLIBS "${MUTTLIBS} -lncurses")
132 ELSEIF(HAVE_NCURSES_H OR HAVE_NCURSES_NCURSES_H)
133     SET(CMAKE_REQUIRED_INCLUDES "ncurses/ncurses.h")
134     SET(MUTTLIBS "${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 PKGCONFIG(lua5.1 lua_INCDIR lua_LINKDIR lua_LDFLAGS lua_CFLAGS)
144 MESSAGE(STATUS "found lua5.1 at: INCDIR ${lua_INCDIR}")
145 INCLUDE_DIRECTORIES(${lua_INCDIR})
146 ADD_DEFINITIONS(${lua_CFLAGS})
147 SET(MUTTLIBS "${MUTTLIBS} ${lua_LDFLAGS}")
148
149 IF(WITH_GPGME)
150     XCONFIG(gpgme-config gpgme_INCDIR gpgme_LINKDIR gpgme_LDFLAGS gpgme_CFLAGS)
151     INCLUDE_DIRECTORIES(${gpgme_INCDIR})
152     ADD_DEFINITIONS(${gpgme_CFLAGS})
153     SET(MUTTLIBS "${MUTTLIBS} ${gpgme_LDFLAGS}")
154     SET(HAVE_GPGME 1)
155 ENDIF(WITH_GPGME)
156
157 XCONFIG(libgnutls-config gnutls_INCDIR gnutls_LINKDIR gnutls_LDFLAGS gnutls_CFLAGS)
158 INCLUDE_DIRECTORIES(${gnutls_INCDIR})
159 ADD_DEFINITIONS(${gnutls_CFLAGS})
160 CHECK_INCLUDE_FILE(gnutls/openssl.h  HAVE_GNUTLS_OPENSSL_H)
161 SET(MUTTLIBS "${MUTTLIBS} ${gnutls_LDFLAGS}")
162
163 CHECK_LIBRARY_EXISTS(sasl2 sasl_client_init "" WITH_SASL)
164 IF(NOT WITH_SASL)
165     MESSAGE(FATAL_ERROR "sasl2 not found")
166 ENDIF(NOT WITH_SASL)
167 SET(MUTTLIBS "${MUTTLIBS} -lsasl2")
168
169 IF(WITH_IDN)
170     PKGCONFIG(libidn idn_INCDIR idn_LINKDIR idn_LDFLAGS idn_CFLAGS)
171     SET(MUTTLIBS "${MUTTLIBS} ${idn_LDFLAGS}")
172     SET(HAVE_LIBIDN 1)
173 ENDIF(WITH_IDN)
174
175 IF(USE_HCACHE)
176     OPTION(WITH_QDBM "Use qdbm for header caching [default: on]" ON)
177     OPTION(WITH_GDBM "Use gdbm for header caching [default: off]")
178     SET(USE_HCACHE)
179
180     IF(WITH_QDBM)
181         PKGCONFIG(qdbm qdbm_INCDIR qdbm_LINKDIR qdbm_LDFLAGS qdbm_CFLAGS)
182         IF(qdbm_LDFLAGS)
183             MESSAGE(STATUS "qdbm found")
184         ELSE(qdbm_LDFLAGS)
185             MESSAGE(FATAL_ERROR "qdbm not found")
186         ENDIF(qdbm_LDFLAGS)
187         INCLUDE_DIRECTORIES(${qdbm_INCDIR})
188         ADD_DEFINITIONS(${qdbm_CFLAGS})
189         SET(MUTTLIBS "${MUTTLIBS} ${qdbm_LDFLAGS}")
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         SET(MUTTLIBS "${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 IF(WITH_NNTP AND NOT USE_NNTP)
210     SET(USE_NNTP 1)
211     MESSAGE(STATUS "building NNTP support")
212 ENDIF(WITH_NNTP AND NOT USE_NNTP)
213
214 # }}}
215 # C flags {{{
216 # big debug flags
217 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ggdb3")
218 # Use pipes and not temp files.
219 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe")
220 # optimize even more
221 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
222 # let the type char be unsigned by default
223 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -funsigned-char")
224 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing")
225 # turn on all common warnings
226 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
227 # turn on extra warnings
228 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W")
229 # treat warnings as errors
230 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
231 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wchar-subscripts")
232 # warn about undefined preprocessor identifiers
233 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef")
234 # warn about local variable shadowing another local variable
235 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
236 # warn about casting of pointers to increased alignment requirements
237 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align")
238 # make string constants const
239 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wwrite-strings")
240 # warn about comparisons between signed and unsigned values
241 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare")
242 # warn about unused declared stuff
243 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused")
244 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
245 # warn about variable use before initialization
246 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wuninitialized")
247 # warn about variables which are initialized with themselves
248 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winit-self")
249 # warn about pointer arithmetic on void* and function pointers
250 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
251 # warn about multiple declarations
252 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
253 # warn if the format string is not a string literal
254 #SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat-nonliteral")
255 # do not warn about zero-length formats.
256 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format-zero-length")
257 # missing prototypes
258 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes")
259 # warn about functions without format attribute that should have one
260 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
261 # }}}
262
263 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
264
265 # we generate some includes
266 ADD_SUBDIRECTORY(lib-lib)
267 ADD_SUBDIRECTORY(lib-mime)
268 ADD_SUBDIRECTORY(lib-sys)
269 ADD_SUBDIRECTORY(lib-ui)
270 ADD_SUBDIRECTORY(imap)
271 ADD_SUBDIRECTORY(lib-mx)
272 ADD_SUBDIRECTORY(lib-lua)
273 ADD_SUBDIRECTORY(po)
274
275 MADMUTT_SOURCES(madmuttsrc madmuttgen
276     alias.cpkg
277     buffy.cpkg
278     charset.cpkg
279     crypt.cpkg
280     score.cpkg
281
282     account.c
283     attach.c
284     browser.c
285     commands.c
286     compose.c
287     copy.c
288     editmsg.c
289     flags.c
290     from.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     remailer.c
307     send.c
308     sendlib.c
309     sort.c
310     state.c
311     thread.c
312
313     main.c
314 )
315 IF(WITH_NNTP)
316     MADMUTT_SOURCES(madmuttsrc madmuttgen
317         nntp.c
318     )
319 ENDIF(WITH_NNTP)
320
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 ADD_EXECUTABLE(madmutt_dotlock dotlock.c)
326 TARGET_LINK_LIBRARIES(madmutt_dotlock lib)
327
328 # generate_files hack {{{
329
330 ADD_CUSTOM_COMMAND(
331     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
332     DEPENDS ${madmutt_SOURCE_DIR}/OPS ${madmutt_SOURCE_DIR}/tools/gen_defs
333     COMMAND ${madmutt_SOURCE_DIR}/tools/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h
334     COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS"
335 )
336 ADD_CUSTOM_COMMAND(
337     OUTPUT  ${madmutt_SOURCE_DIR}/charset.gperf
338     DEPENDS ${madmutt_SOURCE_DIR}/charset.def
339     COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf
340     COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def"
341 )
342 ADD_CUSTOM_TARGET(generate_file
343     DEPENDS ${madmuttgen}
344     ${madmutt_SOURCE_DIR}/keymap_defs.h
345     ${madmutt_SOURCE_DIR}/charset.gperf
346 )
347 ADD_DEPENDENCIES(generate_file generate_files)
348 ADD_DEPENDENCIES(madmutt generate_file)
349
350 # }}}