diff --git a/Userland/DevTools/HackStudio/HackStudioWidget.cpp b/Userland/DevTools/HackStudio/HackStudioWidget.cpp index 1edf5cb425..a331c88198 100644 --- a/Userland/DevTools/HackStudio/HackStudioWidget.cpp +++ b/Userland/DevTools/HackStudio/HackStudioWidget.cpp @@ -162,6 +162,8 @@ HackStudioWidget::HackStudioWidget(String path_to_project) } }; } + + m_project_builder = make(*m_terminal_wrapper, *m_project); } void HackStudioWidget::update_actions() @@ -923,20 +925,20 @@ String HackStudioWidget::get_project_executable_path() const return String::formatted("{}/{}", m_project->root_path(), LexicalPath::basename(m_project->root_path())); } -void HackStudioWidget::build(TerminalWrapper& wrapper) +void HackStudioWidget::build() { - if (active_file().ends_with(".js")) - wrapper.run_command(String::formatted("js -A {}", active_file())); - else - wrapper.run_command("make"); + auto result = m_project_builder->build(active_file()); + if (result.is_error()) { + GUI::MessageBox::show(window(), String::formatted("{}", result.error()), "Build failed", GUI::MessageBox::Type::Error); + } } -void HackStudioWidget::run(TerminalWrapper& wrapper) +void HackStudioWidget::run() { - if (active_file().ends_with(".js")) - wrapper.run_command(String::formatted("js {}", active_file())); - else - wrapper.run_command("make run"); + auto result = m_project_builder->run(active_file()); + if (result.is_error()) { + GUI::MessageBox::show(window(), String::formatted("{}", result.error()), "Run failed", GUI::MessageBox::Type::Error); + } } void HackStudioWidget::hide_action_tabs() @@ -1065,7 +1067,7 @@ NonnullRefPtr HackStudioWidget::create_build_action() return; reveal_action_tab(*m_terminal_wrapper); - build(*m_terminal_wrapper); + build(); m_stop_action->set_enabled(true); }); } @@ -1074,7 +1076,7 @@ NonnullRefPtr HackStudioWidget::create_run_action() { return GUI::Action::create("&Run", { Mod_Ctrl, Key_R }, Gfx::Bitmap::try_load_from_file("/res/icons/16x16/program-run.png").release_value_but_fixme_should_propagate_errors(), [this](auto&) { reveal_action_tab(*m_terminal_wrapper); - run(*m_terminal_wrapper); + run(); m_stop_action->set_enabled(true); }); } diff --git a/Userland/DevTools/HackStudio/HackStudioWidget.h b/Userland/DevTools/HackStudio/HackStudioWidget.h index 7a9ea47fe0..709a0d50e7 100644 --- a/Userland/DevTools/HackStudio/HackStudioWidget.h +++ b/Userland/DevTools/HackStudio/HackStudioWidget.h @@ -18,6 +18,7 @@ #include "Git/GitWidget.h" #include "Locator.h" #include "Project.h" +#include "ProjectBuilder.h" #include "ProjectFile.h" #include "TerminalWrapper.h" #include "ToDoEntriesWidget.h" @@ -133,8 +134,8 @@ private: void create_project_tab(GUI::Widget& parent); void configure_project_tree_view(); - void run(TerminalWrapper& wrapper); - void build(TerminalWrapper& wrapper); + void run(); + void build(); void hide_action_tabs(); bool any_document_is_dirty() const; @@ -228,5 +229,6 @@ private: Mode m_mode { Mode::Code }; OwnPtr m_coredump_inspector; + OwnPtr m_project_builder; }; } diff --git a/Userland/DevTools/HackStudio/ProjectBuilder.cpp b/Userland/DevTools/HackStudio/ProjectBuilder.cpp index fea73e59fb..cf9cc7077f 100644 --- a/Userland/DevTools/HackStudio/ProjectBuilder.cpp +++ b/Userland/DevTools/HackStudio/ProjectBuilder.cpp @@ -158,9 +158,13 @@ void ProjectBuilder::generate_cmake_library_definitions(StringBuilder& builder) { Vector arguments = { "sh", "-c", "find Userland/Libraries -name CMakeLists.txt | xargs grep serenity_lib" }; auto res = Core::command("/bin/sh", arguments, {}); + if (res.is_error()) { + warnln("{}", res.error()); + return; + } static const Regex parse_library_definition(R"~~~(.+:serenity_lib[c]?\((\w+) (\w+)\).*)~~~"); - for (auto& line : res->stdout.split('\n')) { + for (auto& line : res.value().stdout.split('\n')) { RegexResult result; if (!parse_library_definition.search(line, result)) @@ -180,9 +184,13 @@ void ProjectBuilder::generate_cmake_library_dependencies(StringBuilder& builder) { Vector arguments = { "sh", "-c", "find Userland/Libraries -name CMakeLists.txt | xargs grep target_link_libraries" }; auto res = Core::command("/bin/sh", arguments, {}); + if (res.is_error()) { + warnln("{}", res.error()); + return; + } static const Regex parse_library_definition(R"~~~(.+:target_link_libraries\((\w+) ([\w\s]+)\).*)~~~"); - for (auto& line : res->stdout.split('\n')) { + for (auto& line : res.value().stdout.split('\n')) { RegexResult result; if (!parse_library_definition.search(line, result)) @@ -201,7 +209,7 @@ void ProjectBuilder::generate_cmake_library_dependencies(StringBuilder& builder) ErrorOr ProjectBuilder::verify_cmake_is_installed() { auto res = Core::command("cmake --version", {}); - if (res.has_value() && res->exit_code == 0) + if (!res.is_error() && res.value().exit_code == 0) return {}; return Error::from_string_literal("CMake port is not installed"sv); }