@@ -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
89108namespace 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::LogLevelArgs::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+
91132void 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
114158void 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-
132173void 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 )