#pragma once #include "common/goos/Interpreter.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::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_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); 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); 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); template void add_tool() { add_tool(std::make_shared()); } void clear_project(); /*! * 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::unordered_map> m_output_to_step; std::unordered_map> m_tools; PathMap m_path_map; };