fix broken ext arg parsing
[platform/upstream/libwebsockets.git] / README.build.md
1 Introduction to CMake
2 ---------------------
3
4 CMake is a multi-platform build tool that can generate build files for many
5 different target platforms. See more info at http://www.cmake.org
6
7 CMake also allows/recommends you to do "out of source"-builds, that is,
8 the build files are separated from your sources, so there is no need to
9 create elaborate clean scripts to get a clean source tree, instead you
10 simply remove your build directory.
11
12 Libwebsockets has been tested to build successfully on the following platforms
13 with SSL support (both OpenSSL/wolfSSL):
14
15 - Windows (Visual Studio)
16 - Windows (MinGW)
17 - Linux (x86 and ARM)
18 - OSX
19 - NetBSD
20
21 Building the library and test apps
22 ----------------------------------
23
24 The project settings used by CMake to generate the platform specific build
25 files is called [CMakeLists.txt](CMakeLists.txt). CMake then uses one of its "Generators" to
26 output a Visual Studio project or Make file for instance. To see a list of
27 the available generators for your platform, simply run the "cmake" command.
28
29 Note that by default OpenSSL will be linked, if you don't want SSL support
30 see below on how to toggle compile options.
31
32 Building on Unix:
33 -----------------
34
35 1. Install CMake 2.8 or greater: http://cmake.org/cmake/resources/software.html
36    (Most Unix distributions comes with a packaged version also)
37
38 2. Install OpenSSL.
39
40 3. Generate the build files (default is Make files):
41
42     ```bash
43         $ cd /path/to/src
44         $ mkdir build
45         $ cd build
46         $ cmake ..
47     ```
48
49         (**NOTE**: The `build/`` directory can have any name and be located anywhere
50          on your filesystem, and that the argument `..` given to cmake is simply
51          the source directory of **libwebsockets** containing the [CMakeLists.txt](CMakeLists.txt)
52          project file. All examples in this file assumes you use "..")
53
54         **NOTE2**:
55         A common option you may want to give is to set the install path, same
56         as --prefix= with autotools.  It defaults to /usr/local.
57         You can do this by, eg
58
59     ```bash
60         $ cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
61     ```
62
63         **NOTE3**:
64         On machines that want libraries in lib64, you can also add the
65         following to the cmake line
66
67     ```bash
68         -DLIB_SUFFIX=64
69     ```
70
71         **NOTE4**:
72         If you are building against a non-distro OpenSSL (eg, in order to get
73         access to ALPN support only in newer OpenSSL versions) the nice way to
74         express that in one cmake command is eg,
75
76     ```bash
77         $ cmake .. -DOPENSSL_ROOT_DIR=/usr/local/ssl \
78                  -DCMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE=/usr/local/ssl \
79                  -DLWS_WITH_HTTP2=1
80     ```
81
82         When you run the test apps using non-distro SSL, you have to force them
83         to use your libs, not the distro ones
84
85     ```bash
86         $ LD_LIBRARY_PATH=/usr/local/ssl/lib libwebsockets-test-server --ssl
87     ```
88
89 4. Finally you can build using the generated Makefile:
90
91     ```bash
92         $ make
93     ```
94
95 Quirk of cmake
96 --------------
97
98 When changing cmake options, for some reason the only way to get it to see the
99 changes sometimes is delete the contents of your build directory and do the
100 cmake from scratch.
101
102 Building on Windows (Visual Studio)
103 -----------------------------------
104 1. Install CMake 2.6 or greater: http://cmake.org/cmake/resources/software.html
105
106 2. Install OpenSSL binaries. http://www.openssl.org/related/binaries.html
107
108    (**NOTE**: Preferably in the default location to make it easier for CMake to find them)
109
110    **NOTE2**: 
111    Be sure that OPENSSL_CONF environment variable is defined and points at 
112    <OpenSSL install location>\bin\openssl.cfg
113          
114 3. Generate the Visual studio project by opening the Visual Studio cmd prompt:
115
116    ```bash
117    cd <path to src>
118    md build
119    cd build
120    cmake -G "Visual Studio 10" ..
121    ```
122
123    (**NOTE**: There is also a cmake-gui available on Windows if you prefer that)
124    
125    **NOTE2**:
126    See this link to find out the version number corresponding to your Visual Studio edition:
127    http://superuser.com/a/194065
128
129 4. Now you should have a generated Visual Studio Solution in  your
130    `<path to src>/build` directory, which can be used to build.
131
132 Building on Windows (MinGW)
133 ---------------------------
134 1. Install MinGW: http://sourceforge.net/projects/mingw/files
135
136    (**NOTE**: Preferably in the default location C:\MinGW)
137
138 2. Fix up MinGW headers
139
140    a) Add the following lines to C:\MinGW\include\winsock2.h:
141    
142    ```c
143    #if(_WIN32_WINNT >= 0x0600)
144
145    typedef struct pollfd {
146
147        SOCKET  fd;
148        SHORT   events;
149        SHORT   revents;
150
151    } WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
152
153    WINSOCK_API_LINKAGE int WSAAPI WSAPoll(LPWSAPOLLFD fdArray, ULONG fds, INT timeout);
154
155    #endif // (_WIN32_WINNT >= 0x0600)
156    ```
157
158    b) Create C:\MinGW\include\mstcpip.h and copy and paste the content from following link into it:
159     
160    http://wine-unstable.sourcearchive.com/documentation/1.1.32/mstcpip_8h-source.html
161
162 3. Install CMake 2.6 or greater: http://cmake.org/cmake/resources/software.html
163
164 4. Install OpenSSL binaries. http://www.openssl.org/related/binaries.html
165
166    (**NOTE**: Preferably in the default location to make it easier for CMake to find them)
167
168    **NOTE2**: 
169    Be sure that OPENSSL_CONF environment variable is defined and points at 
170    <OpenSSL install location>\bin\openssl.cfg
171
172 5. Generate the build files (default is Make files) using MSYS shell:
173
174    ```bash
175    $ cd /drive/path/to/src
176    $ mkdir build
177    $ cd build
178    $ cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=C:/MinGW ..
179    ```
180
181    (**NOTE**: The `build/`` directory can have any name and be located anywhere
182     on your filesystem, and that the argument `..` given to cmake is simply
183     the source directory of **libwebsockets** containing the [CMakeLists.txt](CMakeLists.txt)
184     project file. All examples in this file assumes you use "..")
185
186    **NOTE2**:
187    To generate build files allowing to create libwebsockets binaries with debug information
188    set the CMAKE_BUILD_TYPE flag to DEBUG:
189
190    ```bash
191    $ cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=C:/MinGW -DCMAKE_BUILD_TYPE=DEBUG ..
192    ```
193
194 6. Finally you can build using the generated Makefile and get the results deployed into your MinGW installation:
195
196    ```bash
197    $ make
198    $ make install
199    ```
200
201 Setting compile options
202 -----------------------
203
204 To set compile time flags you can either use one of the CMake gui applications
205 or do it via command line.
206
207 Command line
208 ------------
209 To list avaialable options (ommit the H if you don't want the help text):
210
211         cmake -LH ..
212
213 Then to set an option and build (for example turn off SSL support):
214
215         cmake -DLWS_WITH_SSL=0 ..
216 or
217         cmake -DLWS_WITH_SSL:BOOL=OFF ..
218
219 Building on mbed3
220 -----------------
221 MBED3 is a non-posix embedded OS targeted on Cortex M class chips.
222
223 https://www.mbed.com/
224
225 It's quite unlike any other Posixy platform since the OS is linked statically
226 in with lws to form one binary.
227
228 At the minute server-only is supported and due to bugs in mbed3 network support,
229 the port is of alpha quality.  However it can serve the test html, favicon.ico
230 and logo png and may be able to make ws connections.  The binary for that
231 including the OS, test app, lws and all the assets is only 117KB.
232
233 0) Today mbed3 only properly works on FRDM K64F $35 Freescale Dev Board with
234 1MB Flash, 256KB SRAM and Ethernet.
235
236 http://www.freescale.com/products/arm-processors/kinetis-cortex-m/k-series/k6x-ethernet-mcus/freescale-freedom-development-platform-for-kinetis-k64-k63-and-k24-mcus:FRDM-K64F
237
238 1) Get a working mbed3 environment with arm-none-eabi-cs toolchain
239 (available in Fedora, Ubuntu and other distros)
240
241 2) Confirm you can build things using yotta by following the getting started guide here
242
243 https://docs.mbed.com/docs/getting-started-mbed-os/en/latest/
244
245 3)
246
247 git clone https://github.com/warmcat/lws-test-server
248
249 and cd into it
250
251 4) mkdir -p yotta_modules ; cd yotta_modules
252
253 5) git clone https://github.com/warmcat/libwebsockets ; mv libwebsockets websockets ; cd ..
254
255 6) yotta target frdm-k64f-gcc
256
257 7) yotta install
258
259 8) yotta build
260
261
262 Unix GUI
263 --------
264 If you have a curses-enabled build you simply type:
265 (not all packages include this, my debian install does not for example).
266
267         ccmake
268
269 Windows GUI
270 -----------
271 On windows CMake comes with a gui application:
272         Start -> Programs -> CMake -> CMake (cmake-gui)
273
274 wolfSSL/CyaSSL replacement for OpenSSL
275 --------------------------------------
276 wolfSSL/CyaSSL is a lightweight SSL library targeted at embedded systems:
277 https://www.wolfssl.com/wolfSSL/Products-wolfssl.html
278
279 It contains a OpenSSL compatibility layer which makes it possible to pretty
280 much link to it instead of OpenSSL, giving a much smaller footprint.
281
282 **NOTE**: wolfssl needs to be compiled using the `--enable-opensslextra` flag for
283 this to work.
284
285 Compiling libwebsockets with wolfSSL
286 ------------------------------------
287
288 ```bash
289 cmake .. -DLWS_USE_WOLFSSL=1 \
290          -DLWS_WOLFSSL_INCLUDE_DIRS=/path/to/wolfssl \
291          -DLWS_WOLFSSL_LIBRARIES=/path/to/wolfssl/wolfssl.a ..
292 ```
293
294 **NOTE**: On windows use the .lib file extension for `LWS_WOLFSSL_LIBRARIES` instead.
295
296 Compiling libwebsockets with CyaSSL
297 -----------------------------------
298
299 ```bash
300 cmake .. -DLWS_USE_CYASSL=1 \
301          -DLWS_CYASSL_INCLUDE_DIRS=/path/to/cyassl \
302          -DLWS_CYASSL_LIBRARIES=/path/to/wolfssl/cyassl.a ..
303 ```
304
305 **NOTE**: On windows use the .lib file extension for `LWS_CYASSL_LIBRARIES` instead.
306
307 Reproducing HTTP2.0 tests
308 -------------------------
309
310 You must have built and be running lws against a version of openssl that has
311 ALPN / NPN.  Most distros still have older versions.  You'll know it's right by
312 seeing
313
314 ```bash
315 lwsts[4752]:  Compiled with OpenSSL support
316 lwsts[4752]:  Using SSL mode
317 lwsts[4752]:  HTTP2 / ALPN enabled
318 ```
319
320 at lws startup.
321
322 For non-SSL HTTP2.0 upgrade
323
324 ```bash
325 $ nghttp -nvasu http://localhost:7681/test.htm
326 ```
327
328 For SSL / ALPN HTTP2.0 upgrade
329
330 ```
331 $ nghttp -nvas https://localhost:7681/test.html
332 ```
333
334 Cross compiling
335 ---------------
336 To enable cross-compiling **libwebsockets** using CMake you need to create
337 a "Toolchain file" that you supply to CMake when generating your build files.
338 CMake will then use the cross compilers and build paths specified in this file
339 to look for dependencies and such.
340
341 **Libwebsockets** includes an example toolchain file [cross-arm-linux-gnueabihf.cmake](cross-arm-linux-gnueabihf.cmake)
342 you can use as a starting point.
343
344 The commandline to configure for cross with this would look like
345
346 ```bash
347 $ cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/usr \
348          -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake \
349          -DWITHOUT_EXTENSIONS=1 -DWITH_SSL=0
350 ```
351
352 The example shows how to build with no external cross lib dependencies, you
353 need to provide the cross libraries otherwise.
354
355 **NOTE**: start from an EMPTY build directory if you had a non-cross build in there
356         before the settings will be cached and your changes ignored.
357
358 Additional information on cross compilation with CMake:
359         http://www.vtk.org/Wiki/CMake_Cross_Compiling
360
361 Memory efficiency
362 -----------------
363
364 Embedded server-only configuration without extensions (ie, no compression
365 on websocket connections), but with full v13 websocket features and http
366 server, built on ARM Cortex-A9:
367
368 Update at 8dac94d (2013-02-18)
369
370 ```bash
371 $ ./configure --without-client --without-extensions --disable-debug --without-daemonize
372
373 Context Creation, 1024 fd limit[2]:   16720 (includes 12 bytes per fd)
374 Per-connection [3]:                      72 bytes, +1328 during headers
375
376 .text   .rodata .data   .bss
377 11512   2784    288     4
378 ```
379
380 This shows the impact of the major configuration with/without options at
381 13ba5bbc633ea962d46d using Ubuntu ARM on a PandaBoard ES.
382
383 These are accounting for static allocations from the library elf, there are
384 additional dynamic allocations via malloc.  These are a bit old now but give
385 the right idea for relative "expense" of features.
386
387 Static allocations, ARM9
388
389 |                                | .text   | .rodata | .data | .bss |
390 |--------------------------------|---------|---------|-------|------|
391 | All (no without)               | 35024   | 9940    | 336   | 4104 |
392 | without client                 | 25684   | 7144    | 336   | 4104 |
393 | without client, exts           | 21652   | 6288    | 288   | 4104 |
394 | without client, exts, debug[1] | 19756   | 3768    | 288   | 4104 |
395 | without server                 | 30304   | 8160    | 336   | 4104 |
396 | without server, exts           | 25382   | 7204    | 288   | 4104 |
397 | without server, exts, debug[1] | 23712   | 4256    | 288   | 4104 |
398
399 [1] `--disable-debug` only removes messages below `lwsl_notice`.  Since that is
400 the default logging level the impact is not noticeable, error, warn and notice
401 logs are all still there.
402
403 [2] `1024` fd per process is the default limit (set by ulimit) in at least Fedora
404 and Ubuntu.  You can make significant savings tailoring this to actual expected
405 peak fds, ie, at a limit of `20`, context creation allocation reduces to `4432 +
406 240 = 4672`)
407
408 [3] known header content is freed after connection establishment