changeset 6540:59888c43f6b4

upgraded boost to 1.89.0
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 09 Dec 2025 13:52:07 +0100
parents e94178d6b6a2
children 770d6037b79f
files NEWS OrthancFramework/Resources/CMake/BoostConfiguration.cmake OrthancFramework/Resources/CMake/BoostConfiguration.sh OrthancFramework/Resources/Patches/boost-1.85.0-emscripten.patch OrthancFramework/Resources/Patches/boost-1.86.0-emscripten.patch OrthancFramework/Resources/Patches/boost-1.89.0-emscripten.patch OrthancServer/UnitTestsSources/VersionsTests.cpp
diffstat 7 files changed, 180 insertions(+), 306 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Tue Dec 09 12:09:50 2025 +0100
+++ b/NEWS	Tue Dec 09 13:52:07 2025 +0100
@@ -1,6 +1,9 @@
 Pending changes in the mainline
 ===============================
 
+* Upgraded dependencies for static builds:
+  - boost 1.89.0
+
 
 Version 1.12.10 (2025-11-26)
 ============================
--- a/OrthancFramework/Resources/CMake/BoostConfiguration.cmake	Tue Dec 09 12:09:50 2025 +0100
+++ b/OrthancFramework/Resources/CMake/BoostConfiguration.cmake	Tue Dec 09 13:52:07 2025 +0100
@@ -96,10 +96,10 @@
   ## Parameters for static compilation of Boost 
   ##
   
-  set(BOOST_NAME boost_1_86_0)
-  set(BOOST_VERSION 1.86.0)
-  set(BOOST_BCP_SUFFIX bcpdigest-1.12.5)
-  set(BOOST_MD5 "20b9c325c0dde830889ee75a9e64ded8")
+  set(BOOST_NAME boost_1_89_0)
+  set(BOOST_VERSION 1.89.0)
+  set(BOOST_BCP_SUFFIX bcpdigest-1.12.11)
+  set(BOOST_MD5 "af98f0ba3507cb611e78f96fe8bd0a7c")
   set(BOOST_URL "https://orthanc.uclouvain.be/downloads/third-party-downloads/${BOOST_NAME}_${BOOST_BCP_SUFFIX}.tar.gz")
   set(BOOST_SOURCES_DIR ${CMAKE_BINARY_DIR}/${BOOST_NAME})
 
@@ -120,7 +120,7 @@
   if (FirstRun)
     execute_process(
       COMMAND ${PATCH_EXECUTABLE} -p0 -N -i
-      ${CMAKE_CURRENT_LIST_DIR}/../Patches/boost-1.86.0-emscripten.patch
+      ${CMAKE_CURRENT_LIST_DIR}/../Patches/boost-${BOOST_VERSION}-emscripten.patch
       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
       RESULT_VARIABLE Failure
       )
@@ -184,10 +184,6 @@
     -DBOOST_FILESYSTEM_HAS_POSIX_AT_APIS
     )
 
