[build] check for pipe2() at configure time
[lighttpd.git] / src / CMakeLists.txt
blob39784ac5a72884073aa04aba0758484afec1e3e9
1 include(CheckCSourceCompiles)
2 include(CheckIncludeFiles)
3 include(CheckFunctionExists)
4 include(CheckSymbolExists)
5 include(CheckVariableExists)
6 include(CheckTypeSize)
7 include(CheckLibraryExists)
8 include(CMakeDetermineCCompiler)
9 include(FindThreads)
10 include(FindPkgConfig)
12 include(LighttpdMacros)
14 add_definitions(-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGE_FILES)
16 option(WITH_XATTR "with xattr-support for the stat-cache [default: off]")
17 option(WITH_MYSQL "with mysql-support for the mod_sql_vhost [default: off]")
18 # option(WITH_POSTGRESQL "with postgress-support for the mod_sql_vhost [default: off]")
19 option(WITH_OPENSSL "with openssl-support [default: off]")
20 option(WITH_PCRE "with regex support [default: on]" ON)
21 option(WITH_WEBDAV_PROPS "with property-support for mod_webdav [default: off]")
22 option(WITH_WEBDAV_LOCKS "locks in webdav [default: off]")
23 option(WITH_BZIP "with bzip2-support for mod_compress [default: off]")
24 option(WITH_ZLIB "with deflate-support for mod_compress [default: on]" ON)
25 option(WITH_KRB5 "with Kerberos5-support for the mod_auth [default: off]")
26 option(WITH_LDAP "with LDAP-support for the mod_auth [default: off]")
27 option(WITH_LUA "with lua 5.1 for mod_magnet [default: off]")
28 # option(WITH_VALGRIND "with internal support for valgrind [default: off]")
29 # option(WITH_KERBEROS5 "use Kerberos5 support with OpenSSL [default: off]")
30 option(WITH_FAM "fam/gamin for reducing number of stat() calls [default: off]")
31 option(WITH_GDBM "gdbm storage for mod_trigger_b4_dl [default: off]")
32 option(WITH_MEMCACHED "memcached storage for mod_trigger_b4_dl [default: off]")
33 option(WITH_LIBEV "libev support for fdevent handlers [default: off]")
34 option(WITH_LIBUNWIND "with libunwind to print backtraces in asserts [default: off]")
35 option(WITH_GEOIP "with GeoIP-support mod_geoip [default: off]")
37 if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
38         option(BUILD_EXTRA_WARNINGS "extra warnings")
40         if(BUILD_EXTRA_WARNINGS)
41                 set(WARN_CFLAGS "-g -g2 -Wall -Wmissing-declarations -Wdeclaration-after-statement -Wcast-align -Wsign-compare -Wnested-externs -Wpointer-arith -D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security")
42                 set(WARN_LDFLAGS "-Wl,--as-needed")
43                 # -Werror -Wbad-function-cast -Wmissing-prototypes
44         endif()
45 endif()
47 option(BUILD_STATIC "build a static lighttpd with all modules added")
49 if(BUILD_STATIC)
50         set(LIGHTTPD_STATIC 1)
51 elseif(APPLE)
52         set(CMAKE_SHARED_MODULE_PREFIX "")
53 else()
54         set(CMAKE_SHARED_LIBRARY_PREFIX "")
55 endif()
57 if(WITH_LIBEV)
58         find_package(LibEV REQUIRED)
59         set(HAVE_LIBEV 1)
60 endif()
62 if(WITH_LIBUNWIND)
63         pkg_check_modules(LIBUNWIND REQUIRED libunwind)
64         set(HAVE_LIBUNWIND 1)
65 endif()
67 if(WITH_WEBDAV_PROPS)
68         set(WITH_XML 1)
69         set(WITH_SQLITE3 1)
70         set(WITH_UUID 1)
71 endif()
73 check_include_files(sys/devpoll.h HAVE_SYS_DEVPOLL_H)
74 check_include_files(sys/epoll.h HAVE_SYS_EPOLL_H)
75 check_include_files(sys/event.h HAVE_SYS_EVENT_H)
76 check_include_files(sys/mman.h HAVE_SYS_MMAN_H)
77 check_include_files(sys/poll.h HAVE_SYS_POLL_H)
78 check_include_files(sys/port.h HAVE_SYS_PORT_H)
79 check_include_files(sys/prctl.h HAVE_SYS_PRCTL_H)
80 check_include_files(sys/resource.h HAVE_SYS_RESOURCE_H)
81 check_include_files(sys/sendfile.h HAVE_SYS_SENDFILE_H)
82 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
83 check_include_files(sys/types.h HAVE_SYS_TYPES_H)
84 check_include_files(sys/uio.h HAVE_SYS_UIO_H)
85 check_include_files(sys/un.h HAVE_SYS_UN_H)
86 check_include_files(sys/wait.h HAVE_SYS_WAIT_H)
87 check_include_files(sys/time.h HAVE_SYS_TIME_H)
88 check_include_files(unistd.h HAVE_UNISTD_H)
89 check_include_files(pthread.h HAVE_PTHREAD_H)
90 check_include_files(getopt.h HAVE_GETOPT_H)
91 check_include_files(inttypes.h HAVE_INTTYPES_H)
92 check_include_files(poll.h HAVE_POLL_H)
93 check_include_files(pwd.h HAVE_PWD_H)
94 check_include_files(stddef.h HAVE_STDDEF_H)
95 check_include_files(stdint.h HAVE_STDINT_H)
96 check_include_files(syslog.h HAVE_SYSLOG_H)
98 # check for fastcgi lib, for the tests only
99 check_include_files(fastcgi.h HAVE_FASTCGI_H)
100 check_include_files(fastcgi/fastcgi.h HAVE_FASTCGI_FASTCGI_H)
102 # will be needed for auth
103 check_include_files(crypt.h HAVE_CRYPT_H)
104 # check if we need libcrypt for crypt_r()
105 check_library_exists(crypt crypt_r "" HAVE_LIBCRYPT_CRYPT_R)
106 if(HAVE_LIBCRYPT_CRYPT_R)
107         set(HAVE_CRYPT_R 1)
108         set(HAVE_LIBCRYPT 1)
109 else()
110         check_library_exists(crypt crypt "" HAVE_LIBCRYPT)
111 endif()
112 check_function_exists(crypt_r HAVE_CRYPT_R)
113 check_function_exists(crypt HAVE_CRYPT)
115 check_include_files(sys/inotify.h HAVE_SYS_INOTIFY_H)
116 if(HAVE_SYS_INOTIFY_H)
117         check_function_exists(inotify_init HAVE_INOTIFY_INIT)
118 endif()
120 set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
121 check_type_size(socklen_t HAVE_SOCKLEN_T)
122 set(CMAKE_EXTRA_INCLUDE_FILES)
124 check_include_files(linux/random.h HAVE_LINUX_RANDOM_H)
125 set(CMAKE_EXTRA_INCLUDE_FILES linux/random.h)
126 check_function_exists(getrandom HAVE_GETRANDOM)
127 set(CMAKE_EXTRA_INCLUDE_FILES)
129 check_type_size(long SIZEOF_LONG)
130 check_type_size(off_t SIZEOF_OFF_T)
132 check_function_exists(arc4random_buf HAVE_ARC4RANDOM_BUF)
133 check_function_exists(chroot HAVE_CHROOT)
134 check_function_exists(epoll_ctl HAVE_EPOLL_CTL)
135 check_function_exists(fork HAVE_FORK)
136 check_function_exists(getentropy HAVE_GETENTROPY)
137 check_function_exists(getloadavg HAVE_GETLOADAVG)
138 check_function_exists(getrlimit HAVE_GETRLIMIT)
139 check_function_exists(getuid HAVE_GETUID)
140 check_function_exists(gmtime_r HAVE_GMTIME_R)
141 check_function_exists(inet_ntop HAVE_INET_NTOP)
142 check_function_exists(jrand48 HAVE_JRAND48)
143 check_function_exists(kqueue HAVE_KQUEUE)
144 check_function_exists(localtime_r HAVE_LOCALTIME_R)
145 check_function_exists(lstat HAVE_LSTAT)
146 check_function_exists(madvise HAVE_MADVISE)
147 check_function_exists(memcpy HAVE_MEMCPY)
148 check_function_exists(memset HAVE_MEMSET)
149 check_function_exists(mmap HAVE_MMAP)
150 check_function_exists(pathconf HAVE_PATHCONF)
151 check_function_exists(pipe2 HAVE_PIPE2)
152 check_function_exists(poll HAVE_POLL)
153 check_function_exists(port_create HAVE_PORT_CREATE)
154 check_function_exists(prctl HAVE_PRCTL)
155 check_function_exists(pread HAVE_PREAD)
156 check_function_exists(posix_fadvise HAVE_POSIX_FADVISE)
157 check_function_exists(select HAVE_SELECT)
158 check_function_exists(sendfile HAVE_SENDFILE)
159 check_function_exists(send_file HAVE_SEND_FILE)
160 check_function_exists(sendfile64 HAVE_SENDFILE64)
161 check_function_exists(sendfilev HAVE_SENDFILEV)
162 check_function_exists(sigaction HAVE_SIGACTION)
163 check_function_exists(signal HAVE_SIGNAL)
164 check_function_exists(sigtimedwait HAVE_SIGTIMEDWAIT)
165 check_function_exists(srandom HAVE_SRANDOM)
166 check_function_exists(strptime HAVE_STRPTIME)
167 check_function_exists(syslog HAVE_SYSLOG)
168 check_function_exists(writev HAVE_WRITEV)
169 check_function_exists(inet_aton HAVE_INET_ATON)
170 check_function_exists(issetugid HAVE_ISSETUGID)
171 check_function_exists(inet_pton HAVE_INET_PTON)
172 check_function_exists(memset_s HAVE_MEMSET_S)
173 check_function_exists(explicit_bzero HAVE_EXPLICIT_BZERO)
174 check_symbol_exists(clock_gettime "time.h" HAVE_CLOCK_GETTIME)
175 if (NOT HAVE_CLOCK_GETTIME)
176         check_library_exists(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME)
177 endif()
178 check_c_source_compiles("
179         #include <sys/types.h>
180         #include <sys/socket.h>
181         #include <netinet/in.h>
183         int main() {
184                 struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0;
185                 return 0;
186         }" HAVE_IPV6)
187 check_c_source_compiles("
188         __attribute__((weak)) void __dummy(void *x) { }
189         int main() {
190                 void *x;
191                 __dummy(x);
192         }
193         " HAVE_WEAK_SYMBOLS)
194 check_c_source_compiles("
195         #include <time.h>
196         int main(void) {
197                 struct tm t;
198                 t.tm_gmtoff = 0;
199                 return 0;
200         }
201         " HAVE_STRUCT_TM_GMTOFF)
203 ## refactor me
204 macro(XCONFIG _package _include_DIR _link_DIR _link_FLAGS _cflags)
205 # reset the variables at the beginning
206         set(${_include_DIR})
207         set(${_link_DIR})
208         set(${_link_FLAGS})
209         set(${_cflags})
211         find_program(${_package}CONFIG_EXECUTABLE NAMES ${_package} PATHS /usr/local/bin )
213         # if pkg-config has been found
214         if(${_package}CONFIG_EXECUTABLE)
215                 set(XCONFIG_EXECUTABLE "${${_package}CONFIG_EXECUTABLE}")
216                 message(STATUS "found ${_package}: ${XCONFIG_EXECUTABLE}")
218                 exec_program(${XCONFIG_EXECUTABLE} ARGS --libs OUTPUT_VARIABLE __link_FLAGS)
219                 string(REPLACE "\n" "" ${_link_FLAGS} ${__link_FLAGS})
220                 exec_program(${XCONFIG_EXECUTABLE} ARGS --cflags OUTPUT_VARIABLE __cflags)
221                 string(REPLACE "\n" "" ${_cflags} ${__cflags})
222         else()
223                 message(STATUS "found ${_package}: no")
224         endif()
225 endmacro(XCONFIG _package _include_DIR _link_DIR _link_FLAGS _cflags)
227 if(WITH_XATTR)
228         check_include_files(attr/attributes.h HAVE_ATTR_ATTRIBUTES_H)
229         if(HAVE_ATTR_ATTRIBUTES_H)
230                 check_library_exists(attr attr_get "" HAVE_XATTR)
231         endif()
232 else()
233         unset(HAVE_ATTR_ATTRIBUTES_H)
234         unset(HAVE_XATTR)
235 endif()
237 if(WITH_MYSQL)
238         xconfig(mysql_config MYSQL_INCDIR MYSQL_LIBDIR MYSQL_LDFLAGS MYSQL_CFLAGS)
240         set(CMAKE_REQUIRED_INCLUDES /usr/include/mysql)
241         check_include_files(mysql.h HAVE_MYSQL_H)
242         set(CMAKE_REQUIRED_INCLUDES)
243         if(HAVE_MYSQL_H)
244                 check_library_exists(mysqlclient mysql_real_connect "" HAVE_MYSQL)
245         endif()
246 else()
247         unset(HAVE_MYSQL_H)
248         unset(HAVE_MYSQL)
249 endif()
251 if(WITH_OPENSSL)
252         if(APPLE)
253                 set(CMAKE_REQUIRED_INCLUDES /opt/local/include)
254         endif()
255         check_include_files(openssl/ssl.h HAVE_OPENSSL_SSL_H)
256         if(APPLE)
257                 set(CMAKE_REQUIRED_INCLUDES)
258         endif()
259         if(HAVE_OPENSSL_SSL_H)
260                 check_library_exists(crypto BIO_f_base64 "" HAVE_LIBCRYPTO)
261                 if(HAVE_LIBCRYPTO)
262                         check_library_exists(ssl SSL_new "" HAVE_LIBSSL)
263                 endif()
264         endif()
265 else()
266         unset(HAVE_OPENSSL_SSL_H)
267         unset(HAVE_LIBCRYPTO)
268         unset(HAVE_LIBSSL)
269 endif()
271 if(WITH_PCRE)
272         ## if we have pcre-config, use it
273         xconfig(pcre-config PCRE_INCDIR PCRE_LIBDIR PCRE_LDFLAGS PCRE_CFLAGS)
274         if(PCRE_LDFLAGS OR PCRE_CFLAGS)
275                 message(STATUS "found pcre at: LDFLAGS: ${PCRE_LDFLAGS} CFLAGS: ${PCRE_CFLAGS}")
277                 if(NOT PCRE_CFLAGS STREQUAL "\n")
278                         ## if it is empty we'll get newline returned
279                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PCRE_CFLAGS}")
280                 endif()
282                 set(HAVE_PCRE_H 1)
283                 set(HAVE_LIBPCRE 1)
284         else()
285                 if(NOT WIN32)
286                         check_include_files(pcre.h HAVE_PCRE_H)
287                         check_library_exists(pcre pcre_exec "" HAVE_LIBPCRE)
288                         set(PCRE_LDFLAGS -lpcre)
289                 else()
290                         find_path(PCRE_INCLUDE_DIR pcre.h
291                         /usr/local/include
292                         /usr/include
293                         )
295                         set(PCRE_NAMES pcre)
296                         find_library(PCRE_LIBRARY
297                         NAMES ${PCRE_NAMES}
298                         PATHS /usr/lib /usr/local/lib
299                         )
301                         if(PCRE_INCLUDE_DIR AND PCRE_LIBRARY)
302                                 set(CMAKE_REQUIRED_INCLUDES ${PCRE_INCLUDE_DIR})
303                                 set(CMAKE_REQUIRED_LIBRARIES ${PCRE_LIBRARY})
304                                 check_include_files(pcre.h HAVE_PCRE_H)
305                                 check_library_exists(pcre pcre_exec "" HAVE_LIBPCRE)
306                                 set(CMAKE_REQUIRED_INCLUDES)
307                                 set(CMAKE_REQUIRED_LIBRARIES)
308                                 include_directories(${PCRE_INCLUDE_DIR})
309                         endif()
310                 endif()
311         endif()
313         if(NOT HAVE_PCRE_H)
314                 message(FATAL_ERROR "pcre.h couldn't be found")
315         endif()
316         if(NOT HAVE_LIBPCRE)
317                 message(FATAL_ERROR "libpcre couldn't be found")
318         endif()
319 else()
320         unset(HAVE_PCRE_H)
321         unset(HAVE_LIBPCRE)
322 endif()
325 if(WITH_XML)
326         xconfig(xml2-config XML2_INCDIR XML2_LIBDIR XML2_LDFLAGS XML2_CFLAGS)
327         if(XML2_LDFLAGS OR XML2_CFLAGS)
328                 message(STATUS "found xml2 at: LDFLAGS: ${XML2_LDFLAGS} CFLAGS: ${XML2_CFLAGS}")
330                 ## if it is empty we'll get newline returned
331                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${XML2_CFLAGS}")
333                 check_include_files(libxml/tree.h HAVE_LIBXML_H)
335                 set(CMAKE_REQUIRED_FLAGS ${XML2_LDFLAGS})
336                 check_library_exists(xml2 xmlParseChunk "" HAVE_LIBXML)
337                 set(CMAKE_REQUIRED_FLAGS)
338         else()
339                 check_include_files(libxml.h HAVE_LIBXML_H)
340                 check_library_exists(xml2 xmlParseChunk "" HAVE_LIBXML)
341         endif()
343         if(NOT HAVE_LIBXML_H)
344                 message(FATAL_ERROR "libxml/tree.h couldn't be found")
345         endif()
346         if(NOT HAVE_LIBXML)
347                 message(FATAL_ERROR "libxml2 couldn't be found")
348         endif()
349 else()
350         unset(HAVE_LIBXML_H)
351         unset(HAVE_LIBXML)
352 endif()
354 if(WITH_SQLITE3)
355         check_include_files(sqlite3.h HAVE_SQLITE3_H)
356         check_library_exists(sqlite3 sqlite3_reset "" HAVE_SQLITE3)
357 else()
358         unset(HAVE_SQLITE3_H)
359         unset(HAVE_SQLITE3)
360 endif()
362 if(WITH_UUID)
363         check_include_files(uuid/uuid.h HAVE_UUID_UUID_H)
364         check_library_exists(uuid uuid_generate "" NEED_LIBUUID)
365         if(NOT NEED_LIBUUID)
366                 check_function_exists(uuid_generate HAVE_LIBUUID)
367         else()
368                 set(HAVE_LIBUUID 1)
369         endif()
370 else()
371         unset(HAVE_UUID_UUID_H)
372         unset(NEED_LIBUUID)
373         unset(HAVE_LIBUUID)
374 endif()
376 if(WITH_ZLIB)
377         if(NOT WIN32)
378                 check_include_files(zlib.h HAVE_ZLIB_H)
379                 check_library_exists(z deflate "" HAVE_LIBZ)
380                 set(ZLIB_LIBRARY z)
381         else()
382                 find_path(ZLIB_INCLUDE_DIR zlib.h
383                         /usr/local/include
384                         /usr/include
385                 )
387                 set(ZLIB_NAMES z zlib zdll)
388                         find_library(ZLIB_LIBRARY
389                         NAMES ${ZLIB_NAMES}
390                         PATHS /usr/lib /usr/local/lib
391                 )
393                 if(ZLIB_INCLUDE_DIR AND ZLIB_LIBRARY)
394                         set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR})
395                         set(CMAKE_REQUIRED_LIBRARIES ${ZLIB_LIBRARY})
396                         get_filename_component(ZLIB_NAME ${ZLIB_LIBRARY} NAME)
397                         check_include_files(zlib.h HAVE_ZLIB_H)
398                         check_library_exists(${ZLIB_NAME} deflate "" HAVE_LIBZ)
399                         set(CMAKE_REQUIRED_INCLUDES)
400                         set(CMAKE_REQUIRED_LIBRARIES)
401                         include_directories(${ZLIB_INCLUDE_DIR})
402                 endif()
403         endif()
404 else()
405         unset(HAVE_ZLIB_H)
406         unset(HAVE_LIBZ)
407         unset(ZLIB_INCLUDE_DIR)
408         unset(ZLIB_LIBRARY)
409 endif()
411 if(WITH_BZIP)
412         check_include_files(bzlib.h HAVE_BZLIB_H)
413         check_library_exists(bz2 BZ2_bzCompress "" HAVE_LIBBZ2)
414 else()
415         unset(HAVE_BZLIB_H)
416         unset(HAVE_LIBBZ2)
417 endif()
419 if(WITH_LDAP)
420         check_include_files(ldap.h HAVE_LDAP_H)
421         check_library_exists(ldap ldap_bind "" HAVE_LIBLDAP)
422         check_include_files(lber.h HAVE_LBER_H)
423         check_library_exists(lber ber_printf "" HAVE_LIBLBER)
424         set(LDAP_DEPRECATED 1) # Using deprecated ldap api
425 else()
426         unset(HAVE_LDAP_H)
427         unset(HAVE_LIBLDAP)
428         unset(HAVE_LBER_H)
429         unset(HAVE_LIBLBER)
430 endif()
432 if(WITH_LUA)
433         pkg_search_module(LUA REQUIRED lua5.3 lua-5.3 lua5.2 lua-5.2 lua5.1 lua-5.1 lua)
434         message(STATUS "found lua at: INCDIR: ${LUA_INCLUDE_DIRS} LIBDIR: ${LUA_LIBRARY_DIRS} LDFLAGS: ${LUA_LDFLAGS} CFLAGS: ${LUA_CFLAGS}")
435         set(HAVE_LIBLUA 1 "Have liblua")
436         set(HAVE_LUA_H  1 "Have liblua header")
437 else()
438         unset(HAVE_LIBLUA)
439         unset(HAVE_LUA_H)
440 endif()
442 if(WITH_FAM)
443         check_include_files(fam.h HAVE_FAM_H)
444         check_library_exists(fam FAMOpen2 "" HAVE_LIBFAM)
445         if(HAVE_LIBFAM)
446                 set(CMAKE_REQUIRED_LIBRARIES fam)
447                 check_function_exists(FAMNoExists HAVE_FAMNOEXISTS)
448         endif()
449 else()
450         unset(HAVE_FAM_H)
451         unset(HAVE_LIBFAM)
452         unset(HAVE_FAMNOEXISTS)
453 endif()
455 if(WITH_GDBM)
456         check_include_files(gdbm.h HAVE_GDBM_H)
457         check_library_exists(gdbm gdbm_open "" HAVE_GDBM)
458 else()
459         unset(HAVE_GDBM_H)
460         unset(HAVE_GDBM)
461 endif()
463 if(WITH_MEMCACHED)
464         check_include_files(libmemcached/memcached.h HAVE_LIBMEMCACHED_MEMCACHED_H)
465         check_library_exists(memcached memcached "" HAVE_LIBMEMCACHED)
466         if(HAVE_LIBMEMCACHED_MEMCACHED_H AND HAVE_LIBMEMCACHED)
467                 set(USE_MEMCACHED 1)
468         else()
469                 message(FATAL_ERROR "didn't find libmemcached")
470         endif()
471 endif()
473 if(WITH_GEOIP)
474         check_library_exists(geoip GeoIP_country_name_by_addr "" HAVE_GEOIP)
475 endif()
477 if(NOT BUILD_STATIC)
478         check_include_files(dlfcn.h HAVE_DLFCN_H)
479 else()
480         unset(HAVE_DLFCN_H)
481 endif()
483 if(HAVE_DLFCN_H)
484         check_library_exists(dl dlopen "" HAVE_LIBDL)
485 else()
486         unset(HAVE_LIBDL)
487 endif()
489 set(LIGHTTPD_VERSION_ID 10400)
490 set(PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
491 set(PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}")
493 if(NOT SBINDIR)
494         set(SBINDIR "sbin")
495 endif()
497 if(NOT LIGHTTPD_MODULES_DIR)
498         set(LIGHTTPD_MODULES_DIR "lib${LIB_SUFFIX}/lighttpd")
499 endif()
501 if(NOT WIN32)
502         set(LIGHTTPD_LIBRARY_DIR "${CMAKE_INSTALL_PREFIX}/${LIGHTTPD_MODULES_DIR}")
503 else()
504         ## We use relative path in windows
505         set(LIGHTTPD_LIBRARY_DIR "lib")
506 endif()
508 ## Write out config.h
509 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
511 add_definitions(-DHAVE_CONFIG_H)
513 include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
515 set(COMMON_SRC
516         base64.c buffer.c log.c
517         keyvalue.c chunk.c
518         http_chunk.c stream.c fdevent.c
519         stat_cache.c plugin.c joblist.c etag.c array.c
520         data_string.c data_array.c
521         data_integer.c md5.c data_fastcgi.c
522         vector.c
523         fdevent_select.c fdevent_libev.c
524         fdevent_poll.c fdevent_linux_sysepoll.c
525         fdevent_solaris_devpoll.c fdevent_solaris_port.c
526         fdevent_freebsd_kqueue.c
527         data_config.c
528         inet_ntop_cache.c crc32.c
529         connections-glue.c
530         configfile-glue.c
531         http-header-glue.c
532         http_auth.c
533         splaytree.c
534         rand.c
535         status_counter.c safe_memclear.c
538 if(WIN32)
539         message(STATUS "Adding local getopt implementation.")
540         set(COMMON_SRC ${COMMON_SRC} xgetopt.c)
541 endif()
543 add_executable(lemon lemon.c)
545 ## Build parsers by using lemon...
546 lemon_parser(configparser.y)
547 lemon_parser(mod_ssi_exprparser.y)
549 set(L_INSTALL_TARGETS)
551 add_executable(lighttpd-angel lighttpd-angel.c)
552 set(L_INSTALL_TARGETS ${L_INSTALL_TARGETS} lighttpd-angel)
553 add_target_properties(lighttpd-angel COMPILE_FLAGS "-DSBIN_DIR=\\\\\"${CMAKE_INSTALL_PREFIX}/${SBINDIR}\\\\\"")
555 add_executable(lighttpd
556         server.c
557         response.c
558         connections.c
559         network.c
560         network_darwin_sendfile.c
561         network_freebsd_sendfile.c
562         network_linux_sendfile.c
563         network_openssl.c
564         network_solaris_sendfilev.c
565         network_write.c
566         network_write_mmap.c
567         network_write_no_mmap.c
568         network_writev.c
569         configfile.c
570         configparser.c
571         request.c
572         proc_open.c
573         ${COMMON_SRC}
575 set(L_INSTALL_TARGETS ${L_INSTALL_TARGETS} lighttpd)
577 add_and_install_library(mod_access mod_access.c)
578 add_and_install_library(mod_accesslog mod_accesslog.c)
579 add_and_install_library(mod_alias mod_alias.c)
580 add_and_install_library(mod_auth "mod_auth.c")
581 add_and_install_library(mod_authn_file "mod_authn_file.c")
582 if(NOT WIN32)
583         add_and_install_library(mod_cgi mod_cgi.c)
584 endif()
585 add_and_install_library(mod_compress mod_compress.c)
586 add_and_install_library(mod_deflate mod_deflate.c)
587 add_and_install_library(mod_dirlisting mod_dirlisting.c)
588 add_and_install_library(mod_evasive mod_evasive.c)
589 add_and_install_library(mod_evhost mod_evhost.c)
590 add_and_install_library(mod_expire mod_expire.c)
591 add_and_install_library(mod_extforward mod_extforward.c)
592 add_and_install_library(mod_fastcgi mod_fastcgi.c)
593 add_and_install_library(mod_flv_streaming mod_flv_streaming.c)
594 add_and_install_library(mod_indexfile mod_indexfile.c)
595 add_and_install_library(mod_proxy mod_proxy.c)
596 add_and_install_library(mod_redirect mod_redirect.c)
597 add_and_install_library(mod_rewrite mod_rewrite.c)
598 add_and_install_library(mod_rrdtool mod_rrdtool.c)
599 add_and_install_library(mod_scgi mod_scgi.c)
600 add_and_install_library(mod_secdownload mod_secdownload.c)
601 add_and_install_library(mod_setenv mod_setenv.c)
602 add_and_install_library(mod_simple_vhost mod_simple_vhost.c)
603 add_and_install_library(mod_ssi "mod_ssi_exprparser.c;mod_ssi_expr.c;mod_ssi.c")
604 add_and_install_library(mod_staticfile mod_staticfile.c)
605 add_and_install_library(mod_status mod_status.c)
606 add_and_install_library(mod_uploadprogress mod_uploadprogress.c)
607 add_and_install_library(mod_userdir mod_userdir.c)
608 add_and_install_library(mod_usertrack mod_usertrack.c)
609 add_and_install_library(mod_webdav mod_webdav.c)
611 add_executable(test_buffer
612         test_buffer.c
613         buffer.c
615 add_test(NAME test_buffer COMMAND test_buffer)
617 add_executable(test_base64
618         test_base64.c
619         buffer.c
620         base64.c
622 add_test(NAME test_base64 COMMAND test_base64)
624 add_executable(test_configfile
625         test_configfile.c
626         buffer.c
627         array.c
628         data_string.c
629         keyvalue.c
630         vector.c
631         log.c
633 add_test(NAME test_configfile COMMAND test_configfile)
635 if(HAVE_PCRE_H)
636         target_link_libraries(lighttpd ${PCRE_LDFLAGS})
637         add_target_properties(lighttpd COMPILE_FLAGS ${PCRE_CFLAGS})
638         target_link_libraries(mod_rewrite ${PCRE_LDFLAGS})
639         add_target_properties(mod_rewrite COMPILE_FLAGS ${PCRE_CFLAGS})
640         target_link_libraries(mod_dirlisting ${PCRE_LDFLAGS})
641         add_target_properties(mod_dirlisting COMPILE_FLAGS ${PCRE_CFLAGS})
642         target_link_libraries(mod_redirect ${PCRE_LDFLAGS})
643         add_target_properties(mod_redirect COMPILE_FLAGS ${PCRE_CFLAGS})
644         target_link_libraries(test_configfile ${PCRE_LDFLAGS})
645         add_target_properties(test_configfile COMPILE_FLAGS ${PCRE_CFLAGS})
646 endif()
648 if(WITH_PCRE AND (WITH_MEMCACHED OR WITH_GDBM))
649         add_and_install_library(mod_trigger_b4_dl mod_trigger_b4_dl.c)
650         target_link_libraries(mod_trigger_b4_dl ${PCRE_LDFLAGS})
651         add_target_properties(mod_trigger_b4_dl COMPILE_FLAGS ${PCRE_CFLAGS})
652 endif()
654 if(WITH_LUA)
655         add_and_install_library(mod_magnet "mod_magnet.c;mod_magnet_cache.c")
656         target_link_libraries(mod_magnet ${LUA_LDFLAGS})
657         add_target_properties(mod_magnet COMPILE_FLAGS ${LUA_CFLAGS})
659         add_and_install_library(mod_cml "mod_cml.c;mod_cml_lua.c;mod_cml_funcs.c")
660         target_link_libraries(mod_cml ${LUA_LDFLAGS})
661         add_target_properties(mod_cml COMPILE_FLAGS ${LUA_CFLAGS})
662 endif()
664 if(WITH_GEOIP)
665         add_and_install_library(mod_geoip mod_geoip.c)
666         target_link_libraries(mod_geoip GeoIP)
667 endif()
669 if(HAVE_MYSQL_H AND HAVE_MYSQL)
670         add_and_install_library(mod_mysql_vhost "mod_mysql_vhost.c")
671         target_link_libraries(mod_mysql_vhost mysqlclient)
672         include_directories(/usr/include/mysql)
674         add_and_install_library(mod_authn_mysql "mod_authn_mysql.c")
675         set(L_MOD_AUTHN_MYSQL)
676         if(HAVE_LIBCRYPT)
677                 set(L_MOD_AUTHN_MYSQL ${L_MOD_AUTHN_MYSQL} crypt)
678         endif()
679         target_link_libraries(mod_authn_mysql ${L_MOD_AUTHN_MYSQL} mysqlclient)
680 endif()
682 set(L_MOD_WEBDAV)
683 if(HAVE_SQLITE3_H)
684         set(L_MOD_WEBDAV ${L_MOD_WEBDAV} sqlite3)
685 endif()
686 if(HAVE_LIBXML_H)
687         target_link_libraries(mod_webdav ${XML2_LDFLAGS})
688 endif()
689 if(HAVE_UUID_H)
690         if(NEED_LIBUUID)
691                 set(L_MOD_WEBDAV ${L_MOD_WEBDAV} uuid)
692         endif()
693 endif()
695 target_link_libraries(mod_webdav ${L_MOD_WEBDAV})
697 set(L_MOD_AUTHN_FILE)
698 if(HAVE_LIBCRYPT)
699         set(L_MOD_AUTHN_FILE ${L_MOD_AUTHN_FILE} crypt)
700 endif()
701 target_link_libraries(mod_authn_file ${L_MOD_AUTHN_FILE})
703 if(WITH_KRB5)
704         check_library_exists(krb5 krb5_init_context "" HAVE_KRB5)
705         add_and_install_library(mod_authn_gssapi "mod_authn_gssapi.c")
706         set(L_MOD_AUTHN_GSSAPI ${L_MOD_AUTHN_GSSAPI} krb5 gssapi_krb5)
707         target_link_libraries(mod_authn_gssapi ${L_MOD_AUTHN_GSSAPI})
708 endif()
710 if(WITH_LDAP)
711         add_and_install_library(mod_authn_ldap "mod_authn_ldap.c")
712         set(L_MOD_AUTHN_LDAP ${L_MOD_AUTHN_LDAP} ldap lber)
713         target_link_libraries(mod_authn_ldap ${L_MOD_AUTHN_LDAP})
714 endif()
716 if(HAVE_ZLIB_H)
717         if(HAVE_BZLIB_H)
718                 target_link_libraries(mod_compress ${ZLIB_LIBRARY} bz2)
719                 target_link_libraries(mod_deflate ${ZLIB_LIBRARY} bz2)
720         else()
721                 target_link_libraries(mod_compress ${ZLIB_LIBRARY})
722                 target_link_libraries(mod_deflate ${ZLIB_LIBRARY})
723         endif()
724 endif()
726 if(HAVE_LIBFAM)
727         target_link_libraries(lighttpd fam)
728 endif()
730 if(HAVE_GDBM_H)
731         target_link_libraries(mod_trigger_b4_dl gdbm)
732 endif()
734 if(WITH_MEMCACHED)
735         target_link_libraries(mod_trigger_b4_dl memcached)
736 endif()
738 if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
739         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -Wall -g -Wshadow -W -pedantic ${WARN_CFLAGS}")
740         set(CMAKE_C_FLAGS_RELEASE        "${CMAKE_C_FLAGS_RELEASE}     -O2")
741         set(CMAKE_C_FLAGS_DEBUG          "${CMAKE_C_FLAGS_DEBUG}       -O0")
742         set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_WITHDEBINFO} -O2")
743         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${WARN_LDFLAGS}")
744         set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${WARN_LDFLAGS}")
745 endif()
747 if((NOT APPLE) OR CMAKE_C_COMPILER_ID MATCHES "GNU")
748         add_target_properties(lighttpd LINK_FLAGS "-Wl,-export-dynamic")
749 endif()
751 set_target_properties(lighttpd PROPERTIES CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
753 if(WIN32)
754         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNVALGRIND")
755         add_target_properties(lighttpd COMPILE_FLAGS "-DLI_DECLARE_EXPORTS")
756         target_link_libraries(lighttpd ws2_32)
757         target_link_libraries(mod_proxy ws2_32)
758         target_link_libraries(mod_fcgi ws2_32)
759         target_link_libraries(mod_scgi ws2_32)
760         target_link_libraries(mod_ssi ws2_32)
762         if(MINGW)
763                 target_link_libraries(lighttpd msvcr70)
764                 add_target_properties(lighttpd LINK_FLAGS "-Wl,-subsystem,console")
765         endif()
766 endif()
768 if(NOT BUILD_STATIC)
769         if(HAVE_LIBDL)
770                 target_link_libraries(lighttpd dl)
771         endif()
772 endif()
774 if(HAVE_LIBSSL AND HAVE_LIBCRYPTO)
775         target_link_libraries(lighttpd ssl)
776         target_link_libraries(lighttpd crypto)
777 endif()
779 if(WITH_LIBEV)
780         target_link_libraries(lighttpd ${LIBEV_LDFLAGS})
781         add_target_properties(lighttpd COMPILE_FLAGS ${LIBEV_CFLAGS})
782 endif()
784 if(WITH_LIBUNWIND)
785         target_link_libraries(lighttpd ${LIBUNWIND_LDFLAGS})
786         add_target_properties(lighttpd COMPILE_FLAGS ${LIBUNWIND_CFLAGS})
788         target_link_libraries(test_buffer ${LIBUNWIND_LDFLAGS})
789         add_target_properties(test_buffer COMPILE_FLAGS ${LIBUNWIND_CFLAGS})
790         target_link_libraries(test_base64 ${LIBUNWIND_LDFLAGS})
791         add_target_properties(test_base64 COMPILE_FLAGS ${LIBUNWIND_CFLAGS})
792         target_link_libraries(test_configfile ${PCRE_LDFLAGS} ${LIBUNWIND_LDFLAGS})
793         add_target_properties(test_configfile COMPILE_FLAGS ${PCRE_CFLAGS} ${LIBUNWIND_CFLAGS})
794 endif()
796 if(NOT WIN32)
797 install(TARGETS ${L_INSTALL_TARGETS}
798         RUNTIME DESTINATION ${SBINDIR}
799         LIBRARY DESTINATION ${LIGHTTPD_MODULES_DIR}
800         ARCHIVE DESTINATION ${LIGHTTPD_MODULES_DIR}/static)
801 else()
802 ## HACK to make win32 to install our libraries in desired directory..
803 install(TARGETS lighttpd
804         RUNTIME DESTINATION ${SBINDIR}
805         ARCHIVE DESTINATION lib/static)
806 list(REMOVE_ITEM L_INSTALL_TARGETS lighttpd)
807 install(TARGETS ${L_INSTALL_TARGETS}
808         RUNTIME DESTINATION ${SBINDIR}/lib
809         LIBRARY DESTINATION lib
810         ARCHIVE DESTINATION lib/static)
811 endif()