4
1
mirror of https://github.com/QuasarApp/CQtDeployer.git synced 2025-05-06 06:29:35 +00:00

big refactoring begin

This commit is contained in:
Andrei Yankovich 2019-09-07 12:01:20 +03:00
parent 2655afe0be
commit a454dc3c06
9 changed files with 453 additions and 338 deletions

@ -49,6 +49,7 @@ SOURCES += \
deploy.cpp \
deploycore.cpp \
deployparams.cpp \
envirement.cpp \
filemanager.cpp \
pe.cpp \
igetlibinfo.cpp \
@ -65,6 +66,7 @@ HEADERS += \
deploy_global.h \
deploycore.h \
deployparams.h \
envirement.h \
filemanager.h \
pe.h \
igetlibinfo.h \

@ -1,6 +1,347 @@
#include "cqt.h"
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include "deploycore.h"
#include "quasarapp.h"
CQT::CQT(const QString &targetDir)
{
bool CQT::parseParams() {
switch (DeployCore::getMode()) {
case RunMode::Info: {
qInfo() << "selected info mode" ;
if (!parseQtInfoMode()) {
qCritical() << "info mode fail!";
return false;
}
return true;
}
case RunMode::Clear: {
qInfo() << "selected clear mode" ;
if (!parseQtClearMode()) {
qCritical() << "clear mode fail!";
return false;
}
return true;
}
case RunMode::Deploy: {
qInfo() << "selected deploy mode" ;
if (!parseQtDeployMode()) {
qCritical() << "deploy mode fail!";
return false;
}
return true;
}
}
return false;
}
DeployConfig CQT::config() const {
}
void CQT::setConfig(const DeployConfig &config) {
_config = config;
}
bool CQT::createFromDeploy() const {
}
bool CQT::loadFromFile() {
}
bool CQT::parseQtDeployMode() {
}
bool CQT::parseQtInfoMode() {
}
bool CQT::parseQtClearMode() {
deploy->setTargetDir("./");
}
void CQT::setTargetDir(const QString &target) {
if (QuasarAppUtils::Params::isEndable("targetDir")) {
targetDir = QFileInfo(QuasarAppUtils::Params::getStrArg("targetDir")).absoluteFilePath();
} else if (target.size()) {
targetDir = QFileInfo(target).absoluteFilePath();
} else {
if (targets.size())
targetDir = QFileInfo(targets.begin().key()).absolutePath() + "/Distro";
targetDir = QFileInfo("./Distro").absoluteFilePath();
qInfo () << "flag targetDir not used." << "use default target dir :" << targetDir;
}
_fileManager.loadDeployemendFiles(targetDir);
}
bool CQT::setTargets(const QStringList &value) {
bool isfillList = false;
for (auto &i : value) {
QFileInfo targetInfo(i);
if (i.isEmpty())
continue;
if (targetInfo.isFile()) {
auto sufix = targetInfo.completeSuffix();
targets.insert(QDir::fromNativeSeparators(i), sufix.isEmpty());
isfillList = true;
}
else if (targetInfo.isDir()) {
if (!setBinDir(i)) {
DeployCore::verboseLog(i + " du not contains executable binaries!");
continue;
}
isfillList = true;
} else {
DeployCore::verboseLog(targetInfo.absoluteFilePath() + " not exits!");
}
}
if (!isfillList)
return false;
setTargetDir();
return true;
}
bool CQT::setTargetsRecursive(const QString &dir) {
if (!setBinDir(dir, true)) {
qWarning() << "setBinDir failed!";
return false;
}
setTargetDir();
return true;
}
bool CQT::setBinDir(const QString &dir, bool recursive) {
QDir d(dir);
if (dir.isEmpty() || !d.exists()) {
DeployCore::verboseLog(dir + " dir not exits!");
return false;
}
DeployCore::verboseLog("setBinDir check path: " + dir);
QFileInfoList list;
if (recursive) {
list = d.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
} else {
list = d.entryInfoList(QDir::Files | QDir::NoDotAndDotDot);
}
bool result = false;
for (auto &file : list) {
if (file.isDir()) {
result |= setBinDir(file.absoluteFilePath(), recursive);
continue;
}
auto sufix = file.completeSuffix();
if (!((!recursive && sufix.isEmpty()) || sufix.contains("dll", Qt::CaseInsensitive) ||
sufix.contains("so", Qt::CaseInsensitive) || sufix.contains("exe", Qt::CaseInsensitive))) {
continue;
}
result = true;
targets.insert(QDir::fromNativeSeparators(file.absoluteFilePath()), sufix.isEmpty());
}
return result;
}
void CQT::initIgnoreList()
{
if (QuasarAppUtils::Params::isEndable("ignore")) {
auto list = QuasarAppUtils::Params::getStrArg("ignore").split(',');
ignoreList.append(list);
}
if (QuasarAppUtils::Params::isEndable("noLibc")) {
ignoreList.append("libc.so");
}
}
void CQT::initIgnoreEnvList() {
if (QuasarAppUtils::Params::isEndable("ignoreEnv")) {
auto ignoreList = QuasarAppUtils::Params::getStrArg("ignoreEnv").split(',');
for (auto &i : ignoreList) {
auto path = QFileInfo(i).absoluteFilePath();
if (path.right(1) == "/" || path.right(1) == "\\") {
path.remove(path.size() - 1, 1);
}
ignoreEnvList.append(path);
}
}
}
void CQT::setQmlScaner(const QString &value) {
externQmlScaner = QDir::fromNativeSeparators(value);
QuasarAppUtils::Params::verboseLog("qmlScaner = " + externQmlScaner,
QuasarAppUtils::VerboseLvl::Info);
deployQml = QFileInfo(externQmlScaner).isFile();
}
void CQT::setQmake(const QString &value) {
qmake = QDir::fromNativeSeparators(value);
QFileInfo info(qmake);
QDir dir = info.absoluteDir();
if (!dir.cdUp() || !dir.cd("qml")) {
QuasarAppUtils::Params::verboseLog("get qml fail!");
return;
}
qmlDir = dir.absolutePath();
QuasarAppUtils::Params::verboseLog("qmlDir = " + qmlDir);
dir = (info.absoluteDir());
if (!dir.cdUp() || !dir.cd("translations")) {
QuasarAppUtils::Params::verboseLog("get translations fail!");
return;
}
translationDir = dir.absolutePath();
QuasarAppUtils::Params::verboseLog("translations = " + translationDir);
}
void CQT::setQtDir(const QString &value) {
DeployCore::qtDir = QDir::fromNativeSeparators(value);
addEnv(DeployCore::qtDir);
addEnv(DeployCore::qtDir + "/lib");
addEnv(DeployCore::qtDir + "/bin");
}
void CQT::setExtraPath(const QStringList &value) {
QDir dir;
for (auto i : value) {
QFileInfo info(i);
if (info.isDir()) {
if (targets.contains(info.absoluteFilePath())) {
QuasarAppUtils::Params::verboseLog("skip the extra lib path becouse it is target!");
continue;
}
dir.setPath(info.absoluteFilePath());
DeployCore::extraPaths.push_back(
QDir::fromNativeSeparators(info.absoluteFilePath()));
addEnv(recursiveInvairement(0, dir));
} else {
QuasarAppUtils::Params::verboseLog(i + " does not exist! and skiped");
}
}
}
void CQT::setExtraPlugins(const QStringList &value) {
for (auto i : value) {
QFileInfo info(i);
if (info.exists()) {
extraPlugins.append(info.absoluteFilePath());
} else {
QuasarAppUtils::Params::verboseLog(i + " does not exist! and skiped");
}
}
}
QString CQT::recursiveInvairement(int depch, QDir &dir) {
char separator = ':';
#ifdef Q_OS_WIN
separator = ';';
#endif
if (!dir.exists() || depch >= depchLimit) {
return dir.absolutePath();
}
QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
QString res = "";
for (QFileInfo &i : list) {
dir.cd(i.fileName());
QString temp = recursiveInvairement(depch + 1, dir);
res += (res.size())? separator + temp: temp;
dir.cdUp();
}
res += (res.size())? separator + dir.absolutePath(): dir.absolutePath();
return res;
}
void CQT::initEnvirement() {
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
addEnv(env.value("LD_LIBRARY_PATH"));
addEnv(env.value("PATH"));
if (QuasarAppUtils::Params::isEndable("deploySystem")) {
QStringList dirs;
if (!QuasarAppUtils::Params::isEndable("noLibc"))
dirs.append(getDirsRecursive("/lib"));
dirs.append(getDirsRecursive("/usr/lib"));
for (auto &&i : dirs) {
addEnv(i);
}
}
if (deployEnvironment.size() < 2) {
qWarning() << "system environment is empty";
}
}
QStringList CQT::getDirsRecursive(const QString &path) {
QDir dir(path);
QStringList res;
auto list = dir.entryInfoList(QDir::Dirs| QDir::NoDotAndDotDot);
for (auto &&subDir: list) {
res.push_back(subDir.absoluteFilePath());
res.append(getDirsRecursive(subDir.absoluteFilePath()));
}
return res;
}
CQT::CQT() {
}

@ -3,8 +3,32 @@
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QStringList>
#include <QMap>
#include <QDir>
struct DeployConfig {
QString qmake = "";
QString targetDir = "";
QString qmlDir = "";
QString translationDir = "";
QString externQmlScaner = "";
int depchLimit = 0;
bool deployQml = false;
QStringList ignoreList;
QStringList extraPlugins;
QString appDir;
QString qtDir;
QStringList extraPaths;
/**
* @brief targets
* key - path
* value - create wrapper
*/
QMap<QString, bool> targets;
};
/**
* @brief The CQT class - it is wrapper for cqt file. qcn it is configuration file of deploying project.
*/
@ -12,12 +36,41 @@ class CQT
{
private:
DeployConfig _config;
bool createFromDeploy() const;
bool loadFromFile();
bool parseQtDeployMode();
bool parseQtInfoMode();
bool parseQtClearMode();
void setTargetDir(const QString &target);
bool setTargets(const QStringList &value);
bool setTargetsRecursive(const QString &dir);
bool setBinDir(const QString &dir, bool recursive);
void initIgnoreList();
void initIgnoreEnvList();
void setQmlScaner(const QString &value);
void setQmake(const QString &value);
void setQtDir(const QString &value);
void setExtraPath(const QStringList &value);
void setExtraPlugins(const QStringList &value);
QString recursiveInvairement(int depch, QDir &dir);
void initEnvirement();
QStringList getDirsRecursive(const QString &path);
public:
CQT(const QString& targetDir);
CQT();
bool parseParams();
DeployConfig config() const;
void setConfig(const DeployConfig &config);
};
#endif // CQT_H

@ -32,56 +32,8 @@ void Deploy::setDeployQml(bool value) { deployQml = value; }
QString Deploy::getQmlScaner() const { return externQmlScaner; }
void Deploy::setQmlScaner(const QString &value) {
externQmlScaner = QDir::fromNativeSeparators(value);
QuasarAppUtils::Params::verboseLog("qmlScaner = " + externQmlScaner,
QuasarAppUtils::VerboseLvl::Info);
deployQml = QFileInfo(externQmlScaner).isFile();
}
QString Deploy::getQmake() const { return qmake; }
void Deploy::setQmake(const QString &value) {
qmake = QDir::fromNativeSeparators(value);
QFileInfo info(qmake);
QDir dir = info.absoluteDir();
if (!dir.cdUp() || !dir.cd("qml")) {
QuasarAppUtils::Params::verboseLog("get qml fail!");
return;
}
qmlDir = dir.absolutePath();
QuasarAppUtils::Params::verboseLog("qmlDir = " + qmlDir);
dir = (info.absoluteDir());
if (!dir.cdUp() || !dir.cd("translations")) {
QuasarAppUtils::Params::verboseLog("get translations fail!");
return;
}
translationDir = dir.absolutePath();
QuasarAppUtils::Params::verboseLog("translations = " + translationDir);
}
void Deploy::setTargetDir(const QString &target) {
if (QuasarAppUtils::Params::isEndable("targetDir")) {
targetDir = QFileInfo(QuasarAppUtils::Params::getStrArg("targetDir")).absoluteFilePath();
} else if (target.size()) {
targetDir = QFileInfo(target).absoluteFilePath();
} else {
if (targets.size())
targetDir = QFileInfo(targets.begin().key()).absolutePath() + "/Distro";
targetDir = QFileInfo("./Distro").absoluteFilePath();
qInfo () << "flag targetDir not used." << "use default target dir :" << targetDir;
}
_fileManager.loadDeployemendFiles(targetDir);
}
void Deploy::clear(bool force) {
_fileManager.clear(targetDir, force);
}
@ -98,91 +50,6 @@ bool Deploy::deployMSVC() {
return _fileManager.copyFile(msvcInstaller, targetDir);
}
bool Deploy::setTargets(const QStringList &value) {
bool isfillList = false;
for (auto &i : value) {
QFileInfo targetInfo(i);
if (i.isEmpty())
continue;
if (targetInfo.isFile()) {
auto sufix = targetInfo.completeSuffix();
targets.insert(QDir::fromNativeSeparators(i), sufix.isEmpty());
isfillList = true;
}
else if (targetInfo.isDir()) {
if (!setBinDir(i)) {
DeployCore::verboseLog(i + " du not contains executable binaries!");
continue;
}
isfillList = true;
} else {
DeployCore::verboseLog(targetInfo.absoluteFilePath() + " not exits!");
}
}
if (!isfillList)
return false;
setTargetDir();
return true;
}
bool Deploy::setTargetsRecursive(const QString &dir) {
if (!setBinDir(dir, true)) {
qWarning() << "setBinDir failed!";
return false;
}
setTargetDir();
return true;
}
bool Deploy::setBinDir(const QString &dir, bool recursive) {
QDir d(dir);
if (dir.isEmpty() || !d.exists()) {
DeployCore::verboseLog(dir + " dir not exits!");
return false;
}
DeployCore::verboseLog("setBinDir check path: " + dir);
QFileInfoList list;
if (recursive) {
list = d.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
} else {
list = d.entryInfoList(QDir::Files | QDir::NoDotAndDotDot);
}
bool result = false;
for (auto &file : list) {
if (file.isDir()) {
result |= setBinDir(file.absoluteFilePath(), recursive);
continue;
}
auto sufix = file.completeSuffix();
if (!((!recursive && sufix.isEmpty()) || sufix.contains("dll", Qt::CaseInsensitive) ||
sufix.contains("so", Qt::CaseInsensitive) || sufix.contains("exe", Qt::CaseInsensitive))) {
continue;
}
result = true;
targets.insert(QDir::fromNativeSeparators(file.absoluteFilePath()), sufix.isEmpty());
}
return result;
}
bool Deploy::createRunScript(const QString &target) {
QString content =
@ -264,35 +131,7 @@ bool Deploy::createQConf() {
QFileDevice::ReadOwner);
}
void Deploy::initIgnoreList()
{
if (QuasarAppUtils::Params::isEndable("ignore")) {
auto list = QuasarAppUtils::Params::getStrArg("ignore").split(',');
ignoreList.append(list);
}
if (QuasarAppUtils::Params::isEndable("noLibc")) {
ignoreList.append("libc.so");
}
}
void Deploy::initIgnoreEnvList()
{
if (QuasarAppUtils::Params::isEndable("ignoreEnv")) {
auto ignoreList = QuasarAppUtils::Params::getStrArg("ignoreEnv").split(',');
for (auto &i : ignoreList) {
auto path = QFileInfo(i).absoluteFilePath();
if (path.right(1) == "/" || path.right(1) == "\\") {
path.remove(path.size() - 1, 1);
}
ignoreEnvList.append(path);
}
}
}
void Deploy::deploy() {
qInfo() << "target deploy started!!";
@ -353,51 +192,13 @@ void Deploy::deploy() {
_fileManager.saveDeploymendFiles(targetDir);
qInfo() << "deploy done!";
}
QString Deploy::getQtDir() const { return DeployCore::qtDir; }
void Deploy::setQtDir(const QString &value) {
DeployCore::qtDir = QDir::fromNativeSeparators(value);
addEnv(DeployCore::qtDir);
addEnv(DeployCore::qtDir + "/lib");
addEnv(DeployCore::qtDir + "/bin");
}
void Deploy::setExtraPath(const QStringList &value) {
QDir dir;
for (auto i : value) {
QFileInfo info(i);
if (info.isDir()) {
if (targets.contains(info.absoluteFilePath())) {
QuasarAppUtils::Params::verboseLog("skip the extra lib path becouse it is target!");
continue;
}
dir.setPath(info.absoluteFilePath());
DeployCore::extraPaths.push_back(
QDir::fromNativeSeparators(info.absoluteFilePath()));
addEnv(recursiveInvairement(0, dir));
} else {
QuasarAppUtils::Params::verboseLog(i + " does not exist! and skiped");
}
}
}
void Deploy::setExtraPlugins(const QStringList &value) {
for (auto i : value) {
QFileInfo info(i);
if (info.exists()) {
extraPlugins.append(info.absoluteFilePath());
} else {
QuasarAppUtils::Params::verboseLog(i + " does not exist! and skiped");
}
}
}
void Deploy::setDepchLimit(int value) { depchLimit = value; }
int Deploy::find(const QString &str, const QStringList &list) const {
@ -408,34 +209,6 @@ int Deploy::find(const QString &str, const QStringList &list) const {
return -1;
}
QString Deploy::recursiveInvairement(int depch, QDir &dir) {
char separator = ':';
#ifdef Q_OS_WIN
separator = ';';
#endif
if (!dir.exists() || depch >= depchLimit) {
return dir.absolutePath();
}
QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
QString res = "";
for (QFileInfo &i : list) {
dir.cd(i.fileName());
QString temp = recursiveInvairement(depch + 1, dir);
res += (res.size())? separator + temp: temp;
dir.cdUp();
}
res += (res.size())? separator + dir.absolutePath(): dir.absolutePath();
return res;
}
bool Deploy::copyPlugin(const QString &plugin) {
QStringList listItems;
@ -817,43 +590,6 @@ void Deploy::extract(const QString &file) {
}
void Deploy::initEnvirement() {
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
addEnv(env.value("LD_LIBRARY_PATH"));
addEnv(env.value("PATH"));
if (QuasarAppUtils::Params::isEndable("deploySystem")) {
QStringList dirs;
if (!QuasarAppUtils::Params::isEndable("noLibc"))
dirs.append(getDirsRecursive("/lib"));
dirs.append(getDirsRecursive("/usr/lib"));
for (auto &&i : dirs) {
addEnv(i);
}
}
if (deployEnvironment.size() < 2) {
qWarning() << "system environment is empty";
}
}
QStringList Deploy::getDirsRecursive(const QString &path) {
QDir dir(path);
QStringList res;
auto list = dir.entryInfoList(QDir::Dirs| QDir::NoDotAndDotDot);
for (auto &&subDir: list) {
res.push_back(subDir.absoluteFilePath());
res.append(getDirsRecursive(subDir.absoluteFilePath()));
}
return res;
}
Deploy::Deploy() {
#ifdef Q_OS_LINUX
appDir = QuasarAppUtils::Params::getStrArg("appPath");

@ -17,31 +17,10 @@
class DEPLOYSHARED_EXPORT Deploy {
private:
bool deployQml = false;
int depchLimit = 0;
QString externQmlScaner = "";
QString qmake = "";
/**
* @brief targets
* key - path
* value - create wrapper
*/
QMap<QString, bool> targets;
QString targetDir = "";
QString qmlDir = "";
QString translationDir = "";
QStringList deployEnvironment;
QStringList neadedLibs;
QStringList systemLibs;
QStringList ignoreList;
QStringList ignoreEnvList;
QStringList extraPlugins;
QString appDir;
DependenciesScanner scaner;
FileManager _fileManager;

@ -14,8 +14,8 @@
#include <QFileInfo>
#include <QLibraryInfo>
QString DeployCore::qtDir = "";
QStringList DeployCore::extraPaths = QStringList();
//QString DeployCore::qtDir = "";
//QStringList DeployCore::extraPaths = QStringList();
QtModuleEntry DeployCore::qtModuleEntries[] = {
@ -200,7 +200,6 @@ void DeployCore::help() {
}
bool DeployCore::parseQtClearMode(Deploy *deploy) {
deploy->setTargetDir("./");
deploy->clear(QuasarAppUtils::Params::isEndable("force-clear"));
return true;
@ -314,45 +313,6 @@ bool DeployCore::parseQtDeployMode(Deploy *deploy) {
}
bool DeployCore::parseQt(Deploy *deploy) {
switch (getMode()) {
case RunMode::Info: {
qInfo() << "selected info mode" ;
if (!parseQtInfoMode()) {
qCritical() << "info mode fail!";
return false;
}
return true;
}
case RunMode::Clear: {
qInfo() << "selected clear mode" ;
if (!parseQtClearMode(deploy)) {
qCritical() << "clear mode fail!";
return false;
}
return true;
}
case RunMode::Deploy: {
qInfo() << "selected deploy mode" ;
if (!parseQtDeployMode(deploy)) {
qCritical() << "deploy mode fail!";
return false;
}
deploy->deploy();
qInfo() << "deploy done!";
return true;
}
}
return false;
}
QStringList DeployCore::extractTranslation(const QStringList &libs) {

@ -60,9 +60,6 @@ private:
static QString getMSVCName(MSVCVersion msvc);
static QString getMSVCVersion(MSVCVersion msvc);
static bool parseQtDeployMode(Deploy *deploy);
static bool parseQtInfoMode();
static bool parseQtClearMode(Deploy *deploy);
public:
enum QtModule : quint64
{
@ -123,8 +120,7 @@ public:
DeployCore() = delete;
static QString qtDir;
static QStringList extraPaths;
static QtModuleEntry qtModuleEntries[];
static MSVCVersion getMSVC(const QString & _qmake);

26
Deploy/envirement.cpp Normal file

@ -0,0 +1,26 @@
#include "envirement.h"
QStringList Envirement::deployEnvironment() const
{
return _deployEnvironment;
}
void Envirement::setDeployEnvironment(const QStringList &deployEnvironment)
{
_deployEnvironment = deployEnvironment;
}
QStringList Envirement::ignoreEnvList() const
{
return _ignoreEnvList;
}
void Envirement::setIgnoreEnvList(const QStringList &ignoreEnvList)
{
_ignoreEnvList = ignoreEnvList;
}
Envirement::Envirement()
{
}

22
Deploy/envirement.h Normal file

@ -0,0 +1,22 @@
#ifndef ENVIREMENT_H
#define ENVIREMENT_H
#include <QStringList>
class Envirement
{
private:
QStringList _ignoreEnvList;
QStringList _deployEnvironment;
public:
Envirement();
QStringList deployEnvironment() const;
void setDeployEnvironment(const QStringList &deployEnvironment);
QStringList ignoreEnvList() const;
void setIgnoreEnvList(const QStringList &ignoreEnvList);
};
#endif // ENVIREMENT_H