-  set(BOOST_SOURCES
-    ${BOOST_SOURCES_DIR}/libs/system/src/error_code.cpp
-    )
-
   if ("${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase" OR
       "${CMAKE_SYSTEM_NAME}" STREQUAL "Android")
     add_definitions(
@@ -319,34 +315,33 @@
     message("boost::locale is disabled")
   else()
     set(BOOST_ICU_SOURCES
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/icu/boundary.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/icu/codecvt.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/icu/collator.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/icu/conversion.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/icu/date_time.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/icu/formatter.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/icu/formatters_cache.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/icu/icu_backend.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/icu/numeric.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/icu/time_zone.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/icu/boundary.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/icu/codecvt.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/icu/collator.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/icu/conversion.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/icu/date_time.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/icu/formatter.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/icu/formatters_cache.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/icu/icu_backend.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/icu/numeric.cpp
       )
 
     list(APPEND BOOST_SOURCES
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/encoding/codepage.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/shared/date_time.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/shared/formatting.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/shared/generator.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/shared/iconv_codecvt.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/shared/ids.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/shared/localization_backend.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/shared/message.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/shared/mo_lambda.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/util/codecvt_converter.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/util/default_locale.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/util/encoding.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/util/gregorian.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/util/info.cpp
-      ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/util/locale_data.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/encoding/codepage.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/shared/date_time.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/shared/formatting.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/shared/generator.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/shared/iconv_codecvt.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/shared/ids.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/shared/localization_backend.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/shared/message.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/shared/mo_lambda.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/util/codecvt_converter.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/util/default_locale.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/util/encoding.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/util/gregorian.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/util/info.cpp
+      ${BOOST_SOURCES_DIR}/libs/locale/src/util/locale_data.cpp
       )        
 
     if (CMAKE_SYSTEM_NAME STREQUAL "OpenBSD" OR
@@ -357,11 +352,11 @@
         )
       
       list(APPEND BOOST_SOURCES
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/std/codecvt.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/std/collate.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/std/converter.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/std/numeric.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/std/std_backend.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/std/codecvt.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/std/collate.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/std/converter.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/std/numeric.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/std/std_backend.cpp
         )
 
       if (BOOST_LOCALE_BACKEND STREQUAL "gcc" OR
@@ -388,11 +383,11 @@
         )
       
       list(APPEND BOOST_SOURCES
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/posix/codecvt.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/posix/collate.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/posix/converter.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/posix/numeric.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/posix/posix_backend.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/posix/codecvt.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/posix/collate.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/posix/converter.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/posix/numeric.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/posix/posix_backend.cpp
         )
 
       if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten" OR
@@ -415,11 +410,11 @@
         )
 
       list(APPEND BOOST_SOURCES
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/win32/collate.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/win32/converter.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/win32/lcid.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/win32/numeric.cpp
-        ${BOOST_SOURCES_DIR}/libs/locale/src/boost/locale/win32/win_backend.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/win32/collate.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/win32/converter.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/win32/lcid.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/win32/numeric.cpp
+        ${BOOST_SOURCES_DIR}/libs/locale/src/win32/win_backend.cpp
         )
 
       # Starting with release 0.8.2, Orthanc statically links against
--- a/OrthancFramework/Resources/CMake/BoostConfiguration.sh	Tue Dec 09 12:09:50 2025 +0100
+++ b/OrthancFramework/Resources/CMake/BoostConfiguration.sh	Tue Dec 09 13:52:07 2025 +0100
@@ -26,11 +26,12 @@
 ##   - Orthanc 1.12.1: Boost 1.82.0
 ##   - Orthanc 1.12.2: Boost 1.83.0
 ##   - Orthanc 1.12.3: Boost 1.84.0
-##   - Orthanc > 1.12.3: Boost 1.85.0
-##   - Orthanc 1.12.5: Boost 1.86.0
+##   - Orthanc between 1.12.3 and 1.12.4: Boost 1.85.0
+##   - Orthanc between 1.12.5 and 1.12.10: Boost 1.86.0
+##   - Orthanc > 1.12.10: Boost 1.89.0
 
-BOOST_VERSION=1_86_0
-ORTHANC_VERSION=1.12.5
+BOOST_VERSION=1_89_0
+ORTHANC_VERSION=1.12.11
 
 rm -rf /tmp/boost_${BOOST_VERSION}
 rm -rf /tmp/bcp/boost_${BOOST_VERSION}
