aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/Qt6QmlMacros.cmake44
-rw-r--r--src/qmlcompiler/qqmljscompilerstats.cpp6
-rw-r--r--src/qmlcompiler/qqmljscompilerstats_p.h1
-rw-r--r--src/qmlcompiler/qqmljscompilerstatsreporter.cpp12
-rw-r--r--src/qmlcompiler/qqmljscompilerstatsreporter_p.h5
-rw-r--r--tools/qmlaotstats/main.cpp17
-rw-r--r--tools/qmlcachegen/qmlcachegen.cpp5
7 files changed, 78 insertions, 12 deletions
diff --git a/src/qml/Qt6QmlMacros.cmake b/src/qml/Qt6QmlMacros.cmake
index 23572bb3e8..f6fcb6345b 100644
--- a/src/qml/Qt6QmlMacros.cmake
+++ b/src/qml/Qt6QmlMacros.cmake
@@ -1092,6 +1092,8 @@ endfunction()
function(_qt_internal_deferred_aotstats_setup)
get_property(module_targets GLOBAL PROPERTY _qt_qml_aotstats_module_targets)
+ set(onlybytecode_modules "")
+ set(empty_modules "")
set(module_aotstats_targets "")
set(module_aotstats_files "")
@@ -1102,6 +1104,14 @@ function(_qt_internal_deferred_aotstats_setup)
get_target_property(aotstats_files ${module_target} QT_QML_MODULE_AOTSTATS_FILES)
get_target_property(rcc_qmlcache_path ${module_target} QT_QML_MODULE_RCC_QMLCACHE_PATH)
+ if("--only-bytecode" IN_LIST qmlcachegen_args)
+ list(APPEND onlybytecode_modules "${uri}(${module_target})")
+ continue()
+ elseif(NOT aotstats_files)
+ list(APPEND empty_modules "${uri}(${module_target})")
+ continue()
+ endif()
+
list(JOIN aotstats_files "\n" aotstats_files_lines)
set(module_aotstats_list_file "${rcc_qmlcache_path}/module_${module_target}.aotstatslist")
file(WRITE ${module_aotstats_list_file} "${aotstats_files_lines}")
@@ -1134,12 +1144,28 @@ function(_qt_internal_deferred_aotstats_setup)
endforeach()
+ set(project_rcc_qmlcache "${PROJECT_BINARY_DIR}/.rcc/qmlcache")
+
+ set(qmlaotstats_options "")
+ if(onlybytecode_modules)
+ set(onlybytecode_modules_file "${project_rcc_qmlcache}/aotstats_onlybytecode_modules.txt")
+ list(JOIN onlybytecode_modules "\n" onlybytecode_modules_lines)
+ file(WRITE ${onlybytecode_modules_file} "${onlybytecode_modules_lines}")
+ list(APPEND qmlaotstats_options "--only-bytecode-modules" "${onlybytecode_modules_file}")
+ endif()
+ if(empty_modules)
+ set(empty_modules_file "${project_rcc_qmlcache}/aotstats_empty_modules.txt")
+ list(JOIN empty_modules "\n" empty_modules_lines)
+ file(WRITE ${empty_modules_file} "${empty_modules_lines}")
+ list(APPEND qmlaotstats_options "--empty-modules" "${empty_modules_file}")
+ endif()
+
list(JOIN module_aotstats_files "\n" module_aotstats_lines)
- set(aotstats_list_file "${PROJECT_BINARY_DIR}/.rcc/qmlcache/all_aotstats.aotstatslist")
+ set(aotstats_list_file "${project_rcc_qmlcache}/all_aotstats.aotstatslist")
file(WRITE "${aotstats_list_file}" "${module_aotstats_lines}")
- set(all_aotstats_file "${PROJECT_BINARY_DIR}/.rcc/qmlcache/all_aotstats.aotstats")
- set(formatted_stats_file "${PROJECT_BINARY_DIR}/.rcc/qmlcache/all_aotstats.txt")
+ set(all_aotstats_file "${project_rcc_qmlcache}/all_aotstats.aotstats")
+ set(formatted_stats_file "${project_rcc_qmlcache}/all_aotstats.txt")
_qt_internal_get_tool_wrapper_script_path(tool_wrapper)
add_custom_command(
@@ -1159,6 +1185,8 @@ function(_qt_internal_deferred_aotstats_setup)
format
"${all_aotstats_file}"
"${formatted_stats_file}"
+ "${qmlaotstats_options}"
+ COMMAND_EXPAND_LISTS
)
if(NOT TARGET all_aotstats)
@@ -2723,6 +2751,10 @@ function(qt6_target_qml_sources target)
message(FATAL_ERROR "Unknown/unexpected arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()
+ if(NOT arg_QML_FILES)
+ set_property(GLOBAL APPEND PROPERTY _qt_qml_aotstats_module_targets ${target})
+ endif()
+
get_target_property(no_lint ${target} QT_QML_MODULE_NO_LINT)
if(NOT arg_QML_FILES AND NOT arg_RESOURCES)
if(NOT arg_NO_LINT AND NOT no_lint)
@@ -2846,8 +2878,10 @@ function(qt6_target_qml_sources target)
"$<${have_direct_calls}:--direct-calls>"
"$<${have_arguments}:${arguments}>"
${qrc_resource_args}
- "--dump-aot-stats"
- "--module-id=${arg_URI}(${target})"
+ # The --only-bytecode argument is mutually exclusive with aotstats and can
+ # be added after qt_add_qml_module. Conditionally add aotstats flags via genex.
+ "$<$<NOT:$<IN_LIST:--only-bytecode,${arguments}>>:--dump-aot-stats>"
+ "$<$<NOT:$<IN_LIST:--only-bytecode,${arguments}>>:--module-id=${uri}(${target})>"
)
# For direct evaluation in if() below
diff --git a/src/qmlcompiler/qqmljscompilerstats.cpp b/src/qmlcompiler/qqmljscompilerstats.cpp
index 7cef0f39c3..1932ec7d0b 100644
--- a/src/qmlcompiler/qqmljscompilerstats.cpp
+++ b/src/qmlcompiler/qqmljscompilerstats.cpp
@@ -33,9 +33,9 @@ void AotStats::insert(const AotStats &other)
}
}
-std::optional<QList<QString>> extractAotstatsFilesList(const QString &aotstatsListPath)
+std::optional<QList<QString>> AotStats::readAllLines(const QString &path)
{
- QFile aotstatsListFile(aotstatsListPath);
+ QFile aotstatsListFile(path);
if (!aotstatsListFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug().noquote() << u"Could not open \"%1\" for reading"_s.arg(aotstatsListFile.fileName());
return std::nullopt;
@@ -62,7 +62,7 @@ std::optional<AotStats> AotStats::parseAotstatsFile(const QString &aotstatsPath)
std::optional<AotStats> AotStats::aggregateAotstatsList(const QString &aotstatsListPath)
{
- const auto aotstatsFiles = extractAotstatsFilesList(aotstatsListPath);
+ const auto aotstatsFiles = readAllLines(aotstatsListPath);
if (!aotstatsFiles.has_value())
return std::nullopt;
diff --git a/src/qmlcompiler/qqmljscompilerstats_p.h b/src/qmlcompiler/qqmljscompilerstats_p.h
index 53ebb9f777..31f09473a5 100644
--- a/src/qmlcompiler/qqmljscompilerstats_p.h
+++ b/src/qmlcompiler/qqmljscompilerstats_p.h
@@ -53,6 +53,7 @@ public:
void addEntry(const QString &moduleId, const QString &filepath, const AotStatsEntry &entry);
void insert(const AotStats &other);
+ static std::optional<QStringList> readAllLines(const QString &path);
bool saveToDisk(const QString &filepath) const;
static std::optional<AotStats> parseAotstatsFile(const QString &aotstatsPath);
diff --git a/src/qmlcompiler/qqmljscompilerstatsreporter.cpp b/src/qmlcompiler/qqmljscompilerstatsreporter.cpp
index 1cb17f71fe..4684b8d1a5 100644
--- a/src/qmlcompiler/qqmljscompilerstatsreporter.cpp
+++ b/src/qmlcompiler/qqmljscompilerstatsreporter.cpp
@@ -11,7 +11,9 @@ namespace QQmlJS {
using namespace Qt::StringLiterals;
-AotStatsReporter::AotStatsReporter(const AotStats &aotstats) : m_aotstats(aotstats)
+AotStatsReporter::AotStatsReporter(const AotStats &aotstats, const QStringList &emptyModules,
+ const QStringList &onlyBytecodeModules)
+ : m_aotstats(aotstats), m_emptyModules(emptyModules), m_onlyBytecodeModules(onlyBytecodeModules)
{
for (const auto &[moduleUri, fileEntries] : aotstats.entries().asKeyValueRange()) {
for (const auto &[filepath, statsEntries] : fileEntries.asKeyValueRange()) {
@@ -68,7 +70,7 @@ void AotStatsReporter::formatDetailedStats(QTextStream &s) const
void AotStatsReporter::formatSummary(QTextStream &s) const
{
s << "############ AOT COMPILATION STATS SUMMARY ############\n";
- if (m_totalCounters.codegens == 0) {
+ if (m_totalCounters.codegens == 0 && m_emptyModules.empty() && m_onlyBytecodeModules.empty()) {
s << "No attempted compilations to Cpp for bindings or functions.\n";
return;
}
@@ -79,6 +81,12 @@ void AotStatsReporter::formatSummary(QTextStream &s) const
<< formatSuccessRate(counters.codegens, counters.successes) << "\n";
}
+ for (const auto &module : m_emptyModules)
+ s << u"Module %1: No .qml files to compile.\n"_s.arg(module);
+
+ for (const auto &module : m_onlyBytecodeModules)
+ s << u"Module %1: No .qml files compiled (--only-bytecode).\n"_s.arg(module);
+
s << "Total results: " << formatSuccessRate(m_totalCounters.codegens, m_totalCounters.successes);
s << "\n";
diff --git a/src/qmlcompiler/qqmljscompilerstatsreporter_p.h b/src/qmlcompiler/qqmljscompilerstatsreporter_p.h
index 9acf4adac8..1b29b63321 100644
--- a/src/qmlcompiler/qqmljscompilerstatsreporter_p.h
+++ b/src/qmlcompiler/qqmljscompilerstatsreporter_p.h
@@ -27,7 +27,8 @@ namespace QQmlJS {
class Q_QMLCOMPILER_EXPORT AotStatsReporter
{
public:
- AotStatsReporter(const QQmlJS::AotStats &);
+ AotStatsReporter(const QQmlJS::AotStats &stats, const QStringList &emptyModules,
+ const QStringList &onlyBytecodeModules);
QString format() const;
@@ -37,6 +38,8 @@ private:
QString formatSuccessRate(int codegens, int successes) const;
const AotStats &m_aotstats;
+ const QStringList &m_emptyModules;
+ const QStringList &m_onlyBytecodeModules;
struct Counters
{
diff --git a/tools/qmlaotstats/main.cpp b/tools/qmlaotstats/main.cpp
index 24b34efec3..42ef263979 100644
--- a/tools/qmlaotstats/main.cpp
+++ b/tools/qmlaotstats/main.cpp
@@ -54,6 +54,10 @@ int main(int argc, char **argv)
parser.addPositionalArgument("output", "Aggregate mode: the path where to store the "
"aggregated aotstats. Format mode: the the path where "
"the formatted output will be saved.");
+ QCommandLineOption emptyModulesOption("empty-modules", QCoreApplication::translate("main", "Format mode: File containing a list of modules with no QML files."), "file");
+ parser.addOption(emptyModulesOption);
+ QCommandLineOption onlyBytecodeModulesOption("only-bytecode-modules", QCoreApplication::translate("main", "Format mode: File containing a list of modules for which only the bytecode is generated."), "file");
+ parser.addOption(onlyBytecodeModulesOption);
parser.process(app);
const auto &positionalArgs = parser.positionalArguments();
@@ -74,7 +78,18 @@ int main(int argc, char **argv)
const auto aotstats = QQmlJS::AotStats::parseAotstatsFile(positionalArgs[1]);
if (!aotstats.has_value())
return EXIT_FAILURE;
- const QQmlJS::AotStatsReporter reporter(aotstats.value());
+
+ const auto emptyModules = parser.isSet(emptyModulesOption)
+ ? QQmlJS::AotStats::readAllLines(parser.value(emptyModulesOption))
+ : QStringList();
+ const auto onlyBytecodeModules = parser.isSet(onlyBytecodeModulesOption)
+ ? QQmlJS::AotStats::readAllLines(parser.value(onlyBytecodeModulesOption))
+ : QStringList();
+ if (!emptyModules || !onlyBytecodeModules)
+ return EXIT_FAILURE;
+
+ const QQmlJS::AotStatsReporter reporter(aotstats.value(), emptyModules.value(),
+ onlyBytecodeModules.value());
if (!saveFormattedStats(reporter.format(), positionalArgs[2]))
return EXIT_FAILURE;
}
diff --git a/tools/qmlcachegen/qmlcachegen.cpp b/tools/qmlcachegen/qmlcachegen.cpp
index 3b8fe5bad4..aebca5f2fc 100644
--- a/tools/qmlcachegen/qmlcachegen.cpp
+++ b/tools/qmlcachegen/qmlcachegen.cpp
@@ -257,6 +257,11 @@ int main(int argc, char **argv)
error.augment("Error compiling qml file: "_L1).print();
return EXIT_FAILURE;
}
+
+ if (parser.isSet(onlyBytecode)) {
+ QQmlJS::AotStats emptyStats;
+ emptyStats.saveToDisk(outputFileName + u".aotstats"_s);
+ }
} else {
QStringList importPaths;