diff --git a/MainWidget.cpp b/MainWidget.cpp index 96ba179..dc1324b 100644 --- a/MainWidget.cpp +++ b/MainWidget.cpp @@ -21,10 +21,10 @@ void MainWidget::connect_operator() connect(ui->btnGenerate, &QPushButton::clicked, this, [=]() { generate(); }); } -void MainWidget::control_init() -{ - ui->plainTextEdit->setEnabled(false); -#if !defined (NDEBUG) +void MainWidget::control_init() +{ + // ui->plainTextEdit->setEnabled(false); +#if !defined(NDEBUG) ui->edBinary->setText("/home/typ/Downloads/build-QXmlEdit-Desktop_Qt_5_14_2_GCC_64bit-Release/build/qxmledit"); ui->edQtDir->setText("/home/typ/Qt5.14.2/5.14.2/gcc_64"); ui->edOutDir->setText("/home/typ/testpack"); @@ -40,7 +40,51 @@ void MainWidget::add_env_btn() ui->listWidget->addItem(env); } -void MainWidget::simple_log(const QString& info) { ui->plainTextEdit->appendPlainText(info + "\n"); } +void MainWidget::simple_log(const QString& info, bool enter) +{ + // dd + if (enter) { + ui->plainTextEdit->appendPlainText(info + "\n"); + + } else { + ui->plainTextEdit->appendPlainText(info); + } +} + +// 将某个文件夹拷贝到制定目录下 +bool MainWidget::copy_dir(const std::string& source_dir, const std::string& des_dir) +{ + if (!fs::exists(source_dir) || !fs::exists(des_dir)) { + return false; + } + + fs::path des_parent_dir = fs::path(des_dir).append(fs::path(source_dir).filename()); + if (!fs::exists(des_parent_dir)) { + fs::create_directories(des_parent_dir); + } + std::list paths{}; + for (const auto& entry : fs::directory_iterator(source_dir)) { + paths.push_back(entry); + } + + while (!paths.empty()) { + fs::path path = paths.front(); + paths.pop_front(); + + fs::path destination(boost::replace_all_copy(path.string(), source_dir, des_parent_dir.string())); + if (fs::is_directory(path)) { + if (!fs::exists(destination)) { + fs::create_directories(destination); + } + for (const auto& entry : fs::directory_iterator(path)) { + paths.push_back(entry); + } + continue; + } + fs::copy_file(path, destination, fs::copy_options::overwrite_existing); + } + return true; +} std::vector MainWidget::get_depend_on(const std::string& name, const std::vector& env) { @@ -68,25 +112,32 @@ std::vector MainWidget::get_depend_on(const std::string& name, cons return vec; } -std::vector MainWidget::handle_result(const std::vector& vec) +std::list MainWidget::handle_result(const std::vector& vec) { - std::vector ret; + std::list ret; for (const auto& data : vec) { if (data.empty()) { continue; } + + if (boost::contains(data, "not found")) { + simple_log(QString::fromStdString("未找到依赖:" + data), false); + continue; + } + std::string tdata = boost::replace_all_copy(data, "=>", ""); std::vector vt; boost::split(vt, tdata, boost::is_any_of(" ")); if (vt.size() != 4) { - QString info = "长度不对,原始数据:\n" + QString::fromStdString(data); - simple_log(info); + // QString info = "原始数据:" + QString::fromStdString(data); + // simple_log(info, false); continue; } if (boost::starts_with(vt[2], "/lib")) { continue; } ret.push_back(vt[2]); + // simple_log(QString::fromStdString(vt[2]), false); } return ret; } @@ -149,6 +200,7 @@ void MainWidget::generate() { ui->plainTextEdit->clear(); envs_.clear(); + sos_.clear(); binary_ = ui->edBinary->text().trimmed(); fs::path binary_dir = fs::path(binary_.toStdString()).parent_path(); @@ -161,4 +213,49 @@ void MainWidget::generate() auto retPrevious = get_depend_on(binary_.toStdString(), envs_); auto result = handle_result(retPrevious); + + std::vector dynamic_so{}; + std::copy(result.begin(), result.end(), std::back_inserter(dynamic_so)); + + // 处理 platform文件夹 + std::list platform{}; + fs::path qt_platform(ui->edQtDir->text().trimmed().toStdString()); + qt_platform.append("plugins/platforms"); + for (const auto& entry : fs::directory_iterator(qt_platform)) { + result.push_back(entry.path().string()); + } + + while (!result.empty()) { + std::string bin = result.front(); + result.pop_front(); + auto tmp_retPrevious = get_depend_on(bin, envs_); + auto tmp_result = handle_result(tmp_retPrevious); + for (const auto& data : tmp_result) { + auto iter = std::find(dynamic_so.begin(), dynamic_so.end(), data); + if (iter != dynamic_so.end()) { + continue; + } + dynamic_so.push_back(data); + result.push_back(data); + } + } + + fs::path out_dir(ui->edOutDir->text().trimmed().toStdString()); + if (!fs::exists(out_dir)) { + fs::create_directories(out_dir); + } + + for (const auto& data : dynamic_so) { + std::string purpose = fs::path(out_dir).append(fs::path(data).filename()).string(); + fs::copy_file(data, purpose, fs::copy_options::overwrite_existing); + } + + // 复制platform文件夹 + // fs::path qt_platform(ui->edQtDir->text().trimmed().toStdString()); + // qt_platform.append("plugins/platforms"); + // copy_dir(qt_platform.string(), out_dir.string()); + + // 复制主体文件 + fs::path out_binary = fs::path(out_dir).append(fs::path(binary_.toStdString()).filename()); + fs::copy_file(binary_.toStdString(), out_binary, fs::copy_options::overwrite_existing); } \ No newline at end of file diff --git a/MainWidget.h b/MainWidget.h index 509327a..9936f26 100644 --- a/MainWidget.h +++ b/MainWidget.h @@ -33,11 +33,13 @@ private: void add_env_btn(); void del_env_btn(); void generate(); - void simple_log(const QString& info); + void simple_log(const QString& info, bool enter = true); + // 将某个文件夹拷贝到制定目录下 + bool copy_dir(const std::string& source_dir, const std::string& des_dir); private: std::vector get_depend_on(const std::string& name, const std::vector& env); - std::vector handle_result(const std::vector& vec); + std::list handle_result(const std::vector& vec); private: static QString SelectDirectory(QWidget* parent, QLineEdit* pEdit, const QString& pre_path = ""); @@ -51,5 +53,6 @@ private: private: QString binary_{}; std::vector envs_{}; + std::vector sos_{}; }; #endif // MAINWIDGET_H