Skip to content

Refactor Args constructable class to static class #202

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Mar 28, 2022
9 changes: 5 additions & 4 deletions bootstrap/main.buildcc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,13 @@ static void hybrid_simple_example_cb(BaseTarget &target,
const BaseTarget &libbuildcc);

int main(int argc, char **argv) {
Args args;
Args::Init();
ArgToolchain custom_toolchain_arg;
args.AddToolchain("host", "Host Toolchain", custom_toolchain_arg);
args.Parse(argc, argv);
Args::AddToolchain("host", "Host Toolchain", custom_toolchain_arg);
Args::Parse(argc, argv);

Register reg(args);
Register reg;
;
reg.Clean(clean_cb);

BaseToolchain toolchain = custom_toolchain_arg.ConstructToolchain();
Expand Down
1 change: 1 addition & 0 deletions buildcc/lib/args/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ add_library(mock_args
)
target_include_directories(mock_args PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/mock
)
target_compile_options(mock_args PUBLIC
${TEST_COMPILE_FLAGS} ${BUILD_COMPILE_FLAGS}
Expand Down
45 changes: 18 additions & 27 deletions buildcc/lib/args/include/args/args.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,26 +88,30 @@ struct ArgTarget {
class Args {
public:
public:
Args() { Initialize(); }
Args() = delete;
Args(const Args &) = delete;
Args(Args &&) = delete;

static void Init();
static void Deinit();

/**
* @brief Parse command line information to CLI11
*
* @param argc from int main(int argc, char ** argv)
* @param argv from int main(int argc, char ** argv)
*/
void Parse(int argc, const char *const *argv);
static void Parse(int argc, const char *const *argv);

/**
* @brief Modifiable reference to CLI::App (CLI11)
*/
CLI::App &Ref() { return app_; }
static CLI::App &Ref();

/**
* @brief Constant reference to CLI::App (CLI11)
*/
const CLI::App &ConstRef() const { return app_; }
static const CLI::App &ConstRef();

// Setters

Expand All @@ -117,9 +121,9 @@ class Args {
* @param out Receive the toolchain information through the CLI
* @param initial Set the default toolchain information as a fallback
*/
void AddToolchain(const std::string &name, const std::string &description,
ArgToolchain &out,
const ArgToolchain &initial = ArgToolchain());
static void AddToolchain(const std::string &name,
const std::string &description, ArgToolchain &out,
const ArgToolchain &initial = ArgToolchain());

/**
* @brief Add Target config commands with a unique name and description
Expand All @@ -129,31 +133,18 @@ class Args {
*
* TODO, Update with other options for TargetConfig
*/
void AddTarget(const std::string &name, const std::string &description,
ArgTarget &out, const ArgTarget &initial = ArgTarget());
static void AddTarget(const std::string &name, const std::string &description,
ArgTarget &out, const ArgTarget &initial = ArgTarget());

// Getters
bool Clean() const { return clean_; }
env::LogLevel GetLogLevel() const { return loglevel_; }

const fs::path &GetProjectRootDir() const { return project_root_dir_; }
const fs::path &GetProjectBuildDir() const { return project_build_dir_; }
static bool Clean();
static env::LogLevel GetLogLevel();

private:
void Initialize();
void RootArgs();
static const fs::path &GetProjectRootDir();
static const fs::path &GetProjectBuildDir();

private:
// Required parameters
bool clean_{false};
env::LogLevel loglevel_{env::LogLevel::Info};
fs::path project_root_dir_{""};
fs::path project_build_dir_{"_internal"};

// Internal
CLI::App app_{"BuildCC buildsystem"};
CLI::App *toolchain_{nullptr};
CLI::App *target_{nullptr};
static void RootArgs();
};

} // namespace buildcc
Expand Down
5 changes: 3 additions & 2 deletions buildcc/lib/args/include/args/register.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ namespace buildcc {

class Register {
public:
Register(const Args &args) : args_(args) { Initialize(); }
// Register(const Args &args) : args_(args) { Initialize(); }
Register() { Initialize(); }
Register(const Register &) = delete;

/**
Expand Down Expand Up @@ -154,7 +155,7 @@ class Register {
void BuildStoreTask(const std::string &unique_id, const tf::Task &task);

private:
const Args &args_;
// const Args &args_;

// Build
tf::Taskflow build_tf_{"Targets"};
Expand Down
2 changes: 1 addition & 1 deletion buildcc/lib/args/mock/parse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace buildcc {

void Args::Parse(int argc, const char *const *argv) {
try {
app_.parse(argc, argv);
Ref().parse(argc, argv);
} catch (const CLI::ParseError &e) {
env::assert_fatal<false>(e.what());
}
Expand Down
60 changes: 51 additions & 9 deletions buildcc/lib/args/src/args.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,56 @@ const std::unordered_map<const char *, buildcc::ToolchainId> kToolchainIdMap{
{"undefined", buildcc::ToolchainId::Undefined},
};

// Static variables
bool clean_{false};
buildcc::env::LogLevel loglevel_{buildcc::env::LogLevel::Info};
fs::path project_root_dir_{""};
fs::path project_build_dir_{"_internal"};

// Internal
// std::unique_ptr<CLI::App> app_;
// CLI::App *toolchain_{nullptr};
// CLI::App *target_{nullptr};

struct ArgsInstance {
CLI::App app_{"BuildCC Buildsystem"};
CLI::App *toolchain_{nullptr};
CLI::App *target_{nullptr};
};

std::unique_ptr<ArgsInstance> args_instance_;

} // namespace

namespace buildcc {

void Args::Init() {
if (!args_instance_) {
args_instance_ = std::make_unique<ArgsInstance>();
args_instance_->toolchain_ =
Ref().add_subcommand(kToolchainSubcommand, kToolchainDesc);
args_instance_->target_ =
Ref().add_subcommand(kTargetSubcommand, kTargetDesc);
RootArgs();
}
}

void Args::Deinit() { args_instance_.reset(nullptr); }

CLI::App &Args::Ref() { return args_instance_->app_; }
const CLI::App &Args::ConstRef() { return args_instance_->app_; }

bool Args::Clean() { return clean_; }
env::LogLevel Args::GetLogLevel() { return loglevel_; }

const fs::path &Args::GetProjectRootDir() { return project_root_dir_; }
const fs::path &Args::GetProjectBuildDir() { return project_build_dir_; }

void Args::AddToolchain(const std::string &name, const std::string &description,
ArgToolchain &out, const ArgToolchain &initial) {
CLI::App *toolchain_ = args_instance_->toolchain_;
env::assert_fatal(toolchain_ != nullptr,
"Initialize Args using the Args::Init API");
CLI::App *t_user =
toolchain_->add_subcommand(name, description)->group(kToolchainGroup);
t_user->add_flag(kToolchainBuildParam, out.state.build);
Expand All @@ -113,6 +157,9 @@ void Args::AddToolchain(const std::string &name, const std::string &description,

void Args::AddTarget(const std::string &name, const std::string &description,
ArgTarget &out, const ArgTarget &initial) {
CLI::App *target_ = args_instance_->target_;
env::assert_fatal(target_ != nullptr,
"Initialize Args using the Args::Init API");
CLI::App *target_user =
target_->add_subcommand(name, description)->group(kTargetGroup);
target_user->add_option(kTargetCompileCommandParam, out.compile_command)
Expand All @@ -123,20 +170,15 @@ void Args::AddTarget(const std::string &name, const std::string &description,

// Private

void Args::Initialize() {
RootArgs();
toolchain_ = app_.add_subcommand(kToolchainSubcommand, kToolchainDesc);
target_ = app_.add_subcommand(kTargetSubcommand, kTargetDesc);
}

void Args::RootArgs() {
app_.set_help_all_flag(kHelpAllParam, kHelpAllDesc);
Ref().set_help_all_flag(kHelpAllParam, kHelpAllDesc);

app_.set_config(kConfigParam, "", kConfigDesc)
Ref()
.set_config(kConfigParam, "", kConfigDesc)
->expected(kMinFiles, kMaxFiles);

// Root flags
auto *root_group = app_.add_option_group(kRootGroup);
auto *root_group = Ref().add_option_group(kRootGroup);

root_group->add_flag(kCleanParam, clean_, kCleanDesc);
root_group->add_option(kLoglevelParam, loglevel_, kLoglevelDesc)
Expand Down
4 changes: 2 additions & 2 deletions buildcc/lib/args/src/parse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ namespace buildcc {

void Args::Parse(int argc, const char *const *argv) {
try {
app_.parse(argc, argv);
Ref().parse(argc, argv);
} catch (const CLI::ParseError &e) {
exit(app_.exit(e));
exit(ConstRef().exit(e));
}
}

Expand Down
8 changes: 4 additions & 4 deletions buildcc/lib/args/src/register.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ void DepDetectCyclicDependency(const tf::Task &target_task,
namespace buildcc {

void Register::Clean(const std::function<void(void)> &clean_cb) {
if (args_.Clean()) {
if (Args::Clean()) {
clean_cb();
}
}
Expand Down Expand Up @@ -119,9 +119,9 @@ void Register::BuildStoreTask(const std::string &unique_id,
void Register::Initialize() { Env(); }

void Register::Env() {
Project::Init(fs::current_path() / args_.GetProjectRootDir(),
fs::current_path() / args_.GetProjectBuildDir());
env::set_log_level(args_.GetLogLevel());
Project::Init(fs::current_path() / Args::GetProjectRootDir(),
fs::current_path() / Args::GetProjectBuildDir());
env::set_log_level(Args::GetLogLevel());
}

//
Expand Down
Loading