[extra-cmake-modules] /: Revert "Make sure we load translations on the main thread."

Alex Merry alex.merry at kde.org
Sun Nov 8 19:31:39 UTC 2015


Git commit 6745bd7e4796560959bb67e33b7c7f86f96a5a94 by Alex Merry.
Committed on 08/11/2015 at 19:29.
Pushed by alexmerry into branch 'master'.

Revert "Make sure we load translations on the main thread."

This broke the build for projects which used ecm_create_qm_loader in
unusual ways. A better approach is coming, but won't be in e-c-m 5.16.

This reverts commit 009c480413910e8c1a18f4d1420f4a517ea606e6.

CCBUG: 346188
CCMAIL: release-team at kde.org
CCMAIL: kde-buildsystem at kde.org

M  +2    -13   modules/ECMPoQmTools.cmake
M  +26   -62   modules/ECMQmLoader.cpp.in
M  +2    -2    tests/CMakeLists.txt
M  +5    -27   tests/ECMPoQmToolsTest/CMakeLists.txt
D  +0    -2    tests/ECMPoQmToolsTest/check_conf.cmake.in
R  +10   -30   tests/ECMPoQmToolsTest/check_tree.cmake.in [from: tests/ECMPoQmToolsTest/check.cmake.in - 052% similarity]
D  +0    -22   tests/ECMPoQmToolsTest/tr_test-po/en/catalog.po
D  +0    -22   tests/ECMPoQmToolsTest/tr_test-po/en_GB/catalog.po
D  +0    -16   tests/ECMPoQmToolsTest/tr_test.cpp
D  +0    -68   tests/ECMPoQmToolsTest/tr_thread_test.cpp
D  +0    -12   tests/ECMPoQmToolsTest/tr_thread_test_module.cpp

http://commits.kde.org/extra-cmake-modules/6745bd7e4796560959bb67e33b7c7f86f96a5a94

diff --git a/modules/ECMPoQmTools.cmake b/modules/ECMPoQmTools.cmake
index 22258dc..12bcf6b 100644
--- a/modules/ECMPoQmTools.cmake
+++ b/modules/ECMPoQmTools.cmake
@@ -99,20 +99,9 @@ endfunction()
 
 
 function(ecm_create_qm_loader out_var catalog_name)
-    set(loader_cpp ${CMAKE_CURRENT_BINARY_DIR}/ECMQmLoader.cpp)
-    set(loader_moc ${CMAKE_CURRENT_BINARY_DIR}/ECMQmLoader.moc)
-
     # catalog_name is used in ECMQmLoader.cpp.in
-    configure_file(${ECM_MODULE_DIR}/ECMQmLoader.cpp.in "${loader_cpp}" @ONLY)
-    set(${out_var} "${${out_var}}" "${loader_cpp}" "${loader_moc}" PARENT_SCOPE)
-
-    # can't assume target has AUTOMOC turned on
-    if(NOT Qt5Core_FOUND)
-        find_package(Qt5Core)
-    endif()
-    if(Qt5Core_FOUND)
-        qt5_generate_moc("${loader_cpp}" "${loader_moc}")
-    endif()
+    configure_file(${ECM_MODULE_DIR}/ECMQmLoader.cpp.in ECMQmLoader.cpp @ONLY)
+    set(${out_var} ${${out_var}} ${CMAKE_CURRENT_BINARY_DIR}/ECMQmLoader.cpp PARENT_SCOPE)
 endfunction()
 
 
diff --git a/modules/ECMQmLoader.cpp.in b/modules/ECMQmLoader.cpp.in
index fc667ba..423d1c9 100644
--- a/modules/ECMQmLoader.cpp.in
+++ b/modules/ECMQmLoader.cpp.in
@@ -32,77 +32,41 @@
  */
 #include <QCoreApplication>
 #include <QLocale>
-#include <QMetaObject>
 #include <QStandardPaths>
-#include <QThread>
 #include <QTranslator>
 
