From 7b3a2f5e3d5f496036c4ea7e2fa3778fce848e57 Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Mon, 27 Apr 2020 16:25:20 +0200 Subject: [PATCH] cmake support for tst_moc We use qt_wrap_cpp instead of AUTOMOC so that we can easily find the json files. Getting autorcc to run only after json file has been generated was deemed too tricky. Therefore the test is slightly modified to check for the json files in its directory instead of the resource, if the qrc file does not exist. Change-Id: Id1aabb117c8bab3ff81156da1f66d64e796bf18b Reviewed-by: Qt CI Bot Reviewed-by: Alexandru Croitor --- tests/auto/tools/CMakeLists.txt | 2 +- tests/auto/tools/moc/CMakeLists.txt | 144 ++++++++++++++++++++++++++++ tests/auto/tools/moc/tst_moc.cpp | 15 ++- 3 files changed, 155 insertions(+), 6 deletions(-) create mode 100644 tests/auto/tools/moc/CMakeLists.txt diff --git a/tests/auto/tools/CMakeLists.txt b/tests/auto/tools/CMakeLists.txt index 128b919538..d6cc753db7 100644 --- a/tests/auto/tools/CMakeLists.txt +++ b/tests/auto/tools/CMakeLists.txt @@ -2,7 +2,7 @@ add_subdirectory(qmakelib) add_subdirectory(qmake) -#add_subdirectory(moc) # special case to be ported +add_subdirectory(moc) add_subdirectory(rcc) if(TARGET Qt::Widgets) add_subdirectory(uic) diff --git a/tests/auto/tools/moc/CMakeLists.txt b/tests/auto/tools/moc/CMakeLists.txt new file mode 100644 index 0000000000..db953ab735 --- /dev/null +++ b/tests/auto/tools/moc/CMakeLists.txt @@ -0,0 +1,144 @@ +# special case skip regeneration +# Generated from moc.pro. + +##################################################################### +## tst_moc Test: +##################################################################### + + +set(JSON_HEADERS + backslash-newlines.h + c-comments.h + cstyle-enums.h + cxx11-enums.h + cxx11-explicit-override-control.h + cxx11-final-classes.h + cxx17-namespaces.h + dir-in-include-path.h + escapes-in-string-literals.h + enum_with_include.h + forward-declared-param.h + function-with-attributes.h + gadgetwithnoenums.h + grand-parent-gadget-class.h + moc_include.h + namespace.h + namespaced-flags.h + no-keywords.h + non-gadget-parent-class.h + oldstyle-casts.h + parse-defines.h + plugin_metadata.h + pointery_to_incomplete.h + pure-virtual-signals.h + qinvokable.h + qprivateslots.h + qtbug-35657-gadget.h + related-metaobjects-in-gadget.h + related-metaobjects-in-namespaces.h + related-metaobjects-name-conflict.h + single-quote-digit-separator-n3781.h + single_function_keyword.h + slots-with-void-template.h + task192552.h + task234909.h + task240368.h + task87883.h + trigraphs.h + using-namespaces.h +) + +qt_wrap_cpp(comparison_relevant_moc_list ${JSON_HEADERS} + TARGET tst_moc + OPTIONS + "-Muri=com.company.app" + "-Muri=com.company.app.private" + "-DDEFINE_CMDLINE_EMPTY=" + "-DDEFINE_CMDLINE_SIGNAL=void cmdlineSignal(const QMap &i)" + "--output-json" +) + +list(TRANSFORM comparison_relevant_moc_list APPEND ".json" OUTPUT_VARIABLE moc_json_files) + +qt_add_test(tst_moc + SOURCES + cxx-attributes.h + tst_moc.cpp + ${comparison_relevant_moc_list} + INCLUDE_DIRECTORIES + testproject + testproject/include + MOC_OPTIONS + "-Muri=com.company.app" + "-Muri=com.company.app.private" + "-DDEFINE_CMDLINE_EMPTY=" + "-DDEFINE_CMDLINE_SIGNAL=void cmdlineSignal(const QMap &i)" + "--output-json" + EXCEPTIONS +) + +qt_extend_target(tst_moc PUBLIC_LIBRARIES Qt::CorePrivate) + +qt_extend_target(tst_moc CONDITION CMAKE_CROSSCOMPILING + DEFINES + MOC_CROSS_COMPILED +) + +if (UNIX AND (CLANG OR GCC OR ICC)) + qt_wrap_cpp(os9_moc os9-newlines.h) +endif() + +qt_extend_target(tst_moc CONDITION UNIX AND (CLANG OR GCC OR ICC) + SOURCES + os9-newlines.h + win-newlines.h + ${os9_moc} +) + +qt_extend_target(tst_moc CONDITION CLANG OR GCC + SOURCES + dollars.h +) + +qt_extend_target(tst_moc CONDITION TARGET Qt::DBus + PUBLIC_LIBRARIES + Qt::DBus +) + +qt_extend_target(tst_moc CONDITION TARGET Qt::Concurrent + PUBLIC_LIBRARIES + Qt::Concurrent +) + +qt_extend_target(tst_moc CONDITION TARGET Qt::Network + PUBLIC_LIBRARIES + Qt::Network +) + +qt_extend_target(tst_moc CONDITION TARGET Qt::Sql + PUBLIC_LIBRARIES + Qt::Sql +) + +get_target_property(target_binary_dir tst_moc BINARY_DIR) +set(cmake_autogen_cache_file + "${target_binary_dir}/CMakeFiles/tst_moc_autogen.dir/ParseCache.txt") +set(cmake_autogen_info_file + "${target_binary_dir}/CMakeFiles/tst_moc_autogen.dir/AutogenInfo.json") +set(moc_json_out ${target_binary_dir}/moc_json_out) + +file(REMOVE ${moc_json_out}) +foreach(filename ${moc_json_files}) + file(APPEND ${moc_json_out} "${filename}\n") +endforeach() + +set(metatype_file "allmocs.json") +configure_file("allmocs_baseline_in.json" "${target_binary_dir}/allmocs_baseline.json") + +add_custom_command(TARGET tst_moc + POST_BUILD + COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::moc + -o "allmocs.json" + --collect-json "@${moc_json_out}" + COMMENT "Running moc with --collect-json" +) diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index 1432018647..c866fcd903 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -3970,14 +3970,20 @@ void tst_Moc::mocJsonOutput() return QJsonDocument::fromJson(f.readAll()); }; - const QString actualFile = QStringLiteral(":/allmocs.json"); - const QString expectedFile = QStringLiteral(":/allmocs_baseline.json"); + QString actualFile = QStringLiteral(":/allmocs.json"); + QString expectedFile = QStringLiteral(":/allmocs_baseline.json"); + if (!QFile::exists(actualFile)) { + // TODO: necessary with cmake as we cannot generate the qrc file soon enough + auto const appDir = QCoreApplication::applicationDirPath(); + actualFile = appDir + QDir::separator() + QLatin1String("./allmocs.json"); + expectedFile = appDir + QDir::separator() + QLatin1String("./allmocs_baseline.json"); + } QVERIFY2(QFile::exists(actualFile), qPrintable(actualFile)); QVERIFY2(QFile::exists(expectedFile), qPrintable(expectedFile)); - QJsonDocument actualOutput = readFile(QLatin1String(":/allmocs.json")); - QJsonDocument expectedOutput = readFile(QLatin1String(":/allmocs_baseline.json")); + QJsonDocument actualOutput = readFile(actualFile); + QJsonDocument expectedOutput = readFile(expectedFile); const auto showPotentialDiff = [](const QJsonDocument &actual, const QJsonDocument &expected) -> QByteArray { #if defined(Q_OS_UNIX) @@ -4275,4 +4281,3 @@ QTEST_MAIN(tst_Moc) #undef emit #include "tst_moc.moc" -