/* * Copyright (C) 2018-2021 QuasarApp. * Distributed under the lgplv3 software license, see the accompanying * Everyone is permitted to copy and distribute verbatim copies * of this license document, but changing it is not allowed. */ #include "deploycore.h" #include "metafilemanager.h" #include #include #include #include "filemanager.h" #include bool MetaFileManager::createRunScriptWindows(const QString &target) { auto cnf = DeployCore::_config; auto targetinfo = cnf->targets().value(target); if (!targetinfo.isValid()) { return false; } auto distro = cnf->getDistro(target); QFileInfo targetInfo(target); QString content; auto runScript = targetinfo.getRunScript(); QFile script(runScript); if (!script.open(QIODevice::ReadOnly)) { return false; } content = script.readAll(); script.close(); replace(toReplace(target, distro), content); QString fname = DeployCore::_config->getTargetDir(target) + QDir::separator() + targetInfo.baseName()+ ".bat"; QFile F(fname); if (!F.open(QIODevice::WriteOnly)) { return false; } F.write(content.toUtf8()); F.flush(); F.close(); _fileManager->addToDeployed(fname); return F.setPermissions(QFileDevice::ExeOther | QFileDevice::WriteOther | QFileDevice::ReadOther | QFileDevice::ExeUser | QFileDevice::WriteUser | QFileDevice::ReadUser | QFileDevice::ExeOwner | QFileDevice::WriteOwner | QFileDevice::ReadOwner); } bool MetaFileManager::createRunScriptLinux(const QString &target) { auto cnf = DeployCore::_config; auto targetinfo = cnf->targets().value(target); if (!cnf->targets().contains(target)) { return false; } auto distro = cnf->getDistro(target); QFileInfo targetInfo(target); QString content; auto runScript = targetinfo.getRunScript(); QFile script(runScript); if (!script.open(QIODevice::ReadOnly)) { return false; } content = script.readAll(); script.close(); replace(toReplace(target, distro), content); QString fname = DeployCore::_config->getTargetDir(target) + QDir::separator() + targetInfo.baseName()+ ".sh"; QFile F(fname); if (!F.open(QIODevice::WriteOnly)) { return false; } F.write(content.toUtf8()); F.flush(); F.close(); _fileManager->addToDeployed(fname); return F.setPermissions(QFileDevice::ExeOther | QFileDevice::WriteOther | QFileDevice::ReadOther | QFileDevice::ExeUser | QFileDevice::WriteUser | QFileDevice::ReadUser | QFileDevice::ExeOwner | QFileDevice::WriteOwner | QFileDevice::ReadOwner); } QString MetaFileManager::generateCustoScriptBlok(bool bat) const { QString res = ""; QString commentMarker = "# "; if (bat) { commentMarker = ":: "; } auto cstSh = QuasarAppUtils::Params::getArg("customScript", ""); if (cstSh.size()) { res = "\n" + commentMarker + "Begin Custom Script (generated by customScript flag)\n" "%0\n" + commentMarker + "End Custom Script\n" "\n"; res = res.arg(cstSh); } return res; } MetaFileManager::MetaFileManager(FileManager *manager): _fileManager(manager) { assert(_fileManager); } bool MetaFileManager::createRunScript(const QString &target) { QFileInfo info(target); auto sufix = info.completeSuffix(); if (sufix.contains("exe", Qt::CaseSensitive)) { return createRunScriptWindows(target); } if (sufix.isEmpty()) { return createRunScriptLinux(target); } return true; } bool MetaFileManager::createQConf(const QString &target) { auto cnf = DeployCore::_config; if (!cnf->targets().contains(target)) { return false; } auto distro = cnf->getDistro(target); QString content = "[Paths]\n" "Prefix= ." + distro.getRootDir(distro.getBinOutDir()) + "\n" "Libraries= ." + distro.getLibOutDir() + "\n" "Plugins= ." + distro.getPluginsOutDir() + "\n" "Imports= ." + distro.getQmlOutDir() + "\n" "Translations= ." + distro.getTrOutDir() + "\n" "Qml2Imports= ." + distro.getQmlOutDir() + "\n"; content.replace("//", "/"); content = QDir::fromNativeSeparators(content); QString fname = DeployCore::_config->getTargetDir(target) + distro.getBinOutDir() + "qt.conf"; QFile F(fname); if (!F.open(QIODevice::WriteOnly)) { return false; } F.write(content.toUtf8()); F.flush(); F.close(); _fileManager->addToDeployed(fname); return F.setPermissions(QFileDevice::ExeOther | QFileDevice::WriteOther | QFileDevice::ReadOther | QFileDevice::ExeUser | QFileDevice::WriteUser | QFileDevice::ReadUser | QFileDevice::ExeOwner | QFileDevice::WriteOwner | QFileDevice::ReadOwner); } QHash MetaFileManager::toReplace(const QString& target, const DistroModule& distro) const { QFileInfo targetInfo(target); QHash result = { {"CQT_BIN_PATH", distro.getBinOutDir()}, {"CQT_LIB_PATH", distro.getLibOutDir()}, {"CQT_QML_PATH", distro.getQmlOutDir()}, {"CQT_PLUGIN_PATH", distro.getPluginsOutDir()}, {"CQT_SYSTEM_LIB_PATH", distro.getLibOutDir() + DeployCore::systemLibsFolderName()}, {"CQT_BASE_NAME", targetInfo.baseName()} }; bool fGui = DeployCore::isGui(_mudulesMap.value(target)); if (targetInfo.completeSuffix().compare(".exe", Qt::CaseInsensitive) == 0) { result.insert("CQT_CUSTOM_SCRIPT_BLOCK", generateCustoScriptBlok(true)); // Run application as invoke of the console for consle applications // And run gui applciation in the detached mode. QString runCmd; if (fGui) { runCmd = "start \"" + targetInfo.baseName() + "\" /B " + "\"%BASE_DIR%" + distro.getBinOutDir() + targetInfo.fileName() + "\" %*"; } else { runCmd = "call \"%BASE_DIR%" + distro.getBinOutDir() + targetInfo.fileName() + "\" %*"; } result.insert("CQT_RUN_COMMAND", runCmd); } else { result.insert("CQT_CUSTOM_SCRIPT_BLOCK", generateCustoScriptBlok(false)); QString runCmd = "\"$BASE_DIR" + distro.getBinOutDir() + targetInfo.fileName() + "\" \"$@\" "; result.insert("CQT_RUN_COMMAND", runCmd); } return result; } void MetaFileManager::replace(const QHash &map, QString &content) { for (auto it = map.begin(); it != map.end(); ++it) { content = content.replace(it.key(), it.value()); } } void MetaFileManager::createRunMetaFiles(const QHash& modulesMap) { _mudulesMap = modulesMap; for (auto i = DeployCore::_config->targets().cbegin(); i != DeployCore::_config->targets().cend(); ++i) { if (i.value().fEnableRunScript() && !createRunScript(i.key())) { QuasarAppUtils::Params::log("Failed to create a run script: " + i.key(), QuasarAppUtils::Error); } if (!createQConf(i.key())) { QuasarAppUtils::Params::log("Failed to create the qt.conf file", QuasarAppUtils::Warning); } } }