fix qtTest

This commit is contained in:
Andrei Yankovich 2022-08-27 22:30:55 +03:00
parent 99c03a50c8
commit c9e271c3f1
123 changed files with 999 additions and 162 deletions

2
.gitignore vendored
View File

@ -87,7 +87,7 @@ CTestTestfile.cmake
_deps _deps
# cmake configured files # cmake configured files
src/LibDeploy/src/deploy_global.h src/Deploy/src/deploy_global.h
src/QtELFReader/src/elfreader_global.h src/QtELFReader/src/elfreader_global.h
src/CQtDeployer/Deploy/CQtDeployer.json src/CQtDeployer/Deploy/CQtDeployer.json
src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer/meta/package.xml src/CQtDeployer/Deploy/QIFWTemplate/packages/CQtDeployer/meta/package.xml

View File

@ -60,7 +60,7 @@ option(BUILD_COMMAND_LINE_TOOLS "Build Command Line Tools" OFF)
add_subdirectory(submodules/pe-parse) add_subdirectory(submodules/pe-parse)
add_subdirectory(submodules/zip) add_subdirectory(submodules/zip)
add_subdirectory(src/LibDeploy) add_subdirectory(src/Deploy)
if (DEFINED CQT_DEPLOYER_TOOL) if (DEFINED CQT_DEPLOYER_TOOL)
add_subdirectory(src/CQtDeployer) add_subdirectory(src/CQtDeployer)

View File

@ -42,7 +42,7 @@ else()
endif() endif()
target_link_libraries(${CURRENT_PROJECT} PUBLIC LibDeploy) target_link_libraries(${CURRENT_PROJECT} PUBLIC Deploy)
target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR})
target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR}) target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR})

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

View File

