xref: /aosp_15_r20/external/libwebsockets/READMEs/README.build.md (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard WorkerNotes about building lws
2*1c60b9acSAndroid Build Coastguard Worker========================
3*1c60b9acSAndroid Build Coastguard Worker
4*1c60b9acSAndroid Build Coastguard WorkerYou can download and install lws using the [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager:
5*1c60b9acSAndroid Build Coastguard Worker```
6*1c60b9acSAndroid Build Coastguard Workergit clone https://github.com/microsoft/vcpkg.git
7*1c60b9acSAndroid Build Coastguard Workercd vcpkg
8*1c60b9acSAndroid Build Coastguard Worker./bootstrap-vcpkg.sh
9*1c60b9acSAndroid Build Coastguard Worker./vcpkg integrate install
10*1c60b9acSAndroid Build Coastguard Workervcpkg install libwebsockets
11*1c60b9acSAndroid Build Coastguard Worker```
12*1c60b9acSAndroid Build Coastguard WorkerThe lws port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg/) on the vcpkg repository.
13*1c60b9acSAndroid Build Coastguard Worker
14*1c60b9acSAndroid Build Coastguard Worker@section cm Introduction to CMake
15*1c60b9acSAndroid Build Coastguard Worker
16*1c60b9acSAndroid Build Coastguard WorkerCMake is a multi-platform build tool that can generate build files for many
17*1c60b9acSAndroid Build Coastguard Workerdifferent target platforms. See more info at http://www.cmake.org
18*1c60b9acSAndroid Build Coastguard Worker
19*1c60b9acSAndroid Build Coastguard WorkerCMake also allows/recommends you to do "out of source"-builds, that is,
20*1c60b9acSAndroid Build Coastguard Workerthe build files are separated from your sources, so there is no need to
21*1c60b9acSAndroid Build Coastguard Workercreate elaborate clean scripts to get a clean source tree, instead you
22*1c60b9acSAndroid Build Coastguard Workersimply remove your build directory.
23*1c60b9acSAndroid Build Coastguard Worker
24*1c60b9acSAndroid Build Coastguard WorkerLibwebsockets has been tested to build successfully on the following platforms
25*1c60b9acSAndroid Build Coastguard Workerwith SSL support (for OpenSSL/wolfSSL/BoringSSL):
26*1c60b9acSAndroid Build Coastguard Worker
27*1c60b9acSAndroid Build Coastguard Worker- Windows (Visual Studio)
28*1c60b9acSAndroid Build Coastguard Worker- Windows (MinGW)
29*1c60b9acSAndroid Build Coastguard Worker- Linux (x86 and ARM)
30*1c60b9acSAndroid Build Coastguard Worker- OSX
31*1c60b9acSAndroid Build Coastguard Worker- NetBSD
32*1c60b9acSAndroid Build Coastguard Worker
33*1c60b9acSAndroid Build Coastguard Worker
34*1c60b9acSAndroid Build Coastguard Worker@section build1 Building the library and test apps
35*1c60b9acSAndroid Build Coastguard Worker
36*1c60b9acSAndroid Build Coastguard WorkerThe project settings used by CMake to generate the platform specific build
37*1c60b9acSAndroid Build Coastguard Workerfiles is called [CMakeLists.txt](../CMakeLists.txt). CMake then uses one of its "Generators" to
38*1c60b9acSAndroid Build Coastguard Workeroutput a Visual Studio project or Make file for instance. To see a list of
39*1c60b9acSAndroid Build Coastguard Workerthe available generators for your platform, simply run the "cmake" command.
40*1c60b9acSAndroid Build Coastguard Worker
41*1c60b9acSAndroid Build Coastguard WorkerNote that by default OpenSSL will be linked, if you don't want SSL support
42*1c60b9acSAndroid Build Coastguard Workersee below on how to toggle compile options.
43*1c60b9acSAndroid Build Coastguard Worker
44*1c60b9acSAndroid Build Coastguard Worker
45*1c60b9acSAndroid Build Coastguard Worker@section bu Building on Unix:
46*1c60b9acSAndroid Build Coastguard Worker
47*1c60b9acSAndroid Build Coastguard Worker1. Install CMake 2.8 or greater: http://cmake.org/cmake/resources/software.html
48*1c60b9acSAndroid Build Coastguard Worker   (Most Unix distributions comes with a packaged version also)
49*1c60b9acSAndroid Build Coastguard Worker
50*1c60b9acSAndroid Build Coastguard Worker2. Install OpenSSL.
51*1c60b9acSAndroid Build Coastguard Worker
52*1c60b9acSAndroid Build Coastguard Worker3. Generate the build files (default is Make files):
53*1c60b9acSAndroid Build Coastguard Worker```
54*1c60b9acSAndroid Build Coastguard Worker        $ cd /path/to/src
55*1c60b9acSAndroid Build Coastguard Worker        $ mkdir build
56*1c60b9acSAndroid Build Coastguard Worker        $ cd build
57*1c60b9acSAndroid Build Coastguard Worker        $ cmake ..
58*1c60b9acSAndroid Build Coastguard Worker```
59*1c60b9acSAndroid Build Coastguard Worker
60*1c60b9acSAndroid Build Coastguard Worker4. Finally you can build using the generated Makefile:
61*1c60b9acSAndroid Build Coastguard Worker```
62*1c60b9acSAndroid Build Coastguard Worker    $ make && sudo make install
63*1c60b9acSAndroid Build Coastguard Worker```
64*1c60b9acSAndroid Build Coastguard Worker**NOTE**: The `build/`` directory can have any name and be located anywhere
65*1c60b9acSAndroid Build Coastguard Worker on your filesystem, and that the argument `..` given to cmake is simply
66*1c60b9acSAndroid Build Coastguard Worker the source directory of **libwebsockets** containing the [CMakeLists.txt](../CMakeLists.txt)
67*1c60b9acSAndroid Build Coastguard Worker project file. All examples in this file assumes you use ".."
68*1c60b9acSAndroid Build Coastguard Worker
69*1c60b9acSAndroid Build Coastguard Worker**NOTE2**:
70*1c60b9acSAndroid Build Coastguard WorkerA common option you may want to give is to set the install path, same
71*1c60b9acSAndroid Build Coastguard Workeras --prefix= with autotools.  It defaults to /usr/local.
72*1c60b9acSAndroid Build Coastguard WorkerYou can do this by, eg
73*1c60b9acSAndroid Build Coastguard Worker```
74*1c60b9acSAndroid Build Coastguard Worker    $ cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr .
75*1c60b9acSAndroid Build Coastguard Worker```
76*1c60b9acSAndroid Build Coastguard Worker
77*1c60b9acSAndroid Build Coastguard Worker**NOTE3**:
78*1c60b9acSAndroid Build Coastguard WorkerOn machines that want libraries in lib64, you can also add the
79*1c60b9acSAndroid Build Coastguard Workerfollowing to the cmake line
80*1c60b9acSAndroid Build Coastguard Worker```
81*1c60b9acSAndroid Build Coastguard Worker    -DLIB_SUFFIX=64
82*1c60b9acSAndroid Build Coastguard Worker```
83*1c60b9acSAndroid Build Coastguard Worker
84*1c60b9acSAndroid Build Coastguard Worker**NOTE4**:
85*1c60b9acSAndroid Build Coastguard WorkerIf you are building against a non-distro OpenSSL (eg, in order to get
86*1c60b9acSAndroid Build Coastguard Workeraccess to ALPN support only in newer OpenSSL versions) the nice way to
87*1c60b9acSAndroid Build Coastguard Workerexpress that in one cmake command is eg,
88*1c60b9acSAndroid Build Coastguard Worker```
89*1c60b9acSAndroid Build Coastguard Worker    $ cmake .. -DOPENSSL_ROOT_DIR=/usr/local/ssl \
90*1c60b9acSAndroid Build Coastguard Worker         -DCMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE=/usr/local/ssl \
91*1c60b9acSAndroid Build Coastguard Worker         -DLWS_WITH_HTTP2=1
92*1c60b9acSAndroid Build Coastguard Worker```
93*1c60b9acSAndroid Build Coastguard Worker
94*1c60b9acSAndroid Build Coastguard WorkerWhen you run the test apps using non-distro SSL, you have to force them
95*1c60b9acSAndroid Build Coastguard Workerto use your libs, not the distro ones
96*1c60b9acSAndroid Build Coastguard Worker```
97*1c60b9acSAndroid Build Coastguard Worker    $ LD_LIBRARY_PATH=/usr/local/ssl/lib libwebsockets-test-server --ssl
98*1c60b9acSAndroid Build Coastguard Worker```
99*1c60b9acSAndroid Build Coastguard Worker
100*1c60b9acSAndroid Build Coastguard WorkerTo get it to build on latest openssl (2016-04-10) it needed this approach
101*1c60b9acSAndroid Build Coastguard Worker```
102*1c60b9acSAndroid Build Coastguard Worker    cmake .. -DLWS_WITH_HTTP2=1 -DLWS_OPENSSL_INCLUDE_DIRS=/usr/local/include/openssl -DLWS_OPENSSL_LIBRARIES="/usr/local/lib64/libssl.so;/usr/local/lib64/libcrypto.so"
103*1c60b9acSAndroid Build Coastguard Worker```
104*1c60b9acSAndroid Build Coastguard Worker
105*1c60b9acSAndroid Build Coastguard WorkerMac users have reported
106*1c60b9acSAndroid Build Coastguard Worker
107*1c60b9acSAndroid Build Coastguard Worker```
108*1c60b9acSAndroid Build Coastguard Worker $ export OPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2k; cmake ..; make -j4
109*1c60b9acSAndroid Build Coastguard Worker```
110*1c60b9acSAndroid Build Coastguard Worker
111*1c60b9acSAndroid Build Coastguard Workerworked for them when using "homebrew" OpenSSL
112*1c60b9acSAndroid Build Coastguard Worker
113*1c60b9acSAndroid Build Coastguard Worker**NOTE5**:
114*1c60b9acSAndroid Build Coastguard WorkerTo build with debug info and _DEBUG for lower priority debug messages
115*1c60b9acSAndroid Build Coastguard Workercompiled in, use
116*1c60b9acSAndroid Build Coastguard Worker```
117*1c60b9acSAndroid Build Coastguard Worker    $ cmake .. -DCMAKE_BUILD_TYPE=DEBUG
118*1c60b9acSAndroid Build Coastguard Worker```
119*1c60b9acSAndroid Build Coastguard Worker
120*1c60b9acSAndroid Build Coastguard Worker**NOTE6**
121*1c60b9acSAndroid Build Coastguard WorkerTo build on Solaris the linker needs to be informed to use lib socket
122*1c60b9acSAndroid Build Coastguard Workerand libnsl, and only builds in 64bit mode.
123*1c60b9acSAndroid Build Coastguard Worker
124*1c60b9acSAndroid Build Coastguard Worker```bash
125*1c60b9acSAndroid Build Coastguard Worker    $ cmake .. -DCMAKE_C_FLAGS=-m64 -DCMAKE_EXE_LINKER_FLAGS="-lsocket -lnsl"
126*1c60b9acSAndroid Build Coastguard Worker```
127*1c60b9acSAndroid Build Coastguard Worker
128*1c60b9acSAndroid Build Coastguard Worker**NOTE7**
129*1c60b9acSAndroid Build Coastguard Worker
130*1c60b9acSAndroid Build Coastguard WorkerBuild and test flow against boringssl.  Notice `LWS_WITH_GENHASH` is currently
131*1c60b9acSAndroid Build Coastguard Workerunavailable with boringssl due to their removing the necessary apis.
132*1c60b9acSAndroid Build Coastguard Worker
133*1c60b9acSAndroid Build Coastguard WorkerBuild current HEAD boringssl
134*1c60b9acSAndroid Build Coastguard Worker
135*1c60b9acSAndroid Build Coastguard Worker```
136*1c60b9acSAndroid Build Coastguard Worker $ cd /projects
137*1c60b9acSAndroid Build Coastguard Worker $ git clone https://boringssl.googlesource.com/boringssl
138*1c60b9acSAndroid Build Coastguard Worker $ cd boringssl
139*1c60b9acSAndroid Build Coastguard Worker $ mkdir build
140*1c60b9acSAndroid Build Coastguard Worker $ cd build
141*1c60b9acSAndroid Build Coastguard Worker $ cmake ..  -DBUILD_SHARED_LIBS=1
142*1c60b9acSAndroid Build Coastguard Worker $ make -j8
143*1c60b9acSAndroid Build Coastguard Worker```
144*1c60b9acSAndroid Build Coastguard Worker
145*1c60b9acSAndroid Build Coastguard WorkerBuild and test lws against it
146*1c60b9acSAndroid Build Coastguard Worker
147*1c60b9acSAndroid Build Coastguard Worker```
148*1c60b9acSAndroid Build Coastguard Worker $ cd /projects/libwebsockets/build
149*1c60b9acSAndroid Build Coastguard Worker $ cmake .. -DOPENSSL_LIBRARIES="/projects/boringssl/build/ssl/libssl.so;\
150*1c60b9acSAndroid Build Coastguard Worker   /projects/boringssl/build/crypto/libcrypto.so" \
151*1c60b9acSAndroid Build Coastguard Worker   -DOPENSSL_INCLUDE_DIRS=/projects/boringssl/include \
152*1c60b9acSAndroid Build Coastguard Worker   -DLWS_WITH_BORINGSSL=1 -DCMAKE_BUILD_TYPE=DEBUG
153*1c60b9acSAndroid Build Coastguard Worker $ make -j8 && sudo make install
154*1c60b9acSAndroid Build Coastguard Worker $ LD_PRELOAD="/projects/boringssl/build/ssl/libssl.so \
155*1c60b9acSAndroid Build Coastguard Worker   /projects/boringssl/build/crypto/libcrypto.so" \
156*1c60b9acSAndroid Build Coastguard Worker   /usr/local/bin/libwebsockets-test-server -s
157*1c60b9acSAndroid Build Coastguard Worker```
158*1c60b9acSAndroid Build Coastguard Worker
159*1c60b9acSAndroid Build Coastguard Worker4. Finally you can build using the generated Makefile:
160*1c60b9acSAndroid Build Coastguard Worker
161*1c60b9acSAndroid Build Coastguard Worker```bash
162*1c60b9acSAndroid Build Coastguard Worker    $ make
163*1c60b9acSAndroid Build Coastguard Worker ```
164*1c60b9acSAndroid Build Coastguard Worker
165*1c60b9acSAndroid Build Coastguard Worker@section lcap Linux Capabilities
166*1c60b9acSAndroid Build Coastguard Worker
167*1c60b9acSAndroid Build Coastguard WorkerOn Linux, lws now lets you retain selected root capabilities when dropping
168*1c60b9acSAndroid Build Coastguard Workerprivileges.  If libcap-dev or similar package is installed providing
169*1c60b9acSAndroid Build Coastguard Workersys/capabilities.h, and libcap or similar package is installed providing
170*1c60b9acSAndroid Build Coastguard Workerlibcap.so, CMake will enable the capability features.
171*1c60b9acSAndroid Build Coastguard Worker
172*1c60b9acSAndroid Build Coastguard WorkerThe context creation info struct .caps[] and .count_caps members can then
173*1c60b9acSAndroid Build Coastguard Workerbe set by user code to enable selected root capabilities to survive the
174*1c60b9acSAndroid Build Coastguard Workertransition to running under an unprivileged user.
175*1c60b9acSAndroid Build Coastguard Worker
176*1c60b9acSAndroid Build Coastguard Worker@section cmq Quirk of cmake
177*1c60b9acSAndroid Build Coastguard Worker
178*1c60b9acSAndroid Build Coastguard WorkerWhen changing cmake options, for some reason the only way to get it to see the
179*1c60b9acSAndroid Build Coastguard Workerchanges sometimes is delete the contents of your build directory and do the
180*1c60b9acSAndroid Build Coastguard Workercmake from scratch.
181*1c60b9acSAndroid Build Coastguard Worker
182*1c60b9acSAndroid Build Coastguard Workerdeleting build/CMakeCache.txt may be enough.
183*1c60b9acSAndroid Build Coastguard Worker
184*1c60b9acSAndroid Build Coastguard Worker
185*1c60b9acSAndroid Build Coastguard Worker@section cmw Building on Windows (Visual Studio)
186*1c60b9acSAndroid Build Coastguard Worker
187*1c60b9acSAndroid Build Coastguard Worker1. Install CMake 2.6 or greater: http://cmake.org/cmake/resources/software.html
188*1c60b9acSAndroid Build Coastguard Worker
189*1c60b9acSAndroid Build Coastguard Worker2. Install OpenSSL binaries. https://wiki.openssl.org/index.php/Binaries
190*1c60b9acSAndroid Build Coastguard Worker
191*1c60b9acSAndroid Build Coastguard Worker   (**NOTE**: Preferably in the default location to make it easier for CMake to find them)
192*1c60b9acSAndroid Build Coastguard Worker
193*1c60b9acSAndroid Build Coastguard Worker   **NOTE2**:
194*1c60b9acSAndroid Build Coastguard Worker   Be sure that OPENSSL_CONF environment variable is defined and points at
195*1c60b9acSAndroid Build Coastguard Worker   <OpenSSL install location>\bin\openssl.cfg
196*1c60b9acSAndroid Build Coastguard Worker
197*1c60b9acSAndroid Build Coastguard Worker3. Generate the Visual studio project by opening the Visual Studio cmd prompt:
198*1c60b9acSAndroid Build Coastguard Worker
199*1c60b9acSAndroid Build Coastguard Worker```
200*1c60b9acSAndroid Build Coastguard Worker    cd <path to src>
201*1c60b9acSAndroid Build Coastguard Worker    md build
202*1c60b9acSAndroid Build Coastguard Worker    cd build
203*1c60b9acSAndroid Build Coastguard Worker    cmake -G "Visual Studio 10" ..
204*1c60b9acSAndroid Build Coastguard Worker```
205*1c60b9acSAndroid Build Coastguard Worker
206*1c60b9acSAndroid Build Coastguard Worker   (**NOTE**: There is also a cmake-gui available on Windows if you prefer that)
207*1c60b9acSAndroid Build Coastguard Worker
208*1c60b9acSAndroid Build Coastguard Worker   **NOTE2**:
209*1c60b9acSAndroid Build Coastguard Worker   See this link to find out the version number corresponding to your Visual Studio edition:
210*1c60b9acSAndroid Build Coastguard Worker   http://superuser.com/a/194065
211*1c60b9acSAndroid Build Coastguard Worker
212*1c60b9acSAndroid Build Coastguard Worker4. Now you should have a generated Visual Studio Solution in  your
213*1c60b9acSAndroid Build Coastguard Worker   `<path to src>/build` directory, which can be used to build.
214*1c60b9acSAndroid Build Coastguard Worker
215*1c60b9acSAndroid Build Coastguard Worker5. Some additional deps may be needed
216*1c60b9acSAndroid Build Coastguard Worker
217*1c60b9acSAndroid Build Coastguard Worker - iphlpapi.lib
218*1c60b9acSAndroid Build Coastguard Worker - psapi.lib
219*1c60b9acSAndroid Build Coastguard Worker - userenv.lib
220*1c60b9acSAndroid Build Coastguard Worker
221*1c60b9acSAndroid Build Coastguard Worker6. If you're using libuv, you must make sure to compile libuv with the same multithread-dll / Mtd attributes as libwebsockets itself
222*1c60b9acSAndroid Build Coastguard Worker
223*1c60b9acSAndroid Build Coastguard Worker
224*1c60b9acSAndroid Build Coastguard Worker@section cmwmgw Building on Windows (MinGW)
225*1c60b9acSAndroid Build Coastguard Worker
226*1c60b9acSAndroid Build Coastguard Worker1. Install MinGW
227*1c60b9acSAndroid Build Coastguard Worker
228*1c60b9acSAndroid Build Coastguard Worker    For Fedora, it's, eg, `dnf install mingw64-gcc`
229*1c60b9acSAndroid Build Coastguard Worker
230*1c60b9acSAndroid Build Coastguard Worker2. Install current CMake package
231*1c60b9acSAndroid Build Coastguard Worker
232*1c60b9acSAndroid Build Coastguard Worker    For Fedora, it's `dnf install cmake`
233*1c60b9acSAndroid Build Coastguard Worker
234*1c60b9acSAndroid Build Coastguard Worker3. Instal mingw-built OpenSSL pieces
235*1c60b9acSAndroid Build Coastguard Worker
236*1c60b9acSAndroid Build Coastguard Worker    For Fedora, it's `mingw64-openssl.noarch mingw64-openssl-static.noarch`
237*1c60b9acSAndroid Build Coastguard Worker
238*1c60b9acSAndroid Build Coastguard Worker    mingw64-cmake as described below will auto-find the libs and includes
239*1c60b9acSAndroid Build Coastguard Worker    for build.  But to execute the apps, they either need to go into the same
240*1c60b9acSAndroid Build Coastguard Worker    `/usr/x86_64-w64-mingw32/sys-root/mingw/bin/` as the dlls are installed to,
241*1c60b9acSAndroid Build Coastguard Worker    or the dlls have to be copied into the same dir as your app executable.
242*1c60b9acSAndroid Build Coastguard Worker
243*1c60b9acSAndroid Build Coastguard Worker4. Generate the build files (default is Make files) using MSYS shell.
244*1c60b9acSAndroid Build Coastguard Worker
245*1c60b9acSAndroid Build Coastguard Worker   For Fedora, they provide a `mingw64-cmake` wrapper in the package
246*1c60b9acSAndroid Build Coastguard Worker   `mingw64-filesystem`, with this you can run that instead of cmake directly
247*1c60b9acSAndroid Build Coastguard Worker   and don't have to get involved with setting the cmake generator.
248*1c60b9acSAndroid Build Coastguard Worker
249*1c60b9acSAndroid Build Coastguard Worker   Otherwise doing it by hand is like this:
250*1c60b9acSAndroid Build Coastguard Worker
251*1c60b9acSAndroid Build Coastguard Worker```
252*1c60b9acSAndroid Build Coastguard Worker    $ cd /drive/path/to/src
253*1c60b9acSAndroid Build Coastguard Worker    $ mkdir build
254*1c60b9acSAndroid Build Coastguard Worker    $ cd build
255*1c60b9acSAndroid Build Coastguard Worker    $ cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=C:/MinGW ..
256*1c60b9acSAndroid Build Coastguard Worker```
257*1c60b9acSAndroid Build Coastguard Worker
258*1c60b9acSAndroid Build Coastguard Worker   To generate build files allowing to create libwebsockets binaries with debug information
259*1c60b9acSAndroid Build Coastguard Worker   set the CMAKE_BUILD_TYPE flag to DEBUG:
260*1c60b9acSAndroid Build Coastguard Worker```
261*1c60b9acSAndroid Build Coastguard Worker    $ cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=C:/MinGW -DCMAKE_BUILD_TYPE=DEBUG ..
262*1c60b9acSAndroid Build Coastguard Worker```
263*1c60b9acSAndroid Build Coastguard Worker5. Finally you can build using the generated Makefile and get the results deployed into your MinGW installation:
264*1c60b9acSAndroid Build Coastguard Worker
265*1c60b9acSAndroid Build Coastguard Worker```
266*1c60b9acSAndroid Build Coastguard Worker    $ make && make install
267*1c60b9acSAndroid Build Coastguard Worker```
268*1c60b9acSAndroid Build Coastguard Worker
269*1c60b9acSAndroid Build Coastguard Worker@section distro Selecting CMake options useful for distros
270*1c60b9acSAndroid Build Coastguard Worker
271*1c60b9acSAndroid Build Coastguard WorkerDistro packagers should select the CMake option "LWS_WITH_DISTRO_RECOMMENDED",
272*1c60b9acSAndroid Build Coastguard Workerwhich selects common additional options like support for various event libraries,
273*1c60b9acSAndroid Build Coastguard Workerplugins and lwsws.
274*1c60b9acSAndroid Build Coastguard Worker
275*1c60b9acSAndroid Build Coastguard Worker@section ssllib Choosing Your TLS Poison
276*1c60b9acSAndroid Build Coastguard Worker
277*1c60b9acSAndroid Build Coastguard Worker - If you are really restricted on memory, code size, or don't care about TLS
278*1c60b9acSAndroid Build Coastguard Worker   speed, mbedTLS is a good choice: `cmake .. -DLWS_WITH_MBEDTLS=1`
279*1c60b9acSAndroid Build Coastguard Worker
280*1c60b9acSAndroid Build Coastguard Worker - If cpu and memory is not super restricted and you care about TLS speed,
281*1c60b9acSAndroid Build Coastguard Worker   OpenSSL or a directly compatible variant like Boring SSL is a good choice.
282*1c60b9acSAndroid Build Coastguard Worker
283*1c60b9acSAndroid Build Coastguard WorkerJust building lws against stock Fedora OpenSSL or stock Fedora mbedTLS, for
284*1c60b9acSAndroid Build Coastguard WorkerSSL handhake mbedTLS takes ~36ms and OpenSSL takes ~1ms on the same x86_64
285*1c60b9acSAndroid Build Coastguard Workerbuild machine here, with everything else the same.  Over the 144 connections of
286*1c60b9acSAndroid Build Coastguard Workerh2spec compliance testing for example, this ends up completing in 400ms for
287*1c60b9acSAndroid Build Coastguard WorkerOpenSSL and 5.5sec for mbedTLS on x86_64.  In other words mbedTLS is very slow
288*1c60b9acSAndroid Build Coastguard Workercompared to OpenSSL under the (fairly typical) conditions I tested it.
289*1c60b9acSAndroid Build Coastguard Worker
290*1c60b9acSAndroid Build Coastguard WorkerThis isn't an inefficiency in the mbedtls interface implementation, it's just
291*1c60b9acSAndroid Build Coastguard WorkermbedTLS doing the crypto much slower than OpenSSL, which has accelerated
292*1c60b9acSAndroid Build Coastguard Workerversions of common crypto operations it automatically uses for platforms
293*1c60b9acSAndroid Build Coastguard Workersupporting it.  As of Oct 2017 mbedTLS itself has no such optimizations for any
294*1c60b9acSAndroid Build Coastguard Workerplatform that I could find.  It's just pure C running on the CPU.
295*1c60b9acSAndroid Build Coastguard Worker
296*1c60b9acSAndroid Build Coastguard WorkerLws supports both almost the same, so instead of taking my word for it you are
297*1c60b9acSAndroid Build Coastguard Workerinvited to try it both ways and see which the results (including, eg, binary
298*1c60b9acSAndroid Build Coastguard Workersize and memory usage as well as speed) suggest you use.
299*1c60b9acSAndroid Build Coastguard Worker
300*1c60b9acSAndroid Build Coastguard WorkerNOTE: one major difference with mbedTLS is it does not load the system trust
301*1c60b9acSAndroid Build Coastguard Workerstore by default.  That has advantages and disadvantages, but the disadvantage
302*1c60b9acSAndroid Build Coastguard Workeris you must provide the CA cert to lws built against mbedTLS for it to be able
303*1c60b9acSAndroid Build Coastguard Workerto validate it, ie, use -A with the test client.  The minimal test clients
304*1c60b9acSAndroid Build Coastguard Workerhave the CA cert for warmcat.com and libwebsockets.org and use it if they see
305*1c60b9acSAndroid Build Coastguard Workerthey were built with mbedTLS.
306*1c60b9acSAndroid Build Coastguard Worker
307*1c60b9acSAndroid Build Coastguard Worker@section optee Building for OP-TEE
308*1c60b9acSAndroid Build Coastguard Worker
309*1c60b9acSAndroid Build Coastguard WorkerOP-TEE is a "Secure World" Trusted Execution Environment.
310*1c60b9acSAndroid Build Coastguard Worker
311*1c60b9acSAndroid Build Coastguard WorkerAlthough lws is only part of the necessary picture to have an https-enabled
312*1c60b9acSAndroid Build Coastguard WorkerTA, it does support OP-TEE as a platform and if you provide the other
313*1c60b9acSAndroid Build Coastguard Workerpieces, does work very well.
314*1c60b9acSAndroid Build Coastguard Worker
315*1c60b9acSAndroid Build Coastguard WorkerSelect it in cmake with `-DLWS_PLAT_OPTEE=1`
316*1c60b9acSAndroid Build Coastguard Worker
317*1c60b9acSAndroid Build Coastguard Worker
318*1c60b9acSAndroid Build Coastguard Worker@section cmco Setting compile options
319*1c60b9acSAndroid Build Coastguard Worker
320*1c60b9acSAndroid Build Coastguard WorkerTo set compile time flags you can either use one of the CMake gui applications
321*1c60b9acSAndroid Build Coastguard Workeror do it via the command line.
322*1c60b9acSAndroid Build Coastguard Worker
323*1c60b9acSAndroid Build Coastguard Worker@subsection cmcocl Command line
324*1c60b9acSAndroid Build Coastguard Worker
325*1c60b9acSAndroid Build Coastguard WorkerTo list available options (omit the H if you don't want the help text):
326*1c60b9acSAndroid Build Coastguard Worker
327*1c60b9acSAndroid Build Coastguard Worker    cmake -LH ..
328*1c60b9acSAndroid Build Coastguard Worker
329*1c60b9acSAndroid Build Coastguard WorkerThen to set an option and build (for example turn off SSL support):
330*1c60b9acSAndroid Build Coastguard Worker
331*1c60b9acSAndroid Build Coastguard Worker    cmake -DLWS_WITH_SSL=0 ..
332*1c60b9acSAndroid Build Coastguard Workeror
333*1c60b9acSAndroid Build Coastguard Worker    cmake -DLWS_WITH_SSL:BOOL=OFF ..
334*1c60b9acSAndroid Build Coastguard Worker
335*1c60b9acSAndroid Build Coastguard Worker@subsection cmcoug Unix GUI
336*1c60b9acSAndroid Build Coastguard Worker
337*1c60b9acSAndroid Build Coastguard WorkerIf you have a curses-enabled build you simply type:
338*1c60b9acSAndroid Build Coastguard Worker(not all packages include this, my debian install does not for example).
339*1c60b9acSAndroid Build Coastguard Worker
340*1c60b9acSAndroid Build Coastguard Worker    ccmake
341*1c60b9acSAndroid Build Coastguard Worker
342*1c60b9acSAndroid Build Coastguard Worker@subsection cmcowg Windows GUI
343*1c60b9acSAndroid Build Coastguard Worker
344*1c60b9acSAndroid Build Coastguard WorkerOn windows CMake comes with a gui application:
345*1c60b9acSAndroid Build Coastguard Worker    Start -> Programs -> CMake -> CMake (cmake-gui)
346*1c60b9acSAndroid Build Coastguard Worker
347*1c60b9acSAndroid Build Coastguard Worker
348*1c60b9acSAndroid Build Coastguard Worker@section wolf wolfSSL/CyaSSL replacement for OpenSSL
349*1c60b9acSAndroid Build Coastguard Worker
350*1c60b9acSAndroid Build Coastguard WorkerwolfSSL/CyaSSL is a lightweight SSL library targeted at embedded systems:
351*1c60b9acSAndroid Build Coastguard Workerhttps://www.wolfssl.com/wolfSSL/Products-wolfssl.html
352*1c60b9acSAndroid Build Coastguard Worker
353*1c60b9acSAndroid Build Coastguard WorkerIt contains a OpenSSL compatibility layer which makes it possible to pretty
354*1c60b9acSAndroid Build Coastguard Workermuch link to it instead of OpenSSL, giving a much smaller footprint.
355*1c60b9acSAndroid Build Coastguard Worker
356*1c60b9acSAndroid Build Coastguard Worker**NOTE**: wolfssl needs to be compiled using the `--enable-opensslextra` flag for
357*1c60b9acSAndroid Build Coastguard Workerthis to work.
358*1c60b9acSAndroid Build Coastguard Worker
359*1c60b9acSAndroid Build Coastguard Worker@section wolf1 Compiling libwebsockets with wolfSSL
360*1c60b9acSAndroid Build Coastguard Worker
361*1c60b9acSAndroid Build Coastguard Worker```
362*1c60b9acSAndroid Build Coastguard Worker    cmake .. -DLWS_WITH_WOLFSSL=1 \
363*1c60b9acSAndroid Build Coastguard Worker         -DLWS_WOLFSSL_INCLUDE_DIRS=/path/to/wolfssl \
364*1c60b9acSAndroid Build Coastguard Worker         -DLWS_WOLFSSL_LIBRARIES=/path/to/wolfssl/wolfssl.a ..
365*1c60b9acSAndroid Build Coastguard Worker```
366*1c60b9acSAndroid Build Coastguard Worker
367*1c60b9acSAndroid Build Coastguard Worker**NOTE**: On windows use the .lib file extension for `LWS_WOLFSSL_LIBRARIES` instead.
368*1c60b9acSAndroid Build Coastguard Worker
369*1c60b9acSAndroid Build Coastguard Worker@section cya Compiling libwebsockets with CyaSSL
370*1c60b9acSAndroid Build Coastguard Worker
371*1c60b9acSAndroid Build Coastguard Worker```
372*1c60b9acSAndroid Build Coastguard Worker    cmake .. -DLWS_WITH_CYASSL=1 \
373*1c60b9acSAndroid Build Coastguard Worker         -DLWS_CYASSL_INCLUDE_DIRS=/path/to/cyassl \
374*1c60b9acSAndroid Build Coastguard Worker         -DLWS_CYASSL_LIBRARIES=/path/to/wolfssl/cyassl.a ..
375*1c60b9acSAndroid Build Coastguard Worker```
376*1c60b9acSAndroid Build Coastguard Worker
377*1c60b9acSAndroid Build Coastguard Worker**NOTE**: On windows use the .lib file extension for `LWS_CYASSL_LIBRARIES` instead.
378*1c60b9acSAndroid Build Coastguard Worker
379*1c60b9acSAndroid Build Coastguard Worker@section gzip Selecting GZIP or MINIZ
380*1c60b9acSAndroid Build Coastguard Worker
381*1c60b9acSAndroid Build Coastguard WorkerBy default lws supports gzip when compression is needed.  But you can tell it to use
382*1c60b9acSAndroid Build Coastguard WorkerMINIZ instead by using `-DLWS_WITH_MINIZ=1`.
383*1c60b9acSAndroid Build Coastguard Worker
384*1c60b9acSAndroid Build Coastguard WorkerFor native build cmake will try to find an existing libminiz.so or .a and build
385*1c60b9acSAndroid Build Coastguard Workeragainst that and the found includes automatically.
386*1c60b9acSAndroid Build Coastguard Worker
387*1c60b9acSAndroid Build Coastguard WorkerFor cross-build or building against local miniz, you need the following kind of
388*1c60b9acSAndroid Build Coastguard Workercmake to tell it where to get miniz
389*1c60b9acSAndroid Build Coastguard Worker
390*1c60b9acSAndroid Build Coastguard Worker```
391*1c60b9acSAndroid Build Coastguard Workercmake .. -DLWS_WITH_MINIZ=1 -DLWS_WITH_ZIP_FOPS=1 -DMINIZ_INCLUDE_DIRS="/projects/miniz;/projects/miniz/build" -DMINIZ_LIBRARIES=/projects/miniz/build/libminiz.so.2.1.0
392*1c60b9acSAndroid Build Coastguard Worker```
393*1c60b9acSAndroid Build Coastguard Worker
394*1c60b9acSAndroid Build Coastguard Worker@section esp32 Building for ESP32
395*1c60b9acSAndroid Build Coastguard Worker
396*1c60b9acSAndroid Build Coastguard WorkerBuilding for ESP32 requires the ESP-IDF framework. It can be built under Linux, OSX or Windows (MSYS2).
397*1c60b9acSAndroid Build Coastguard Worker
398*1c60b9acSAndroid Build Coastguard Worker1. Install ESP-IDF, follow the getting started guide here - http://esp-idf.readthedocs.io/en/latest/get-started/
399*1c60b9acSAndroid Build Coastguard Worker2. Set ESP-IDF to last known working version (assuming ESP-IDF is in `~/esp/esp-idf`) :
400*1c60b9acSAndroid Build Coastguard Worker```
401*1c60b9acSAndroid Build Coastguard Worker    cd ~/esp/esp-idf
402*1c60b9acSAndroid Build Coastguard Worker    git checkout 0c50b65a34cd6b3954f7435193411a88adb49cb0
403*1c60b9acSAndroid Build Coastguard Worker    git submodule update --recursive
404*1c60b9acSAndroid Build Coastguard Worker```
405*1c60b9acSAndroid Build Coastguard Worker3. Add `libwebsockets` as a submodule in the `components` folder of your ESP-IDF project:
406*1c60b9acSAndroid Build Coastguard Worker```
407*1c60b9acSAndroid Build Coastguard Worker    git submodule add https://github.com/warmcat/libwebsockets.git components/libwebsockets
408*1c60b9acSAndroid Build Coastguard Worker```
409*1c60b9acSAndroid Build Coastguard Worker4. If on Windows (MSYS2) you will need to install CMake in the MSYS2 environment:
410*1c60b9acSAndroid Build Coastguard Worker```
411*1c60b9acSAndroid Build Coastguard Worker    pacman -S mingw-w64-i686-cmake
412*1c60b9acSAndroid Build Coastguard Worker```
413*1c60b9acSAndroid Build Coastguard WorkerIf you're on Linux or OSX ensure CMake version is at least 3.7.
414*1c60b9acSAndroid Build Coastguard Worker
415*1c60b9acSAndroid Build Coastguard Worker@section extplugins Building plugins outside of lws itself
416*1c60b9acSAndroid Build Coastguard Worker
417*1c60b9acSAndroid Build Coastguard WorkerThe directory ./plugin-standalone/ shows how easy it is to create plugins
418*1c60b9acSAndroid Build Coastguard Workeroutside of lws itself.  First build lws itself with -DLWS_WITH_PLUGINS,
419*1c60b9acSAndroid Build Coastguard Workerthen use the same flow to build the standalone plugin
420*1c60b9acSAndroid Build Coastguard Worker```
421*1c60b9acSAndroid Build Coastguard Worker    cd ./plugin-standalone
422*1c60b9acSAndroid Build Coastguard Worker    mkdir build
423*1c60b9acSAndroid Build Coastguard Worker    cd build
424*1c60b9acSAndroid Build Coastguard Worker    cmake ..
425*1c60b9acSAndroid Build Coastguard Worker    make && sudo make install
426*1c60b9acSAndroid Build Coastguard Worker```
427*1c60b9acSAndroid Build Coastguard Worker
428*1c60b9acSAndroid Build Coastguard Workerif you changed the default plugin directory when you built lws, you must
429*1c60b9acSAndroid Build Coastguard Workeralso give the same arguments to cmake here (eg,
430*1c60b9acSAndroid Build Coastguard Worker` -DCMAKE_INSTALL_PREFIX:PATH=/usr/something/else...` )
431*1c60b9acSAndroid Build Coastguard Worker
432*1c60b9acSAndroid Build Coastguard WorkerOtherwise if you run lwsws or libwebsockets-test-server-v2.0, it will now
433*1c60b9acSAndroid Build Coastguard Workerfind the additional plugin "libprotocol_example_standalone.so"
434*1c60b9acSAndroid Build Coastguard Worker```
435*1c60b9acSAndroid Build Coastguard Worker    lwsts[21257]:   Plugins:
436*1c60b9acSAndroid Build Coastguard Worker    lwsts[21257]:    libprotocol_dumb_increment.so
437*1c60b9acSAndroid Build Coastguard Worker    lwsts[21257]:    libprotocol_example_standalone.so
438*1c60b9acSAndroid Build Coastguard Worker    lwsts[21257]:    libprotocol_lws_mirror.so
439*1c60b9acSAndroid Build Coastguard Worker    lwsts[21257]:    libprotocol_lws_server_status.so
440*1c60b9acSAndroid Build Coastguard Worker    lwsts[21257]:    libprotocol_lws_status.so
441*1c60b9acSAndroid Build Coastguard Worker```
442*1c60b9acSAndroid Build Coastguard WorkerIf you have multiple vhosts, you must enable plugins at the vhost
443*1c60b9acSAndroid Build Coastguard Workeradditionally, discovered plugins are not enabled automatically for security
444*1c60b9acSAndroid Build Coastguard Workerreasons.  You do this using info->pvo or for lwsws, in the JSON config.
445*1c60b9acSAndroid Build Coastguard Worker
446*1c60b9acSAndroid Build Coastguard Worker
447*1c60b9acSAndroid Build Coastguard Worker@section http2rp Reproducing HTTP/2 tests
448*1c60b9acSAndroid Build Coastguard Worker
449*1c60b9acSAndroid Build Coastguard WorkerEnable `-DLWS_WITH_HTTP2=1` in cmake to build with http/2 support enabled.
450*1c60b9acSAndroid Build Coastguard Worker
451*1c60b9acSAndroid Build Coastguard WorkerYou must have built and be running lws against a version of openssl that has
452*1c60b9acSAndroid Build Coastguard WorkerALPN.  At the time of writing, recent distros have started upgrading to OpenSSL
453*1c60b9acSAndroid Build Coastguard Worker1.1+ that supports this already.  You'll know it's right by seeing
454*1c60b9acSAndroid Build Coastguard Worker
455*1c60b9acSAndroid Build Coastguard Worker```
456*1c60b9acSAndroid Build Coastguard Worker    lwsts[4752]:  Compiled with OpenSSL support
457*1c60b9acSAndroid Build Coastguard Worker    lwsts[4752]:  Using SSL mode
458*1c60b9acSAndroid Build Coastguard Worker    lwsts[4752]:  HTTP2 / ALPN enabled
459*1c60b9acSAndroid Build Coastguard Worker```
460*1c60b9acSAndroid Build Coastguard Workerat lws startup.
461*1c60b9acSAndroid Build Coastguard Worker
462*1c60b9acSAndroid Build Coastguard WorkerRecent Firefox and Chrome also support HTTP/2 by ALPN, so these should just work
463*1c60b9acSAndroid Build Coastguard Workerwith the test server running in -s / ssl mode.
464*1c60b9acSAndroid Build Coastguard Worker
465*1c60b9acSAndroid Build Coastguard WorkerFor testing with nghttp client:
466*1c60b9acSAndroid Build Coastguard Worker
467*1c60b9acSAndroid Build Coastguard Worker```
468*1c60b9acSAndroid Build Coastguard Worker    $ nghttp -nvas https://localhost:7681/test.html
469*1c60b9acSAndroid Build Coastguard Worker```
470*1c60b9acSAndroid Build Coastguard Worker
471*1c60b9acSAndroid Build Coastguard WorkerTesting with h2spec (https://github.com/summerwind/h2spec)
472*1c60b9acSAndroid Build Coastguard Worker
473*1c60b9acSAndroid Build Coastguard Worker```
474*1c60b9acSAndroid Build Coastguard Worker        $ h2spec  -h 127.0.0.1 -p 7681 -t -k -v -o 1
475*1c60b9acSAndroid Build Coastguard Worker```
476*1c60b9acSAndroid Build Coastguard Worker
477*1c60b9acSAndroid Build Coastguard Worker```
478*1c60b9acSAndroid Build Coastguard Worker145 tests, 145 passed, 0 skipped, 0 failed
479*1c60b9acSAndroid Build Coastguard Worker
480*1c60b9acSAndroid Build Coastguard Worker```
481*1c60b9acSAndroid Build Coastguard Worker
482*1c60b9acSAndroid Build Coastguard Worker@section coverage Automated Coverage Testing
483*1c60b9acSAndroid Build Coastguard Worker
484*1c60b9acSAndroid Build Coastguard Worker./test-apps/attack.sh contains scripted tests that are the basis
485*1c60b9acSAndroid Build Coastguard Workerof the automated test coverage assessment available for gcc and clang.
486*1c60b9acSAndroid Build Coastguard Worker
487*1c60b9acSAndroid Build Coastguard WorkerTo reproduce
488*1c60b9acSAndroid Build Coastguard Worker
489*1c60b9acSAndroid Build Coastguard Worker $ cd build
490*1c60b9acSAndroid Build Coastguard Worker $ cmake .. -DLWS_WITH_GCOV=1 -DCMAKE_BUILD_TYPE=DEBUG
491*1c60b9acSAndroid Build Coastguard Worker $ ../scripts/build-gcov.sh
492*1c60b9acSAndroid Build Coastguard Worker $ ../test-apps/attack.sh
493*1c60b9acSAndroid Build Coastguard Worker $ ../scripts/gcov.sh
494*1c60b9acSAndroid Build Coastguard Worker...
495*1c60b9acSAndroid Build Coastguard WorkerLines executed:51.24% of 8279
496*1c60b9acSAndroid Build Coastguard Worker
497*1c60b9acSAndroid Build Coastguard Worker@section windowsprebuilt Using Windows binary builds on Appveyor
498*1c60b9acSAndroid Build Coastguard Worker
499*1c60b9acSAndroid Build Coastguard WorkerThe CI builds on Appveyor now produce usable binary outputs.  Visit
500*1c60b9acSAndroid Build Coastguard Worker
501*1c60b9acSAndroid Build Coastguard Worker[lws on Appveyor](https://ci.appveyor.com/project/lws-team/libwebsockets)
502*1c60b9acSAndroid Build Coastguard Worker
503*1c60b9acSAndroid Build Coastguard Workerand select one of the builds, then click on ARTIFACTS at the top right.  The zip file
504*1c60b9acSAndroid Build Coastguard Workerwant to be unpacked into `C:\Program Files (x86)/libwebsockets`, after that, you should be able to run the test server, by running it from `bin/Release/libwebsockets-test-server.exe` and opening a browser on http://127.0.0.1:7681
505*1c60b9acSAndroid Build Coastguard Worker
506*1c60b9acSAndroid Build Coastguard Worker@section cross Cross compiling
507*1c60b9acSAndroid Build Coastguard Worker
508*1c60b9acSAndroid Build Coastguard WorkerTo enable cross-compiling **libwebsockets** using CMake you need to create
509*1c60b9acSAndroid Build Coastguard Workera "Toolchain file" that you supply to CMake when generating your build files.
510*1c60b9acSAndroid Build Coastguard WorkerCMake will then use the cross compilers and build paths specified in this file
511*1c60b9acSAndroid Build Coastguard Workerto look for dependencies and such.
512*1c60b9acSAndroid Build Coastguard Worker
513*1c60b9acSAndroid Build Coastguard Worker**Libwebsockets** includes an example toolchain file [cross-arm-linux-gnueabihf.cmake](../contrib/cross-arm-linux-gnueabihf.cmake)
514*1c60b9acSAndroid Build Coastguard Workeryou can use as a starting point.
515*1c60b9acSAndroid Build Coastguard Worker
516*1c60b9acSAndroid Build Coastguard WorkerThe commandline to configure for cross with this would look like
517*1c60b9acSAndroid Build Coastguard Worker```
518*1c60b9acSAndroid Build Coastguard Worker    $ cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/usr/lib/my-cross-root \
519*1c60b9acSAndroid Build Coastguard Worker         -DCMAKE_TOOLCHAIN_FILE=../contrib/cross-arm-linux-gnueabihf.cmake \
520*1c60b9acSAndroid Build Coastguard Worker         -DLWS_WITHOUT_EXTENSIONS=1 -DLWS_WITH_SSL=0 \
521*1c60b9acSAndroid Build Coastguard Worker         -DLWS_WITH_ZIP_FOPS=0 -DLWS_WITH_ZLIB=0
522*1c60b9acSAndroid Build Coastguard Worker```
523*1c60b9acSAndroid Build Coastguard WorkerThe example shows how to build with no external cross lib dependencies, you
524*1c60b9acSAndroid Build Coastguard Workerneed to provide the cross libraries otherwise.
525*1c60b9acSAndroid Build Coastguard Worker
526*1c60b9acSAndroid Build Coastguard Worker**NOTE**: start from an EMPTY build directory if you had a non-cross build in there
527*1c60b9acSAndroid Build Coastguard Worker    before the settings will be cached and your changes ignored.
528*1c60b9acSAndroid Build Coastguard Worker    Delete `build/CMakeCache.txt` at least before trying a new cmake config
529*1c60b9acSAndroid Build Coastguard Worker    to ensure you are really building the options you think you are.
530*1c60b9acSAndroid Build Coastguard Worker
531*1c60b9acSAndroid Build Coastguard WorkerAdditional information on cross compilation with CMake:
532*1c60b9acSAndroid Build Coastguard Worker    http://www.vtk.org/Wiki/CMake_Cross_Compiling
533*1c60b9acSAndroid Build Coastguard Worker
534*1c60b9acSAndroid Build Coastguard Worker@section cross_example Complex Cross compiling example
535*1c60b9acSAndroid Build Coastguard Worker
536*1c60b9acSAndroid Build Coastguard WorkerHere are step by step instructions for cross-building the external projects needed for lws with lwsws + mbedtls as an example.
537*1c60b9acSAndroid Build Coastguard Worker
538*1c60b9acSAndroid Build Coastguard WorkerIn the example, my toolchain lives in `/projects/aist-tb/arm-tc` and is named `arm-linux-gnueabihf`.  So you will need to adapt those to where your toolchain lives and its name where you see them here.
539*1c60b9acSAndroid Build Coastguard Worker
540*1c60b9acSAndroid Build Coastguard WorkerLikewise I do all this in /tmp but it has no special meaning, you can adapt that to somewhere else.
541*1c60b9acSAndroid Build Coastguard Worker
542*1c60b9acSAndroid Build Coastguard WorkerAll "foreign" cross-built binaries are sent into `/tmp/cross` so they cannot be confused for 'native' x86_64 stuff on your host machine in /usr/[local/]....
543*1c60b9acSAndroid Build Coastguard Worker
544*1c60b9acSAndroid Build Coastguard Worker## Prepare the cmake toolchain file
545*1c60b9acSAndroid Build Coastguard Worker
546*1c60b9acSAndroid Build Coastguard Worker1) `cd /tmp`
547*1c60b9acSAndroid Build Coastguard Worker
548*1c60b9acSAndroid Build Coastguard Worker2) `wget -O mytoolchainfile https://raw.githubusercontent.com/warmcat/libwebsockets/main/contrib/cross-arm-linux-gnueabihf.cmake`
549*1c60b9acSAndroid Build Coastguard Worker
550*1c60b9acSAndroid Build Coastguard Worker3) Edit `/tmp/mytoolchainfile` adapting `CROSS_PATH`, `CMAKE_C_COMPILER` and `CMAKE_CXX_COMPILER` to reflect your toolchain install dir and path to your toolchain C and C++ compilers respectively.  For my case:
551*1c60b9acSAndroid Build Coastguard Worker
552*1c60b9acSAndroid Build Coastguard Worker```
553*1c60b9acSAndroid Build Coastguard Workerset(CROSS_PATH /projects/aist-tb/arm-tc/)
554*1c60b9acSAndroid Build Coastguard Workerset(CMAKE_C_COMPILER "${CROSS_PATH}/bin/arm-linux-gnueabihf-gcc")
555*1c60b9acSAndroid Build Coastguard Workerset(CMAKE_CXX_COMPILER "${CROSS_PATH}/bin/arm-linux-gnueabihf-g++")
556*1c60b9acSAndroid Build Coastguard Worker```
557*1c60b9acSAndroid Build Coastguard Worker
558*1c60b9acSAndroid Build Coastguard Worker## 1/4: Building libuv cross:
559*1c60b9acSAndroid Build Coastguard Worker
560*1c60b9acSAndroid Build Coastguard Worker1) `export PATH=/projects/aist-tb/arm-tc/bin:$PATH`  Notice there is a **/bin** on the end of the toolchain path
561*1c60b9acSAndroid Build Coastguard Worker
562*1c60b9acSAndroid Build Coastguard Worker2) `cd /tmp ; mkdir cross` we will put the cross-built libs in /tmp/cross
563*1c60b9acSAndroid Build Coastguard Worker
564*1c60b9acSAndroid Build Coastguard Worker3) `git clone https://github.com/libuv/libuv.git` get libuv
565*1c60b9acSAndroid Build Coastguard Worker
566*1c60b9acSAndroid Build Coastguard Worker4) `cd libuv`
567*1c60b9acSAndroid Build Coastguard Worker
568*1c60b9acSAndroid Build Coastguard Worker5) `./autogen.sh`
569*1c60b9acSAndroid Build Coastguard Worker
570*1c60b9acSAndroid Build Coastguard Worker```
571*1c60b9acSAndroid Build Coastguard Worker+ libtoolize --copy
572*1c60b9acSAndroid Build Coastguard Workerlibtoolize: putting auxiliary files in '.'.
573*1c60b9acSAndroid Build Coastguard Workerlibtoolize: copying file './ltmain.sh'
574*1c60b9acSAndroid Build Coastguard Workerlibtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
575*1c60b9acSAndroid Build Coastguard Workerlibtoolize: copying file 'm4/libtool.m4'
576*1c60b9acSAndroid Build Coastguard Workerlibtoolize: copying file 'm4/ltoptions.m4'
577*1c60b9acSAndroid Build Coastguard Workerlibtoolize: copying file 'm4/ltsugar.m4'
578*1c60b9acSAndroid Build Coastguard Workerlibtoolize: copying file 'm4/ltversion.m4'
579*1c60b9acSAndroid Build Coastguard Workerlibtoolize: copying file 'm4/lt~obsolete.m4'
580*1c60b9acSAndroid Build Coastguard Worker+ aclocal -I m4
581*1c60b9acSAndroid Build Coastguard Worker+ autoconf
582*1c60b9acSAndroid Build Coastguard Worker+ automake --add-missing --copy
583*1c60b9acSAndroid Build Coastguard Workerconfigure.ac:38: installing './ar-lib'
584*1c60b9acSAndroid Build Coastguard Workerconfigure.ac:25: installing './compile'
585*1c60b9acSAndroid Build Coastguard Workerconfigure.ac:22: installing './config.guess'
586*1c60b9acSAndroid Build Coastguard Workerconfigure.ac:22: installing './config.sub'
587*1c60b9acSAndroid Build Coastguard Workerconfigure.ac:21: installing './install-sh'
588*1c60b9acSAndroid Build Coastguard Workerconfigure.ac:21: installing './missing'
589*1c60b9acSAndroid Build Coastguard WorkerMakefile.am: installing './depcomp'
590*1c60b9acSAndroid Build Coastguard Worker```
591*1c60b9acSAndroid Build Coastguard WorkerIf it has problems, you will need to install `automake`, `libtool` etc.
592*1c60b9acSAndroid Build Coastguard Worker
593*1c60b9acSAndroid Build Coastguard Worker6) `./configure  --host=arm-linux-gnueabihf --prefix=/tmp/cross`
594*1c60b9acSAndroid Build Coastguard Worker
595*1c60b9acSAndroid Build Coastguard Worker7) `make && make install` this will install to `/tmp/cross/...`
596*1c60b9acSAndroid Build Coastguard Worker
597*1c60b9acSAndroid Build Coastguard Worker8) `file /tmp/cross/lib/libuv.so.1.0.0`  Check it's really built for ARM
598*1c60b9acSAndroid Build Coastguard Worker```
599*1c60b9acSAndroid Build Coastguard Worker/tmp/cross/lib/libuv.so.1.0.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=cdde0bc945e51db6001a9485349c035baaec2b46, with debug_info, not stripped
600*1c60b9acSAndroid Build Coastguard Worker```
601*1c60b9acSAndroid Build Coastguard Worker
602*1c60b9acSAndroid Build Coastguard Worker## 2/4: Building zlib cross
603*1c60b9acSAndroid Build Coastguard Worker
604*1c60b9acSAndroid Build Coastguard Worker1) `cd /tmp`
605*1c60b9acSAndroid Build Coastguard Worker
606*1c60b9acSAndroid Build Coastguard Worker2) `git clone https://github.com/madler/zlib.git`
607*1c60b9acSAndroid Build Coastguard Worker
608*1c60b9acSAndroid Build Coastguard Worker3) `CC=arm-linux-gnueabihf-gcc ./configure --prefix=/tmp/cross`
609*1c60b9acSAndroid Build Coastguard Worker```
610*1c60b9acSAndroid Build Coastguard WorkerChecking for shared library support...
611*1c60b9acSAndroid Build Coastguard WorkerBuilding shared library libz.so.1.2.11 with arm-linux-gnueabihf-gcc.
612*1c60b9acSAndroid Build Coastguard WorkerChecking for size_t... Yes.
613*1c60b9acSAndroid Build Coastguard WorkerChecking for off64_t... Yes.
614*1c60b9acSAndroid Build Coastguard WorkerChecking for fseeko... Yes.
615*1c60b9acSAndroid Build Coastguard WorkerChecking for strerror... Yes.
616*1c60b9acSAndroid Build Coastguard WorkerChecking for unistd.h... Yes.
617*1c60b9acSAndroid Build Coastguard WorkerChecking for stdarg.h... Yes.
618*1c60b9acSAndroid Build Coastguard WorkerChecking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf().
619*1c60b9acSAndroid Build Coastguard WorkerChecking for vsnprintf() in stdio.h... Yes.
620*1c60b9acSAndroid Build Coastguard WorkerChecking for return value of vsnprintf()... Yes.
621*1c60b9acSAndroid Build Coastguard WorkerChecking for attribute(visibility) support... Yes.
622*1c60b9acSAndroid Build Coastguard Worker```
623*1c60b9acSAndroid Build Coastguard Worker
624*1c60b9acSAndroid Build Coastguard Worker4)  `make && make install`
625*1c60b9acSAndroid Build Coastguard Worker```
626*1c60b9acSAndroid Build Coastguard Workerarm-linux-gnueabihf-gcc -O3 -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -c -o example.o test/example.c
627*1c60b9acSAndroid Build Coastguard Worker...
628*1c60b9acSAndroid Build Coastguard Workerrm -f /tmp/cross/include/zlib.h /tmp/cross/include/zconf.h
629*1c60b9acSAndroid Build Coastguard Workercp zlib.h zconf.h /tmp/cross/include
630*1c60b9acSAndroid Build Coastguard Workerchmod 644 /tmp/cross/include/zlib.h /tmp/cross/include/zconf.h
631*1c60b9acSAndroid Build Coastguard Worker```
632*1c60b9acSAndroid Build Coastguard Worker
633*1c60b9acSAndroid Build Coastguard Worker5) `file /tmp/cross/lib/libz.so.1.2.11`  This is just to confirm we built an ARM lib as expected
634*1c60b9acSAndroid Build Coastguard Worker```
635*1c60b9acSAndroid Build Coastguard Worker/tmp/cross/lib/libz.so.1.2.11: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=6f8ffef84389b1417d2fd1da1bd0c90f748f300d, with debug_info, not stripped
636*1c60b9acSAndroid Build Coastguard Worker```
637*1c60b9acSAndroid Build Coastguard Worker
638*1c60b9acSAndroid Build Coastguard Worker## 3/4: Building mbedtls cross
639*1c60b9acSAndroid Build Coastguard Worker
640*1c60b9acSAndroid Build Coastguard Worker1) `cd /tmp`
641*1c60b9acSAndroid Build Coastguard Worker
642*1c60b9acSAndroid Build Coastguard Worker2) `git clone https://github.com/ARMmbed/mbedtls.git`
643*1c60b9acSAndroid Build Coastguard Worker
644*1c60b9acSAndroid Build Coastguard Worker3) `cd mbedtls ; mkdir build ; cd build`
645*1c60b9acSAndroid Build Coastguard Worker
646*1c60b9acSAndroid Build Coastguard Worker3) `cmake .. -DCMAKE_TOOLCHAIN_FILE=/tmp/mytoolchainfile -DCMAKE_INSTALL_PREFIX:PATH=/tmp/cross -DCMAKE_BUILD_TYPE=RELEASE -DUSE_SHARED_MBEDTLS_LIBRARY=1`  mbedtls also uses cmake, so you can simply reuse the toolchain file you used for libwebsockets.  That is why you shouldn't put project-specific options in the toolchain file, it should just describe the toolchain.
647*1c60b9acSAndroid Build Coastguard Worker
648*1c60b9acSAndroid Build Coastguard Worker4) `make && make install`
649*1c60b9acSAndroid Build Coastguard Worker
650*1c60b9acSAndroid Build Coastguard Worker5) `file /tmp/cross/lib/libmbedcrypto.so.2.6.0`
651*1c60b9acSAndroid Build Coastguard Worker```
652*1c60b9acSAndroid Build Coastguard Worker/tmp/cross/lib/libmbedcrypto.so.2.6.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=bcca195e78bd4fd2fb37f36ab7d72d477d609d87, with debug_info, not stripped
653*1c60b9acSAndroid Build Coastguard Worker```
654*1c60b9acSAndroid Build Coastguard Worker
655*1c60b9acSAndroid Build Coastguard Worker## 4/4: Building libwebsockets with everything
656*1c60b9acSAndroid Build Coastguard Worker
657*1c60b9acSAndroid Build Coastguard Worker1) `cd /tmp`
658*1c60b9acSAndroid Build Coastguard Worker
659*1c60b9acSAndroid Build Coastguard Worker2) `git clone ssh://[email protected]/warmcat/libwebsockets`
660*1c60b9acSAndroid Build Coastguard Worker
661*1c60b9acSAndroid Build Coastguard Worker3) `cd libwebsockets ; mkdir build ; cd build`
662*1c60b9acSAndroid Build Coastguard Worker
663*1c60b9acSAndroid Build Coastguard Worker4)  (this is all one line on the commandline)
664*1c60b9acSAndroid Build Coastguard Worker```
665*1c60b9acSAndroid Build Coastguard Workercmake .. -DCMAKE_TOOLCHAIN_FILE=/tmp/mytoolchainfile \
666*1c60b9acSAndroid Build Coastguard Worker-DCMAKE_INSTALL_PREFIX:PATH=/tmp/cross \
667*1c60b9acSAndroid Build Coastguard Worker-DLWS_WITH_LWSWS=1 \
668*1c60b9acSAndroid Build Coastguard Worker-DLWS_WITH_MBEDTLS=1 \
669*1c60b9acSAndroid Build Coastguard Worker-DLWS_MBEDTLS_LIBRARIES="/tmp/cross/lib/libmbedcrypto.so;/tmp/cross/lib/libmbedtls.so;/tmp/cross/lib/libmbedx509.so" \
670*1c60b9acSAndroid Build Coastguard Worker-DLWS_MBEDTLS_INCLUDE_DIRS=/tmp/cross/include \
671*1c60b9acSAndroid Build Coastguard Worker-DLWS_LIBUV_LIBRARIES=/tmp/cross/lib/libuv.so \
672*1c60b9acSAndroid Build Coastguard Worker-DLWS_LIBUV_INCLUDE_DIRS=/tmp/cross/include \
673*1c60b9acSAndroid Build Coastguard Worker-DLWS_ZLIB_LIBRARIES=/tmp/cross/lib/libz.so \
674*1c60b9acSAndroid Build Coastguard Worker-DLWS_ZLIB_INCLUDE_DIRS=/tmp/cross/include
675*1c60b9acSAndroid Build Coastguard Worker```
676*1c60b9acSAndroid Build Coastguard Worker
677*1c60b9acSAndroid Build Coastguard Worker3) `make && make install`
678*1c60b9acSAndroid Build Coastguard Worker
679*1c60b9acSAndroid Build Coastguard Worker4) `file /tmp/cross/lib/libwebsockets.so.11`
680*1c60b9acSAndroid Build Coastguard Worker```
681*1c60b9acSAndroid Build Coastguard Worker/tmp/cross/lib/libwebsockets.so.11: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=81e59c6534f8e9629a9fc9065c6e955ce96ca690, with debug_info, not stripped
682*1c60b9acSAndroid Build Coastguard Worker```
683*1c60b9acSAndroid Build Coastguard Worker
684*1c60b9acSAndroid Build Coastguard Worker5) `arm-linux-gnueabihf-objdump -p /tmp/cross/lib/libwebsockets.so.11 | grep NEEDED`  Confirm that the lws library was linked against everything we expect (libm / libc are provided by your toolchain)
685*1c60b9acSAndroid Build Coastguard Worker```
686*1c60b9acSAndroid Build Coastguard Worker  NEEDED               libz.so.1
687*1c60b9acSAndroid Build Coastguard Worker  NEEDED               libmbedcrypto.so.0
688*1c60b9acSAndroid Build Coastguard Worker  NEEDED               libmbedtls.so.10
689*1c60b9acSAndroid Build Coastguard Worker  NEEDED               libmbedx509.so.0
690*1c60b9acSAndroid Build Coastguard Worker  NEEDED               libuv.so.1
691*1c60b9acSAndroid Build Coastguard Worker  NEEDED               libm.so.6
692*1c60b9acSAndroid Build Coastguard Worker  NEEDED               libc.so.6
693*1c60b9acSAndroid Build Coastguard Worker```
694*1c60b9acSAndroid Build Coastguard Worker
695*1c60b9acSAndroid Build Coastguard WorkerYou will also find the lws test apps in `/tmp/cross/bin`... to run lws on the target you will need to copy the related things from /tmp/cross... all the .so from /tmp/cross/lib and anything from /tmp/cross/bin you want.
696*1c60b9acSAndroid Build Coastguard Worker
697*1c60b9acSAndroid Build Coastguard Worker@section mem Memory efficiency
698*1c60b9acSAndroid Build Coastguard Worker
699*1c60b9acSAndroid Build Coastguard WorkerEmbedded server-only configuration without extensions (ie, no compression
700*1c60b9acSAndroid Build Coastguard Workeron websocket connections), but with full v13 websocket features and http
701*1c60b9acSAndroid Build Coastguard Workerserver, built on ARM Cortex-A9:
702*1c60b9acSAndroid Build Coastguard Worker
703*1c60b9acSAndroid Build Coastguard WorkerUpdate at 8dac94d (2013-02-18)
704*1c60b9acSAndroid Build Coastguard Worker```
705*1c60b9acSAndroid Build Coastguard Worker    $ ./configure --without-client --without-extensions --disable-debug --without-daemonize
706*1c60b9acSAndroid Build Coastguard Worker
707*1c60b9acSAndroid Build Coastguard Worker    Context Creation, 1024 fd limit[2]:   16720 (includes 12 bytes per fd)
708*1c60b9acSAndroid Build Coastguard Worker    Per-connection [3]:                      72 bytes, +1328 during headers
709*1c60b9acSAndroid Build Coastguard Worker
710*1c60b9acSAndroid Build Coastguard Worker    .text	.rodata	.data	.bss
711*1c60b9acSAndroid Build Coastguard Worker    11512	2784	288	4
712*1c60b9acSAndroid Build Coastguard Worker```
713*1c60b9acSAndroid Build Coastguard WorkerThis shows the impact of the major configuration with/without options at
714*1c60b9acSAndroid Build Coastguard Worker13ba5bbc633ea962d46d using Ubuntu ARM on a PandaBoard ES.
715*1c60b9acSAndroid Build Coastguard Worker
716*1c60b9acSAndroid Build Coastguard WorkerThese are accounting for static allocations from the library elf, there are
717*1c60b9acSAndroid Build Coastguard Workeradditional dynamic allocations via malloc.  These are a bit old now but give
718*1c60b9acSAndroid Build Coastguard Workerthe right idea for relative "expense" of features.
719*1c60b9acSAndroid Build Coastguard Worker
720*1c60b9acSAndroid Build Coastguard WorkerStatic allocations, ARM9
721*1c60b9acSAndroid Build Coastguard Worker
722*1c60b9acSAndroid Build Coastguard Worker|                                | .text   | .rodata | .data | .bss |
723*1c60b9acSAndroid Build Coastguard Worker|--------------------------------|---------|---------|-------|------|
724*1c60b9acSAndroid Build Coastguard Worker| All (no without)               | 35024   | 9940    | 336   | 4104 |
725*1c60b9acSAndroid Build Coastguard Worker| without client                 | 25684   | 7144    | 336   | 4104 |
726*1c60b9acSAndroid Build Coastguard Worker| without client, exts           | 21652   | 6288    | 288   | 4104 |
727*1c60b9acSAndroid Build Coastguard Worker| without client, exts, debug[1] | 19756   | 3768    | 288   | 4104 |
728*1c60b9acSAndroid Build Coastguard Worker| without server                 | 30304   | 8160    | 336   | 4104 |
729*1c60b9acSAndroid Build Coastguard Worker| without server, exts           | 25382   | 7204    | 288   | 4104 |
730*1c60b9acSAndroid Build Coastguard Worker| without server, exts, debug[1] | 23712   | 4256    | 288   | 4104 |
731*1c60b9acSAndroid Build Coastguard Worker
732*1c60b9acSAndroid Build Coastguard Worker[1] `--disable-debug` only removes messages below `lwsl_notice`.  Since that is
733*1c60b9acSAndroid Build Coastguard Workerthe default logging level the impact is not noticeable, error, warn and notice
734*1c60b9acSAndroid Build Coastguard Workerlogs are all still there.
735*1c60b9acSAndroid Build Coastguard Worker
736*1c60b9acSAndroid Build Coastguard Worker[2] `1024` fd per process is the default limit (set by ulimit) in at least Fedora
737*1c60b9acSAndroid Build Coastguard Workerand Ubuntu.  You can make significant savings tailoring this to actual expected
738*1c60b9acSAndroid Build Coastguard Workerpeak fds, ie, at a limit of `20`, context creation allocation reduces to `4432 +
739*1c60b9acSAndroid Build Coastguard Worker240 = 4672`)
740*1c60b9acSAndroid Build Coastguard Worker
741*1c60b9acSAndroid Build Coastguard Worker[3] known header content is freed after connection establishment
742