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