Replace syncqt arguments with rsp file

syncqt arguments contain full paths and may exceed the supported
command line size on some platforms. Use a single rsp file to pass
all arguments to syncqt.

Added the missing end-of-line terminators for error messages.

Change-Id: I60ad0f6770458d5256e67f042a63a3c16cd5ecb5
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
(cherry picked from commit 947dd880cc2c1fc7973c0439ff8393e0f63f96a0)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Alexey Edelev 2022-12-28 15:10:53 +01:00 committed by Qt Cherry-pick Bot
parent e9479d2a22
commit 80f9966c90
2 changed files with 72 additions and 73 deletions

View File

@ -134,34 +134,33 @@ function(qt_internal_target_sync_headers target module_headers module_headers_ge
list(FILTER module_headers EXCLUDE REGEX list(FILTER module_headers EXCLUDE REGEX
"(.+/(ui_)[^/]+\\.h|${CMAKE_CURRENT_SOURCE_DIR}(/.+)?/doc/+\\.h)") "(.+/(ui_)[^/]+\\.h|${CMAKE_CURRENT_SOURCE_DIR}(/.+)?/doc/+\\.h)")
set(module_headers_rsp "${binary_dir_real}/${target}_module_headers")
list(JOIN module_headers "\n" module_headers_string)
qt_configure_file_v2(OUTPUT "${module_headers_rsp}" CONTENT "${module_headers_string}")
set(module_headers_generated_rsp "${binary_dir_real}/${target}_module_headers_generated")
list(JOIN module_headers_generated "\n" module_headers_generated_string)
qt_configure_file_v2(OUTPUT "${module_headers_generated_rsp}" CONTENT
"${module_headers_generated_string}")
set(syncqt_staging_dir "${module_build_interface_include_dir}/.syncqt_staging") set(syncqt_staging_dir "${module_build_interface_include_dir}/.syncqt_staging")
set(syncqt_args "${common_syncqt_arguments}")
list(APPEND syncqt_args
${common_syncqt_arguments}
-headers ${module_headers}
-generatedHeaders ${module_headers_generated}
-stagingDir "${syncqt_staging_dir}"
-knownModules ${known_modules}
${framework_args}
${version_script_args}
)
list(JOIN syncqt_args "\n" syncqt_args_string)
set(syncqt_args_rsp "${binary_dir_real}/${target}_syncqt_args")
qt_configure_file_v2(OUTPUT "${syncqt_args_rsp}" CONTENT "${syncqt_args_string}")
add_custom_command( add_custom_command(
OUTPUT OUTPUT
${syncqt_outputs} ${syncqt_outputs}
COMMAND COMMAND
${QT_CMAKE_EXPORT_NAMESPACE}::syncqt ${QT_CMAKE_EXPORT_NAMESPACE}::syncqt
${common_syncqt_arguments} "@${syncqt_args_rsp}"
${build_time_syncqt_arguments} ${build_time_syncqt_arguments}
-headers "@${module_headers_rsp}"
-generatedHeaders "@${module_headers_generated_rsp}"
-stagingDir "${syncqt_staging_dir}"
-knownModules ${known_modules}
${framework_args}
${version_script_args}
COMMAND COMMAND
${CMAKE_COMMAND} -E touch "${syncqt_timestamp}" ${CMAKE_COMMAND} -E touch "${syncqt_timestamp}"
DEPENDS DEPENDS
${module_headers_rsp} ${syncqt_args_rsp}
${module_headers_generated_rsp}
${module_headers} ${module_headers}
${QT_CMAKE_EXPORT_NAMESPACE}::syncqt ${QT_CMAKE_EXPORT_NAMESPACE}::syncqt
COMMENT COMMENT
@ -178,13 +177,17 @@ function(qt_internal_target_sync_headers target module_headers module_headers_ge
# available for qdoc. # available for qdoc.
# ${target}_sync_headers is added as dependency to make sure that # ${target}_sync_headers is added as dependency to make sure that
# ${target}_sync_all_public_headers is running after ${target}_sync_headers, when building docs. # ${target}_sync_all_public_headers is running after ${target}_sync_headers, when building docs.
set(syncqt_all_args "${common_syncqt_arguments};-all")
list(JOIN syncqt_all_args "\n" syncqt_all_args_string)
set(syncqt_all_args_rsp "${binary_dir_real}/${target}_syncqt_all_args")
qt_configure_file_v2(OUTPUT "${syncqt_all_args_rsp}" CONTENT "${syncqt_all_args_string}")
add_custom_target(${target}_sync_all_public_headers add_custom_target(${target}_sync_all_public_headers
COMMAND COMMAND
${QT_CMAKE_EXPORT_NAMESPACE}::syncqt ${QT_CMAKE_EXPORT_NAMESPACE}::syncqt
${common_syncqt_arguments} "@${syncqt_all_args_rsp}"
-all
DEPENDS DEPENDS
${module_headers} ${module_headers}
${syncqt_all_args_rsp}
${QT_CMAKE_EXPORT_NAMESPACE}::syncqt ${QT_CMAKE_EXPORT_NAMESPACE}::syncqt
${target}_sync_headers ${target}_sync_headers
VERBATIM VERBATIM
@ -223,12 +226,7 @@ function(qt_internal_target_sync_headers target module_headers module_headers_ge
execute_process( execute_process(
COMMAND COMMAND
${syncqt_location} ${syncqt_location}
${common_syncqt_arguments} "@${syncqt_args_rsp}"
-headers "@${module_headers_rsp}"
-generatedHeaders "@${module_headers_generated_rsp}"
-stagingDir "${syncqt_staging_dir}"
-knownModules ${known_modules}
${framework_args}
RESULT_VARIABLE syncqt_result RESULT_VARIABLE syncqt_result
OUTPUT_VARIABLE syncqt_output OUTPUT_VARIABLE syncqt_output
ERROR_VARIABLE syncqt_output ERROR_VARIABLE syncqt_output

View File

@ -264,7 +264,6 @@ private:
std::string qpaHeadersFilter; std::string qpaHeadersFilter;
std::string privateHeadersFilter; std::string privateHeadersFilter;
std::string publicNamespaceFilter; std::string publicNamespaceFilter;
std::set<std::string> generatedHeaders;
static std::unordered_map<std::string, CommandLineOption<std::string>> stringArgumentMap = { static std::unordered_map<std::string, CommandLineOption<std::string>> stringArgumentMap = {
{ "-module", { &m_moduleName } }, { "-module", { &m_moduleName } },
{ "-sourceDir", { &m_sourceDir } }, { "-sourceDir", { &m_sourceDir } },
@ -283,7 +282,7 @@ private:
static const std::unordered_map<std::string, CommandLineOption<std::set<std::string>>> static const std::unordered_map<std::string, CommandLineOption<std::set<std::string>>>
listArgumentMap = { listArgumentMap = {
{ "-headers", { &m_headers, true } }, { "-headers", { &m_headers, true } },
{ "-generatedHeaders", { &generatedHeaders, true } }, { "-generatedHeaders", { &m_generatedHeaders, true } },
{ "-knownModules", { &m_knownModules, true } }, { "-knownModules", { &m_knownModules, true } },
}; };
@ -298,11 +297,8 @@ private:
std::string *currentValue = nullptr; std::string *currentValue = nullptr;
std::set<std::string> *currentListValue = nullptr; std::set<std::string> *currentListValue = nullptr;
for (int i = 1; i < argc; ++i) {
std::string arg(argv[i]);
if (arg.empty())
continue;
auto parseArgument = [&currentValue, &currentListValue](const std::string &arg) -> bool {
if (arg[0] == '-') { if (arg[0] == '-') {
currentValue = nullptr; currentValue = nullptr;
currentListValue = nullptr; currentListValue = nullptr;
@ -314,7 +310,7 @@ private:
return false; return false;
} }
currentValue = it->second.value; currentValue = it->second.value;
continue; return true;
} }
} }
@ -326,7 +322,7 @@ private:
return false; return false;
} }
*(it->second.value) = true; *(it->second.value) = true;
continue; return true;
} }
} }
@ -338,13 +334,15 @@ private:
return false; return false;
} }
currentListValue = it->second.value; currentListValue = it->second.value;
continue; currentListValue->insert(""); // Indicate that argument is provided
return true;
} }
} }
std::cerr << "Unknown argument: " << arg << std::endl; std::cerr << "Unknown argument: " << arg << std::endl;
return false; return false;
} else { }
if (currentValue != nullptr) { if (currentValue != nullptr) {
*currentValue = arg; *currentValue = arg;
currentValue = nullptr; currentValue = nullptr;
@ -352,8 +350,34 @@ private:
currentListValue->insert(arg); currentListValue->insert(arg);
} else { } else {
std::cerr << "Unknown argument: " << arg << std::endl; std::cerr << "Unknown argument: " << arg << std::endl;
return false;
} }
return true;
};
for (int i = 1; i < argc; ++i) {
std::string arg(argv[i]);
if (arg.empty())
continue;
if (arg[0] == '@') {
std::ifstream ifs(arg.substr(1), std::ifstream::in);
if (!ifs.is_open()) {
std::cerr << "Unable to open rsp file: " << arg[0] << std::endl;
return false;
} }
std::string argFromFile;
while (std::getline(ifs, argFromFile)) {
if (argFromFile.empty())
continue;
if (!parseArgument(argFromFile))
return false;
}
continue;
}
if (!parseArgument(arg))
return false;
} }
if (m_printHelpOnly) if (m_printHelpOnly)
@ -369,32 +393,18 @@ private:
m_publicNamespaceRegex = std::regex(publicNamespaceFilter); m_publicNamespaceRegex = std::regex(publicNamespaceFilter);
if (m_headers.empty() && !m_scanAllMode) { if (m_headers.empty() && !m_scanAllMode) {
std::cerr << "You need to specify either -headers or -all option."; std::cerr << "You need to specify either -headers or -all option." << std::endl;
return false; return false;
} }
if (!m_headers.empty() && m_scanAllMode) { if (!m_headers.empty() && m_scanAllMode) {
std::cerr << "Both -headers and -all are specified. Need to choose only one" std::cerr << "Both -headers and -all are specified. Need to choose only one"
"operational mode."; "operational mode." << std::endl;
return false; return false;
} }
for (const auto &header : generatedHeaders) { for (const auto &argument : listArgumentMap)
if (header.empty()) argument.second.value->erase("");
continue;
if (header[0] == '@') {
std::ifstream ifs(header.substr(1), std::ifstream::in);
if (ifs.is_open()) {
std::string headerFromFile;
while (std::getline(ifs, headerFromFile)) {
if (!headerFromFile.empty())
m_generatedHeaders.insert(headerFromFile);
}
}
} else {
m_generatedHeaders.insert(header);
}
}
bool ret = true; bool ret = true;
ret &= checkRequiredArguments(stringArgumentMap); ret &= checkRequiredArguments(stringArgumentMap);
@ -566,16 +576,7 @@ public:
const auto &headers = m_commandLineArgs->headers(); const auto &headers = m_commandLineArgs->headers();
for (auto it = headers.begin(); it != headers.end(); ++it) { for (auto it = headers.begin(); it != headers.end(); ++it) {
const auto &header = *it; const auto &header = *it;
if (!header.empty() && header[0] == '@') { if (!processHeader(makeHeaderAbsolute(header))) {
std::ifstream ifs(header.substr(1), std::ifstream::in);
if (ifs.is_open()) {
std::string headerFromFile;
while (std::getline(ifs, headerFromFile)) {
if (!headerFromFile.empty())
rspHeaders.insert(headerFromFile);
}
}
} else if (!processHeader(makeHeaderAbsolute(header))) {
error = SyncFailed; error = SyncFailed;
} }
} }
@ -734,7 +735,7 @@ public:
// Check if a directory is passed as argument. That shouldn't happen, print error and exit. // Check if a directory is passed as argument. That shouldn't happen, print error and exit.
if (m_currentFilename.empty()) { if (m_currentFilename.empty()) {
std::cerr << "Header file name of " << m_currentFileString << "is empty"; std::cerr << "Header file name of " << m_currentFileString << "is empty" << std::endl;
return false; return false;
} }