#pragma once #include "common/goos/Interpreter.h" #include "common/util/FileUtil.h" #include "goalc/make/Tool.h" struct MakeStep { std::vector input; std::vector deps, outputs; goos::Object arg; std::string tool; std::string print() const; }; class MakeSystem { public: MakeSystem(const std::optional repl_config, const std::string& username = "#f"); void load_project_file(const std::string& file_path); goos::Object handle_defstep(const goos::Object& obj, goos::Arguments& args, const std::shared_ptr& env); goos::Object handle_basename(const goos::Object& obj, goos::Arguments& args, const std::shared_ptr& env); goos::Object handle_stem(const goos::Object& obj, goos::Arguments&, const std::shared_ptr& env); goos::Object handle_get_gsrc_path(const goos::Object& obj, goos::Arguments&, const std::shared_ptr& env); goos::Object handle_map_path(const goos::Object& obj, goos::Arguments& args, const std::shared_ptr& env); goos::Object handle_set_output_prefix(const goos::Object& obj, goos::Arguments& args, const std::shared_ptr& env); goos::Object handle_set_gsrc_folder(const goos::Object& obj, goos::Arguments& args, const std::shared_ptr& env); goos::Object handle_get_gsrc_folder(const goos::Object& obj, goos::Arguments& args, const std::shared_ptr& env); goos::Object handle_get_game_version_folder(const goos::Object& obj, goos::Arguments&, const std::shared_ptr& env); std::vector get_dependencies(const std::string& target) const; std::vector filter_dependencies(const std::vector& all_deps); bool make(const std::string& target, bool force, bool verbose, bool gen_report); void add_tool(std::shared_ptr tool); void set_constant(const std::string& name, const std::string& value); void set_constant(const std::string& name, bool value); void set_constant(const std::string& name, int value); template void add_tool() { add_tool(std::make_shared()); } void clear_project(); std::vector get_loaded_projects() const { return m_loaded_projects; } /*! * Get the prefix that the project has requested for all compiler outputs */ const std::string& compiler_output_prefix() const { return m_path_map.output_prefix; } private: void va_check(const goos::Object& form, const goos::Arguments& args, const std::vector>& unnamed, const std::unordered_map>>& named); void get_dependencies(const std::string& master_target, const std::string& output, std::vector* result_order, std::unordered_set* result_set) const; goos::Interpreter m_goos; std::optional m_repl_config; std::vector m_loaded_projects; std::unordered_map> m_output_to_step; std::unordered_map> m_tools; PathMap m_path_map; std::vector m_gsrc_folder; std::map m_gsrc_files = {}; };