Some more Cmake stuff.
[profile/ivi/libwebsockets.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.6)
2
3 project(libwebsockets)
4
5 set(PACKAGE "libwebsockets")
6 set(PACKAGE_VERSION "1.1")
7 set(PACKAGE_BUGREPORT "andy@warmcat.com")
8 set(PACKAGE_NAME "${PACKAGE}")
9 set(PACKAGE_STRING "${PACKAGE} ${PACKAGE_VERSION}")
10 set(PACKAGE_TARNAME "${PACKAGE}")
11 set(PACKAGE_URL "http://libwebsockets.org")
12 set(VERSION "{PACKAGE_VERSION}")
13
14 option(WITH_SSL "Include SSL support (default OpenSSL, CyaSSL if USE_CYASSL is set)" ON)
15 option(USE_INCLUDED_WIN32_ZLIB "Use the internal version of ZLib instead of searching the system" ON)
16 option(USE_CYASSL "Use CyaSSL replacement for OpenSSL" OFF)
17 option(WITH_BUILTIN_GETIFADDRS "Use BSD getifaddrs implementation from libwebsockets... default is your libc provides it" OFF)
18 option(WITHOUT_TESTAPPS "Don't build the libwebsocket-test-apps" OFF)
19 option(WITHOUT_CLIENT "Don't build the client part of the library" OFF)
20 option(WITHOUT_SERVER "Don't build the server part of the library" OFF)
21 option(WITH_LIBCRYPTO "Use libcrypto MD5 and SHA1 implementations" ON)
22 option(WITHOUT_PING "Don't build the ping test application" OFF)
23 option(WITHOUT_DEBUG "Don't compile debug related code" OFF)
24
25 set(CYASSL_LIB ON CACHE STRING "")
26 set(CYASSL_INCLUDE_DIRS ON CACHE STRING "")
27
28 if (USE_CYASSL)
29         if (NOT CYASSL_LIB OR NOT CYASSL_INCLUDE_DIRS)
30                 error("You must set CYASSL_LIB and CYASSL_INCLUDE_DIRS when USE_CYASSL is turned on")
31         endif()
32 endif()
33
34 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/")
35 include_directories(${PROJECT_BINARY_DIR})
36
37 include(CheckFunctionExists)
38 include(CheckIncludeFile)
39 include(CheckIncludeFiles)
40 include(CheckLibraryExists)
41
42 CHECK_FUNCTION_EXISTS(bzero HAVE_BZERO)
43 CHECK_FUNCTION_EXISTS(fork HAVE_FORK)
44 CHECK_FUNCTION_EXISTS(malloc HAVE_MALLOC)
45 CHECK_FUNCTION_EXISTS(memset HAVE_MEMSET)
46 CHECK_FUNCTION_EXISTS(realloc HAVE_REALLOC)
47 CHECK_FUNCTION_EXISTS(socket HAVE_SOCKET)
48 CHECK_FUNCTION_EXISTS(strerror HAVE_STRERROR)
49 CHECK_FUNCTION_EXISTS(vfork HAVE_VFORK)
50 CHECK_FUNCTION_EXISTS(getifaddrs HAVE_GETIFADDRS)
51
52 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
53 CHECK_INCLUDE_FILE(fcntl.h HAVE_FCNTL_H)
54 CHECK_INCLUDE_FILE(inttypes.h HAVE_INTTYPES_H)
55 CHECK_INCLUDE_FILE(memory.h HAVE_MEMORY_H)
56 CHECK_INCLUDE_FILE(netinet/in.h HAVE_NETINET_IN_H)
57 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
58 CHECK_INCLUDE_FILE(stdlib.h HAVE_STDLIB_H)
59 CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
60 CHECK_INCLUDE_FILE(string.h HAVE_STRING_H)
61 CHECK_INCLUDE_FILE(sys/prctl.h HAVE_SYS_PRCTL_H)
62 CHECK_INCLUDE_FILE(sys/socket.h HAVE_SYS_SOCKET_H)
63 CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H)
64 CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)
65 CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
66 CHECK_INCLUDE_FILE(vfork.h HAVE_VFORK_H)
67 CHECK_INCLUDE_FILE(zlib.h HAVE_ZLIB_H)
68
69 # TODO: These can be tested if they actually work also...
70 set(HAVE_WORKING_FORK HAVE_FORK)
71 set(HAVE_WORKING_VFORK HAVE_VFORK)
72
73 CHECK_INCLUDE_FILES("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS)
74
75 if (NOT HAVE_SYS_TYPES_H)
76         set(pid_t int)
77         set(size_t "unsigned int")
78 endif()
79
80 if (NOT HAVE_MALLOC)
81         set(malloc rpl_malloc)
82 endif()
83
84 if (NOT HAVE_REALLOC)
85         set(realloc rpl_realloc)
86 endif()
87
88 if (WITH_SSL)
89         set(LWS_OPENSSL_SUPPORT)
90 endif()
91
92 # Generate the config.h that includes all the compilation settings.
93 configure_file(
94                 ${PROJECT_SOURCE_DIR}/config.h.cmake 
95                 ${PROJECT_BINARY_DIR}/config.h)
96
97 set(LIB_LIST)
98
99 if (MSVC)
100         # Turn off stupid microsoft security warnings.
101         add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
102 endif()
103
104 if (WIN32)
105         # For windows, do not allow the compiler to use default target (Vista).
106         add_definitions(-D_WIN32_WINNT=0x0501)
107 endif(WIN32)
108
109 # Group headers and sources.
110 # Some IDEs use this for nicer file structure.
111 set(HDR_PRIVATE
112         lib/private-libwebsockets.h
113         lib/extension-deflate-frame.h
114         lib/lib/extension-deflate-stream.h)
115
116 set(HDR_PUBLIC  
117         lib/libwebsockets.h
118         )
119
120 set(SOURCES
121         lib/base64-decode.c
122         lib/client.c
123         lib/client-handshake.c
124         lib/client-parser.c
125         lib/daemonize.c
126         lib/extension.c
127         lib/extension-deflate-frame.c
128         lib/extension-deflate-stream.c
129         lib/handshake.c
130         lib/libwebsockets.c
131         lib/minilex.c
132         lib/output.c
133         lib/parsers.c
134         lib/server.c
135         lib/server-handshake.c
136         lib/sha-1.c
137         )
138
139 # Add helper files for Windows.
140 if (WIN32)
141         set(WIN32_HELPERS_PATH ${PROJECT_SOURCE_DIR}/win32port/win32helpers)
142
143         list(APPEND HDR_PRIVATE
144                 ${WIN32_HELPERS_PATH}/websock-w32.h
145                 ${WIN32_HELPERS_PATH}/gettimeofday.h
146                 )
147
148         list(APPEND SOURCES 
149                 ${WIN32_HELPERS_PATH}/websock-w32.c
150                 ${WIN32_HELPERS_PATH}/gettimeofday.c
151                 )
152 endif()
153
154 if (UNIX)
155         if (!WITH_BUILTIN_GETIFADDRS)
156                 list(APPEND HDR_PRIVATE lib/getifaddrs.h)
157                 list(APPEND SOURCES lib/getifaddrs.c)
158         endif()
159 endif()
160
161 source_group("Headers Private"  FILES ${HDR_PRIVATE})
162 source_group("Headers Public"   FILES ${HDR_PUBLIC})
163 source_group("Sources"          FILES ${SOURCES})
164
165 #
166 # Create the lib.
167 #
168 add_library(websocket STATIC
169                         ${HDR_PRIVATE}
170                         ${HDR_PUBLIC}
171                         ${SOURCES})
172
173 #
174 # Find libraries.
175 #
176
177 #
178 # ZLIB.
179 #
180 if (WIN32 AND USE_INCLUDED_WIN32_ZLIB)
181         # Compile ZLib if needed.
182         if (USE_INCLUDED_WIN32_ZLIB)
183                 set(WIN32_ZLIB_PATH "${PROJECT_SOURCE_DIR}/win32port/zlib")
184                 set(ZLIB_SRCS
185                         ${WIN32_ZLIB_PATH}/adler32.c
186                         ${WIN32_ZLIB_PATH}/compress.c
187                         ${WIN32_ZLIB_PATH}/crc32.c
188                         ${WIN32_ZLIB_PATH}/deflate.c
189                         ${WIN32_ZLIB_PATH}/gzclose.c
190                         ${WIN32_ZLIB_PATH}/gzio.c
191                         ${WIN32_ZLIB_PATH}/gzlib.c
192                         ${WIN32_ZLIB_PATH}/gzread.c
193                         ${WIN32_ZLIB_PATH}/gzwrite.c
194                         ${WIN32_ZLIB_PATH}/infback.c
195                         ${WIN32_ZLIB_PATH}/inffast.c
196                         ${WIN32_ZLIB_PATH}/inflate.c
197                         ${WIN32_ZLIB_PATH}/inftrees.c
198                         ${WIN32_ZLIB_PATH}/trees.c
199                         ${WIN32_ZLIB_PATH}/uncompr.c
200                         ${WIN32_ZLIB_PATH}/zutil.c
201                 )
202
203                 # Create the library.
204                 add_library(zlib STATIC ${ZLIB_SRCS})
205
206                 # Set the same variables as find_package would.
207                 set(${ZLIB_INCLUDE_DIRS} ${WIN32_ZLIB_PATH})
208                 get_property(ZLIB_LIBRARIES TARGET zlib PROPERTY LOCATION)
209                 set(ZLIB_FOUND 1)
210         endif()
211 else()
212         find_package(zlib REQUIRED)
213 endif()
214
215 include_directories(${ZLIB_INCLUDE_DIRS})
216 target_link_libraries(websocket ${ZLIB_LIBRARIES})
217
218 #
219 # OpenSSL
220 #
221 if (WITH_SSL)
222         if (USE_CYASSL)
223                 # Use CyaSSL as OpenSSL replacement.
224                 set(OPENSSL_LIBRARIES ${CYASSL_LIB})
225                 set(OPENSSL_INCLUDE_DIRS ${CYASSL_INCLUDE_DIRS})
226                 set(OPENSSL_FOUND 1)
227         else()
228                 # TODO: Add support for STATIC also.
229                 find_package(OpenSSL REQUIRED)
230         endif()
231
232         include_directories(${OPENSSL_INCLUDE_DIR})
233         target_link_libraries(websocket ${OPENSSL_LIBRARIES})
234 endif()
235
236