Skip to main content

Dependencies

The TEN Framework relies on several external libraries and tools. Some are used for testing purposes, while others are integrated into the core runtime. This page documents these dependencies and any modifications needed for use with TEN.

Build system tools

The TEN framework uses the following build system tools to compile and package the codebase.

Google GN

Use one of the following installation options:

  • Download pre-built binaries from the Google GN webpage

    OSArchitectureInstance ID
    Linuxx64BzX0zkfwFeUn9MaDVqm6FugmTIy-hFpgNUx43O1fN00C
    Linuxarm64rT_12w1Iv6ug8CJ4j0VQekA0qTDq6CwoAqGWasIKFcEC
    Winx641QlqF0FPVt82ba5f48HxHpv5xPqOmyaThoR3TicuJ8QC
  • Build from source using the GN repository

    OSArchitectureCommit ID
    Macuniversal18602f6cf1168cf78302024043edc02e8bad2ffb

Google ninja

A small build system focused on speed.

Version: 1.12.1 Installation: Download from the Ninja release page

Core libraries

LibraryVersionLicensePurpose
yyjson0.10.0MITJSON parsing and generation
libuv1.50.0MITEvent loop implementation
msgpack-c6.1.0Boost 1.0Efficient binary serialization
libwebsockets4.3.2
with patch
MITNetwork communication
curl8.1.2
with patch
MIT-likeHTTP requests and API communication
clingo5.8.0
with patch
MIT.Logical constraint solving
FFmpeg6.0LGPL/GPLAudio and video processing
libbacktrace*1.0BSDDebug information and crash reporting
uthash*2.3.0BSD revisedEfficient in-memory data structures
uuid4*-MITUnique identifier generation
zf_log*-MITFramework-wide logging

*This library has been significantly modified to conform to the naming conventions and folder structure of the TEN Framework. Click the library name to view details.

Library customizations

libwebsockets patch


_10
--- /home/wei/MyData/Temp/libwebsockets-4.3.2/CMakeLists.txt
_10
+++ libwebsockets/CMakeLists.txt
_10
@@ -851,6 +851,7 @@
_10
add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
_10
# Fail the build if any warnings
_10
add_compile_options(/W3 /WX)
_10
+ add_compile_options(/Zc:preprocessor /wd4819)
_10
# Unbreak MSVC broken preprocessor __VA_ARGS__ behaviour
_10
if (MSVC_VERSION GREATER 1925)
_10
add_compile_options(/Zc:preprocessor /wd5105)

Apply the following patch.


_32
diff --git a/| `third_party/libwebsockets/`cmake/lws_config.h.in b/| `third_party/libwebsockets/`cmake/lws_config.h.in
_32
index f3f4a9d79..e8d36c3ae 100644
_32
--- a/| `third_party/libwebsockets/`cmake/lws_config.h.in
_32
+++ b/| `third_party/libwebsockets/`cmake/lws_config.h.in
_32
@@ -238,3 +238,9 @@
_32
#cmakedefine LWS_WITH_PLUGINS_API
_32
#cmakedefine LWS_HAVE_RTA_PREF
_32
_32
+// NOTE (Liu): The libwebsockets library will use external variables from mbedtls
_32
+// if 'LWS_WITH_MBEDTLS' is enabled. On Windows, variable declarations in the header
_32
+// file must start with '__declspec(dllimport)', otherwise, the
_32
+// symbols cannot be accessed.
_32
+// Refer to | `third_party/mbedtls/`include/mbedtls/export.h.
_32
+#define USING_SHARED_MBEDTLS
_32
diff --git a/| `third_party/libwebsockets/`lib/tls/mbedtls/wrapper/platform/ssl_pm.c b/| `third_party/libwebsockets/`lib/tls/mbedtls/wrapper/platform/ssl_pm.c
_32
index e8a0cb2d4..84a164e90 100755
_32
--- a/| `third_party/libwebsockets/`lib/tls/mbedtls/wrapper/platform/ssl_pm.c
_32
+++ b/| `third_party/libwebsockets/`lib/tls/mbedtls/wrapper/platform/ssl_pm.c
_32
@@ -183,7 +183,12 @@ int ssl_pm_new(SSL *ssl)
_32
mbedtls_ssl_conf_min_version(&ssl_pm->conf, MBEDTLS_SSL_MAJOR_VERSION_3, version);
_32
} else {
_32
mbedtls_ssl_conf_max_version(&ssl_pm->conf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);
_32
- mbedtls_ssl_conf_min_version(&ssl_pm->conf, MBEDTLS_SSL_MAJOR_VERSION_3, 1);
_32
+
_32
+ // NOTE: mbedtls added 'ssl_conf_version_check()' since v3.1.0, and
_32
+ // mbedtls only enables TLS 1.2 by default. So the 'min_tls_version' and
_32
+ // 'max_tls_version' must be '0x303', or 'mbedtls_ssl_setup' will
_32
+ // fail.
_32
+ mbedtls_ssl_conf_min_version(&ssl_pm->conf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);
_32
}
_32
_32
mbedtls_ssl_conf_rng(&ssl_pm->conf, mbedtls_ctr_drbg_random, &ssl_pm->ctr_drbg);


