Better way to wrap pkg-config (IMNSHO)
[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 # }}}
8
9 INCLUDE(CMakeDetermineCCompiler)
10 include(Cpkg2c)
11 include(XConfig)
12
13 ADD_DEFINITIONS(-DHAVE_CONFIG_H)
14 ADD_DEFINITIONS(-D_GNU_SOURCE)
15 INCLUDE_DIRECTORIES(${madmutt_BINARY_DIR} ${madmutt_SOURCE_DIR})
16
17 SET(BINDIR     "${CMAKE_INSTALL_PREFIX}/bin")
18 SET(DATADIR    "${CMAKE_INSTALL_PREFIX}/share")
19 SET(PKGDATADIR "${CMAKE_INSTALL_PREFIX}/share/madmutt")
20 SET(PKGDOCDIR  "${CMAKE_INSTALL_PREFIX}/share/doc/madmutt")
21 SET(SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc")
22 SET(VERSION    "devel")
23 SET(MUTTLIBS)
24
25 ADD_DEFINITIONS("-DBINDIR=\\\"${BINDIR}\\\"")
26 ADD_DEFINITIONS("-DPKGDATADIR=\\\"${PKGDATADIR}\\\"")
27 ADD_DEFINITIONS("-DPKGDOCDIR=\\\"${PKGDOCDIR}\\\"")
28 ADD_DEFINITIONS("-DSYSCONFDIR=\\\"${SYSCONFDIR}\\\"")
29 ADD_DEFINITIONS("-DVERSION=\\\"${VERSION}\\\"")
30 ADD_DEFINITIONS("-DMUTTLOCALEDIR=\\\"${DATADIR}/locale\\\"")
31
32 SET(MAILPATH         CACHE STRING "Where new mail is spooled")
33 OPTION(WITH_GPGME    "Use GPGME [default: on]" ON)
34 OPTION(WITH_NNTP     "Build NNTP support [default: off]")
35 OPTION(WITH_IDN      "Use GNU libidn for domain names [default: off]")
36
37 OPTION(USE_FLOCK     "Use flock to lock files [default: off]")
38 OPTION(USE_FCNTL     "Use fcntl to lock files [default: on]" ON)
39 OPTION(USE_HCACHE    "Enable headers caching  [default: off]")
40
41 FIND_FILE(SENDMAIL sendmail
42     PATHS /usr/sbin /sbin /usr/lib
43     DOC   "path to sendmail executable"
44 )
45
46 IF(NOT MAILPATH)
47     IF(EXISTS /var/mail)
48         SET(MAILPATH "/var/mail")
49     ELSEIF(EXISTS /var/spool/mail)
50         SET(MAILPATH "/var/spool/mail")
51     ELSEIF(EXISTS /usr/spool/mail)
52         SET(MAILPATH "/usr/spool/mail")
53     ELSEIF(EXISTS /usr/mail)
54         SET(MAILPATH "/usr/mail")
55     ELSE(EXISTS /var/mail)
56         MESSAGE(FATAL_ERROR "Unable to determine MAILPATH")
57     ENDIF(EXISTS /var/mail)
58 ENDIF(NOT MAILPATH)
59
60 # headers {{{
61 INCLUDE(CheckIncludeFile)
62
63 CHECK_INCLUDE_FILE(alloca.h               HAVE_ALLOCA_H)
64 CHECK_INCLUDE_FILE(argz.h                 HAVE_ARGZ_H)
65 CHECK_INCLUDE_FILE(getopt.h               HAVE_GETOPT_H)
66 CHECK_INCLUDE_FILE(iconv.h                HAVE_ICONV_H)
67 CHECK_INCLUDE_FILE(inttypes.h             HAVE_INTTYPES_H)
68 CHECK_INCLUDE_FILE(ioctl.h                HAVE_IOCTL_H)
69 CHECK_INCLUDE_FILE(langinfo.h             HAVE_LANGINFO_H)
70 CHECK_INCLUDE_FILE(limits.h               HAVE_LIMITS_H)
71 CHECK_INCLUDE_FILE(locale.h               HAVE_LOCALE_H)
72 CHECK_INCLUDE_FILE(memory.h               HAVE_MEMORY_H)
73 CHECK_INCLUDE_FILE(ncurses.h              HAVE_NCURSES_H)
74 CHECK_INCLUDE_FILE(ncurses/ncurses.h      HAVE_NCURSES_NCURSES_H)
75 CHECK_INCLUDE_FILE(ncursesw/ncurses.h     HAVE_NCURSESW_NCURSES_H)
76 CHECK_INCLUDE_FILE(regex.h                HAVE_REGEX_H)
77 CHECK_INCLUDE_FILE(stdarg.h               HAVE_STDARG_H)
78 CHECK_INCLUDE_FILE(stddef.h               HAVE_STDDEF_H)
79 CHECK_INCLUDE_FILE(stdint.h               HAVE_STDINT_H)
80 CHECK_INCLUDE_FILE(stdlib.h               HAVE_STDLIB_H)
81 CHECK_INCLUDE_FILE(string.h               HAVE_STRING_H)
82 CHECK_INCLUDE_FILE(strings.h              HAVE_STRINGS_H)
83 CHECK_INCLUDE_FILE(sysexits.h             HAVE_SYSEXITS_H)
84 CHECK_INCLUDE_FILE(sys/ioctl.h            HAVE_SYS_IOCTL_H)
85 CHECK_INCLUDE_FILE(sys/param.h            HAVE_SYS_PARAM_H)
86 CHECK_INCLUDE_FILE(sys/resource.h         HAVE_SYS_RESOURCE_H)
87 CHECK_INCLUDE_FILE(sys/stat.h             HAVE_SYS_STAT_H)
88 CHECK_INCLUDE_FILE(sys/time.h             HAVE_SYS_TIME_H)
89 CHECK_INCLUDE_FILE(sys/types.h            HAVE_SYS_TYPES_H)
90 CHECK_INCLUDE_FILE(unistd.h               HAVE_UNISTD_H)
91 CHECK_INCLUDE_FILE(unix.h                 HAVE_UNIX_H)
92 CHECK_INCLUDE_FILE(wchar.h                HAVE_WCHAR_H)
93 CHECK_INCLUDE_FILE(wctype.h               HAVE_WCTYPE_H)
94
95 IF(NOT HAVE_ICONV_H)
96     MESSAGE(FATAL_ERROR "inconv.h not found")
97 ENDIF(NOT HAVE_ICONV_H)
98
99 # }}}
100 # types {{{
101
102 INCLUDE(CheckStructMember)
103
104 CHECK_STRUCT_MEMBER("struct dirent" "d_ino" "dirent.h" HAVE_DIRENT_D_INO)
105
106 # }}}
107 # functions {{{
108 INCLUDE (CheckFunctionExists)
109
110 CHECK_FUNCTION_EXISTS(strlimit    HAVE_SETRLIMIT)
111 CHECK_FUNCTION_EXISTS(getsid      HAVE_GETSID)
112 CHECK_FUNCTION_EXISTS(setegid     HAVE_SETEGID)
113 CHECK_FUNCTION_EXISTS(getopt      HAVE_GETOPT)
114 CHECK_FUNCTION_EXISTS(nl_langinfo HAVE_LANGINFO_CODESET)
115
116 # }}}
117 # libraries {{{
118 INCLUDE(CheckLibraryExists)
119 INCLUDE(FindPkgConfig)
120
121 IF(HAVE_NCURSESW_NCURSES_H)
122     SET(CMAKE_REQUIRED_INCLUDES "ncursesw/ncurses.h")
123     LIST(APPEND MUTTLIBS -lncursesw)
124 ELSEIF(HAVE_NCURSES_H)
125     SET(CMAKE_REQUIRED_INCLUDES "ncurses.h")
126     LIST(APPEND MUTTLIBS  -lncurses)
127 ELSEIF(HAVE_NCURSES_H OR HAVE_NCURSES_NCURSES_H)
128     SET(CMAKE_REQUIRED_INCLUDES "ncurses/ncurses.h")
129     LIST(APPEND MUTTLIBS  -lncurses)
130 ELSE(HAVE_NCURSESW_NCURSES_H)
131     MESSAGE(FATAL_ERROR "could not find ncurses.h")
132 ENDIF(HAVE_NCURSESW_NCURSES_H)
133 SET(CMAKE_REQUIRED_LIBRARIES ${MUTTLIBS})
134 CHECK_FUNCTION_EXISTS(resizeterm         HAVE_RESIZETERM)
135 SET(CMAKE_REQUIRED_LIBRARIES)
136 SET(CMAKE_REQUIRED_INCLUDES)
137
138 pkg_search_module(LUA REQUIRED lua5.1)
139 ADD_DEFINITIONS(${LUA_CFLAGS})
140 LIST(APPEND MUTTLIBS ${LUA_LDFLAGS})
141
142 IF(WITH_GPGME)
143     XCONFIG(gpgme-config gpgme_INCDIR gpgme_LINKDIR gpgme_LDFLAGS gpgme_CFLAGS)
144     INCLUDE_DIRECTORIES(${gpgme_INCDIR})
145     ADD_DEFINITIONS(${gpgme_CFLAGS})
146     LIST(APPEND MUTTLIBS ${gpgme_LDFLAGS})
147     SET(HAVE_GPGME 1)
148 ENDIF(WITH_GPGME)
149
150 XCONFIG(libgnutls-config gnutls_INCDIR gnutls_LINKDIR gnutls_LDFLAGS gnutls_CFLAGS)
151 INCLUDE_DIRECTORIES(${gnutls_INCDIR})
152 ADD_DEFINITIONS(${gnutls_CFLAGS})
153 CHECK_INCLUDE_FILE(gnutls/openssl.h  HAVE_GNUTLS_OPENSSL_H)
154 LIST(APPEND MUTTLIBS ${gnutls_LDFLAGS})
155
156 CHECK_LIBRARY_EXISTS(sasl2 sasl_client_init "" WITH_SASL)
157 IF(NOT WITH_SASL)
158     MESSAGE(FATAL_ERROR "sasl2 not found")
159 ENDIF(NOT WITH_SASL)
160 LIST(APPEND MUTTLIBS -lsasl2)
161
162 IF(WITH_IDN)
163     pkg_search_module(IDN REQUIRED libidn)
164     LIST(APPEND MUTTLIBS ${IDN_LDFLAGS})
165     SET(HAVE_LIBIDN 1)
166 ENDIF(WITH_IDN)
167
168 CHECK_LIBRARY_EXISTS(lockfile lockfile_create "" WITH_LOCKFILE)
169 IF(NOT WITH_LOCKFILE)
170     MESSAGE(FATAL_ERROR "lockfile not found")
171 ENDIF(NOT WITH_LOCKFILE)
172 LIST(APPEND MUTTLIBS -llockfile)
173
174 IF(USE_HCACHE)
175     OPTION(WITH_QDBM "Use qdbm for header caching [default: on]" ON)
176     OPTION(WITH_GDBM "Use gdbm for header caching [default: off]")
177     SET(USE_HCACHE)
178
179     IF(WITH_QDBM)
180         pkg_search_module(QDBM REQUIRED qdbm)
181         ADD_DEFINITIONS(${QDBM_CFLAGS})
182         SET(QDBM_LDFLAGS "${QDBM_LDFLAGS}")
183         # LIST(APPEND MUTTLIBS ${QDBM_LDFLAGS})
184         LIST(APPEND MUTTLIBS -lqdbm)
185         SET(USE_HCACHE 1)
186         SET(HAVE_QDBM 1)
187     ENDIF(WITH_QDBM)
188
189     IF(NOT USE_HCACHE AND WITH_GDBM)
190         CHECK_LIBRARY_EXISTS(gdbm gdbm_open "" GDBM)
191         IF(NOT GDBM)
192             MESSAGE(FATAL_ERROR "gdbm not found")
193         ENDIF(NOT GDBM)
194         LIST(APPEND MUTTLIBS -lgdbm)
195         SET(USE_HCACHE 1)
196         SET(HAVE_GDBM 1)
197     ENDIF(NOT USE_HCACHE AND WITH_GDBM)
198
199     IF(NOT USE_HCACHE)
200         MESSAGE(FATAL_ERROR "no backend for header caching selected")
201     ENDIF(NOT USE_HCACHE)
202 ENDIF(USE_HCACHE)
203
204 IF(WITH_NNTP AND NOT USE_NNTP)
205     SET(USE_NNTP 1)
206     MESSAGE(STATUS "building NNTP support")
207 ENDIF(WITH_NNTP AND NOT USE_NNTP)
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
258 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
259
260 # we generate some includes
261 ADD_SUBDIRECTORY(lib-lib)
262 ADD_SUBDIRECTORY(lib-mime)
263 ADD_SUBDIRECTORY(lib-sys)
264 ADD_SUBDIRECTORY(lib-ui)
265 ADD_SUBDIRECTORY(imap)
266 ADD_SUBDIRECTORY(lib-mx)
267 ADD_SUBDIRECTORY(lib-lua)
268 ADD_SUBDIRECTORY(po)
269
270 MADMUTT_SOURCES(madmuttsrc madmuttgen
271     alias.cpkg
272     buffy.cpkg
273     charset.cpkg
274     crypt.cpkg
275     score.cpkg
276
277     account.c
278     attach.c
279     browser.c
280     commands.c
281     compose.c
282     copy.c
283     editmsg.c
284     flags.c
285     handler.c
286     headers.c
287     help.c
288     hook.c
289     init.c
290     keymap.c
291     mutt_idna.c
292     muttlib.c
293     mutt_sasl.c
294     pager.c
295     pattern.c
296     pop.c
297     postpone.c
298     recvattach.c
299     recvcmd.c
300     send.c
301     sendlib.c
302     sort.c
303     state.c
304     thread.c
305
306     main.c
307 )
308 IF(WITH_NNTP)
309     MADMUTT_SOURCES(madmuttsrc madmuttgen
310         nntp.c
311     )
312 ENDIF(WITH_NNTP)
313
314 STRING(REGEX REPLACE ";" " " MUTTLIBS "${MUTTLIBS}")
315 ADD_EXECUTABLE(madmutt ${madmuttsrc})
316 TARGET_LINK_LIBRARIES(madmutt mime sys mx lua imap ui lib)
317 SET_TARGET_PROPERTIES(madmutt PROPERTIES LINK_FLAGS "${MUTTLIBS}")
318
319 # generate_files hack {{{
320
321 ADD_CUSTOM_COMMAND(
322     OUTPUT  ${madmutt_SOURCE_DIR}/keymap_defs.h
323     DEPENDS ${madmutt_SOURCE_DIR}/OPS ${madmutt_SOURCE_DIR}/tools/gen_defs
324     COMMAND ${madmutt_SOURCE_DIR}/tools/gen_defs ${madmutt_SOURCE_DIR}/OPS > ${madmutt_SOURCE_DIR}/keymap_defs.h
325     COMMENT "Generating ${madmutt_SOURCE_DIR}/keymap_defs.h from ${madmutt_SOURCE_DIR}/OPS"
326 )
327 ADD_CUSTOM_COMMAND(
328     OUTPUT  ${madmutt_SOURCE_DIR}/charset.gperf
329     DEPENDS ${madmutt_SOURCE_DIR}/charset.def
330     COMMAND sh ${madmutt_SOURCE_DIR}/charset.def > ${madmutt_SOURCE_DIR}/charset.gperf
331     COMMENT "Generating ${madmutt_SOURCE_DIR}/charset.gperf from ${madmutt_SOURCE_DIR}/charset.def"
332 )
333 ADD_CUSTOM_TARGET(generate_file
334     DEPENDS ${madmuttgen}
335     ${madmutt_SOURCE_DIR}/keymap_defs.h
336     ${madmutt_SOURCE_DIR}/charset.gperf
337 )
338 ADD_DEPENDENCIES(generate_file generate_files)
339 ADD_DEPENDENCIES(madmutt generate_file)
340
341 # }}}