@ -840,12 +840,12 @@ bool ConfigParser::parseClearMode() {
return true; return true;
} }
QSet<QString> ConfigParser::getQtPathesFromTargets() { QString ConfigParser::getRPathFromTargets() {
QSet<QString> res; QString res;
for (const auto &i: _config.targets()) { for (const auto &i: _config.targets()) {
if (i.isValid() && !i.getQtPath().isEmpty()) { if (i.isValid()) {
res.insert(i.getQtPath()); res += i.getRPath() + DeployCore::getEnvSeparator();
} }
} }
@ -1175,9 +1175,9 @@ bool ConfigParser::initQmake() {
if (!info.isFile() || (info.baseName() != "qmake")) { if (!info.isFile() || (info.baseName() != "qmake")) {
auto qtList = getQtPathesFromTargets(); QString qmakeFromRPath = DeployCore::findProcess(getRPathFromTargets(), "qmake");
if (qtList.isEmpty()) { if (qmakeFromRPath.isEmpty()) {
if (!QuasarAppUtils::Params::isEndable("noCheckPATH")) { if (!QuasarAppUtils::Params::isEndable("noCheckPATH")) {
auto env = QProcessEnvironment::systemEnvironment(); auto env = QProcessEnvironment::systemEnvironment();
@ -1190,6 +1190,14 @@ bool ConfigParser::initQmake() {
return false; return false;
} }
QuasarAppUtils::Params::log(QString("The qmake was found in the PATH variable. qmake : %0"
" If you want to disable search qmake executable in PATH variable,"
" use the noCheckPATH option").
arg(proc),
QuasarAppUtils::Info);
return initQmakePrivate(proc); return initQmakePrivate(proc);
} }
@ -1203,21 +1211,15 @@ bool ConfigParser::initQmake() {
} }
if (qtList.size() > 1) {
QuasarAppUtils::Params::log("Your deployment targets were compiled by different qmakes, "
"auto-capture of the Qt libraries is not possible. "
"Please use the -qmake flag to solve this problem.",
QuasarAppUtils::Error);
return false;
}
auto qt = *qtList.begin(); QuasarAppUtils::Params::log(QString("The qmake was found in the RPATH variable. qmake : %0"
" If you want to disable search qmake executable in RPATH variable,"
" use the noCheckRPATH option").
arg(qmakeFromRPath),
QuasarAppUtils::Info);
if (qt.right(3).compare(QString("lib"), Qt::CaseInsensitive)) { return initQmakePrivate(qmakeFromRPath);
return initQmakePrivate(QFileInfo(qt + "/../bin/qmake").absoluteFilePath());
}
return initQmakePrivate(QFileInfo(qt + "/qmake").absoluteFilePath());
} }
return initQmakePrivate(qmake); return initQmakePrivate(qmake);

View File

@ -62,7 +62,7 @@ private:
bool parseClearMode(); bool parseClearMode();
QSet<QString> getQtPathesFromTargets(); QString getRPathFromTargets();
void setTargetDir(const QString &target = ""); void setTargetDir(const QString &target = "");
bool setTargets(const QStringList &value); bool setTargets(const QStringList &value);

View File

@ -50,6 +50,37 @@ int ELF::getVersionOfTag(const QByteArray& tag, QByteArray& source) const {
return ver; return ver;
} }
QString ELF::extractRPath(ElfReader& reader) const {
QString result;
if (!QuasarAppUtils::Params::isEndable("noCheckRPATH")) {
auto dynStr = getDynamicString(reader);
for (auto i = dynStr.rbegin(); i != dynStr.rend(); ++i) {
if (i->contains("end_")) {
return result;
}
const auto pathes = i->split(DeployCore::getEnvSeparator());
for (const auto &path: pathes) {
if (path.contains("/")) {
if (result.size()) {
result += DeployCore::getEnvSeparator() + DeployCore::transportPathToSnapRoot(path);
} else {
result += DeployCore::transportPathToSnapRoot(path);
}
}
}
if (result.size())
return result;
}
}
return result;
}
bool ELF::getLibInfo(const QString &lib, LibInfo &info) const { bool ELF::getLibInfo(const QString &lib, LibInfo &info) const {
ElfReader reader(lib); ElfReader reader(lib);
@ -82,25 +113,10 @@ bool ELF::getLibInfo(const QString &lib, LibInfo &info) const {
return false; return false;
} }
if (!QuasarAppUtils::Params::isEndable("noCheckRPATH")) {
auto dynStr = getDynamicString(reader);
for (auto i = dynStr.rbegin(); i != dynStr.rend(); ++i) {
if (i->contains("end_")) {
break;
}
if (QFileInfo(*i).isDir()) {
info.setQtPath(DeployCore::transportPathToSnapRoot(*i));
}
}
}
QFileInfo infolib(lib); QFileInfo infolib(lib);
info.setName(infolib.fileName()); info.setName(infolib.fileName());
info.setPath(infolib.absolutePath()); info.setPath(infolib.absolutePath());
info.setRPath(extractRPath(reader));
auto dep = reader.dependencies(); auto dep = reader.dependencies();
for (const auto &i : dep) { for (const auto &i : dep) {

View File

@ -14,15 +14,18 @@
class ELF : public IGetLibInfo class ELF : public IGetLibInfo
{ {
public:
ELF();
bool getLibInfo(const QString &lib, LibInfo &info) const override;
private: private:
QByteArrayList getDynamicString(ElfReader &reader) const; QByteArrayList getDynamicString(ElfReader &reader) const;
int getVersionOfTag(const QByteArray &tag, QByteArray &source) const; int getVersionOfTag(const QByteArray &tag, QByteArray &source) const;
public: QString extractRPath(ElfReader &reader) const;
ELF();
bool getLibInfo(const QString &lib, LibInfo &info) const override;
}; };
#endif // ELF_H #endif // ELF_H

View File

@ -473,10 +473,23 @@ bool Extracter::extractQml() {
} }
} }
QStringList toCopyQmlFiles;
for (const auto& plugin: qAsConst(plugins)) {
const auto qmlFiles = QDir(plugin).entryInfoList(QDir::Files);
for (const auto& qmlFile: qmlFiles) {
toCopyQmlFiles.push_back(qmlFile.absoluteFilePath());
}
}
// This function works very slow because use list mask
// solution: use the QSet and restriction comparese of the pathes for the mask argument.
// to-do optimise this function
if (!_fileManager->copyFolder(cnf->qtDir.getQmls(), if (!_fileManager->copyFolder(cnf->qtDir.getQmls(),
targetPath + distro.getQmlOutDir(), targetPath + distro.getQmlOutDir(),
DeployCore::debugExtensions() , DeployCore::debugExtensions() ,
&listItems, &plugins)) { &listItems,
&toCopyQmlFiles)) {
return false; return false;
} }

View File

@ -84,14 +84,14 @@ void LibInfo::setPriority(const LibPriority &value) {
_priority = value; _priority = value;
} }
QString LibInfo::getQtPath() const const QString &LibInfo::getRPath() const
{ {
return _qtPath; return _rpath;
} }
void LibInfo::setQtPath(const QString &value) void LibInfo::setRPath(const QString &value)
{ {
_qtPath = value; _rpath = value;
} }
WinAPI LibInfo::getWinApi() const { WinAPI LibInfo::getWinApi() const {
@ -124,7 +124,7 @@ QString LibInfo::toString() const {
return QString("LibInfo: path: '%0', name: '%1', qtPath: '%2', platform: '%3', dependencies: '%4'"). return QString("LibInfo: path: '%0', name: '%1', qtPath: '%2', platform: '%3', dependencies: '%4'").
arg(_path, arg(_path,
_name, _name,
_qtPath, _rpath,
DeployCore::platformToString(_platform), DeployCore::platformToString(_platform),
dependenciesList.join(", ")); dependenciesList.join(", "));
} }
@ -136,7 +136,7 @@ QString LibInfo::fullPath() const {
void LibInfo::clear() { void LibInfo::clear() {
_path = ""; _path = "";
_name = ""; _name = "";
_qtPath = ""; _rpath = "";
_platform = Platform::UnknownPlatform; _platform = Platform::UnknownPlatform;
_dependncies.clear(); _dependncies.clear();
_allDep.clear(); _allDep.clear();

View File

@ -42,8 +42,8 @@ public:
LibPriority getPriority() const; LibPriority getPriority() const;
void setPriority(const LibPriority &value); void setPriority(const LibPriority &value);
QString getQtPath() const; const QString& getRPath() const;
void setQtPath(const QString &value); void setRPath(const QString &value);
WinAPI getWinApi() const; WinAPI getWinApi() const;
void setWinApi(WinAPI winApi); void setWinApi(WinAPI winApi);
QtMajorVersion isDependetOfQt() const; QtMajorVersion isDependetOfQt() const;
@ -60,7 +60,7 @@ private:
QString _path; QString _path;
QSet<QString> _dependncies; QSet<QString> _dependncies;
bool _dependsOfGui; bool _dependsOfGui;
QString _qtPath; QString _rpath;
LibPriority _priority = NotFile; LibPriority _priority = NotFile;
WinAPI _winApi = WinAPI::NoWinAPI; WinAPI _winApi = WinAPI::NoWinAPI;

View File

@ -46,6 +46,11 @@ QStringList QML::extractImportsFromFile(const QString &filepath) const {
matcher.setPattern("/\\*(.*)\\*/"); matcher.setPattern("/\\*(.*)\\*/");
content.remove(matcher); content.remove(matcher);
// Replace optional imports to restrict option, because before Qt 6.3 The Qml app needee of optional qml packas.
content.replace("optional import", "import");
const auto list = content.split("\n"); const auto list = content.split("\n");
for (const QString &line : list) for (const QString &line : list)
for (QString &word : line.split(";", splitbehavior)) for (QString &word : line.split(";", splitbehavior))
@ -77,18 +82,19 @@ bool QML::extractImportsFromDir(const QString &path, bool recursive) {
for (const auto &import : qAsConst(imports)) { for (const auto &import : qAsConst(imports)) {
if (!_imports.contains(import)) { if (!_imports.contains(import)) {
_imports.insert(import); _imports.insert(import);
extractImportsFromDir(getPathFromImport(import), recursive); extractImportsFromDir(getPathFromImport(import), false);
} }
} }
} }
for (const auto& module: qAsConst(qmlmodule)) { for (const auto& module: qAsConst(qmlmodule)) {
QStringList imports = extractImportsFromQmlModule(module.absoluteFilePath()); QStringList imports = extractImportsFromQmlModule(module.absoluteFilePath());
imports += extractImportsFromFile(module.absoluteFilePath());
for (const auto &import : qAsConst(imports)) { for (const auto &import : qAsConst(imports)) {
if (!_imports.contains(import)) { if (!_imports.contains(import)) {
_imports.insert(import); _imports.insert(import);
extractImportsFromDir(getPathFromImport(import), recursive); extractImportsFromDir(getPathFromImport(import), false);
} }
} }
} }
@ -99,7 +105,7 @@ bool QML::extractImportsFromDir(const QString &path, bool recursive) {
auto importQtQml = "QtQml"; auto importQtQml = "QtQml";
if (!_imports.contains(importQtQml)) { if (!_imports.contains(importQtQml)) {
_imports.insert(importQtQml); _imports.insert(importQtQml);
extractImportsFromDir(getPathFromImport(importQtQml), recursive); extractImportsFromDir(getPathFromImport(importQtQml), false);
} }
} }

View File

@ -12,6 +12,9 @@ set(CMAKE_AUTOMOC ON)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui Qml Quick) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui Qml Quick)
set(CURRENT_PROJECT "TestQMLWidgets") set(CURRENT_PROJECT "TestQMLWidgets")
# needed for test RPATH functions
get_filename_component(QT_QT_ROOT "${Qt${QT_VERSION_MAJOR}Core_DIR}/../../.." ABSOLUTE)
set(CMAKE_BUILD_RPATH ${QT_QT_ROOT}/bin)
file(GLOB_RECURSE SOURCE_CPP file(GLOB_RECURSE SOURCE_CPP
"*.cpp" "*.h" "*.cpp" "*.h"

View File

@ -1,4 +1,3 @@
import QtQuick 2.10
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
Page { Page {

View File

@ -1,4 +1,3 @@
import QtQuick 2.10
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
Page { Page {

View File

@ -1,4 +1,3 @@
import QtQuick 2.10
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
Page { Page {

Some files were not shown because too many files have changed in this diff Show More