Store PLCnext CommunityPLCnext on LinkedInPLCnext on Instagram  PLCnext on YouTube Github PLCnext CommunityStore PLCnext Community


 How to create a Blog Entry

Crosscompile Guide: Libwebsockets API

The Libwebsockets API ("LWS") covers a lot of interesting features for people making embedded servers or clients:

  • HTTP(S) serving and client operation
  • HTTP/2 support for serving
  • WS(S) serving and client operation
  • HTTP(S) apis for file transfer and upload
  • HTTP 1 + 2 POST form handling (including multipart / file upload)
  • cookie-based sessions
  • account management (including registration, email verification, lost pw etc)
  • strong SSL / TLS PFS support (A+ on SSLlabs test)
  • ssh server integration
  • serving gzipped files directly from inside zip files, without conversion
  • support for linux, bsd, windows etc... and very small non-linux targets like ESP32

    Here's how to crosscompile it - first the easy way, and then for advanced users:

Crosscompiling made easy

  1. git clone
  2. cd libwebsockets
  3. mkdir build
  4. cd build
  5. source /home/ow/SDK/FW1.1/environment-setup-cortexa9t2hf-neon-pxc-linux-gnueabi
  6. cmake $CFLAGS -DCMAKE_INSTALL_PREFIX:PATH=../../Install ..
  7. make # -> if this fails with CMake Error: cmake_symlink_library: System Error: Operation not supported make sure to use a drive that supports symlinks
  8. make install

Check results

  1. execute file libwebsocket.* to check if it is an Arm 32 / ELF Binary ->ELF 32-bit LSB shared object, ARM,
  2. arm-pxc-linux-gnueabi-objdump -p ~/CrossCompiling/Install/lib/ | grep NEEDED

CrossCompiling with all dependencies

There is a good guide at /libwebsockets/READMEs/

The following description simply has been adapted to the Phoenix Contact (PxC) toolchain and the AXC F 2152 controller. FW 1.1 already has libz that is used by libwebsockets. We could include MBEDTLS but won´t because of memory usage and speed. We still need to crosscompile LIBUV.

Compiling LIBUV


libuv is a multi-platform support library with a focus on asynchronous I/O. It was primarily developed for use by Node.js, but it's also used by Luvit, Julia, pyuv, and others.

  • MIT License

Feature highlights

  • Full-featured event loop backed by epoll, kqueue, IOCP, event ports

  • Asynchronous TCP and UDP sockets

  • Asynchronous DNS resolution

  • Asynchronous file and file system operations

  • File system events

  • ANSI escape code controlled TTY

  • IPC with socket sharing, using Unix domain sockets or named pipes (Windows)

  • Child processes

  • Thread pool

  • Signal handling

  • High resolution clock

  • Threading and synchronization primitives

1/3: Building libuv cross:

  1. git clone get libuv
  2. cd libuv
  3. source /home/ow/SDK/FW1.1/environment-setup-cortexa9t2hf-neon-pxc-linux-gnueabi
  4. ./

    + libtoolize --copy
    libtoolize: putting auxiliary files in '.'.
    libtoolize: copying file './'
    libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
    libtoolize: copying file 'm4/libtool.m4'
    libtoolize: copying file 'm4/ltoptions.m4'
    libtoolize: copying file 'm4/ltsugar.m4'
    libtoolize: copying file 'm4/ltversion.m4'
    libtoolize: copying file 'm4/lt~obsolete.m4'
    + aclocal -I m4
    + autoconf
    + automake --add-missing --copy installing './ar-lib' installing './compile' installing './config.guess' installing './config.sub' installing './install-sh' installing './missing' installing './depcomp'

    If it has problems, you will need to install automake, libtool etc.

  5. ./configure --host=arm-linux-gnueabihf --prefix=/home/ow/CrossCompiling/Install

  6. make && make install

  7. file /home/ow/CrossCompiling/Install/lib/libuv.* Check if it's really built for ARM

2/3: Building zlib cross

FW 1.1 already has libz that is used by libwebsocket. You can find it in the SDK /sysroots/cortexa9t2hf-neon-pxc-linux-gnueabi/lib and the headers at /sysroots/cortexa9t2hf-neon-pxc-linux-gnueabi/usr/include

Or compile it again with:

  1. git clone
  2. source /home/ow/SDK/FW1.1/environment-setup-cortexa9t2hf-neon-pxc-linux-gnueabi
  3. ./configure --prefix=~/CrossCompiling/Install
  4. file ~/CrossCompiling/Install/libz.*

3/3: Building libwebsockets with everything

Prepare the CMake toolchain file

For crosscompiling we need a CMake toolchain file. Here we use the file supplied by Bjoern Sauer, ready for download.

{jd_file onlinelayout==Simple File List}{jd_file file==57}

Here's an instruction how to make it yourself.

  1. cd /CrossCompiling

  2. git clone ssh://This email address is being protected from spambots. You need JavaScript enabled to view it./warmcat/libwebsockets

  3. cd libwebsockets ; mkdir build ; cd build

  4. cmake .. -DCMAKE_TOOLCHAIN_FILE=../../axcf2152.cmake \
    -DTOOLCHAIN_ROOT=/home/ow/SDK/FW1.1 \
    -DTOOLCHAIN_PREFIX=~/CrossCompiling/Install \
    -DCMAKE_BUILD_TYPE=Release \
    -DLWS_LIBUV_LIBRARIES=~/CrossCompiling/Install/lib/ \
    -DLWS_LIBUV_INCLUDE_DIRS=~/CrossCompiling/Install/include \
    -DLWS_ZLIB_LIBRARIES=~/CrossCompiling/Install/lib/ \

    (this all is one line on the commandline)

  5. make && make install

  6. file ~/CrossCompiling/Install/lib/libwebsockets.*

  7. rm-pxc-linux-gnueabi-objdump -p ~/CrossCompiling/Install/lib/ | grep NEEDED

    Confirm that the LWS library was linked against everything we expect (libm / libc are provided by your toolchain)

  • you will also find the LWS test apps in ~/CrossCompiling/Install/bin...
  • to run LWS on the target, copy the related things from ~/CrossCompiling/Install...
  • copy them to the '/usr/local/'' directory in the PLC

4/3: Building mbedtls cross (optional)

  1. cd /tmp

  2. git clone

  3. cd mbedtls ; mkdir build ; cd build

  4. cmake .. \
    -DCMAKE_TOOLCHAIN_FILE=../../axcf2152.cmake \
    -DTOOLCHAIN_ROOT=/home/ow/SDK/FW1.1 \
    -DTOOLCHAIN_PREFIX=~/CrossCompiling/Install \
    -DCMAKE_BUILD_TYPE=Release \
  5. make && make install

  6. file ../../Install/lib/libmbed*