Commit 76f521fc for tesseract

commit 76f521fcf711c3054307ff5613a05d2398af2e1c
Author: Stefan Weil <sw@weilnetz.de>
Date:   Fri Aug 14 20:14:53 2026 +0200

    Build unit tests without training tools (#4596)

    The unit tests link the training libraries common_training and
    unicharset_training, but add_subdirectory(src/training) was only
    enabled for BUILD_TRAINING_TOOLS. A build with BUILD_TRAINING_TOOLS
    disabled and BUILD_TESTS enabled therefore failed with missing
    libraries.

    Now the training libraries are also built when BUILD_TESTS is
    enabled, while the training executables and the pango dependency are
    still only built for BUILD_TRAINING_TOOLS.

    Assisted-by: OpenCode / big-pickle (opencode)
    Signed-off-by: Stefan Weil <sw@weilnetz.de>

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 17cf7f64..45d431aa 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -882,7 +882,8 @@ if(BUILD_TESTS
   add_subdirectory(unittest)
 endif()

-if(BUILD_TRAINING_TOOLS)
+if(BUILD_TRAINING_TOOLS OR BUILD_TESTS)
+  # The training libraries are also required by the unit tests.
   add_subdirectory(src/training)
 endif()

diff --git a/src/training/CMakeLists.txt b/src/training/CMakeLists.txt
index 354df753..c5aa8d3a 100644
--- a/src/training/CMakeLists.txt
+++ b/src/training/CMakeLists.txt
@@ -130,7 +130,7 @@ project_group(common_training "Training Tools")
 # EXECUTABLE ambiguous_words
 # ##############################################################################

-if(NOT DISABLED_LEGACY_ENGINE)
+if(BUILD_TRAINING_TOOLS AND NOT DISABLED_LEGACY_ENGINE)
   add_executable(ambiguous_words ambiguous_words.cpp)
   target_link_libraries(ambiguous_words common_training)
   project_group(ambiguous_words "Training Tools")
@@ -148,7 +148,7 @@ endif()
 # EXECUTABLE classifier_tester
 # ##############################################################################

-if(NOT DISABLED_LEGACY_ENGINE)
+if(BUILD_TRAINING_TOOLS AND NOT DISABLED_LEGACY_ENGINE)
   add_executable(classifier_tester classifier_tester.cpp)
   target_link_libraries(classifier_tester common_training)
   project_group(classifier_tester "Training Tools")
@@ -166,23 +166,25 @@ endif()
 # EXECUTABLE combine_tessdata
 # ##############################################################################

-add_executable(combine_tessdata combine_tessdata.cpp)
-target_link_libraries(combine_tessdata common_training)
-project_group(combine_tessdata "Training Tools")
-install(
-  TARGETS combine_tessdata
-  RUNTIME DESTINATION bin
-  LIBRARY DESTINATION lib
-  ARCHIVE DESTINATION lib)
-if (MSVC)
-  install(FILES $<TARGET_PDB_FILE:combine_tessdata> DESTINATION bin OPTIONAL)
+if(BUILD_TRAINING_TOOLS)
+  add_executable(combine_tessdata combine_tessdata.cpp)
+  target_link_libraries(combine_tessdata common_training)
+  project_group(combine_tessdata "Training Tools")
+  install(
+    TARGETS combine_tessdata
+    RUNTIME DESTINATION bin
+    LIBRARY DESTINATION lib
+    ARCHIVE DESTINATION lib)
+  if (MSVC)
+    install(FILES $<TARGET_PDB_FILE:combine_tessdata> DESTINATION bin OPTIONAL)
+  endif()
 endif()

 # ##############################################################################
 # EXECUTABLE cntraining
 # ##############################################################################

-if(NOT DISABLED_LEGACY_ENGINE)
+if(BUILD_TRAINING_TOOLS AND NOT DISABLED_LEGACY_ENGINE)
   add_executable(cntraining cntraining.cpp)
   target_link_libraries(cntraining common_training)
   project_group(cntraining "Training Tools")
@@ -200,23 +202,25 @@ endif()
 # EXECUTABLE dawg2wordlist
 # ##############################################################################

-add_executable(dawg2wordlist dawg2wordlist.cpp)
-target_link_libraries(dawg2wordlist common_training)
-project_group(dawg2wordlist "Training Tools")
-install(
-  TARGETS dawg2wordlist
-  RUNTIME DESTINATION bin
-  LIBRARY DESTINATION lib
-  ARCHIVE DESTINATION lib)
-if (MSVC)
-  install(FILES $<TARGET_PDB_FILE:dawg2wordlist> DESTINATION bin OPTIONAL)
+if(BUILD_TRAINING_TOOLS)
+  add_executable(dawg2wordlist dawg2wordlist.cpp)
+  target_link_libraries(dawg2wordlist common_training)
+  project_group(dawg2wordlist "Training Tools")
+  install(
+    TARGETS dawg2wordlist
+    RUNTIME DESTINATION bin
+    LIBRARY DESTINATION lib
+    ARCHIVE DESTINATION lib)
+  if (MSVC)
+    install(FILES $<TARGET_PDB_FILE:dawg2wordlist> DESTINATION bin OPTIONAL)
+  endif()
 endif()

 # ##############################################################################
 # EXECUTABLE mftraining
 # ##############################################################################

-if(NOT DISABLED_LEGACY_ENGINE)
+if(BUILD_TRAINING_TOOLS AND NOT DISABLED_LEGACY_ENGINE)
   add_executable(mftraining mftraining.cpp mergenf.cpp mergenf.h)
   target_link_libraries(mftraining common_training)
   project_group(mftraining "Training Tools")
@@ -234,7 +238,7 @@ endif()
 # EXECUTABLE shapeclustering
 # ##############################################################################

-if(NOT DISABLED_LEGACY_ENGINE)
+if(BUILD_TRAINING_TOOLS AND NOT DISABLED_LEGACY_ENGINE)
   add_executable(shapeclustering shapeclustering.cpp)
   target_link_libraries(shapeclustering common_training)
   project_group(shapeclustering "Training Tools")
@@ -252,16 +256,18 @@ endif()
 # EXECUTABLE wordlist2dawg
 # ##############################################################################

-add_executable(wordlist2dawg wordlist2dawg.cpp)
-target_link_libraries(wordlist2dawg common_training)
-project_group(wordlist2dawg "Training Tools")
-install(
-  TARGETS wordlist2dawg
-  RUNTIME DESTINATION bin
-  LIBRARY DESTINATION lib
-  ARCHIVE DESTINATION lib)
-if (MSVC)
-  install(FILES $<TARGET_PDB_FILE:wordlist2dawg> DESTINATION bin OPTIONAL)
+if(BUILD_TRAINING_TOOLS)
+  add_executable(wordlist2dawg wordlist2dawg.cpp)
+  target_link_libraries(wordlist2dawg common_training)
+  project_group(wordlist2dawg "Training Tools")
+  install(
+    TARGETS wordlist2dawg
+    RUNTIME DESTINATION bin
+    LIBRARY DESTINATION lib
+    ARCHIVE DESTINATION lib)
+  if (MSVC)
+    install(FILES $<TARGET_PDB_FILE:wordlist2dawg> DESTINATION bin OPTIONAL)
+  endif()
 endif()

 if(ICU_FOUND)
@@ -297,102 +303,114 @@ if(ICU_FOUND)
   # EXECUTABLE combine_lang_model
   # ############################################################################

-  add_executable(combine_lang_model combine_lang_model.cpp)
-  target_link_libraries(combine_lang_model unicharset_training)
-  project_group(combine_lang_model "Training Tools")
-  install(
-    TARGETS combine_lang_model
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib)
-  if (MSVC)
-    install(FILES $<TARGET_PDB_FILE:combine_lang_model> DESTINATION bin OPTIONAL)
+  if(BUILD_TRAINING_TOOLS)
+    add_executable(combine_lang_model combine_lang_model.cpp)
+    target_link_libraries(combine_lang_model unicharset_training)
+    project_group(combine_lang_model "Training Tools")
+    install(
+      TARGETS combine_lang_model
+      RUNTIME DESTINATION bin
+      LIBRARY DESTINATION lib
+      ARCHIVE DESTINATION lib)
+    if (MSVC)
+      install(FILES $<TARGET_PDB_FILE:combine_lang_model> DESTINATION bin OPTIONAL)
+    endif()
   endif()

   # ############################################################################
   # EXECUTABLE lstmeval
   # ############################################################################

-  add_executable(lstmeval lstmeval.cpp)
-  target_link_libraries(lstmeval unicharset_training)
-  project_group(lstmeval "Training Tools")
-  install(
-    TARGETS lstmeval
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib)
-  if (MSVC)
-    install(FILES $<TARGET_PDB_FILE:lstmeval> DESTINATION bin OPTIONAL)
+  if(BUILD_TRAINING_TOOLS)
+    add_executable(lstmeval lstmeval.cpp)
+    target_link_libraries(lstmeval unicharset_training)
+    project_group(lstmeval "Training Tools")
+    install(
+      TARGETS lstmeval
+      RUNTIME DESTINATION bin
+      LIBRARY DESTINATION lib
+      ARCHIVE DESTINATION lib)
+    if (MSVC)
+      install(FILES $<TARGET_PDB_FILE:lstmeval> DESTINATION bin OPTIONAL)
+    endif()
   endif()

   # ############################################################################
   # EXECUTABLE lstmtraining
   # ############################################################################

-  add_executable(lstmtraining lstmtraining.cpp)
-  target_link_libraries(lstmtraining unicharset_training)
-  project_group(lstmtraining "Training Tools")
-  install(
-    TARGETS lstmtraining
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib)
-  if (MSVC)
-    install(FILES $<TARGET_PDB_FILE:lstmtraining> DESTINATION bin OPTIONAL)
+  if(BUILD_TRAINING_TOOLS)
+    add_executable(lstmtraining lstmtraining.cpp)
+    target_link_libraries(lstmtraining unicharset_training)
+    project_group(lstmtraining "Training Tools")
+    install(
+      TARGETS lstmtraining
+      RUNTIME DESTINATION bin
+      LIBRARY DESTINATION lib
+      ARCHIVE DESTINATION lib)
+    if (MSVC)
+      install(FILES $<TARGET_PDB_FILE:lstmtraining> DESTINATION bin OPTIONAL)
+    endif()
   endif()

   # ############################################################################
   # EXECUTABLE merge_unicharsets
   # ############################################################################

-  add_executable(merge_unicharsets merge_unicharsets.cpp)
-  target_link_libraries(merge_unicharsets common_training)
-  project_group(merge_unicharsets "Training Tools")
-  install(
-    TARGETS merge_unicharsets
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib)
-  if (MSVC)
-    install(FILES $<TARGET_PDB_FILE:merge_unicharsets> DESTINATION bin OPTIONAL)
+  if(BUILD_TRAINING_TOOLS)
+    add_executable(merge_unicharsets merge_unicharsets.cpp)
+    target_link_libraries(merge_unicharsets common_training)
+    project_group(merge_unicharsets "Training Tools")
+    install(
+      TARGETS merge_unicharsets
+      RUNTIME DESTINATION bin
+      LIBRARY DESTINATION lib
+      ARCHIVE DESTINATION lib)
+    if (MSVC)
+      install(FILES $<TARGET_PDB_FILE:merge_unicharsets> DESTINATION bin OPTIONAL)
+    endif()
   endif()

   # ############################################################################
   # EXECUTABLE set_unicharset_properties
   # ############################################################################

-  add_executable(set_unicharset_properties set_unicharset_properties.cpp)
-  target_link_libraries(set_unicharset_properties unicharset_training)
-  project_group(set_unicharset_properties "Training Tools")
-  install(
-    TARGETS set_unicharset_properties
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib)
-  if (MSVC)
-    install(FILES $<TARGET_PDB_FILE:set_unicharset_properties> DESTINATION bin OPTIONAL)
+  if(BUILD_TRAINING_TOOLS)
+    add_executable(set_unicharset_properties set_unicharset_properties.cpp)
+    target_link_libraries(set_unicharset_properties unicharset_training)
+    project_group(set_unicharset_properties "Training Tools")
+    install(
+      TARGETS set_unicharset_properties
+      RUNTIME DESTINATION bin
+      LIBRARY DESTINATION lib
+      ARCHIVE DESTINATION lib)
+    if (MSVC)
+      install(FILES $<TARGET_PDB_FILE:set_unicharset_properties> DESTINATION bin OPTIONAL)
+    endif()
   endif()

   # ############################################################################
   # EXECUTABLE unicharset_extractor
   # ############################################################################

-  add_executable(unicharset_extractor unicharset_extractor.cpp)
-  target_compile_features(unicharset_extractor PRIVATE cxx_std_17)
-  target_link_libraries(unicharset_extractor unicharset_training)
-  project_group(unicharset_extractor "Training Tools")
-  install(
-    TARGETS unicharset_extractor
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib)
-  if (MSVC)
-    install(FILES $<TARGET_PDB_FILE:unicharset_extractor> DESTINATION bin OPTIONAL)
+  if(BUILD_TRAINING_TOOLS)
+    add_executable(unicharset_extractor unicharset_extractor.cpp)
+    target_compile_features(unicharset_extractor PRIVATE cxx_std_17)
+    target_link_libraries(unicharset_extractor unicharset_training)
+    project_group(unicharset_extractor "Training Tools")
+    install(
+      TARGETS unicharset_extractor
+      RUNTIME DESTINATION bin
+      LIBRARY DESTINATION lib
+      ARCHIVE DESTINATION lib)
+    if (MSVC)
+      install(FILES $<TARGET_PDB_FILE:unicharset_extractor> DESTINATION bin OPTIONAL)
+    endif()
   endif()

   # ############################################################################

-  if(PKG_CONFIG_FOUND)
+  if(BUILD_TRAINING_TOOLS AND PKG_CONFIG_FOUND)
     pkg_check_modules(
       PANGO
       REQUIRED