-namespace {
+#include <QDebug>
 
-    bool loadTranslation(const QString &localeDirName)
-    {
-        QString subPath = QStringLiteral("locale/") + localeDirName + QStringLiteral("/LC_MESSAGES/@catalog_name at .qm");
-        QString fullPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, subPath);
-        if (fullPath.isEmpty()) {
-            return false;
-        }
-        QTranslator *translator = new QTranslator(QCoreApplication::instance());
-        if (!translator->load(fullPath)) {
-            delete translator;
-            return false;
-        }
-        QCoreApplication::instance()->installTranslator(translator);
-        return true;
+static bool loadTranslation(const QString &localeDirName)
+{
+    QString subPath = QStringLiteral("locale/") + localeDirName + QStringLiteral("/LC_MESSAGES/@catalog_name at .qm");
+    QString fullPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, subPath);
+    if (fullPath.isEmpty()) {
+        return false;
     }
-
-    void load()
-    {
-        // The way Qt translation system handles plural forms makes it necessary to
-        // have a translation file which contains only plural forms for `en`. That's
-        // why we load the `en` translation unconditionally, then load the
-        // translation for the current locale to overload it.
-        loadTranslation(QStringLiteral("en"));
-
-        QLocale locale = QLocale::system();
-        if (locale.name() != QStringLiteral("en")) {
-            if (!loadTranslation(locale.name())) {
-                loadTranslation(locale.bcp47Name());
-            }
-        }
+    QTranslator *translator = new QTranslator(QCoreApplication::instance());
+    if (!translator->load(fullPath)) {
+        delete translator;
+        return false;
     }
+    QCoreApplication::instance()->installTranslator(translator);
+    return true;
+}
 
-    // helper to call load() on the correct thread
-    class Loader : public QObject
-    {
-        Q_OBJECT
-
-    public Q_SLOTS:
-        void callLoadAndDeleteSelf()
-        {
-            load();
-            this->deleteLater();
-        }
-    };
+static void load()
+{
+    // The way Qt translation system handles plural forms makes it necessary to
+    // have a translation file which contains only plural forms for `en`. That's
+    // why we load the `en` translation unconditionally, then load the
+    // translation for the current locale to overload it.
+    loadTranslation(QStringLiteral("en"));
 
-    void loadOnMainThread()
-    {
-        // If this library is loaded after the QCoreApplication instance is created
-        // (eg: because it is brought in by a plugin), there is no guarantee this
-        // function will be called on the main thread.
-        // QCoreApplication::installTranslator needs to be called on the main
-        // thread, because it uses QCoreApplication::sendEvent.
-        if (QThread::currentThread() == QCoreApplication::instance()->thread()) {
-            load();
-        } else {
-            // QObjects inherit their parent object's thread
-            Loader *loader = new Loader();
-            loader->moveToThread(QCoreApplication::instance()->thread());
-            QMetaObject::invokeMethod(loader, "callLoadAndDeleteSelf", Qt::AutoConnection);
+    QLocale locale = QLocale::system();
+    if (locale.name() != QStringLiteral("en")) {
+        if (!loadTranslation(locale.name())) {
+            loadTranslation(locale.bcp47Name());
         }
     }
-
 }
 
-Q_COREAPP_STARTUP_FUNCTION(loadOnMainThread)
-
-#include "ECMQmLoader.moc"
+Q_COREAPP_STARTUP_FUNCTION(load)
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 9e6de12..8a75ae6 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -101,13 +101,13 @@ add_test_macro(ECMInstallIconsTest
     ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/ECMInstallIconsTest/check_tree.cmake"
 )
 
-if (Qt5Core_FOUND AND Qt5LinguistTools_FOUND)
+if (Qt5LinguistTools_FOUND)
     set(ECMPoQmToolsTest_EXTRA_OPTIONS
         --build-target install
         --build-options
             "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/ECMPoQmToolsTest/InstallDirectory"
     )
     add_test_macro(ECMPoQmToolsTest
-        ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/ECMPoQmToolsTest/check.cmake"
+        ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/ECMPoQmToolsTest/check_tree.cmake"
     )
 endif()
diff --git a/tests/ECMPoQmToolsTest/CMakeLists.txt b/tests/ECMPoQmToolsTest/CMakeLists.txt
index e08a2b8..15351d2 100644
--- a/tests/ECMPoQmToolsTest/CMakeLists.txt
+++ b/tests/ECMPoQmToolsTest/CMakeLists.txt
@@ -9,14 +9,9 @@ file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}")
 
 include(ECMPoQmTools)
 
-include(../test_helpers.cmake)
-
-unset(QMLOADER_FILES)
-ecm_create_qm_loader(QMLOADER_FILES catalog)
-assert_var_defined(QMLOADER_FILES)
-
-# These will be used to test the above-generated loader
-ecm_install_po_files_as_qm(tr_test-po)
+# Should create ${CMAKE_CURRENT_BINARY_DIR}/qmloader.cpp and set QMLOADER_PATH
+# to its path
+ecm_create_qm_loader(QMLOADER_PATH catalog)
 
 # Should create a process-and-install.qm file and install it
 ecm_process_po_files_as_qm(fr ALL
@@ -44,22 +39,5 @@ ecm_install_po_files_as_qm(po-custom-dir1)
 set(LOCALE_INSTALL_DIR custom-dir2)
 ecm_install_po_files_as_qm(po-custom-dir2)
 
-find_package(Qt5Core CONFIG REQUIRED)
-
-add_executable(tr_test tr_test.cpp ${QMLOADER_FILES})
-target_link_libraries(tr_test PRIVATE Qt5::Core)
-
-add_library(tr_thread_module MODULE tr_thread_test_module.cpp ${QMLOADER_FILES})
-target_link_libraries(tr_thread_module PRIVATE Qt5::Core)
-
-add_executable(tr_thread_test tr_thread_test.cpp)
-set_target_properties(tr_thread_test PROPERTIES AUTOMOC ON)
-target_include_directories(tr_thread_test PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
-target_compile_definitions(tr_thread_test PRIVATE "MODULE_PATH=\"$<TARGET_FILE:tr_thread_module>\"")
-target_link_libraries(tr_thread_test PRIVATE Qt5::Core)
-
-file(GENERATE
-    OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/check_conf.cmake"
-    INPUT "${CMAKE_CURRENT_SOURCE_DIR}/check_conf.cmake.in"
-)
-configure_file(check.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/check.cmake" @ONLY)
+# this will be run by CTest
+configure_file(check_tree.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/check_tree.cmake" @ONLY)
diff --git a/tests/ECMPoQmToolsTest/check_conf.cmake.in b/tests/ECMPoQmToolsTest/check_conf.cmake.in
deleted file mode 100644
index 0bbab1d..0000000
--- a/tests/ECMPoQmToolsTest/check_conf.cmake.in
+++ /dev/null
@@ -1,2 +0,0 @@
-set(TR_TEST_EXEC "$<TARGET_FILE:tr_test>")
-set(TR_THREAD_TEST_EXEC "$<TARGET_FILE:tr_thread_test>")
diff --git a/tests/ECMPoQmToolsTest/check.cmake.in b/tests/ECMPoQmToolsTest/check_tree.cmake.in
similarity index 52%
rename from tests/ECMPoQmToolsTest/check.cmake.in
rename to tests/ECMPoQmToolsTest/check_tree.cmake.in
index 2f0cc20..9f4f7c0 100644
--- a/tests/ECMPoQmToolsTest/check.cmake.in
+++ b/tests/ECMPoQmToolsTest/check_tree.cmake.in
@@ -1,6 +1,6 @@
 set(BINARY_DIR "@CMAKE_CURRENT_BINARY_DIR@")
 set(ACTUAL_TREE "@CMAKE_INSTALL_PREFIX@")
-include("${BINARY_DIR}/check_conf.cmake")
+set(QMLOADER_PATH "@QMLOADER_PATH@")
 
 set(fail OFF)
 
@@ -9,21 +9,27 @@ macro(mark_failed msg)
     set(fail ON)
 endmacro()
 
+macro(check_strequal var expected)
+    if (NOT "${${var}}" STREQUAL "${expected}")
+        mark_failed("${var} is:\n  \"${${var}}\"\nExpected:\n  \"${expected}\"")
+    endif()
+endmacro()
+
 macro(check_exists file)
-    message(STATUS "Checking for ${file}")
     if (NOT EXISTS ${file})
         mark_failed("File \"${file}\" does not exist")
     endif()
 endmacro()
 
+check_exists(${BINARY_DIR}/ECMQmLoader.cpp)
+check_strequal(QMLOADER_PATH "${BINARY_DIR}/ECMQmLoader.cpp")
+
 check_exists(${BINARY_DIR}/fr/only-process.qm)
 
 set(exp_files
     "share/locale/fr/LC_MESSAGES/process-and-install.qm"
     "share/locale/es/LC_MESSAGES/install-test.qm"
     "share/locale/fr/LC_MESSAGES/install-test.qm"
-    "share/locale/en/LC_MESSAGES/catalog.qm"
-    "share/locale/en_GB/LC_MESSAGES/catalog.qm"
     "custom-dir1/es/LC_MESSAGES/custom-dir1-install-test.qm"
     "custom-dir1/fr/LC_MESSAGES/custom-dir1-install-test.qm"
     "custom-dir2/es/LC_MESSAGES/custom-dir2-install-test.qm"
@@ -48,32 +54,6 @@ if(NOT exp_files STREQUAL actual_files)
             set(fail ON)
         endif()
     endforeach()
-else()
-    message(STATUS "Installed translations in expected locations")
-endif()
-
-# we know we can modify the executable environment on Linux
-if("@CMAKE_SYSTEM_NAME@" STREQUAL "Linux")
-    set(exp_output_en "english text:english plural form 5")
-    set(exp_output_en_GB "british english text:british english plural form 5")
-    # no french translation provided -> english fallback
-    set(exp_output_fr "${exp_output_en}")
-    foreach(exec TR_TEST TR_THREAD_TEST)
-        foreach(lang en en_GB fr)
-            execute_process(
-                COMMAND "${CMAKE_COMMAND}" -E env "XDG_DATA_DIRS=${ACTUAL_TREE}/share"
-                    LC_ALL=${lang} "${${exec}_EXEC}"
-                OUTPUT_VARIABLE output
-            )
-            string(STRIP "${output}" stripped_output)
-            if(NOT stripped_output STREQUAL exp_output_${lang})
-                message(WARNING "${exec}[${lang}] output was \"${stripped_output}\", but expected \"${exp_output_${lang}}\"")
-                set(fail ON)
-            else()
-                message(STATUS "${exec}[${lang}] output was \"${stripped_output}\", as expected")
-            endif()
-        endforeach()
-    endforeach()
 endif()
 
 if (fail)
diff --git a/tests/ECMPoQmToolsTest/tr_test-po/en/catalog.po b/tests/ECMPoQmToolsTest/tr_test-po/en/catalog.po
deleted file mode 100644
index 2a7b6d2..0000000
--- a/tests/ECMPoQmToolsTest/tr_test-po/en/catalog.po
+++ /dev/null
@@ -1,22 +0,0 @@
-msgid ""
-msgstr ""
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Language: en\n"
-"X-Qt-Contexts: true\n"
-
-#: main.cpp:12
-msgctxt "testcontext|"
-msgid "test string"
-msgstr "english text"
-
-#: main.cpp:13
-#, qt-format
-#| msgid "test plural"
-msgctxt "testcontext|"
-msgid "test plural %n"
-msgid_plural "test plural %n"
-msgstr[0] "english singular form %n"
-msgstr[1] "english plural form %n"
diff --git a/tests/ECMPoQmToolsTest/tr_test-po/en_GB/catalog.po b/tests/ECMPoQmToolsTest/tr_test-po/en_GB/catalog.po
deleted file mode 100644
index ec5ad85..0000000
--- a/tests/ECMPoQmToolsTest/tr_test-po/en_GB/catalog.po
+++ /dev/null
@@ -1,22 +0,0 @@
-msgid ""
-msgstr ""
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Language: en_GB\n"
-"X-Qt-Contexts: true\n"
-
-#: main.cpp:12
-msgctxt "testcontext|"
-msgid "test string"
-msgstr "british english text"
-
-#: main.cpp:13
-#, qt-format
-#| msgid "test plural"
-msgctxt "testcontext|"
-msgid "test plural %n"
-msgid_plural "test plural %n"
-msgstr[0] "british english singular form %n"
-msgstr[1] "british english plural form %n"
diff --git a/tests/ECMPoQmToolsTest/tr_test.cpp b/tests/ECMPoQmToolsTest/tr_test.cpp
deleted file mode 100644
index be5d342..0000000
--- a/tests/ECMPoQmToolsTest/tr_test.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <QCoreApplication>
-#include <QTextStream>
-
-#include <stdio.h>
-
-int main(int argc, char** argv)
-{
-    QCoreApplication app(argc, argv);
-
-    QTextStream output(stdout);
-
-    output << QCoreApplication::translate("testcontext", "test string") << ":";
-    output << QCoreApplication::translate("testcontext", "test plural %n", 0, 5) << '\n';
-
-    return 0;
-}
diff --git a/tests/ECMPoQmToolsTest/tr_thread_test.cpp b/tests/ECMPoQmToolsTest/tr_thread_test.cpp
deleted file mode 100644
index 3ed30ee..0000000
--- a/tests/ECMPoQmToolsTest/tr_thread_test.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-#include <QCoreApplication>
-#include <QLibrary>
-#include <QMetaObject>
-#include <QThread>
-
-class Thread : public QThread
-{
-    Q_OBJECT
-
-    QLibrary *m_lib;
-
-public:
-    Thread()
-        : m_lib(0)
-    {}
-    ~Thread()
-    {
-        delete m_lib;
-    }
-
-Q_SIGNALS:
-    void libraryLoaded();
-
-public Q_SLOTS:
-    void printStrings()
-    {
-        // NB: this will run on the *main* event loop.
-        QFunctionPointer print_strings = m_lib->resolve("print_strings");
-        if (print_strings) {
-            print_strings();
-        } else {
-            qFatal("Could not resolve print_strings: %s", m_lib->errorString().toUtf8().data());
-        }
-
-        QCoreApplication::instance()->quit();
-    }
-protected:
-    void run()
-    {
-        m_lib = new QLibrary(MODULE_PATH);
-
-        if (!m_lib->load()) {
-            qFatal("Could not load module: %s", m_lib->errorString().toUtf8().data());
-        }
-
-        // Queue a call to printStrings() on the main event loop (giving the
-        // translations a chance to be loaded).
-        QMetaObject::invokeMethod(this, "printStrings", Qt::QueuedConnection);
-    }
-};
-
-int main(int argc, char** argv)
-{
-    QCoreApplication app(argc, argv);
-
-    Thread thread;
-
-    // Start the thread *after* QCoreApplication is started (otherwise the
-    // plugin's startup function won't be run on the Thread, and we won't test
-    // what we wanted to test).
-    QMetaObject::invokeMethod(&thread, "start", Qt::QueuedConnection);
-
-    app.exec();
-
-    return 0;
-}
-
-#include "tr_thread_test.moc"
diff --git a/tests/ECMPoQmToolsTest/tr_thread_test_module.cpp b/tests/ECMPoQmToolsTest/tr_thread_test_module.cpp
deleted file mode 100644
index b9000ff..0000000
--- a/tests/ECMPoQmToolsTest/tr_thread_test_module.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <QCoreApplication>
-#include <QTextStream>
-
-#include <stdio.h>
-
-extern "C" Q_DECL_EXPORT void print_strings()
-{
-    QTextStream output(stdout);
-
-    output << QCoreApplication::translate("testcontext", "test string") << ":";
-    output << QCoreApplication::translate("testcontext", "test plural %n", 0, 5) << '\n';
-}


More information about the Kde-buildsystem mailing list