Skip to content

Commit 94d62c9

Browse files
authored
Refactor Args constructable class to static class (#202)
1 parent 70ca258 commit 94d62c9

File tree

25 files changed

+318
-269
lines changed

25 files changed

+318
-269
lines changed

bootstrap/main.buildcc.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@ static void hybrid_simple_example_cb(BaseTarget &target,
3333
const BaseTarget &libbuildcc);
3434

3535
int main(int argc, char **argv) {
36-
Args args;
36+
Args::Init();
3737
ArgToolchain custom_toolchain_arg;
38-
args.AddToolchain("host", "Host Toolchain", custom_toolchain_arg);
39-
args.Parse(argc, argv);
38+
Args::AddToolchain("host", "Host Toolchain", custom_toolchain_arg);
39+
Args::Parse(argc, argv);
4040

41-
Register reg(args);
41+
Register reg;
42+
;
4243
reg.Clean(clean_cb);
4344

4445
BaseToolchain toolchain = custom_toolchain_arg.ConstructToolchain();

buildcc/lib/args/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ add_library(mock_args
88
)
99
target_include_directories(mock_args PUBLIC
1010
${CMAKE_CURRENT_SOURCE_DIR}/include
11+
${CMAKE_CURRENT_SOURCE_DIR}/mock
1112
)
1213
target_compile_options(mock_args PUBLIC
1314
${TEST_COMPILE_FLAGS} ${BUILD_COMPILE_FLAGS}

buildcc/lib/args/include/args/args.h

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -88,26 +88,30 @@ struct ArgTarget {
8888
class Args {
8989
public:
9090
public:
91-
Args() { Initialize(); }
91+
Args() = delete;
9292
Args(const Args &) = delete;
93+
Args(Args &&) = delete;
94+
95+
static void Init();
96+
static void Deinit();
9397

9498
/**
9599
* @brief Parse command line information to CLI11
96100
*
97101
* @param argc from int main(int argc, char ** argv)
98102
* @param argv from int main(int argc, char ** argv)
99103
*/
100-
void Parse(int argc, const char *const *argv);
104+
static void Parse(int argc, const char *const *argv);
101105

102106
/**
103107
* @brief Modifiable reference to CLI::App (CLI11)
104108
*/
105-
CLI::App &Ref() { return app_; }
109+
static CLI::App &Ref();
106110

107111
/**
108112
* @brief Constant reference to CLI::App (CLI11)
109113
*/
110-
const CLI::App &ConstRef() const { return app_; }
114+
static const CLI::App &ConstRef();
111115

112116
// Setters
113117

@@ -117,9 +121,9 @@ class Args {
117121
* @param out Receive the toolchain information through the CLI
118122
* @param initial Set the default toolchain information as a fallback
119123
*/
120-
void AddToolchain(const std::string &name, const std::string &description,
121-
ArgToolchain &out,
122-
const ArgToolchain &initial = ArgToolchain());
124+
static void AddToolchain(const std::string &name,
125+
const std::string &description, ArgToolchain &out,
126+
const ArgToolchain &initial = ArgToolchain());
123127

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

135139
// Getters
136-
bool Clean() const { return clean_; }
137-
env::LogLevel GetLogLevel() const { return loglevel_; }
138-
139-
const fs::path &GetProjectRootDir() const { return project_root_dir_; }
140-
const fs::path &GetProjectBuildDir() const { return project_build_dir_; }
140+
static bool Clean();
141+
static env::LogLevel GetLogLevel();
141142

142-
private:
143-
void Initialize();
144-
void RootArgs();
143+
static const fs::path &GetProjectRootDir();
144+
static const fs::path &GetProjectBuildDir();
145145

146146
private:
147-
// Required parameters
148-
bool clean_{false};
149-
env::LogLevel loglevel_{env::LogLevel::Info};
150-
fs::path project_root_dir_{""};
151-
fs::path project_build_dir_{"_internal"};
152-
153-
// Internal
154-
CLI::App app_{"BuildCC buildsystem"};
155-
CLI::App *toolchain_{nullptr};
156-
CLI::App *target_{nullptr};
147+
static void RootArgs();
157148
};
158149

159150
} // namespace buildcc

buildcc/lib/args/include/args/register.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ namespace buildcc {
3333

3434
class Register {
3535
public:
36-
Register(const Args &args) : args_(args) { Initialize(); }
36+
// Register(const Args &args) : args_(args) { Initialize(); }
37+
Register() { Initialize(); }
3738
Register(const Register &) = delete;
3839

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

156157
private:
157-
const Args &args_;
158+
// const Args &args_;
158159

159160
// Build
160161
tf::Taskflow build_tf_{"Targets"};

buildcc/lib/args/mock/parse.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace buildcc {
66

77
void Args::Parse(int argc, const char *const *argv) {
88
try {
9-
app_.parse(argc, argv);
9+
Ref().parse(argc, argv);
1010
} catch (const CLI::ParseError &e) {
1111
env::assert_fatal<false>(e.what());
1212
}

buildcc/lib/args/src/args.cpp

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,56 @@ const std::unordered_map<const char *, buildcc::ToolchainId> kToolchainIdMap{
8484
{"undefined", buildcc::ToolchainId::Undefined},
8585
};
8686

87+
// Static variables
88+
bool clean_{false};
89+
buildcc::env::LogLevel loglevel_{buildcc::env::LogLevel::Info};
90+
fs::path project_root_dir_{""};
91+
fs::path project_build_dir_{"_internal"};
92+
93+
// Internal
94+
// std::unique_ptr<CLI::App> app_;
95+
// CLI::App *toolchain_{nullptr};
96+
// CLI::App *target_{nullptr};
97+
98+
struct ArgsInstance {
99+
CLI::App app_{"BuildCC Buildsystem"};
100+
CLI::App *toolchain_{nullptr};
101+
CLI::App *target_{nullptr};
102+
};
103+
104+
std::unique_ptr<ArgsInstance> args_instance_;
105+
87106
} // namespace
88107

89108
namespace buildcc {
90109

110+
void Args::Init() {
111+
if (!args_instance_) {
112+
args_instance_ = std::make_unique<ArgsInstance>();
113+
args_instance_->toolchain_ =
114+
Ref().add_subcommand(kToolchainSubcommand, kToolchainDesc);
115+
args_instance_->target_ =
116+
Ref().add_subcommand(kTargetSubcommand, kTargetDesc);
117+
RootArgs();
118+
}
119+
}
120+
121+
void Args::Deinit() { args_instance_.reset(nullptr); }
122+
123+
CLI::App &Args::Ref() { return args_instance_->app_; }
124+
const CLI::App &Args::ConstRef() { return args_instance_->app_; }
125+
126+
bool Args::Clean() { return clean_; }
127+
env::LogLevel Args::GetLogLevel() { return loglevel_; }
128+
129+
const fs::path &Args::GetProjectRootDir() { return project_root_dir_; }
130+
const fs::path &Args::GetProjectBuildDir() { return project_build_dir_; }
131+
91132
void Args::AddToolchain(const std::string &name, const std::string &description,
92133
ArgToolchain &out, const ArgToolchain &initial) {
134+
CLI::App *toolchain_ = args_instance_->toolchain_;
135+
env::assert_fatal(toolchain_ != nullptr,
136+
"Initialize Args using the Args::Init API");
93137
CLI::App *t_user =
94138
toolchain_->add_subcommand(name, description)->group(kToolchainGroup);
95139
t_user->add_flag(kToolchainBuildParam, out.state.build);
@@ -113,6 +157,9 @@ void Args::AddToolchain(const std::string &name, const std::string &description,
113157

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

124171
// Private
125172

126-
void Args::Initialize() {
127-
RootArgs();
128-
toolchain_ = app_.add_subcommand(kToolchainSubcommand, kToolchainDesc);
129-
target_ = app_.add_subcommand(kTargetSubcommand, kTargetDesc);
130-
}
131-
132173
void Args::RootArgs() {
133-
app_.set_help_all_flag(kHelpAllParam, kHelpAllDesc);
174+
Ref().set_help_all_flag(kHelpAllParam, kHelpAllDesc);
134175

135-
app_.set_config(kConfigParam, "", kConfigDesc)
176+
Ref()
177+
.set_config(kConfigParam, "", kConfigDesc)
136178
->expected(kMinFiles, kMaxFiles);
137179

138180
// Root flags
139-
auto *root_group = app_.add_option_group(kRootGroup);
181+
auto *root_group = Ref().add_option_group(kRootGroup);
140182

141183
root_group->add_flag(kCleanParam, clean_, kCleanDesc);
142184
root_group->add_option(kLoglevelParam, loglevel_, kLoglevelDesc)

buildcc/lib/args/src/parse.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ namespace buildcc {
2020

2121
void Args::Parse(int argc, const char *const *argv) {
2222
try {
23-
app_.parse(argc, argv);
23+
Ref().parse(argc, argv);
2424
} catch (const CLI::ParseError &e) {
25-
exit(app_.exit(e));
25+
exit(ConstRef().exit(e));
2626
}
2727
}
2828

buildcc/lib/args/src/register.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ void DepDetectCyclicDependency(const tf::Task &target_task,
6161
namespace buildcc {
6262

6363
void Register::Clean(const std::function<void(void)> &clean_cb) {
64-
if (args_.Clean()) {
64+
if (Args::Clean()) {
6565
clean_cb();
6666
}
6767
}
@@ -119,9 +119,9 @@ void Register::BuildStoreTask(const std::string &unique_id,
119119
void Register::Initialize() { Env(); }
120120

121121
void Register::Env() {
122-
Project::Init(fs::current_path() / args_.GetProjectRootDir(),
123-
fs::current_path() / args_.GetProjectBuildDir());
124-
env::set_log_level(args_.GetLogLevel());
122+
Project::Init(fs::current_path() / Args::GetProjectRootDir(),
123+
fs::current_path() / Args::GetProjectBuildDir());
124+
env::set_log_level(Args::GetLogLevel());
125125
}
126126

127127
//

0 commit comments

Comments
 (0)