_17
diff --git a/| `third_party/libwebsockets/`CMakeLists.txt b/| `third_party/libwebsockets/`CMakeLists.txt
_17
index 92638143a..746f9b6a6 100644
_17
--- a/| `third_party/libwebsockets/`CMakeLists.txt
_17
+++ b/| `third_party/libwebsockets/`CMakeLists.txt
_17
@@ -547,9 +547,12 @@ SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
_17
_17
SET(LWS_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}")
_17
_17
-# Put absolute path of dynamic libraries into the object code. Some
_17
-# architectures, notably Mac OS X, need this.
_17
-SET(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}")
_17
+# Commented out to avoid using absolute paths in the install_name on macOS.
_17
+# When CMAKE_INSTALL_NAME_DIR is set to an absolute path, binaries that link
_17
+# against libwebsockets will hardcode this absolute path, making the library
_17
+# difficult to relocate and potentially causing "library not found" errors at
_17
+# runtime if the library is installed in a different location.
_17
+# SET(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}")

Fix for linking mbedtls on Windows

Apply the following patch if your CMake version is higher than 3.24, as find_package supports the GLOBAL keyword since 3.24.


_25
diff --git a/| `third_party/libwebsockets/`lib/tls/mbedtls/CMakeLists.txt b/| `third_party/libwebsockets/`lib/tls/mbedtls/CMakeLists.txt
_25
index e34151724..79b15089d 100644
_25
--- a/| `third_party/libwebsockets/`lib/tls/mbedtls/CMakeLists.txt
_25
+++ b/| `third_party/libwebsockets/`lib/tls/mbedtls/CMakeLists.txt
_25
- find_library(MBEDTLS_LIBRARY mbedtls)
_25
- find_library(MBEDX509_LIBRARY mbedx509)
_25
- find_library(MBEDCRYPTO_LIBRARY mbedcrypto)
_25
+ # find_library(MBEDTLS_LIBRARY mbedtls)
_25
+ # find_library(MBEDX509_LIBRARY mbedx509)
_25
+ # find_library(MBEDCRYPTO_LIBRARY mbedcrypto)
_25
+
_25
+ # set(LWS_MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}")
_25
+
_25
+ # Set the custom search path.
_25
+ set(MBEDTLS_DIR "${MBEDTLS_BUILD_PATH}/cmake")
_25
+
_25
+ // NOTE (Liu): We should use 'find_package' rather than 'find_library'
_25
+ // to search for the mbedtls libraries. 'find_library' only finds a
_25
+ // library, shared or static, without any settings from the external
_25
+ // library.
_25
_25
- set(LWS_MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}")
_25
+ // The 'lib/tls/CMakeLists.txt' depends on the mbedtls libraries, so we set the scope to 'GLOBAL' here.
_25
+ find_package(MbedTLS GLOBAL)
_25
+ set(LWS_MBEDTLS_LIBRARIES MbedTLS::mbedcrypto MbedTLS::mbedx509 MbedTLS::mbedtls)


_12
diff --git a/| `third_party/libwebsockets/`BUILD.gn b/| `third_party/libwebsockets/`BUILD.gn
_12
index 4c89c2e2e..e6d641b9c 100644
_12
--- a/| `third_party/libwebsockets/`BUILD.gn
_12
+++ b/| `third_party/libwebsockets/`BUILD.gn
_12
@@ -84,6 +84,10 @@ cmake_project("websockets") {
_12
}
_12
_12
options += [
_12
+ // The libwebsockets will use the 'MBEDTLS_BUILD_PATH' variable to set the
_12
+ // search path of 'find_package'.
_12
+ "MBEDTLS_BUILD_PATH=" + rebase_path("$root_gen_dir/cmake/mbedtls"),
_12
+

Also, remove #define USING_SHARED_MBEDTLS in https://github.com/TEN-framework/ten-framework/tree/main/| third_party/libwebsockets/README.md/cmake/lws_config.h.in.

curl patch

Patch lib/CMakeLists.txt, to change the shared library name from _imp.lib to .lib.


_10
if(WIN32)
_10
if(BUILD_SHARED_LIBS)
_10
if(MSVC)
_10
// Add "_imp" as a suffix before the extension to avoid conflicting with
_10
// the statically linked "libcurl.lib"
_10
//set_target_properties(${LIB_NAME} PROPERTIES IMPORT_SUFFIX "_imp.lib")
_10
set_target_properties(${LIB_NAME} PROPERTIES IMPORT_SUFFIX ".lib")
_10
endif()
_10
endif()
_10
endif()

Export Curl_ws_done in lib/ws.h. This function is called to prevent memory leaks.


_2
CURL_EXTERN void Curl_ws_done(struct Curl_easy *data);
_2
// ^^^^^^^^

Clingo CMake patch

ten_manager uses the clingo-sys crate to call Clingo. The clingo-sys crate includes its own Clingo source code (version 5.6.2), which has compilation errors in a CMake 4 environment. To address this, we use Cargo's patch feature to point to a local version of the Clingo source code that fixes the CMake 4 compilation errors.

Although clingo-sys includes the Clingo source code, we don't need the third_party/clingo folder for most platforms. However, on Windows, clingo-sys still compiles Clingo as a shared library. Therefore, we currently use the third_party/clingo folder to compile the shared library and use GN scripts to copy it to the final output folder of ten_manager.

In the future, we plan to copy the Windows shared library directly from the Clingo source code bundled in clingo-sys. This change would allow us to remove the third_party/clingo folder entirely.