ProjectBuilder.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /*
  2. * Copyright (c) 2022, Itamar S. <itamar8910@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include "Project.h"
  8. #include "TerminalWrapper.h"
  9. #include <AK/Error.h>
  10. #include <AK/Noncopyable.h>
  11. namespace HackStudio {
  12. class ProjectBuilder {
  13. AK_MAKE_NONCOPYABLE(ProjectBuilder);
  14. public:
  15. ProjectBuilder(NonnullRefPtr<TerminalWrapper>, Project const&);
  16. ~ProjectBuilder() = default;
  17. ErrorOr<void> build(StringView active_file);
  18. ErrorOr<void> run(StringView active_file);
  19. private:
  20. enum class IsSerenityRepo {
  21. No,
  22. Yes
  23. };
  24. ErrorOr<void> build_serenity_component();
  25. ErrorOr<void> run_serenity_component();
  26. ErrorOr<void> initialize_build_directory();
  27. Optional<ByteString> find_cmake_file_for(StringView file_path) const;
  28. ByteString generate_cmake_file_content() const;
  29. ErrorOr<void> update_active_file(StringView active_file);
  30. ByteString build_directory() const;
  31. struct LibraryInfo {
  32. ByteString path;
  33. Vector<ByteString> dependencies {};
  34. };
  35. static HashMap<ByteString, NonnullOwnPtr<LibraryInfo>> get_defined_libraries();
  36. static void for_each_library_definition(Function<void(ByteString, ByteString)>);
  37. static void for_each_library_dependencies(Function<void(ByteString, Vector<StringView>)>);
  38. static ErrorOr<ByteString> component_name(StringView cmake_file_path);
  39. static ErrorOr<void> verify_cmake_is_installed();
  40. static ErrorOr<void> verify_make_is_installed();
  41. ByteString m_project_root;
  42. Project const& m_project;
  43. NonnullRefPtr<TerminalWrapper> m_terminal;
  44. IsSerenityRepo m_is_serenity { IsSerenityRepo::No };
  45. ByteString m_serenity_component_cmake_file;
  46. ByteString m_serenity_component_name;
  47. };
  48. }