From a0963024bc076168656e7c871e840c54a2cb6bec Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 20:12:24 -0700 Subject: [PATCH 01/30] Code cleanup --- bootstrap/main.buildcc.cpp | 1 - example/buildexe/libs/build.main.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/bootstrap/main.buildcc.cpp b/bootstrap/main.buildcc.cpp index 4882d013..48e40683 100644 --- a/bootstrap/main.buildcc.cpp +++ b/bootstrap/main.buildcc.cpp @@ -39,7 +39,6 @@ int main(int argc, char **argv) { Args::Parse(argc, argv); Register reg; - ; reg.Clean(clean_cb); BaseToolchain toolchain = custom_toolchain_arg.ConstructToolchain(); diff --git a/example/buildexe/libs/build.main.cpp b/example/buildexe/libs/build.main.cpp index 5937c5ee..c051e83b 100644 --- a/example/buildexe/libs/build.main.cpp +++ b/example/buildexe/libs/build.main.cpp @@ -24,7 +24,6 @@ int main(int argc, char **argv) { // 2. Initialize your environment Register reg; - ; // 3. Pre-build steps reg.Clean(clean_cb); From 4177e77369cb24f27ff607b57e0b94f179483a45 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 20:15:13 -0700 Subject: [PATCH 02/30] Code cleanup --- buildcc/lib/args/include/args/register.h | 3 --- buildcc/lib/args/src/args.cpp | 5 ----- 2 files changed, 8 deletions(-) diff --git a/buildcc/lib/args/include/args/register.h b/buildcc/lib/args/include/args/register.h index c15a0b83..110e5246 100644 --- a/buildcc/lib/args/include/args/register.h +++ b/buildcc/lib/args/include/args/register.h @@ -33,7 +33,6 @@ namespace buildcc { class Register { public: - // Register(const Args &args) : args_(args) { Initialize(); } Register() { Initialize(); } Register(const Register &) = delete; @@ -155,8 +154,6 @@ class Register { void BuildStoreTask(const std::string &unique_id, const tf::Task &task); private: - // const Args &args_; - // Build tf::Taskflow build_tf_{"Targets"}; diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index ec6b4a33..fc485ee6 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -90,11 +90,6 @@ buildcc::env::LogLevel loglevel_{buildcc::env::LogLevel::Info}; fs::path project_root_dir_{""}; fs::path project_build_dir_{"_internal"}; -// Internal -// std::unique_ptr app_; -// CLI::App *toolchain_{nullptr}; -// CLI::App *target_{nullptr}; - struct ArgsInstance { CLI::App app_{"BuildCC Buildsystem"}; CLI::App *toolchain_{nullptr}; From 13cce14854a66eab1a879677f937a3b4e3dfa92b Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 20:38:28 -0700 Subject: [PATCH 03/30] Update args.cpp --- buildcc/lib/args/src/args.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index fc485ee6..beff6b34 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -90,13 +90,13 @@ buildcc::env::LogLevel loglevel_{buildcc::env::LogLevel::Info}; fs::path project_root_dir_{""}; fs::path project_build_dir_{"_internal"}; -struct ArgsInstance { +struct ArgsInternal { CLI::App app_{"BuildCC Buildsystem"}; CLI::App *toolchain_{nullptr}; CLI::App *target_{nullptr}; }; -std::unique_ptr args_instance_; +std::unique_ptr args_instance_; } // namespace @@ -104,7 +104,7 @@ namespace buildcc { void Args::Init() { if (!args_instance_) { - args_instance_ = std::make_unique(); + args_instance_ = std::make_unique(); args_instance_->toolchain_ = Ref().add_subcommand(kToolchainSubcommand, kToolchainDesc); args_instance_->target_ = From e77a8d20aebda9bede78f99a777f89bf3dca2662 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 20:42:26 -0700 Subject: [PATCH 04/30] Update args.cpp --- buildcc/lib/args/src/args.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index beff6b34..0a8b4a56 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -96,27 +96,27 @@ struct ArgsInternal { CLI::App *target_{nullptr}; }; -std::unique_ptr args_instance_; +std::unique_ptr args_internal_; } // namespace namespace buildcc { void Args::Init() { - if (!args_instance_) { - args_instance_ = std::make_unique(); - args_instance_->toolchain_ = + if (!args_internal_) { + args_internal_ = std::make_unique(); + args_internal_->toolchain_ = Ref().add_subcommand(kToolchainSubcommand, kToolchainDesc); - args_instance_->target_ = + args_internal_->target_ = Ref().add_subcommand(kTargetSubcommand, kTargetDesc); RootArgs(); } } -void Args::Deinit() { args_instance_.reset(nullptr); } +void Args::Deinit() { args_internal_.reset(nullptr); } -CLI::App &Args::Ref() { return args_instance_->app_; } -const CLI::App &Args::ConstRef() { return args_instance_->app_; } +CLI::App &Args::Ref() { return args_internal_->app_; } +const CLI::App &Args::ConstRef() { return args_internal_->app_; } bool Args::Clean() { return clean_; } env::LogLevel Args::GetLogLevel() { return loglevel_; } @@ -126,7 +126,7 @@ 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_; + CLI::App *toolchain_ = args_internal_->toolchain_; env::assert_fatal(toolchain_ != nullptr, "Initialize Args using the Args::Init API"); CLI::App *t_user = @@ -152,7 +152,7 @@ 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_; + CLI::App *target_ = args_internal_->target_; env::assert_fatal(target_ != nullptr, "Initialize Args using the Args::Init API"); CLI::App *target_user = From 8534c8117b02761b6c8e55a12fbb171f49d19c2b Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 22:34:24 -0700 Subject: [PATCH 05/30] Updated args with initial instance apis --- buildcc/lib/args/include/args/args.h | 46 +++++++++- buildcc/lib/args/mock/parse.cpp | 5 ++ buildcc/lib/args/src/args.cpp | 126 +++++++++++++++++---------- buildcc/lib/args/src/parse.cpp | 5 ++ 4 files changed, 132 insertions(+), 50 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index a8b43d51..4a7fe37b 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -86,13 +86,52 @@ struct ArgTarget { }; class Args { -public: +private: + class Instance { + public: + Instance() = default; + + /** + * @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); + + /** + * @brief Add toolchain with a unique name and description + * + * @param out Receive the toolchain information through the CLI + * @param initial Set the default toolchain information as a fallback + */ + Instance &AddToolchain(const std::string &name, + const std::string &description, ArgToolchain &out, + const ArgToolchain &initial = ArgToolchain()); + + /** + * @brief Add toolchain with a unique name and description + * + * @param out Receive the toolchain information through the CLI + * @param initial Set the default toolchain information as a fallback + */ + Instance &AddTarget(const std::string &name, const std::string &description, + ArgTarget &out, const ArgTarget &initial = ArgTarget()); + }; + + struct Internal { + Instance instance; + CLI::App app{"BuildCC Buildsystem"}; + CLI::App *toolchain{nullptr}; + CLI::App *target{nullptr}; + }; + public: Args() = delete; Args(const Args &) = delete; Args(Args &&) = delete; - static void Init(); + static Instance &Init(); static void Deinit(); /** @@ -145,6 +184,9 @@ class Args { private: static void RootArgs(); + +private: + static std::unique_ptr internal_; }; } // namespace buildcc diff --git a/buildcc/lib/args/mock/parse.cpp b/buildcc/lib/args/mock/parse.cpp index dcbccc3c..f5a0cb77 100644 --- a/buildcc/lib/args/mock/parse.cpp +++ b/buildcc/lib/args/mock/parse.cpp @@ -5,6 +5,11 @@ namespace buildcc { void Args::Parse(int argc, const char *const *argv) { + (void)argc; + (void)argv; +} + +void Args::Instance::Parse(int argc, const char *const *argv) { try { Ref().parse(argc, argv); } catch (const CLI::ParseError &e) { diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index 0a8b4a56..ec8bb03c 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -90,33 +90,27 @@ buildcc::env::LogLevel loglevel_{buildcc::env::LogLevel::Info}; fs::path project_root_dir_{""}; fs::path project_build_dir_{"_internal"}; -struct ArgsInternal { - CLI::App app_{"BuildCC Buildsystem"}; - CLI::App *toolchain_{nullptr}; - CLI::App *target_{nullptr}; -}; - -std::unique_ptr args_internal_; - } // namespace namespace buildcc { -void Args::Init() { - if (!args_internal_) { - args_internal_ = std::make_unique(); - args_internal_->toolchain_ = +std::unique_ptr Args::internal_; + +Args::Instance &Args::Init() { + if (!internal_) { + internal_ = std::make_unique(); + internal_->toolchain = Ref().add_subcommand(kToolchainSubcommand, kToolchainDesc); - args_internal_->target_ = - Ref().add_subcommand(kTargetSubcommand, kTargetDesc); + internal_->target = Ref().add_subcommand(kTargetSubcommand, kTargetDesc); RootArgs(); } + return internal_->instance; } -void Args::Deinit() { args_internal_.reset(nullptr); } +void Args::Deinit() { internal_.reset(nullptr); } -CLI::App &Args::Ref() { return args_internal_->app_; } -const CLI::App &Args::ConstRef() { return args_internal_->app_; } +CLI::App &Args::Ref() { return internal_->app; } +const CLI::App &Args::ConstRef() { return internal_->app; } bool Args::Clean() { return clean_; } env::LogLevel Args::GetLogLevel() { return loglevel_; } @@ -126,41 +120,18 @@ 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_internal_->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); - t_user->add_flag(kToolchainTestParam, out.state.test); - - t_user->add_option(kToolchainIdParam, out.id, kToolchainIdDesc) - ->transform(CLI::CheckedTransformer(kToolchainIdMap, CLI::ignore_case)) - ->default_val(initial.id); - t_user->add_option(kToolchainNameParam, out.name)->default_val(initial.name); - t_user->add_option(kToolchainAsmCompilerParam, out.executables.assembler) - ->default_val(initial.executables.assembler); - t_user->add_option(kToolchainCCompilerParam, out.executables.c_compiler) - ->default_val(initial.executables.c_compiler); - t_user->add_option(kToolchainCppCompilerParam, out.executables.cpp_compiler) - ->default_val(initial.executables.cpp_compiler); - t_user->add_option(kToolchainArchiverParam, out.executables.archiver) - ->default_val(initial.executables.archiver); - t_user->add_option(kToolchainLinkerParam, out.executables.linker) - ->default_val(initial.executables.linker); + (void)name; + (void)description; + (void)out; + (void)initial; } void Args::AddTarget(const std::string &name, const std::string &description, ArgTarget &out, const ArgTarget &initial) { - CLI::App *target_ = args_internal_->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) - ->default_val(initial.compile_command); - target_user->add_option(kTargetLinkCommandParam, out.link_command) - ->default_val(initial.link_command); + (void)name; + (void)description; + (void)out; + (void)initial; } // Private @@ -186,4 +157,63 @@ void Args::RootArgs() { ->required(); } +// Args::Instance + +/** + * @brief Add toolchain with a unique name and description + * + * @param out Receive the toolchain information through the CLI + * @param initial Set the default toolchain information as a fallback + */ +Args::Instance &Args::Instance::AddToolchain(const std::string &name, + const std::string &description, + ArgToolchain &out, + const ArgToolchain &initial) { + CLI::App *toolchain = internal_->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); + t_user->add_flag(kToolchainTestParam, out.state.test); + + t_user->add_option(kToolchainIdParam, out.id, kToolchainIdDesc) + ->transform(CLI::CheckedTransformer(kToolchainIdMap, CLI::ignore_case)) + ->default_val(initial.id); + t_user->add_option(kToolchainNameParam, out.name)->default_val(initial.name); + t_user->add_option(kToolchainAsmCompilerParam, out.executables.assembler) + ->default_val(initial.executables.assembler); + t_user->add_option(kToolchainCCompilerParam, out.executables.c_compiler) + ->default_val(initial.executables.c_compiler); + t_user->add_option(kToolchainCppCompilerParam, out.executables.cpp_compiler) + ->default_val(initial.executables.cpp_compiler); + t_user->add_option(kToolchainArchiverParam, out.executables.archiver) + ->default_val(initial.executables.archiver); + t_user->add_option(kToolchainLinkerParam, out.executables.linker) + ->default_val(initial.executables.linker); + return *this; +} + +/** + * @brief Add toolchain with a unique name and description + * + * @param out Receive the toolchain information through the CLI + * @param initial Set the default toolchain information as a fallback + */ +Args::Instance &Args::Instance::AddTarget(const std::string &name, + const std::string &description, + ArgTarget &out, + const ArgTarget &initial) { + CLI::App *target = internal_->target; + env::assert_fatal(target != nullptr, + "Initialize Args using the Args::Init API"); + CLI::App *targetuser = + target->add_subcommand(name, description)->group(kTargetGroup); + targetuser->add_option(kTargetCompileCommandParam, out.compile_command) + ->default_val(initial.compile_command); + targetuser->add_option(kTargetLinkCommandParam, out.link_command) + ->default_val(initial.link_command); + return *this; +} + } // namespace buildcc diff --git a/buildcc/lib/args/src/parse.cpp b/buildcc/lib/args/src/parse.cpp index 08baac2f..5688040d 100644 --- a/buildcc/lib/args/src/parse.cpp +++ b/buildcc/lib/args/src/parse.cpp @@ -19,6 +19,11 @@ namespace buildcc { void Args::Parse(int argc, const char *const *argv) { + (void)argc; + (void)argv; +} + +void Args::Instance::Parse(int argc, const char *const *argv) { try { Ref().parse(argc, argv); } catch (const CLI::ParseError &e) { From b9408c2f70dae73a856a9d897a3411ba566717b5 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 22:55:31 -0700 Subject: [PATCH 06/30] Update test_args.cpp --- buildcc/lib/args/test/test_args.cpp | 57 +++++++++++++++-------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/buildcc/lib/args/test/test_args.cpp b/buildcc/lib/args/test/test_args.cpp index 8c4c3979..5bf11d80 100644 --- a/buildcc/lib/args/test/test_args.cpp +++ b/buildcc/lib/args/test/test_args.cpp @@ -20,9 +20,10 @@ TEST(ArgsTestGroup, Args_BasicParse) { std::vector av{"", "--config", "configs/basic_parse.toml"}; int argc = av.size(); - buildcc::Args::Init(); - buildcc::Args::Init(); // Second init does nothing when already initialized - buildcc::Args::Parse(argc, av.data()); + (void)buildcc::Args::Init(); + auto &instance = buildcc::Args::Init(); // Second init does nothing when + // already initialized + instance.Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -38,8 +39,8 @@ TEST(ArgsTestGroup, Args_BasicExit) { "--help"}; int argc = av.size(); - buildcc::Args::Init(); - CHECK_THROWS(std::exception, buildcc::Args::Parse(argc, av.data())); + auto &instance = buildcc::Args::Init(); + CHECK_THROWS(std::exception, instance.Parse(argc, av.data())); } TEST(ArgsTestGroup, Args_MultiToml) { @@ -47,8 +48,7 @@ TEST(ArgsTestGroup, Args_MultiToml) { "--config", "configs/no_clean.toml"}; int argc = av.size(); - buildcc::Args::Init(); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init().Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -61,10 +61,10 @@ TEST(ArgsTestGroup, Args_CustomToolchain) { "--config", "configs/gcc_toolchain.toml"}; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -95,12 +95,12 @@ TEST(ArgsTestGroup, Args_MultipleCustomToolchain) { }; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -133,18 +133,18 @@ TEST(ArgsTestGroup, Args_MultipleCustomToolchain) { } TEST(ArgsTestGroup, Args_DuplicateCustomToolchain) { - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain other_gcc_toolchain; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + auto &instance = buildcc::Args::Init().AddToolchain( + "gcc", "Generic gcc toolchain", gcc_toolchain); // CLI11 Throws an exception when multiple toolchains with same name are added // NOTE, This behaviour does not need to be tested since it is provided by // CLI11 // This test is as an example of wrong usage by the user CHECK_THROWS(std::exception, - (buildcc::Args::AddToolchain("gcc", "Other gcc toolchain ", - other_gcc_toolchain))); + (instance.AddToolchain("gcc", "Other gcc toolchain ", + other_gcc_toolchain))); } TEST(ArgsTestGroup, Args_CustomTarget) { @@ -159,12 +159,12 @@ TEST(ArgsTestGroup, Args_CustomTarget) { }; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgTarget gcc_target; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::AddTarget("gcc", "Generic gcc target", gcc_target); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .AddTarget("gcc", "Generic gcc target", gcc_target) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -207,16 +207,17 @@ TEST(ArgsTestGroup, Args_MultipleCustomTarget) { }; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgTarget gcc_target; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::AddTarget("gcc", "Generic gcc target", gcc_target); buildcc::ArgToolchain msvc_toolchain; buildcc::ArgTarget msvc_target; - buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - buildcc::Args::AddTarget("msvc", "Generic msvc target", msvc_target); - buildcc::Args::Parse(argc, av.data()); + + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .AddTarget("gcc", "Generic gcc target", gcc_target) + .AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain) + .AddTarget("msvc", "Generic msvc target", msvc_target) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); From 006b5f30042256c765262cf9466247e9dc6cfb22 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:01:27 -0700 Subject: [PATCH 07/30] Update test_register.cpp --- buildcc/lib/args/test/test_register.cpp | 65 ++++++++++++------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/buildcc/lib/args/test/test_register.cpp b/buildcc/lib/args/test/test_register.cpp index 81dbd9cf..bcd6b191 100644 --- a/buildcc/lib/args/test/test_register.cpp +++ b/buildcc/lib/args/test/test_register.cpp @@ -25,8 +25,7 @@ TEST(RegisterTestGroup, Register_Initialize) { std::vector av{"", "--config", "configs/basic_parse.toml"}; int argc = av.size(); - buildcc::Args::Init(); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init().Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -41,8 +40,7 @@ TEST(RegisterTestGroup, Register_Clean) { std::vector av{"", "--config", "configs/basic_parse.toml"}; int argc = av.size(); - buildcc::Args::Init(); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init().Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -65,8 +63,7 @@ TEST(RegisterTestGroup, Register_Clean) { }; int argc = av.size(); - buildcc::Args::Init(); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init().Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -89,12 +86,12 @@ TEST(RegisterTestGroup, Register_Build) { }; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -137,12 +134,12 @@ TEST(RegisterTestGroup, Register_NoBuildAndDep) { }; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -221,12 +218,12 @@ TEST(RegisterTestGroup, Register_BuildAndDep) { }; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -316,12 +313,12 @@ TEST(RegisterTestGroup, Register_DepDuplicate) { }; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -392,12 +389,12 @@ TEST(RegisterTestGroup, Register_DepCyclic) { }; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -468,12 +465,12 @@ TEST(RegisterTestGroup, Register_Test) { }; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); @@ -553,12 +550,12 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { }; int argc = av.size(); - buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - buildcc::Args::Parse(argc, av.data()); + buildcc::Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain) + .AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain) + .Parse(argc, av.data()); STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); From b5aada975bf4a30682e1249776bc1d114fdcfc3c Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:06:06 -0700 Subject: [PATCH 08/30] Removed static functions from Args --- buildcc/lib/args/include/args/args.h | 31 ---------------------------- buildcc/lib/args/mock/parse.cpp | 5 ----- buildcc/lib/args/src/args.cpp | 16 -------------- buildcc/lib/args/src/parse.cpp | 5 ----- 4 files changed, 57 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index 4a7fe37b..bd905b0e 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -134,14 +134,6 @@ class Args { static Instance &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) - */ - static void Parse(int argc, const char *const *argv); - /** * @brief Modifiable reference to CLI::App (CLI11) */ @@ -152,29 +144,6 @@ class Args { */ static const CLI::App &ConstRef(); - // Setters - - /** - * @brief Add toolchain with a unique name and description - * - * @param out Receive the toolchain information through the CLI - * @param initial Set the default toolchain information as a fallback - */ - 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 - * - * @param out Receive the target command information through the CLI - * @param initial Set the default target command information as a fallback - * - * TODO, Update with other options for TargetConfig - */ - static void AddTarget(const std::string &name, const std::string &description, - ArgTarget &out, const ArgTarget &initial = ArgTarget()); - // Getters static bool Clean(); static env::LogLevel GetLogLevel(); diff --git a/buildcc/lib/args/mock/parse.cpp b/buildcc/lib/args/mock/parse.cpp index f5a0cb77..53213201 100644 --- a/buildcc/lib/args/mock/parse.cpp +++ b/buildcc/lib/args/mock/parse.cpp @@ -4,11 +4,6 @@ namespace buildcc { -void Args::Parse(int argc, const char *const *argv) { - (void)argc; - (void)argv; -} - void Args::Instance::Parse(int argc, const char *const *argv) { try { Ref().parse(argc, argv); diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index ec8bb03c..b55922a0 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -118,22 +118,6 @@ 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) { - (void)name; - (void)description; - (void)out; - (void)initial; -} - -void Args::AddTarget(const std::string &name, const std::string &description, - ArgTarget &out, const ArgTarget &initial) { - (void)name; - (void)description; - (void)out; - (void)initial; -} - // Private void Args::RootArgs() { diff --git a/buildcc/lib/args/src/parse.cpp b/buildcc/lib/args/src/parse.cpp index 5688040d..83c0cb1a 100644 --- a/buildcc/lib/args/src/parse.cpp +++ b/buildcc/lib/args/src/parse.cpp @@ -18,11 +18,6 @@ namespace buildcc { -void Args::Parse(int argc, const char *const *argv) { - (void)argc; - (void)argv; -} - void Args::Instance::Parse(int argc, const char *const *argv) { try { Ref().parse(argc, argv); From 787440e2f9f310e0b2b9583cfb0d152ec758d2ae Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:07:14 -0700 Subject: [PATCH 09/30] Update build.cpp --- example/hybrid/single/build.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example/hybrid/single/build.cpp b/example/hybrid/single/build.cpp index ec21de0a..491c8fc2 100644 --- a/example/hybrid/single/build.cpp +++ b/example/hybrid/single/build.cpp @@ -10,10 +10,10 @@ static void hello_world_build_cb(BaseTarget &target); int main(int argc, char **argv) { // 1. Get arguments - Args::Init(); ArgToolchain arg_gcc; - Args::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); - Args::Parse(argc, argv); + Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", arg_gcc) + .Parse(argc, argv); // 2. Initialize your environment Register reg; From 10070cceb67488d3be72fe84650ba26e6fa1cca2 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:07:24 -0700 Subject: [PATCH 10/30] Update build.cpp --- example/hybrid/simple/build.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/hybrid/simple/build.cpp b/example/hybrid/simple/build.cpp index 4f7458e9..94c447f7 100644 --- a/example/hybrid/simple/build.cpp +++ b/example/hybrid/simple/build.cpp @@ -13,12 +13,12 @@ static void cflags_build_cb(BaseTarget &cflags); int main(int argc, char **argv) { // 1. Get arguments - Args::Init(); ArgToolchain arg_gcc; ArgToolchain arg_msvc; - Args::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); - Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); - Args::Parse(argc, argv); + Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", arg_gcc) + .AddToolchain("msvc", "Generic msvc toolchain", arg_msvc) + .Parse(argc, argv); // 2. Initialize your environment Register reg; From 7aa0114cf4d1acad659a136356cf0c836d171cc7 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:08:49 -0700 Subject: [PATCH 11/30] Update build.cpp --- example/hybrid/target_info/build.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/hybrid/target_info/build.cpp b/example/hybrid/target_info/build.cpp index b679a2df..600a8c71 100644 --- a/example/hybrid/target_info/build.cpp +++ b/example/hybrid/target_info/build.cpp @@ -14,12 +14,12 @@ static void genericadd2_build_cb(BaseTarget &genericadd, int main(int argc, char **argv) { // 1. Get arguments - Args::Init(); ArgToolchain arg_gcc; ArgToolchain arg_msvc; - Args::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); - Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); - Args::Parse(argc, argv); + Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", arg_gcc) + .AddToolchain("msvc", "Generic msvc toolchain", arg_msvc) + .Parse(argc, argv); // 2. Initialize your environment Register reg; From b591bf74188371dcd1697340b660bae6483ac3d6 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:09:23 -0700 Subject: [PATCH 12/30] Update build.cpp --- example/hybrid/pch/build.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/hybrid/pch/build.cpp b/example/hybrid/pch/build.cpp index 7badb4b6..a305367d 100644 --- a/example/hybrid/pch/build.cpp +++ b/example/hybrid/pch/build.cpp @@ -13,12 +13,12 @@ static void cflags_build_cb(BaseTarget &cflags); int main(int argc, char **argv) { // 1. Get arguments - Args::Init(); ArgToolchain arg_gcc; ArgToolchain arg_msvc; - Args::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); - Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); - Args::Parse(argc, argv); + Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", arg_gcc) + .AddToolchain("msvc", "Generic msvc toolchain", arg_msvc) + .Parse(argc, argv); // 2. Initialize your environment Register reg; From af9fcb5115c8fb1957aad7f7f125846717ea94cd Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:11:34 -0700 Subject: [PATCH 13/30] Update build.cpp --- example/hybrid/generic/build.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example/hybrid/generic/build.cpp b/example/hybrid/generic/build.cpp index aeba69ac..8f4814d0 100644 --- a/example/hybrid/generic/build.cpp +++ b/example/hybrid/generic/build.cpp @@ -23,7 +23,7 @@ int main(int argc, char **argv) { // 1. Get arguments ArgToolchain custom_toolchain; TargetType default_lib_type{TargetType::StaticLibrary}; - Args::Init(); + auto &instance = Args::Init(); try { const std::map lib_type_map_{ @@ -37,12 +37,12 @@ int main(int argc, char **argv) { ->group("Custom"); // NOTE, You can add more custom toolchains as per your requirement - Args::AddToolchain("user", "User defined toolchain", custom_toolchain); + instance.AddToolchain("user", "User defined toolchain", custom_toolchain); } catch (const std::exception &e) { std::cout << "EXCEPTION " << e.what() << std::endl; } - Args::Parse(argc, argv); + instance.Parse(argc, argv); // 2. Initialize your environment Register reg; From 5b8ba36601d0f1a7f94fdfcf5c5fc1a54e0d1bd0 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:12:01 -0700 Subject: [PATCH 14/30] Update build.main.cpp --- example/hybrid/foolib/build.main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/hybrid/foolib/build.main.cpp b/example/hybrid/foolib/build.main.cpp index bbd3eba6..dc723d7b 100644 --- a/example/hybrid/foolib/build.main.cpp +++ b/example/hybrid/foolib/build.main.cpp @@ -11,12 +11,12 @@ constexpr std::string_view EXE = "build"; int main(int argc, char **argv) { // 1. Get arguments - Args::Init(); ArgToolchain arg_gcc; ArgToolchain arg_msvc; - Args::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); - Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); - Args::Parse(argc, argv); + Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", arg_gcc) + .AddToolchain("msvc", "Generic msvc toolchain", arg_msvc) + .Parse(argc, argv); // 2. Initialize your environment Register reg; From 48340281ae1fa1e16de1c3a547a568ec858f5c82 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:12:44 -0700 Subject: [PATCH 15/30] Update build.main.cpp --- example/hybrid/external_lib/build.main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/hybrid/external_lib/build.main.cpp b/example/hybrid/external_lib/build.main.cpp index fd56b11f..b181281b 100644 --- a/example/hybrid/external_lib/build.main.cpp +++ b/example/hybrid/external_lib/build.main.cpp @@ -11,12 +11,12 @@ constexpr const char *const EXE = "build"; int main(int argc, char **argv) { // 1. Get arguments - Args::Init(); ArgToolchain arg_gcc; ArgToolchain arg_msvc; - Args::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); - Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); - Args::Parse(argc, argv); + Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", arg_gcc) + .AddToolchain("msvc", "Generic msvc toolchain", arg_msvc) + .Parse(argc, argv); // 2. Initialize your environment Register reg; From b545250446d22c61a8e49326ec3ecde10aed8558 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:13:19 -0700 Subject: [PATCH 16/30] Update build.cpp --- example/hybrid/dep_chaining/build.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/hybrid/dep_chaining/build.cpp b/example/hybrid/dep_chaining/build.cpp index 915507bd..49722ad4 100644 --- a/example/hybrid/dep_chaining/build.cpp +++ b/example/hybrid/dep_chaining/build.cpp @@ -16,12 +16,12 @@ static void c_generator_cb(BaseGenerator &generator); int main(int argc, char **argv) { // 1. Get arguments - Args::Init(); ArgToolchain arg_gcc; ArgToolchain arg_msvc; - Args::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); - Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); - Args::Parse(argc, argv); + Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", arg_gcc) + .AddToolchain("msvc", "Generic msvc toolchain", arg_msvc) + .Parse(argc, argv); // 2. Initialize your environment Register reg; From ca950fdb70c656d60325c4b8aa5b00226c6b3ff7 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:14:58 -0700 Subject: [PATCH 17/30] Update build.main.cpp --- example/hybrid/custom_target/build.main.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/example/hybrid/custom_target/build.main.cpp b/example/hybrid/custom_target/build.main.cpp index 50390bd3..6b0829c0 100644 --- a/example/hybrid/custom_target/build.main.cpp +++ b/example/hybrid/custom_target/build.main.cpp @@ -9,16 +9,16 @@ static constexpr std::string_view EXE = "build"; int main(int argc, char **argv) { // 1. Get arguments - Args::Init(); ArgToolchain arg_gcc; ArgToolchain arg_msvc; ArgToolchain toolchain_clang_gnu; ArgTarget target_clang_gnu; - Args::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); - Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); - Args::AddToolchain("clang_gnu", "Clang GNU toolchain", toolchain_clang_gnu); - Args::AddTarget("clang_gnu", "Clang GNU target", target_clang_gnu); - Args::Parse(argc, argv); + Args::Init() + .AddToolchain("gcc", "Generic gcc toolchain", arg_gcc) + .AddToolchain("msvc", "Generic msvc toolchain", arg_msvc) + .AddToolchain("clang_gnu", "Clang GNU toolchain", toolchain_clang_gnu) + .AddTarget("clang_gnu", "Clang GNU target", target_clang_gnu) + .Parse(argc, argv); // 2. Initialize your environment Register reg; From 7766654b2119077a8faf1f57419f0aeb8cf65102 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:27:16 -0700 Subject: [PATCH 18/30] Updated buildexe --- buildexe/buildexe.cpp | 3 +-- buildexe/include/buildexe/args_setup.h | 3 +-- buildexe/src/args_setup.cpp | 7 ++++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/buildexe/buildexe.cpp b/buildexe/buildexe.cpp index 7077d8dd..0af85b3f 100644 --- a/buildexe/buildexe.cpp +++ b/buildexe/buildexe.cpp @@ -42,8 +42,7 @@ int main(int argc, char **argv) { // BuildExeArgs buildexe_args; - buildexe_args.Setup(); - buildexe_args.Parse(argc, argv); + buildexe_args.Setup(argc, argv); // TODO, Add Verification subcommand here for OS, Compiler etc! // os win, linux considerations diff --git a/buildexe/include/buildexe/args_setup.h b/buildexe/include/buildexe/args_setup.h index 26419a53..8f346f6c 100644 --- a/buildexe/include/buildexe/args_setup.h +++ b/buildexe/include/buildexe/args_setup.h @@ -61,8 +61,7 @@ struct LibInfo { class BuildExeArgs { public: - void Setup(); - void Parse(int argc, char **argv) { Args::Parse(argc, argv); } + void Setup(int argc, char **argv); // Getters const ArgToolchain &GetHostToolchainArg() const { diff --git a/buildexe/src/args_setup.cpp b/buildexe/src/args_setup.cpp index 3ec0fb4f..688370a4 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -32,14 +32,15 @@ static const std::unordered_map kTargetTypeMap{ {"dynamicLibrary", TargetType::DynamicLibrary}, }; -void BuildExeArgs::Setup() { - Args::Init(); - Args::AddToolchain("host", "Host Toolchain", host_toolchain_arg_); +void BuildExeArgs::Setup(int argc, char **argv) { + auto &instance = + Args::Init().AddToolchain("host", "Host Toolchain", host_toolchain_arg_); SetupBuildMode(); SetupTargetInfo(); SetupTargetInputs(); SetupScriptMode(); SetupLibs(); + instance.Parse(argc, argv); } void BuildExeArgs::SetupBuildMode() { From 30187f0bc4ee3ae6c22a3e702b76133e088658eb Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 23:28:12 -0700 Subject: [PATCH 19/30] Update main.buildcc.cpp --- bootstrap/main.buildcc.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bootstrap/main.buildcc.cpp b/bootstrap/main.buildcc.cpp index 48e40683..7ee8afd6 100644 --- a/bootstrap/main.buildcc.cpp +++ b/bootstrap/main.buildcc.cpp @@ -33,10 +33,10 @@ static void hybrid_simple_example_cb(BaseTarget &target, const BaseTarget &libbuildcc); int main(int argc, char **argv) { - Args::Init(); ArgToolchain custom_toolchain_arg; - Args::AddToolchain("host", "Host Toolchain", custom_toolchain_arg); - Args::Parse(argc, argv); + Args::Init() + .AddToolchain("host", "Host Toolchain", custom_toolchain_arg) + .Parse(argc, argv); Register reg; reg.Clean(clean_cb); From 8ca8aa26b48779046a380f198872ddd3d90a2c3d Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 01:49:11 -0700 Subject: [PATCH 20/30] Updated args with AddCustomData API --- buildcc/lib/args/include/args/args.h | 12 ++++++++++++ buildcc/lib/args/src/args.cpp | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index bd905b0e..7ff2e19d 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -85,6 +85,10 @@ struct ArgTarget { std::string link_command{""}; }; +struct ArgCustom { + virtual void Add(CLI::App &app) = 0; +}; + class Args { private: class Instance { @@ -117,6 +121,13 @@ class Args { */ Instance &AddTarget(const std::string &name, const std::string &description, ArgTarget &out, const ArgTarget &initial = ArgTarget()); + + /** + * @brief Add custom data + * + * @param data Derive from `buildcc::ArgCustom` and override the `Add` API + */ + Instance &AddCustomData(ArgCustom &data); }; struct Internal { @@ -153,6 +164,7 @@ class Args { private: static void RootArgs(); + static CLI::App &MyRef(); private: static std::unique_ptr internal_; diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index b55922a0..2dccfaec 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -141,6 +141,8 @@ void Args::RootArgs() { ->required(); } +CLI::App &Args::MyRef() { return internal_->app; } + // Args::Instance /** @@ -200,4 +202,10 @@ Args::Instance &Args::Instance::AddTarget(const std::string &name, return *this; } +Args::Instance &Args::Instance::AddCustomData(ArgCustom &data) { + auto &app = MyRef(); + data.Add(app); + return *this; +} + } // namespace buildcc From c35877a757382a21af466119133baebecef5c72c Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 02:03:00 -0700 Subject: [PATCH 21/30] Removed ConstRef --- buildcc/lib/args/include/args/args.h | 2 +- buildcc/lib/args/src/args.cpp | 2 +- buildcc/lib/args/src/parse.cpp | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index 7ff2e19d..8db4abd2 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -153,7 +153,7 @@ class Args { /** * @brief Constant reference to CLI::App (CLI11) */ - static const CLI::App &ConstRef(); + // static const CLI::App &ConstRef(); // Getters static bool Clean(); diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index 2dccfaec..a6ce153d 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -110,7 +110,7 @@ Args::Instance &Args::Init() { void Args::Deinit() { internal_.reset(nullptr); } CLI::App &Args::Ref() { return internal_->app; } -const CLI::App &Args::ConstRef() { return internal_->app; } +// const CLI::App &Args::ConstRef() { return internal_->app; } bool Args::Clean() { return clean_; } env::LogLevel Args::GetLogLevel() { return loglevel_; } diff --git a/buildcc/lib/args/src/parse.cpp b/buildcc/lib/args/src/parse.cpp index 83c0cb1a..bbb6b745 100644 --- a/buildcc/lib/args/src/parse.cpp +++ b/buildcc/lib/args/src/parse.cpp @@ -19,10 +19,11 @@ namespace buildcc { void Args::Instance::Parse(int argc, const char *const *argv) { + auto &app = Ref(); try { - Ref().parse(argc, argv); + app.parse(argc, argv); } catch (const CLI::ParseError &e) { - exit(ConstRef().exit(e)); + exit(app.exit(e)); } } From 0e20e0c2c1ae12fce8ed2712b70f16355ff4fcc2 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 02:11:51 -0700 Subject: [PATCH 22/30] Update test_args.cpp --- buildcc/lib/args/test/test_args.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/buildcc/lib/args/test/test_args.cpp b/buildcc/lib/args/test/test_args.cpp index 5bf11d80..d65f25cf 100644 --- a/buildcc/lib/args/test/test_args.cpp +++ b/buildcc/lib/args/test/test_args.cpp @@ -29,8 +29,6 @@ TEST(ArgsTestGroup, Args_BasicParse) { STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); CHECK(buildcc::Args::GetLogLevel() == buildcc::env::LogLevel::Trace); CHECK_TRUE(buildcc::Args::Clean()); - buildcc::Args::Ref().name("new_name"); - STRCMP_EQUAL(buildcc::Args::Ref().get_name().c_str(), "new_name"); } TEST(ArgsTestGroup, Args_BasicExit) { From dc860e9aafbd5e6aa38c0598786af080f6beff50 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 02:39:58 -0700 Subject: [PATCH 23/30] Updated Args with AddCustomCallback API --- buildcc/lib/args/include/args/args.h | 7 +++++++ buildcc/lib/args/src/args.cpp | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index 8db4abd2..4f0263ef 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -122,6 +122,13 @@ class Args { Instance &AddTarget(const std::string &name, const std::string &description, ArgTarget &out, const ArgTarget &initial = ArgTarget()); + /** + * @brief Custom callback for data + * + * @param add_cb Add callback that exposes underlying CLI::App + */ + Instance &AddCustomCallback(const std::function &add_cb); + /** * @brief Add custom data * diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index a6ce153d..2d326fa5 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -202,6 +202,13 @@ Args::Instance &Args::Instance::AddTarget(const std::string &name, return *this; } +Args::Instance &Args::Instance::AddCustomCallback( + const std::function &add_cb) { + auto &app = MyRef(); + add_cb(app); + return *this; +} + Args::Instance &Args::Instance::AddCustomData(ArgCustom &data) { auto &app = MyRef(); data.Add(app); From 96c802e7b8f2978cd4fd65c15e24b52308bce0ef Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 19:45:26 -0700 Subject: [PATCH 24/30] Update args setup --- buildexe/include/buildexe/args_setup.h | 20 ++++--- buildexe/src/args_setup.cpp | 83 ++++++++++---------------- 2 files changed, 45 insertions(+), 58 deletions(-) diff --git a/buildexe/include/buildexe/args_setup.h b/buildexe/include/buildexe/args_setup.h index 8f346f6c..e6960c20 100644 --- a/buildexe/include/buildexe/args_setup.h +++ b/buildexe/include/buildexe/args_setup.h @@ -26,13 +26,17 @@ enum class BuildExeMode { Script, }; -struct ArgTargetInfo { +struct ArgTargetInfo : public ArgCustom { + void Add(CLI::App &app) override; + std::string name; TargetType type; fs::path relative_to_root; }; -struct ArgTargetInputs { +struct ArgTargetInputs : public ArgCustom { + void Add(CLI::App &app) override; + // Sources std::vector source_files; std::vector include_dirs; @@ -50,10 +54,13 @@ struct ArgTargetInputs { std::vector link_flags; }; -struct ArgScriptInfo { +struct ArgScriptInfo : public ArgCustom { + void Add(CLI::App &app) override; + std::vector configs; }; +// TODO, Update this later struct LibInfo { std::string lib_name; std::string absolute_lib_path; @@ -78,11 +85,8 @@ class BuildExeArgs { } private: - void SetupBuildMode(); - void SetupTargetInfo(); - void SetupTargetInputs(); - void SetupScriptMode(); - void SetupLibs(); + void SetupBuildMode(CLI::App &app); + void SetupLibs(CLI::App & app); private: ArgToolchain host_toolchain_arg_; diff --git a/buildexe/src/args_setup.cpp b/buildexe/src/args_setup.cpp index 688370a4..7ed231c3 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -33,91 +33,74 @@ static const std::unordered_map kTargetTypeMap{ }; void BuildExeArgs::Setup(int argc, char **argv) { - auto &instance = - Args::Init().AddToolchain("host", "Host Toolchain", host_toolchain_arg_); - SetupBuildMode(); - SetupTargetInfo(); - SetupTargetInputs(); - SetupScriptMode(); - SetupLibs(); - instance.Parse(argc, argv); + Args::Init() + .AddToolchain("host", "Host Toolchain", host_toolchain_arg_) + .AddCustomData(out_targetinfo_) + .AddCustomData(out_targetinputs_) + .AddCustomData(out_scriptinfo_) + .AddCustomCallback([&](CLI::App &app) { + SetupBuildMode(app); + SetupLibs(app); + }) + .Parse(argc, argv); } -void BuildExeArgs::SetupBuildMode() { - Args::Ref() - .add_option("--mode", out_mode_, "Provide BuildExe run mode") +void BuildExeArgs::SetupBuildMode(CLI::App &app) { + app.add_option("--mode", out_mode_, "Provide BuildExe run mode") ->transform(CLI::CheckedTransformer(kBuildExeModeMap, CLI::ignore_case)) ->required(); } -// TODO, Add subcommand [build.info] -void BuildExeArgs::SetupTargetInfo() { +void ArgTargetInfo::Add(CLI::App &app) { constexpr const char *const kProjectInfo = "Project Info"; - auto &app = Args::Ref(); - auto *project_info_app = app.add_option_group(kProjectInfo); - project_info_app - ->add_option("--name", out_targetinfo_.name, "Provide Target name") + project_info_app->add_option("--name", name, "Provide Target name") ->required(); - project_info_app - ->add_option("--type", out_targetinfo_.type, "Provide Target Type") + project_info_app->add_option("--type", type, "Provide Target Type") ->transform(CLI::CheckedTransformer(kTargetTypeMap, CLI::ignore_case)) ->required(); project_info_app - ->add_option("--relative_to_root", out_targetinfo_.relative_to_root, + ->add_option("--relative_to_root", relative_to_root, "Provide Target relative to root") ->required(); } -// TODO, Add subcommand [build.inputs] -// TODO, Add group, group by sources, headers, inncludes on CLI -void BuildExeArgs::SetupTargetInputs() { +void ArgTargetInputs::Add(CLI::App &app) { constexpr const char *const kTargetInputs = "Target Inputs"; - auto &app = Args::Ref(); - auto *target_inputs_app = app.add_option_group(kTargetInputs); - target_inputs_app->add_option("--srcs", out_targetinputs_.source_files, - "Provide source files"); - target_inputs_app->add_option("--includes", out_targetinputs_.include_dirs, + target_inputs_app->add_option("--srcs", source_files, "Provide source files"); + target_inputs_app->add_option("--includes", include_dirs, "Provide include dirs"); - target_inputs_app->add_option("--lib_dirs", out_targetinputs_.lib_dirs, - "Provide lib dirs"); - target_inputs_app->add_option("--external_libs", - out_targetinputs_.external_lib_deps, + target_inputs_app->add_option("--lib_dirs", lib_dirs, "Provide lib dirs"); + target_inputs_app->add_option("--external_libs", external_lib_deps, "Provide external libs"); - target_inputs_app->add_option("--preprocessor_flags", - out_targetinputs_.preprocessor_flags, + target_inputs_app->add_option("--preprocessor_flags", preprocessor_flags, "Provide Preprocessor flags"); - target_inputs_app->add_option("--common_compile_flags", - out_targetinputs_.common_compile_flags, + target_inputs_app->add_option("--common_compile_flags", common_compile_flags, "Provide CommonCompile Flags"); - target_inputs_app->add_option("--asm_compile_flags", - out_targetinputs_.asm_compile_flags, + target_inputs_app->add_option("--asm_compile_flags", asm_compile_flags, "Provide AsmCompile Flags"); - target_inputs_app->add_option("--c_compile_flags", - out_targetinputs_.c_compile_flags, + target_inputs_app->add_option("--c_compile_flags", c_compile_flags, "Provide CCompile Flags"); - target_inputs_app->add_option("--cpp_compile_flags", - out_targetinputs_.cpp_compile_flags, + target_inputs_app->add_option("--cpp_compile_flags", cpp_compile_flags, "Provide CppCompile Flags"); - target_inputs_app->add_option("--link_flags", out_targetinputs_.link_flags, + target_inputs_app->add_option("--link_flags", link_flags, "Provide Link Flags"); -} +}; -void BuildExeArgs::SetupScriptMode() { - auto *script_args = Args::Ref().add_subcommand("script"); - script_args->add_option("--configs", out_scriptinfo_.configs, - "Config files for script mode"); +void ArgScriptInfo::Add(CLI::App &app) { + auto *script_args = app.add_subcommand("script"); + script_args->add_option("--configs", configs, "Config files for script mode"); } -void BuildExeArgs::SetupLibs() { - auto *libs_app = Args::Ref().add_subcommand("libs", "Libraries"); +void BuildExeArgs::SetupLibs(CLI::App &app) { + auto *libs_app = app.add_subcommand("libs", "Libraries"); std::error_code ec; fs::directory_iterator dir_iter = fs::directory_iterator(BuildccHome::GetBuildccLibsDir(), ec); From e13f418c5baee6366ef4025fab3379a04822c5dc Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 19:45:35 -0700 Subject: [PATCH 25/30] Update build.cpp --- example/hybrid/generic/build.cpp | 37 +++++++++++++++----------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/example/hybrid/generic/build.cpp b/example/hybrid/generic/build.cpp index 8f4814d0..3b9dcaa3 100644 --- a/example/hybrid/generic/build.cpp +++ b/example/hybrid/generic/build.cpp @@ -15,6 +15,7 @@ constexpr std::string_view EXE = "build"; // Function Prototypes static void clean_cb(); +static void args_lib_type_cb(CLI::App &app, TargetType &lib_type); static void foolib_build_cb(BaseTarget &foolib_target); static void generic_build_cb(BaseTarget &generic_target, BaseTarget &foolib_target); @@ -23,26 +24,11 @@ int main(int argc, char **argv) { // 1. Get arguments ArgToolchain custom_toolchain; TargetType default_lib_type{TargetType::StaticLibrary}; - auto &instance = Args::Init(); - - try { - const std::map lib_type_map_{ - {"StaticLib", TargetType::StaticLibrary}, - {"DynamicLib", TargetType::DynamicLibrary}, - }; - - Args::Ref() - .add_option("--default_lib_type", default_lib_type, "Default Lib Type") - ->transform(CLI::CheckedTransformer(lib_type_map_, CLI::ignore_case)) - ->group("Custom"); - - // NOTE, You can add more custom toolchains as per your requirement - instance.AddToolchain("user", "User defined toolchain", custom_toolchain); - } catch (const std::exception &e) { - std::cout << "EXCEPTION " << e.what() << std::endl; - } - - instance.Parse(argc, argv); + Args::Init() + .AddToolchain("user", "User defined toolchain", custom_toolchain) + .AddCustomCallback( + [&](CLI::App &app) { args_lib_type_cb(app, default_lib_type); }) + .Parse(argc, argv); // 2. Initialize your environment Register reg; @@ -119,6 +105,17 @@ static void clean_cb() { fs::remove_all(Project::GetBuildDir()); } +void args_lib_type_cb(CLI::App &app, TargetType &lib_type) { + const std::map lib_type_map_{ + {"StaticLib", TargetType::StaticLibrary}, + {"DynamicLib", TargetType::DynamicLibrary}, + }; + + app.add_option("--default_lib_type", lib_type, "Default Lib Type") + ->transform(CLI::CheckedTransformer(lib_type_map_, CLI::ignore_case)) + ->group("Custom"); +} + static void foolib_build_cb(BaseTarget &foolib_target) { fooTarget(foolib_target, Project::GetRootDir() / ".." / "foolib"); foolib_target.Build(); From e1145f315d81b8e8277a1f1268f2db80599df3ad Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 19:46:18 -0700 Subject: [PATCH 26/30] Update args --- buildcc/lib/args/include/args/args.h | 12 +----------- buildcc/lib/args/src/args.cpp | 18 +++++++----------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index 4f0263ef..aea9721c 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -152,16 +152,6 @@ class Args { static Instance &Init(); static void Deinit(); - /** - * @brief Modifiable reference to CLI::App (CLI11) - */ - static CLI::App &Ref(); - - /** - * @brief Constant reference to CLI::App (CLI11) - */ - // static const CLI::App &ConstRef(); - // Getters static bool Clean(); static env::LogLevel GetLogLevel(); @@ -171,7 +161,7 @@ class Args { private: static void RootArgs(); - static CLI::App &MyRef(); + static CLI::App &Ref(); private: static std::unique_ptr internal_; diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index 2d326fa5..378bd7d4 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -109,9 +109,6 @@ Args::Instance &Args::Init() { void Args::Deinit() { internal_.reset(nullptr); } -CLI::App &Args::Ref() { return internal_->app; } -// const CLI::App &Args::ConstRef() { return internal_->app; } - bool Args::Clean() { return clean_; } env::LogLevel Args::GetLogLevel() { return loglevel_; } @@ -121,14 +118,13 @@ const fs::path &Args::GetProjectBuildDir() { return project_build_dir_; } // Private void Args::RootArgs() { - Ref().set_help_all_flag(kHelpAllParam, kHelpAllDesc); + auto &app = Ref(); + app.set_help_all_flag(kHelpAllParam, kHelpAllDesc); - Ref() - .set_config(kConfigParam, "", kConfigDesc) - ->expected(kMinFiles, kMaxFiles); + app.set_config(kConfigParam, "", kConfigDesc)->expected(kMinFiles, kMaxFiles); // Root flags - auto *root_group = Ref().add_option_group(kRootGroup); + auto *root_group = app.add_option_group(kRootGroup); root_group->add_flag(kCleanParam, clean_, kCleanDesc); root_group->add_option(kLoglevelParam, loglevel_, kLoglevelDesc) @@ -141,7 +137,7 @@ void Args::RootArgs() { ->required(); } -CLI::App &Args::MyRef() { return internal_->app; } +CLI::App &Args::Ref() { return internal_->app; } // Args::Instance @@ -204,13 +200,13 @@ Args::Instance &Args::Instance::AddTarget(const std::string &name, Args::Instance &Args::Instance::AddCustomCallback( const std::function &add_cb) { - auto &app = MyRef(); + auto &app = Ref(); add_cb(app); return *this; } Args::Instance &Args::Instance::AddCustomData(ArgCustom &data) { - auto &app = MyRef(); + auto &app = Ref(); data.Add(app); return *this; } From 66d7eb7e7a91ca04f58307c07e37c302adc1efbb Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 20:08:08 -0700 Subject: [PATCH 27/30] Updated args setup --- buildexe/include/buildexe/args_setup.h | 20 ++++++++++++-------- buildexe/src/args_setup.cpp | 14 ++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/buildexe/include/buildexe/args_setup.h b/buildexe/include/buildexe/args_setup.h index e6960c20..dde67f08 100644 --- a/buildexe/include/buildexe/args_setup.h +++ b/buildexe/include/buildexe/args_setup.h @@ -60,12 +60,18 @@ struct ArgScriptInfo : public ArgCustom { std::vector configs; }; -// TODO, Update this later struct LibInfo { std::string lib_name; std::string absolute_lib_path; }; +struct ArgLibsInfo : public ArgCustom { + void Add(CLI::App &app) override; + + std::vector libs_info; + std::vector lib_build_files; +}; + class BuildExeArgs { public: void Setup(int argc, char **argv); @@ -79,25 +85,23 @@ class BuildExeArgs { const ArgScriptInfo &GetScriptInfo() const { return out_scriptinfo_; } BuildExeMode GetBuildMode() const { return out_mode_; } - const std::vector &GetLibsInfo() const { return libs_info_; } + const std::vector &GetLibsInfo() const { + return out_libsinfo_.libs_info; + } const std::vector &GetLibBuildFiles() const { - return lib_build_files_; + return out_libsinfo_.lib_build_files; } private: void SetupBuildMode(CLI::App &app); - void SetupLibs(CLI::App & app); private: ArgToolchain host_toolchain_arg_; ArgTargetInfo out_targetinfo_; ArgTargetInputs out_targetinputs_; ArgScriptInfo out_scriptinfo_; - + ArgLibsInfo out_libsinfo_; BuildExeMode out_mode_; - - std::vector libs_info_; - std::vector lib_build_files_; }; } // namespace buildcc diff --git a/buildexe/src/args_setup.cpp b/buildexe/src/args_setup.cpp index 7ed231c3..edee4ada 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -38,10 +38,8 @@ void BuildExeArgs::Setup(int argc, char **argv) { .AddCustomData(out_targetinfo_) .AddCustomData(out_targetinputs_) .AddCustomData(out_scriptinfo_) - .AddCustomCallback([&](CLI::App &app) { - SetupBuildMode(app); - SetupLibs(app); - }) + .AddCustomData(out_libsinfo_) + .AddCustomCallback([&](CLI::App &app) { SetupBuildMode(app); }) .Parse(argc, argv); } @@ -99,7 +97,7 @@ void ArgScriptInfo::Add(CLI::App &app) { script_args->add_option("--configs", configs, "Config files for script mode"); } -void BuildExeArgs::SetupLibs(CLI::App &app) { +void ArgLibsInfo::Add(CLI::App &app) { auto *libs_app = app.add_subcommand("libs", "Libraries"); std::error_code ec; fs::directory_iterator dir_iter = @@ -117,13 +115,13 @@ void BuildExeArgs::SetupLibs(CLI::App &app) { LibInfo lib_info; lib_info.lib_name = lib_name; lib_info.absolute_lib_path = fmt::format("{}", lib_path); - libs_info_.push_back(lib_info); + libs_info.push_back(lib_info); auto add_lib_files_cb_func = [lib_path, this](const std::vector &paths) { for (const auto &p : paths) { - fs::path absolute_file_path = lib_path / p; - lib_build_files_.push_back(absolute_file_path); + fs::path absolute_file_path = (lib_path / p).make_preferred(); + lib_build_files.push_back(absolute_file_path); } }; From 8e67cee5de794f27467938443a15d548d2e10ca7 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 20:26:16 -0700 Subject: [PATCH 28/30] Update test_args.cpp --- buildcc/lib/args/test/test_args.cpp | 59 ++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/buildcc/lib/args/test/test_args.cpp b/buildcc/lib/args/test/test_args.cpp index d65f25cf..697df743 100644 --- a/buildcc/lib/args/test/test_args.cpp +++ b/buildcc/lib/args/test/test_args.cpp @@ -16,7 +16,6 @@ TEST_GROUP(ArgsTestGroup) // clang-format on TEST(ArgsTestGroup, Args_BasicParse) { - UT_PRINT("Args_BasicParse\r\n"); std::vector av{"", "--config", "configs/basic_parse.toml"}; int argc = av.size(); @@ -265,6 +264,64 @@ TEST(ArgsTestGroup, Args_MultipleCustomTarget) { "{compiled_sources}"); } +TEST(ArgsTestGroup, Args_CustomCallback) { + std::vector av{"", + "--config", + "configs/basic_parse.toml", + "--random_bool", + "true", + "--random_string", + "hello world"}; + int argc = av.size(); + + bool random_bool{false}; + std::string random_string; + auto &instance = buildcc::Args::Init(); + instance.AddCustomCallback([&](CLI::App &app) { + app.add_option("--random_bool", random_bool, "Random bool"); + app.add_option("--random_string", random_string, "Random string"); + }); + instance.Parse(argc, av.data()); + + STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); + STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); + CHECK(buildcc::Args::GetLogLevel() == buildcc::env::LogLevel::Trace); + CHECK_TRUE(buildcc::Args::Clean()); + CHECK_TRUE(random_bool); + STRCMP_EQUAL(random_string.c_str(), "hello world"); +} + +TEST(ArgsTestGroup, Args_CustomData) { + struct RandomGroupedData : public buildcc::ArgCustom { + void Add(CLI::App &app) override { + app.add_option("--random_bool", random_bool, "Random bool"); + app.add_option("--random_string", random_string, "Random string"); + } + + bool random_bool{false}; + std::string random_string; + }; + + std::vector av{"", + "--config", + "configs/basic_parse.toml", + "--random_bool", + "true", + "--random_string", + "hello world"}; + int argc = av.size(); + + RandomGroupedData grouped_data; + buildcc::Args::Init().AddCustomData(grouped_data).Parse(argc, av.data()); + + STRCMP_EQUAL(buildcc::Args::GetProjectRootDir().string().c_str(), "root"); + STRCMP_EQUAL(buildcc::Args::GetProjectBuildDir().string().c_str(), "build"); + CHECK(buildcc::Args::GetLogLevel() == buildcc::env::LogLevel::Trace); + CHECK_TRUE(buildcc::Args::Clean()); + CHECK_TRUE(grouped_data.random_bool); + STRCMP_EQUAL(grouped_data.random_string.c_str(), "hello world"); +} + int main(int ac, char **av) { MemoryLeakWarningPlugin::destroyGlobalDetector(); return CommandLineTestRunner::RunAllTests(ac, av); From 2eafd975096982cd99dbe9f091fdd2abe8dc1253 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 20:42:03 -0700 Subject: [PATCH 29/30] Update args.h --- buildcc/lib/args/include/args/args.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index aea9721c..f26e006d 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -93,15 +93,13 @@ class Args { private: class Instance { public: - Instance() = default; - /** * @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 Add toolchain with a unique name and description From b0be6c74a8647d68b45200cf04e8b2bacdd09d60 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 28 Mar 2022 20:42:07 -0700 Subject: [PATCH 30/30] Update args.rst --- docs/source/user_api/args.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/user_api/args.rst b/docs/source/user_api/args.rst index 383268c7..a0c8d482 100644 --- a/docs/source/user_api/args.rst +++ b/docs/source/user_api/args.rst @@ -5,7 +5,8 @@ args.h ------- .. doxygenclass:: buildcc::Args - :members: Args, Parse, Ref, ConstRef, AddToolchain, Clean, GetLogLevel, GetProjectRootDir, GetProjectBuildDir + +.. doxygenclass:: buildcc::Args::Instance .. doxygenstruct:: buildcc::ArgToolchainState