--- a/OrthancFramework/Resources/Patches/boost-1.85.0-emscripten.patch	Tue Dec 09 12:09:50 2025 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,125 +0,0 @@
-diff -urEb boost_1_85_0.orig/libs/locale/src/boost/locale/shared/date_time.cpp boost_1_85_0/libs/locale/src/boost/locale/shared/date_time.cpp
---- boost_1_85_0.orig/libs/locale/src/boost/locale/shared/date_time.cpp	2024-05-16 20:54:25.516816710 +0200
-+++ boost_1_85_0/libs/locale/src/boost/locale/shared/date_time.cpp	2024-05-16 20:55:09.144319528 +0200
-@@ -12,8 +12,10 @@
- #include <boost/locale/date_time.hpp>
- #include <boost/locale/formatting.hpp>
- #include <boost/core/exchange.hpp>
--#include <boost/thread/locks.hpp>
--#include <boost/thread/mutex.hpp>
-+#if !defined(__EMSCRIPTEN__)
-+#  include <boost/thread/locks.hpp>
-+#  include <boost/thread/mutex.hpp>
-+#endif
- #include <cmath>
- 
- namespace boost { namespace locale {
-@@ -400,6 +402,7 @@
-         return impl_->get_option(abstract_calendar::is_dst) != 0;
-     }
- 
-+#if !defined(__EMSCRIPTEN__)
-     namespace time_zone {
-         boost::mutex& tz_mutex()
-         {
-@@ -422,6 +425,7 @@
-             return boost::exchange(tz_id(), new_id);
-         }
-     } // namespace time_zone
-+#endif
- 
- }} // namespace boost::locale
- 
-diff -urEb boost_1_85_0.orig/libs/locale/src/boost/locale/shared/generator.cpp boost_1_85_0/libs/locale/src/boost/locale/shared/generator.cpp
---- boost_1_85_0.orig/libs/locale/src/boost/locale/shared/generator.cpp	2024-05-16 20:54:25.516816710 +0200
-+++ boost_1_85_0/libs/locale/src/boost/locale/shared/generator.cpp	2024-05-16 20:56:20.231509636 +0200
-@@ -7,8 +7,10 @@
- #include <boost/locale/encoding.hpp>
- #include <boost/locale/generator.hpp>
- #include <boost/locale/localization_backend.hpp>
--#include <boost/thread/locks.hpp>
--#include <boost/thread/mutex.hpp>
-+#if !defined(__EMSCRIPTEN__)
-+#  include <boost/thread/locks.hpp>
-+#  include <boost/thread/mutex.hpp>
-+#endif
- #include <algorithm>
- #include <map>
- #include <vector>
-@@ -21,7 +23,9 @@
-         {}
- 
-         mutable std::map<std::string, std::locale> cached;
-+#if !defined(__EMSCRIPTEN__)
-         mutable boost::mutex cached_lock;
-+#endif
- 
-         category_t cats;
-         char_facet_t chars;
-@@ -101,7 +105,9 @@
-     std::locale generator::generate(const std::locale& base, const std::string& id) const
-     {
-         if(d->caching_enabled) {
-+#if !defined(__EMSCRIPTEN__)
-             boost::unique_lock<boost::mutex> guard(d->cached_lock);
-+#endif
-             const auto p = d->cached.find(id);
-             if(p != d->cached.end())
-                 return p->second;
-@@ -126,7 +132,9 @@
-                 result = backend->install(result, facet, char_facet_t::nochar);
-         }
-         if(d->caching_enabled) {
-+#if !defined(__EMSCRIPTEN__)
-             boost::unique_lock<boost::mutex> guard(d->cached_lock);
-+#endif
-             const auto p = d->cached.find(id);
-             if(p == d->cached.end())
-                 d->cached[id] = result;
-diff -urEb boost_1_85_0.orig/libs/locale/src/boost/locale/shared/localization_backend.cpp boost_1_85_0/libs/locale/src/boost/locale/shared/localization_backend.cpp
---- boost_1_85_0.orig/libs/locale/src/boost/locale/shared/localization_backend.cpp	2024-05-16 20:54:25.516816710 +0200
-+++ boost_1_85_0/libs/locale/src/boost/locale/shared/localization_backend.cpp	2024-05-16 20:56:58.823070064 +0200
-@@ -5,8 +5,10 @@
- // https://www.boost.org/LICENSE_1_0.txt
- 
- #include <boost/locale/localization_backend.hpp>
--#include <boost/thread/locks.hpp>
--#include <boost/thread/mutex.hpp>
-+#if !defined(__EMSCRIPTEN__)
-+#  include <boost/thread/locks.hpp>
-+#  include <boost/thread/mutex.hpp>
-+#endif
- #include <functional>
- #include <memory>
- #include <vector>
-@@ -211,11 +213,13 @@
-             return mgr;
-         }
- 
-+#if !defined(__EMSCRIPTEN__)
-         boost::mutex& localization_backend_manager_mutex()
-         {
-             static boost::mutex the_mutex;
-             return the_mutex;
-         }
-+#endif
-         localization_backend_manager& localization_backend_manager_global()
-         {
-             static localization_backend_manager the_manager = make_default_backend_mgr();
-@@ -225,12 +229,16 @@
- 
-     localization_backend_manager localization_backend_manager::global()
-     {
-+#if !defined(__EMSCRIPTEN__)
-         boost::unique_lock<boost::mutex> lock(localization_backend_manager_mutex());
-+#endif
-         return localization_backend_manager_global();
-     }
-     localization_backend_manager localization_backend_manager::global(const localization_backend_manager& in)
-     {
-+#if !defined(__EMSCRIPTEN__)
-         boost::unique_lock<boost::mutex> lock(localization_backend_manager_mutex());
-+#endif
-         return exchange(localization_backend_manager_global(), in);
-     }
- 
--- a/OrthancFramework/Resources/Patches/boost-1.86.0-emscripten.patch	Tue Dec 09 12:09:50 2025 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-diff -urEb boost_1_86_0.orig/libs/locale/src/boost/locale/shared/date_time.cpp boost_1_86_0/libs/locale/src/boost/locale/shared/date_time.cpp
---- boost_1_86_0.orig/libs/locale/src/boost/locale/shared/date_time.cpp	2024-09-25 15:46:01.000000000 +0200
-+++ boost_1_86_0/libs/locale/src/boost/locale/shared/date_time.cpp	2024-09-25 15:58:51.306131987 +0200
-@@ -12,8 +12,10 @@
- #include <boost/locale/date_time.hpp>
- #include <boost/locale/formatting.hpp>
- #include <boost/core/exchange.hpp>
--#include <boost/thread/locks.hpp>
--#include <boost/thread/mutex.hpp>
-+#if !defined(__EMSCRIPTEN__)
-+#  include <boost/thread/locks.hpp>
-+#  include <boost/thread/mutex.hpp>
-+#endif
- #include <cmath>
- 
- namespace boost { namespace locale {
-@@ -400,6 +402,7 @@
-         return impl_->get_option(abstract_calendar::is_dst) != 0;
-     }
- 
-+#if !defined(__EMSCRIPTEN__)
-     namespace time_zone {
-         boost::mutex& tz_mutex()
-         {
-@@ -422,7 +425,7 @@
-             return boost::exchange(tz_id(), new_id);
-         }
-     } // namespace time_zone
--
-+#endif
- }} // namespace boost::locale
- 
- // boostinspect:nominmax
-diff -urEb boost_1_86_0.orig/libs/locale/src/boost/locale/shared/generator.cpp boost_1_86_0/libs/locale/src/boost/locale/shared/generator.cpp
---- boost_1_86_0.orig/libs/locale/src/boost/locale/shared/generator.cpp	2024-09-25 15:46:01.000000000 +0200
-+++ boost_1_86_0/libs/locale/src/boost/locale/shared/generator.cpp	2024-09-25 16:00:07.756233916 +0200
-@@ -7,8 +7,10 @@
- #include <boost/locale/encoding.hpp>
- #include <boost/locale/generator.hpp>
- #include <boost/locale/localization_backend.hpp>
--#include <boost/thread/locks.hpp>
--#include <boost/thread/mutex.hpp>
-+#if !defined(__EMSCRIPTEN__)
-+#  include <boost/thread/locks.hpp>
-+#  include <boost/thread/mutex.hpp>
-+#endif
- #include <algorithm>
- #include <map>
- #include <vector>
-@@ -21,8 +23,9 @@
-         {}
- 
-         mutable std::map<std::string, std::locale> cached;
-+#if !defined(__EMSCRIPTEN__)
-         mutable boost::mutex cached_lock;
--
-+#endif
-         category_t cats;
-         char_facet_t chars;
- 
-@@ -101,7 +104,9 @@
-     std::locale generator::generate(const std::locale& base, const std::string& id) const
-     {
-         if(d->caching_enabled) {
-+#if !defined(__EMSCRIPTEN__)
-             boost::unique_lock<boost::mutex> guard(d->cached_lock);
-+#endif
-             const auto p = d->cached.find(id);
-             if(p != d->cached.end())
-                 return p->second;
-@@ -126,7 +131,9 @@
-                 result = backend->install(result, facet, char_facet_t::nochar);
-         }
-         if(d->caching_enabled) {
-+#if !defined(__EMSCRIPTEN__)
-             boost::unique_lock<boost::mutex> guard(d->cached_lock);
-+#endif
-             const auto p = d->cached.find(id);
-             if(p == d->cached.end())
-                 d->cached[id] = result;
-diff -urEb boost_1_86_0.orig/libs/locale/src/boost/locale/shared/localization_backend.cpp boost_1_86_0/libs/locale/src/boost/locale/shared/localization_backend.cpp
---- boost_1_86_0.orig/libs/locale/src/boost/locale/shared/localization_backend.cpp	2024-09-25 15:46:01.000000000 +0200
-+++ boost_1_86_0/libs/locale/src/boost/locale/shared/localization_backend.cpp	2024-09-25 16:01:09.196820495 +0200
-@@ -5,8 +5,10 @@
- // https://www.boost.org/LICENSE_1_0.txt
- 
- #include <boost/locale/localization_backend.hpp>
--#include <boost/thread/locks.hpp>
--#include <boost/thread/mutex.hpp>
-+#if !defined(__EMSCRIPTEN__)
-+#  include <boost/thread/locks.hpp>
-+#  include <boost/thread/mutex.hpp>
-+#endif
- #include <functional>
- #include <memory>
- #include <vector>
-@@ -211,11 +213,13 @@
-             return mgr;
-         }
- 
-+#if !defined(__EMSCRIPTEN__)
-         boost::mutex& localization_backend_manager_mutex()
-         {
-             static boost::mutex the_mutex;
-             return the_mutex;
-         }
-+#endif
-         localization_backend_manager& localization_backend_manager_global()
-         {
-             static localization_backend_manager the_manager = make_default_backend_mgr();
-@@ -225,12 +229,16 @@
- 
-     localization_backend_manager localization_backend_manager::global()
-     {
-+#if !defined(__EMSCRIPTEN__)
-         boost::unique_lock<boost::mutex> lock(localization_backend_manager_mutex());
-+#endif
-         return localization_backend_manager_global();
-     }
-     localization_backend_manager localization_backend_manager::global(const localization_backend_manager& in)
-     {
-+#if !defined(__EMSCRIPTEN__)
-         boost::unique_lock<boost::mutex> lock(localization_backend_manager_mutex());
-+#endif
-         return exchange(localization_backend_manager_global(), in);
-     }
- 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancFramework/Resources/Patches/boost-1.89.0-emscripten.patch	Tue Dec 09 13:52:07 2025 +0100
@@ -0,0 +1,127 @@
+diff -urEb boost_1_89_0.orig/libs/locale/src/shared/date_time.cpp boost_1_89_0/libs/locale/src/shared/date_time.cpp
+--- boost_1_89_0.orig/libs/locale/src/shared/date_time.cpp	2025-12-09 13:38:27.491462741 +0100
++++ boost_1_89_0/libs/locale/src/shared/date_time.cpp	2025-12-09 13:40:05.120712154 +0100
+@@ -12,8 +12,10 @@
+ #include <boost/locale/date_time.hpp>
+ #include <boost/locale/formatting.hpp>
+ #include <boost/core/exchange.hpp>
+-#include <boost/thread/locks.hpp>
+-#include <boost/thread/mutex.hpp>
++#if !defined(__EMSCRIPTEN__)
++#  include <boost/thread/locks.hpp>
++#  include <boost/thread/mutex.hpp>
++#endif
+ #include <cmath>
+ 
+ namespace boost { namespace locale {
+@@ -400,6 +402,7 @@
+         return impl_->get_option(abstract_calendar::is_dst) != 0;
+     }
+ 
++#if !defined(__EMSCRIPTEN__)
+     namespace time_zone {
+         boost::mutex& tz_mutex()
+         {
+@@ -422,7 +425,7 @@
+             return boost::exchange(tz_id(), new_id);
+         }
+     } // namespace time_zone
+-
++#endif
+ }} // namespace boost::locale
+ 
+ // boostinspect:nominmax
+diff -urEb boost_1_89_0.orig/libs/locale/src/shared/generator.cpp boost_1_89_0/libs/locale/src/shared/generator.cpp
+--- boost_1_89_0.orig/libs/locale/src/shared/generator.cpp	2025-12-09 13:38:27.491462741 +0100
++++ boost_1_89_0/libs/locale/src/shared/generator.cpp	2025-12-09 13:40:59.835293085 +0100
+@@ -8,8 +8,10 @@
+ #include <boost/locale/encoding.hpp>
+ #include <boost/locale/generator.hpp>
+ #include <boost/locale/localization_backend.hpp>
+-#include <boost/thread/locks.hpp>
+-#include <boost/thread/mutex.hpp>
++#if !defined(__EMSCRIPTEN__)
++#  include <boost/thread/locks.hpp>
++#  include <boost/thread/mutex.hpp>
++#endif
+ #include <algorithm>
+ #include <map>
+ #include <vector>
+@@ -22,8 +24,9 @@
+         {}
+ 
+         mutable std::map<std::string, std::locale> cached;
++#if !defined(__EMSCRIPTEN__)
+         mutable boost::mutex cached_lock;
+-
++#endif
+         category_t cats;
+         char_facet_t chars;
+ 
+@@ -100,7 +103,9 @@
+     std::locale generator::generate(const std::locale& base, const std::string& id) const
+     {
+         if(d->caching_enabled) {
++#if !defined(__EMSCRIPTEN__)
+             boost::unique_lock<boost::mutex> guard(d->cached_lock);
++#endif
+             const auto p = d->cached.find(id);
+             if(p != d->cached.end())
+                 return p->second;
+@@ -125,7 +130,9 @@
+                 result = backend->install(result, facet, char_facet_t::nochar);
+         }
+         if(d->caching_enabled) {
++#if !defined(__EMSCRIPTEN__)
+             boost::unique_lock<boost::mutex> guard(d->cached_lock);
++#endif
+             const auto p = d->cached.find(id);
+             if(p == d->cached.end())
+                 d->cached[id] = result;
+diff -urEb boost_1_89_0.orig/libs/locale/src/shared/localization_backend.cpp boost_1_89_0/libs/locale/src/shared/localization_backend.cpp
+--- boost_1_89_0.orig/libs/locale/src/shared/localization_backend.cpp	2025-12-09 13:38:27.491462741 +0100
++++ boost_1_89_0/libs/locale/src/shared/localization_backend.cpp	2025-12-09 13:41:35.543020135 +0100
+@@ -5,8 +5,10 @@
+ // https://www.boost.org/LICENSE_1_0.txt
+ 
+ #include <boost/locale/localization_backend.hpp>
+-#include <boost/thread/locks.hpp>
+-#include <boost/thread/mutex.hpp>
++#if !defined(__EMSCRIPTEN__)
++#  include <boost/thread/locks.hpp>
++#  include <boost/thread/mutex.hpp>
++#endif
+ #include <functional>
+ #include <memory>
+ #include <vector>
+@@ -211,11 +213,13 @@
+             return mgr;
+         }
+ 
++#if !defined(__EMSCRIPTEN__)
+         boost::mutex& localization_backend_manager_mutex()
+         {
+             static boost::mutex the_mutex;
+             return the_mutex;
+         }
++#endif
+         localization_backend_manager& localization_backend_manager_global()
+         {
+             static localization_backend_manager the_manager = make_default_backend_mgr();
+@@ -225,12 +229,16 @@
+ 
+     localization_backend_manager localization_backend_manager::global()
+     {
++#if !defined(__EMSCRIPTEN__)
+         boost::unique_lock<boost::mutex> lock(localization_backend_manager_mutex());
++#endif
+         return localization_backend_manager_global();
+     }
+     localization_backend_manager localization_backend_manager::global(const localization_backend_manager& in)
+     {
++#if !defined(__EMSCRIPTEN__)
+         boost::unique_lock<boost::mutex> lock(localization_backend_manager_mutex());
++#endif
+         return exchange(localization_backend_manager_global(), in);
+     }
+ 
--- a/OrthancServer/UnitTestsSources/VersionsTests.cpp	Tue Dec 09 12:09:50 2025 +0100
+++ b/OrthancServer/UnitTestsSources/VersionsTests.cpp	Tue Dec 09 13:52:07 2025 +0100
@@ -113,7 +113,7 @@
 
 TEST(Versions, BoostStatic)
 {
-  ASSERT_TRUE(std::string(BOOST_LIB_VERSION) == "1_86" ||
+  ASSERT_TRUE(std::string(BOOST_LIB_VERSION) == "1_89" ||
               std::string(BOOST_LIB_VERSION) == "1_69" /* if USE_LEGACY_BOOST */);
 }