jak-project/goalc/make/MakeSystem.h
Tyler Wilding 456d1ba536
goalc: add a performance report feature (#3519)
Adds a quick perf report feature to `goalc` that lets you compare how
much faster / slower it takes to compile the projects, with some simple
features like filtering the files, adjusting for how large of a margin
of error in the speeds you care about, and which test iteration you want
to compare against.

This is something I plan to use as I work more in `goalc` as an easy way
to track / show the results.


![image](https://github.com/open-goal/jak-project/assets/13153231/26f140c7-66d7-4162-994a-a71061e22857)
2024-05-15 22:52:16 -04:00

101 lines
3.9 KiB
C++

#pragma once
#include "common/goos/Interpreter.h"
#include "goalc/make/Tool.h"
struct MakeStep {
std::vector<std::string> input;
std::vector<std::string> deps, outputs;
goos::Object arg;
std::string tool;
std::string print() const;
};
class MakeSystem {
public:
MakeSystem(const std::optional<REPL::Config> 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<goos::EnvironmentObject>& env);
goos::Object handle_basename(const goos::Object& obj,
goos::Arguments& args,
const std::shared_ptr<goos::EnvironmentObject>& env);
goos::Object handle_stem(const goos::Object& obj,
goos::Arguments&,
const std::shared_ptr<goos::EnvironmentObject>& env);
goos::Object handle_get_gsrc_path(const goos::Object& obj,
goos::Arguments&,
const std::shared_ptr<goos::EnvironmentObject>& env);
goos::Object handle_map_path(const goos::Object& obj,
goos::Arguments& args,
const std::shared_ptr<goos::EnvironmentObject>& env);
goos::Object handle_set_output_prefix(const goos::Object& obj,
goos::Arguments& args,
const std::shared_ptr<goos::EnvironmentObject>& env);
goos::Object handle_set_gsrc_folder(const goos::Object& obj,
goos::Arguments& args,
const std::shared_ptr<goos::EnvironmentObject>& env);
goos::Object handle_get_gsrc_folder(const goos::Object& obj,
goos::Arguments& args,
const std::shared_ptr<goos::EnvironmentObject>& env);
goos::Object handle_get_game_version_folder(const goos::Object& obj,
goos::Arguments&,
const std::shared_ptr<goos::EnvironmentObject>& env);
std::vector<std::string> get_dependencies(const std::string& target) const;
std::vector<std::string> filter_dependencies(const std::vector<std::string>& all_deps);
bool make(const std::string& target, bool force, bool verbose, bool gen_report);
void add_tool(std::shared_ptr<Tool> 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 <typename T>
void add_tool() {
add_tool(std::make_shared<T>());
}
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<std::optional<goos::ObjectType>>& unnamed,
const std::unordered_map<std::string,
std::pair<bool, std::optional<goos::ObjectType>>>& named);
void get_dependencies(const std::string& master_target,
const std::string& output,
std::vector<std::string>* result_order,
std::unordered_set<std::string>* result_set) const;
goos::Interpreter m_goos;
std::optional<REPL::Config> m_repl_config;
std::unordered_map<std::string, std::shared_ptr<MakeStep>> m_output_to_step;
std::unordered_map<std::string, std::shared_ptr<Tool>> m_tools;
PathMap m_path_map;
std::vector<std::string> m_gsrc_folder;
std::map<std::string, std::string> m_gsrc_files = {};
};