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.
The TEN framework uses the following build system tools to compile and package the codebase.
Use one of the following installation options:
A small build system focused on speed.
Version: 1.12.1
Installation: Download from the Ninja release page
*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.
_10--- /home/wei/MyData/Temp/libwebsockets-4.3.2/CMakeLists.txt
_10+++ libwebsockets/CMakeLists.txt
_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.
_32diff --git a/| `third_party/libwebsockets/`cmake/lws_config.h.in b/| `third_party/libwebsockets/`cmake/lws_config.h.in
_32index f3f4a9d79..e8d36c3ae 100644
_32--- a/| `third_party/libwebsockets/`cmake/lws_config.h.in
_32+++ b/| `third_party/libwebsockets/`cmake/lws_config.h.in
_32 #cmakedefine LWS_WITH_PLUGINS_API
_32 #cmakedefine LWS_HAVE_RTA_PREF
_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
_32diff --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
_32index 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 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+ // 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+ mbedtls_ssl_conf_min_version(&ssl_pm->conf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);
_32 mbedtls_ssl_conf_rng(&ssl_pm->conf, mbedtls_ctr_drbg_random, &ssl_pm->ctr_drbg);
_17diff --git a/| `third_party/libwebsockets/`CMakeLists.txt b/| `third_party/libwebsockets/`CMakeLists.txt
_17index 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 SET(LWS_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}")
_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}")
Apply the following patch if your CMake version is higher than 3.24, as find_package
supports the GLOBAL
keyword since 3.24.
_25diff --git a/| `third_party/libwebsockets/`lib/tls/mbedtls/CMakeLists.txt b/| `third_party/libwebsockets/`lib/tls/mbedtls/CMakeLists.txt
_25index 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+ # set(LWS_MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}")
_25+ # Set the custom search path.
_25+ set(MBEDTLS_DIR "${MBEDTLS_BUILD_PATH}/cmake")
_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- 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)
_12diff --git a/| `third_party/libwebsockets/`BUILD.gn b/| `third_party/libwebsockets/`BUILD.gn
_12index 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+ // 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"),
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
.
Patch lib/CMakeLists.txt
, to change the shared library name from _imp.lib
to .lib
.
_10 if(BUILD_SHARED_LIBS)
_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")
Export Curl_ws_done
in lib/ws.h
. This function is called to prevent memory leaks.
_2CURL_EXTERN void Curl_ws_done(struct Curl_easy *data);
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.