From 6655d1cb5c6804667c278da1a201dfd0e695e67a Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 02:25:27 -0700 Subject: [PATCH 01/14] Update env.h --- buildcc/lib/env/include/env/env.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/buildcc/lib/env/include/env/env.h b/buildcc/lib/env/include/env/env.h index e9b9fb78..c260b28c 100644 --- a/buildcc/lib/env/include/env/env.h +++ b/buildcc/lib/env/include/env/env.h @@ -27,6 +27,9 @@ namespace buildcc { class Project { public: + Project() = delete; + Project(const Project &) = delete; + Project(Project &&) = delete; static void Init(const fs::path &project_root_dir, const fs::path &project_build_dir); static void Deinit(); From 08442bc5b5f9f8a7f7ddf987f3fe37ea927e0d49 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 05:22:19 -0700 Subject: [PATCH 02/14] Updated Args from constructable to a static function --- bootstrap/main.buildcc.cpp | 9 +- buildcc/lib/args/CMakeLists.txt | 1 + buildcc/lib/args/include/args/args.h | 46 ++--- buildcc/lib/args/include/args/register.h | 5 +- buildcc/lib/args/mock/parse.cpp | 2 +- buildcc/lib/args/mock/test_args.h | 21 ++ buildcc/lib/args/src/args.cpp | 49 ++++- buildcc/lib/args/src/parse.cpp | 4 +- buildcc/lib/args/src/register.cpp | 8 +- buildcc/lib/args/test/test_args.cpp | 114 ++++++----- buildcc/lib/args/test/test_register.cpp | 215 ++++++++++---------- buildexe/buildexe.cpp | 2 +- buildexe/include/buildexe/args_setup.h | 4 +- buildexe/src/args_setup.cpp | 12 +- example/buildexe/libs/build.main.cpp | 9 +- example/hybrid/custom_target/build.main.cpp | 15 +- example/hybrid/dep_chaining/build.cpp | 11 +- example/hybrid/external_lib/build.main.cpp | 11 +- example/hybrid/foolib/build.main.cpp | 11 +- example/hybrid/generic/build.cpp | 11 +- example/hybrid/pch/build.cpp | 11 +- example/hybrid/simple/build.cpp | 11 +- example/hybrid/single/build.cpp | 9 +- example/hybrid/target_info/build.cpp | 11 +- 24 files changed, 336 insertions(+), 266 deletions(-) create mode 100644 buildcc/lib/args/mock/test_args.h diff --git a/bootstrap/main.buildcc.cpp b/bootstrap/main.buildcc.cpp index 7f08c37b..4882d013 100644 --- a/bootstrap/main.buildcc.cpp +++ b/bootstrap/main.buildcc.cpp @@ -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(); diff --git a/buildcc/lib/args/CMakeLists.txt b/buildcc/lib/args/CMakeLists.txt index ffc289fa..5b5843fa 100644 --- a/buildcc/lib/args/CMakeLists.txt +++ b/buildcc/lib/args/CMakeLists.txt @@ -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} diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index c687df92..50e5e975 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -88,8 +88,12 @@ 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 @@ -97,17 +101,17 @@ class Args { * @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 @@ -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 @@ -129,31 +133,19 @@ 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(); + static CLI::App &GetStaticCliApp(); }; } // namespace buildcc diff --git a/buildcc/lib/args/include/args/register.h b/buildcc/lib/args/include/args/register.h index 04210789..c15a0b83 100644 --- a/buildcc/lib/args/include/args/register.h +++ b/buildcc/lib/args/include/args/register.h @@ -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; /** @@ -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"}; diff --git a/buildcc/lib/args/mock/parse.cpp b/buildcc/lib/args/mock/parse.cpp index 210a7530..dcbccc3c 100644 --- a/buildcc/lib/args/mock/parse.cpp +++ b/buildcc/lib/args/mock/parse.cpp @@ -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(e.what()); } diff --git a/buildcc/lib/args/mock/test_args.h b/buildcc/lib/args/mock/test_args.h new file mode 100644 index 00000000..5a9d10a6 --- /dev/null +++ b/buildcc/lib/args/mock/test_args.h @@ -0,0 +1,21 @@ +#ifndef ARGS_MOCK_TEST_ARGS_H_ +#define ARGS_MOCK_TEST_ARGS_H_ + +#include "args/args.h" + +#include + +namespace buildcc::m { + +inline void ArgsDeinit() { + auto subcommand_list = + buildcc::Args::Ref().get_subcommands([](CLI::App *) { return true; }); + for (auto *subcommand : subcommand_list) { + assert(buildcc::Args::Ref().remove_subcommand(subcommand)); + } + buildcc::Args::Ref().clear(); +} + +} // namespace buildcc::m + +#endif diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index e6cd76a1..a3822d23 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -84,10 +84,41 @@ const std::unordered_map 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 +CLI::App *toolchain_{nullptr}; +CLI::App *target_{nullptr}; + } // namespace namespace buildcc { +void Args::Init() { + RootArgs(); + toolchain_ = Ref().add_subcommand(kToolchainSubcommand, kToolchainDesc); + target_ = Ref().add_subcommand(kTargetSubcommand, kTargetDesc); +} + +void Args::Deinit() { + toolchain_->clear(); + target_->clear(); + Ref().clear(); +} + +CLI::App &Args::Ref() { return GetStaticCliApp(); } +const CLI::App &Args::ConstRef() { return GetStaticCliApp(); } + +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 *t_user = @@ -123,20 +154,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) @@ -149,4 +175,9 @@ void Args::RootArgs() { ->required(); } +CLI::App &Args::GetStaticCliApp() { + static CLI::App app_{"BuildCC buildsystem"}; + return app_; +} + } // namespace buildcc diff --git a/buildcc/lib/args/src/parse.cpp b/buildcc/lib/args/src/parse.cpp index 637ee6f4..08baac2f 100644 --- a/buildcc/lib/args/src/parse.cpp +++ b/buildcc/lib/args/src/parse.cpp @@ -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)); } } diff --git a/buildcc/lib/args/src/register.cpp b/buildcc/lib/args/src/register.cpp index 680071d8..cbd1e719 100644 --- a/buildcc/lib/args/src/register.cpp +++ b/buildcc/lib/args/src/register.cpp @@ -61,7 +61,7 @@ void DepDetectCyclicDependency(const tf::Task &target_task, namespace buildcc { void Register::Clean(const std::function &clean_cb) { - if (args_.Clean()) { + if (Args::Clean()) { clean_cb(); } } @@ -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()); } // diff --git a/buildcc/lib/args/test/test_args.cpp b/buildcc/lib/args/test/test_args.cpp index acaa82b7..87d30316 100644 --- a/buildcc/lib/args/test/test_args.cpp +++ b/buildcc/lib/args/test/test_args.cpp @@ -1,5 +1,7 @@ #include "args/args.h" +#include "test_args.h" + // NOTE, Make sure all these includes are AFTER the system and header includes #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/MemoryLeakDetectorNewMacros.h" @@ -9,29 +11,36 @@ // clang-format off TEST_GROUP(ArgsTestGroup) { + void teardown() { + buildcc::m::ArgsDeinit(); + buildcc::Args::Ref().clear(); + } }; // 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(); - buildcc::Args args; - args.Parse(argc, av.data()); + // buildcc::Args::Init(); + buildcc::Args::Init(); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); } TEST(ArgsTestGroup, Args_BasicExit) { + UT_PRINT("Args_BasicExit\r\n"); std::vector av{"", "--config", "configs/basic_parse.toml", "--help"}; int argc = av.size(); - buildcc::Args args; - CHECK_THROWS(std::exception, args.Parse(argc, av.data())); + buildcc::Args::Init(); + CHECK_THROWS(std::exception, buildcc::Args::Parse(argc, av.data())); } TEST(ArgsTestGroup, Args_MultiToml) { @@ -39,13 +48,13 @@ TEST(ArgsTestGroup, Args_MultiToml) { "--config", "configs/no_clean.toml"}; int argc = av.size(); - buildcc::Args args; - args.Parse(argc, av.data()); + buildcc::Args::Init(); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_FALSE(args.Clean()); + 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_FALSE(buildcc::Args::Clean()); } TEST(ArgsTestGroup, Args_CustomToolchain) { @@ -53,15 +62,15 @@ TEST(ArgsTestGroup, Args_CustomToolchain) { "--config", "configs/gcc_toolchain.toml"}; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.Parse(argc, av.data()); + buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); // Toolchain CHECK_TRUE(gcc_toolchain.state.build); @@ -87,17 +96,17 @@ TEST(ArgsTestGroup, Args_MultipleCustomToolchain) { }; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - args.Parse(argc, av.data()); + buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); // Toolchain @@ -125,17 +134,18 @@ TEST(ArgsTestGroup, Args_MultipleCustomToolchain) { } TEST(ArgsTestGroup, Args_DuplicateCustomToolchain) { - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain other_gcc_toolchain; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::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, args.AddToolchain("gcc", "Other gcc toolchain", - other_gcc_toolchain)); + CHECK_THROWS(std::exception, + (buildcc::Args::AddToolchain("gcc", "Other gcc toolchain ", + other_gcc_toolchain))); } TEST(ArgsTestGroup, Args_CustomTarget) { @@ -150,17 +160,17 @@ TEST(ArgsTestGroup, Args_CustomTarget) { }; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgTarget gcc_target; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.AddTarget("gcc", "Generic gcc target", gcc_target); - args.Parse(argc, av.data()); + buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::AddTarget("gcc", "Generic gcc target", gcc_target); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); // Toolchain CHECK_TRUE(gcc_toolchain.state.build); @@ -198,21 +208,21 @@ TEST(ArgsTestGroup, Args_MultipleCustomTarget) { }; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgTarget gcc_target; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.AddTarget("gcc", "Generic gcc target", 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; - args.AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - args.AddTarget("msvc", "Generic msvc target", msvc_target); - args.Parse(argc, av.data()); - - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); + buildcc::Args::AddTarget("msvc", "Generic msvc target", msvc_target); + buildcc::Args::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()); // GCC diff --git a/buildcc/lib/args/test/test_register.cpp b/buildcc/lib/args/test/test_register.cpp index 948ba972..ee9b07a8 100644 --- a/buildcc/lib/args/test/test_register.cpp +++ b/buildcc/lib/args/test/test_register.cpp @@ -1,5 +1,7 @@ #include "args/register.h" +#include "test_args.h" + #include "expect_command.h" #include "mock_command_copier.h" @@ -14,9 +16,10 @@ // clang-format off TEST_GROUP(RegisterTestGroup) { - void teardown() { - mock().clear(); - } + void teardown() { + buildcc::m::ArgsDeinit(); + mock().clear(); + } }; // clang-format on @@ -24,15 +27,15 @@ TEST(RegisterTestGroup, Register_Initialize) { std::vector av{"", "--config", "configs/basic_parse.toml"}; int argc = av.size(); - buildcc::Args args; - args.Parse(argc, av.data()); + buildcc::Args::Init(); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); - buildcc::Register reg(args); + buildcc::Register reg; } TEST(RegisterTestGroup, Register_Clean) { @@ -40,17 +43,18 @@ TEST(RegisterTestGroup, Register_Clean) { std::vector av{"", "--config", "configs/basic_parse.toml"}; int argc = av.size(); - buildcc::Args args; - args.Parse(argc, av.data()); + buildcc::Args::Init(); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); - buildcc::Register reg(args); + buildcc::Register reg; mock().expectOneCall("CleanCb"); reg.Clean([]() { mock().actualCall("CleanCb"); }); + buildcc::m::ArgsDeinit(); } { @@ -63,16 +67,17 @@ TEST(RegisterTestGroup, Register_Clean) { }; int argc = av.size(); - buildcc::Args args; - args.Parse(argc, av.data()); + buildcc::Args::Init(); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_FALSE(args.Clean()); + 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_FALSE(buildcc::Args::Clean()); - buildcc::Register reg(args); + buildcc::Register reg; reg.Clean([]() { mock().actualCall("CleanCb"); }); + buildcc::m::ArgsDeinit(); } mock().checkExpectations(); @@ -86,17 +91,17 @@ TEST(RegisterTestGroup, Register_Build) { }; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - args.Parse(argc, av.data()); + buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); // Make dummy toolchain and target buildcc::Project::Init(fs::current_path(), fs::current_path()); @@ -108,7 +113,7 @@ TEST(RegisterTestGroup, Register_Build) { { buildcc::ArgToolchainState state{false, false}; - buildcc::Register reg(args); + buildcc::Register reg; reg.Build( state, [](buildcc::BaseTarget &target) { (void)target; }, target); } @@ -116,7 +121,7 @@ TEST(RegisterTestGroup, Register_Build) { { buildcc::ArgToolchainState state{true, true}; - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); reg.Build( state, [](buildcc::BaseTarget &target) { (void)target; }, target); @@ -134,17 +139,17 @@ TEST(RegisterTestGroup, Register_NoBuildAndDep) { }; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - args.Parse(argc, av.data()); + buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); // Make dummy toolchain and target buildcc::Project::Init(fs::current_path(), fs::current_path()); @@ -167,13 +172,13 @@ TEST(RegisterTestGroup, Register_NoBuildAndDep) { // T0D0 { - buildcc::Register reg(args); + buildcc::Register reg; CHECK_THROWS(std::exception, reg.Dep(target, dependency)); } // T0D1 { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_depT"); reg.Build( trueState, [](buildcc::BaseTarget &target) { (void)target; }, @@ -184,7 +189,7 @@ TEST(RegisterTestGroup, Register_NoBuildAndDep) { // T1D0 { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); reg.Build( trueState, [](buildcc::BaseTarget &target) { (void)target; }, target); @@ -194,7 +199,7 @@ TEST(RegisterTestGroup, Register_NoBuildAndDep) { // T1D1 { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); mock().expectNCalls(1, "BuildTask_depT"); reg.Build( @@ -218,17 +223,17 @@ TEST(RegisterTestGroup, Register_BuildAndDep) { }; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - args.Parse(argc, av.data()); + buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); // Make dummy toolchain and target buildcc::Project::Init(fs::current_path(), fs::current_path()); @@ -251,7 +256,7 @@ TEST(RegisterTestGroup, Register_BuildAndDep) { // T0D0 { - buildcc::Register reg(args); + buildcc::Register reg; reg.Build( falseState, [](buildcc::BaseTarget &target) { (void)target; }, target); reg.Build( @@ -263,7 +268,7 @@ TEST(RegisterTestGroup, Register_BuildAndDep) { // T0D1 { - buildcc::Register reg(args); + buildcc::Register reg; reg.Build( falseState, [](buildcc::BaseTarget &target) { (void)target; }, target); mock().expectNCalls(1, "BuildTask_depT"); @@ -276,7 +281,7 @@ TEST(RegisterTestGroup, Register_BuildAndDep) { // T1D0 { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); reg.Build( trueState, [](buildcc::BaseTarget &target) { (void)target; }, target); @@ -289,7 +294,7 @@ TEST(RegisterTestGroup, Register_BuildAndDep) { // T1D1 { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); mock().expectNCalls(1, "BuildTask_depT"); reg.Build( @@ -313,17 +318,17 @@ TEST(RegisterTestGroup, Register_DepDuplicate) { }; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - args.Parse(argc, av.data()); + buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); // Make dummy toolchain and target buildcc::Project::Init(fs::current_path(), fs::current_path()); @@ -340,7 +345,7 @@ TEST(RegisterTestGroup, Register_DepDuplicate) { // Duplicate dependency with 2 Targets { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); mock().expectNCalls(1, "BuildTask_depT"); reg.Build( @@ -355,7 +360,7 @@ TEST(RegisterTestGroup, Register_DepDuplicate) { // Duplicate dependency with 3 Targets { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); mock().expectNCalls(1, "BuildTask_depT"); mock().expectNCalls(1, "BuildTask_dep2T"); @@ -389,17 +394,17 @@ TEST(RegisterTestGroup, Register_DepCyclic) { }; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - args.Parse(argc, av.data()); + buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); // Make dummy toolchain and target buildcc::Project::Init(fs::current_path(), fs::current_path()); @@ -416,7 +421,7 @@ TEST(RegisterTestGroup, Register_DepCyclic) { // Immediate cyclic depdendency { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); mock().expectNCalls(1, "BuildTask_depT"); reg.Build( @@ -431,7 +436,7 @@ TEST(RegisterTestGroup, Register_DepCyclic) { // Duplicate dependency with 3 Targets { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); mock().expectNCalls(1, "BuildTask_depT"); mock().expectNCalls(1, "BuildTask_dep2T"); @@ -465,17 +470,17 @@ TEST(RegisterTestGroup, Register_Test) { }; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - args.Parse(argc, av.data()); + buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); // Make dummy toolchain and target buildcc::Project::Init(fs::current_path(), fs::current_path()); @@ -498,33 +503,33 @@ TEST(RegisterTestGroup, Register_Test) { // FF { - buildcc::Register reg(args); + buildcc::Register reg; reg.Test(stateFail, "{executable}", target); } // TF { - buildcc::Register reg(args); + buildcc::Register reg; reg.Test(state1, "{executable}", target); } // FT { - buildcc::Register reg(args); + buildcc::Register reg; reg.Test(state2, "{executable}", target); } // TT // Register::Build not called { - buildcc::Register reg(args); + buildcc::Register reg; CHECK_THROWS(std::exception, reg.Test(stateSuccess, "{executable}", target)); } // Correct Usage { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); reg.Build( stateSuccess, [](buildcc::BaseTarget &target) { (void)target; }, @@ -550,17 +555,17 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { }; int argc = av.size(); - buildcc::Args args; + buildcc::Args::Init(); buildcc::ArgToolchain gcc_toolchain; buildcc::ArgToolchain msvc_toolchain; - args.AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); - args.AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); - args.Parse(argc, av.data()); + buildcc::Args::AddToolchain("gcc", "Generic gcc toolchain", gcc_toolchain); + buildcc::Args::AddToolchain("msvc", "Generic msvc toolchain", msvc_toolchain); + buildcc::Args::Parse(argc, av.data()); - STRCMP_EQUAL(args.GetProjectRootDir().string().c_str(), "root"); - STRCMP_EQUAL(args.GetProjectBuildDir().string().c_str(), "build"); - CHECK(args.GetLogLevel() == buildcc::env::LogLevel::Trace); - CHECK_TRUE(args.Clean()); + 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()); // Make dummy toolchain and target buildcc::Project::Init(fs::current_path(), fs::current_path()); @@ -575,7 +580,7 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { // TestOutput::Type::DefaultBehaviour { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); reg.Build( stateSuccess, [](buildcc::BaseTarget &target) { (void)target; }, @@ -592,7 +597,7 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { // TestOutput::Type::TestPrintOnStderr { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); reg.Build( stateSuccess, [](buildcc::BaseTarget &target) { (void)target; }, @@ -610,7 +615,7 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { // TestOutput::Type::TestPrintOnStdout { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); reg.Build( stateSuccess, [](buildcc::BaseTarget &target) { (void)target; }, @@ -628,7 +633,7 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { // TestOutput::Type::TestPrintOnStderrAndStdout { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); reg.Build( stateSuccess, [](buildcc::BaseTarget &target) { (void)target; }, @@ -647,7 +652,7 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { // TestOutput::Type::UserRedirect { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); reg.Build( stateSuccess, [](buildcc::BaseTarget &target) { (void)target; }, @@ -664,7 +669,7 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { // TestOutput::Type::UserRedirect { - buildcc::Register reg(args); + buildcc::Register reg; mock().expectNCalls(1, "BuildTask_dummyT"); reg.Build( stateSuccess, [](buildcc::BaseTarget &target) { (void)target; }, diff --git a/buildexe/buildexe.cpp b/buildexe/buildexe.cpp index f9e641de..7077d8dd 100644 --- a/buildexe/buildexe.cpp +++ b/buildexe/buildexe.cpp @@ -54,7 +54,7 @@ int main(int argc, char **argv) { // TODO, Add libraries (git cloned) // TODO, Add extension (git cloned) - Register reg(buildexe_args.GetArgs()); + Register reg; reg.Clean(clean_cb); // Host Toolchain diff --git a/buildexe/include/buildexe/args_setup.h b/buildexe/include/buildexe/args_setup.h index 5fc9faff..26419a53 100644 --- a/buildexe/include/buildexe/args_setup.h +++ b/buildexe/include/buildexe/args_setup.h @@ -62,10 +62,9 @@ struct LibInfo { class BuildExeArgs { public: void Setup(); - void Parse(int argc, char **argv) { args_.Parse(argc, argv); } + void Parse(int argc, char **argv) { Args::Parse(argc, argv); } // Getters - const Args &GetArgs() const { return args_; } const ArgToolchain &GetHostToolchainArg() const { return host_toolchain_arg_; } @@ -87,7 +86,6 @@ class BuildExeArgs { void SetupLibs(); private: - Args args_; ArgToolchain host_toolchain_arg_; ArgTargetInfo out_targetinfo_; ArgTargetInputs out_targetinputs_; diff --git a/buildexe/src/args_setup.cpp b/buildexe/src/args_setup.cpp index a797bf95..0959bbd6 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -33,7 +33,7 @@ static const std::unordered_map kTargetTypeMap{ }; void BuildExeArgs::Setup() { - args_.AddToolchain("host", "Host Toolchain", host_toolchain_arg_); + Args::AddToolchain("host", "Host Toolchain", host_toolchain_arg_); SetupBuildMode(); SetupTargetInfo(); SetupTargetInputs(); @@ -42,7 +42,7 @@ void BuildExeArgs::Setup() { } void BuildExeArgs::SetupBuildMode() { - args_.Ref() + Args::Ref() .add_option("--mode", out_mode_, "Provide BuildExe run mode") ->transform(CLI::CheckedTransformer(kBuildExeModeMap, CLI::ignore_case)) ->required(); @@ -51,7 +51,7 @@ void BuildExeArgs::SetupBuildMode() { // TODO, Add subcommand [build.info] void BuildExeArgs::SetupTargetInfo() { constexpr const char *const kProjectInfo = "Project Info"; - auto &app = args_.Ref(); + auto &app = Args::Ref(); auto *project_info_app = app.add_option_group(kProjectInfo); @@ -74,7 +74,7 @@ void BuildExeArgs::SetupTargetInfo() { // TODO, Add group, group by sources, headers, inncludes on CLI void BuildExeArgs::SetupTargetInputs() { constexpr const char *const kTargetInputs = "Target Inputs"; - auto &app = args_.Ref(); + auto &app = Args::Ref(); auto *target_inputs_app = app.add_option_group(kTargetInputs); @@ -109,13 +109,13 @@ void BuildExeArgs::SetupTargetInputs() { } void BuildExeArgs::SetupScriptMode() { - auto *script_args = args_.Ref().add_subcommand("script"); + auto *script_args = Args::Ref().add_subcommand("script"); script_args->add_option("--configs", out_scriptinfo_.configs, "Config files for script mode"); } void BuildExeArgs::SetupLibs() { - auto *libs_app = args_.Ref().add_subcommand("libs", "Libraries"); + auto *libs_app = Args::Ref().add_subcommand("libs", "Libraries"); std::error_code ec; fs::directory_iterator dir_iter = fs::directory_iterator(BuildccHome::GetBuildccLibsDir(), ec); diff --git a/example/buildexe/libs/build.main.cpp b/example/buildexe/libs/build.main.cpp index b8f7d5e6..5937c5ee 100644 --- a/example/buildexe/libs/build.main.cpp +++ b/example/buildexe/libs/build.main.cpp @@ -17,13 +17,14 @@ static void hello_world_build_cb(BaseTarget &target, BaseTarget &fmt_lib); int main(int argc, char **argv) { // 1. Get arguments - Args args; + Args::Init(); ArgToolchain arg_gcc; - args.AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); - args.Parse(argc, argv); + Args::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); + Args::Parse(argc, argv); // 2. Initialize your environment - Register reg(args); + Register reg; + ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/custom_target/build.main.cpp b/example/hybrid/custom_target/build.main.cpp index d290a117..e5d65053 100644 --- a/example/hybrid/custom_target/build.main.cpp +++ b/example/hybrid/custom_target/build.main.cpp @@ -9,19 +9,20 @@ static constexpr std::string_view EXE = "build"; int main(int argc, char **argv) { // 1. Get arguments - Args args; + 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::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); // 2. Initialize your environment - Register reg(args); + Register reg; + ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/dep_chaining/build.cpp b/example/hybrid/dep_chaining/build.cpp index c2b165cb..ef66a09b 100644 --- a/example/hybrid/dep_chaining/build.cpp +++ b/example/hybrid/dep_chaining/build.cpp @@ -16,15 +16,16 @@ static void c_generator_cb(BaseGenerator &generator); int main(int argc, char **argv) { // 1. Get arguments - Args args; + 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::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); + Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); + Args::Parse(argc, argv); // 2. Initialize your environment - Register reg(args); + Register reg; + ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/external_lib/build.main.cpp b/example/hybrid/external_lib/build.main.cpp index b32cb01a..ee4fac01 100644 --- a/example/hybrid/external_lib/build.main.cpp +++ b/example/hybrid/external_lib/build.main.cpp @@ -11,15 +11,16 @@ constexpr const char *const EXE = "build"; int main(int argc, char **argv) { // 1. Get arguments - Args args; + 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::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); + Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); + Args::Parse(argc, argv); // 2. Initialize your environment - Register reg(args); + Register reg; + ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/foolib/build.main.cpp b/example/hybrid/foolib/build.main.cpp index 3586f275..3dffd809 100644 --- a/example/hybrid/foolib/build.main.cpp +++ b/example/hybrid/foolib/build.main.cpp @@ -11,15 +11,16 @@ constexpr std::string_view EXE = "build"; int main(int argc, char **argv) { // 1. Get arguments - Args args; + 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::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); + Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); + Args::Parse(argc, argv); // 2. Initialize your environment - Register reg(args); + Register reg; + ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/generic/build.cpp b/example/hybrid/generic/build.cpp index 605ed4a0..a776dfcb 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 args; + Args::Init(); try { const std::map lib_type_map_{ @@ -31,21 +31,22 @@ int main(int argc, char **argv) { {"DynamicLib", TargetType::DynamicLibrary}, }; - args.Ref() + 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 - args.AddToolchain("user", "User defined toolchain", custom_toolchain); + Args::AddToolchain("user", "User defined toolchain", custom_toolchain); } catch (const std::exception &e) { std::cout << "EXCEPTION " << e.what() << std::endl; } - args.Parse(argc, argv); + Args::Parse(argc, argv); // 2. Initialize your environment - Register reg(args); + Register reg; + ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/pch/build.cpp b/example/hybrid/pch/build.cpp index 8f7bc63d..da8f97d5 100644 --- a/example/hybrid/pch/build.cpp +++ b/example/hybrid/pch/build.cpp @@ -13,15 +13,16 @@ static void cflags_build_cb(BaseTarget &cflags); int main(int argc, char **argv) { // 1. Get arguments - Args args; + 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::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); + Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); + Args::Parse(argc, argv); // 2. Initialize your environment - Register reg(args); + Register reg; + ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/simple/build.cpp b/example/hybrid/simple/build.cpp index ec4d5d80..5e2df66e 100644 --- a/example/hybrid/simple/build.cpp +++ b/example/hybrid/simple/build.cpp @@ -13,15 +13,16 @@ static void cflags_build_cb(BaseTarget &cflags); int main(int argc, char **argv) { // 1. Get arguments - Args args; + 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::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); + Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); + Args::Parse(argc, argv); // 2. Initialize your environment - Register reg(args); + Register reg; + ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/single/build.cpp b/example/hybrid/single/build.cpp index 6ab78d85..107b6823 100644 --- a/example/hybrid/single/build.cpp +++ b/example/hybrid/single/build.cpp @@ -10,13 +10,14 @@ static void hello_world_build_cb(BaseTarget &target); int main(int argc, char **argv) { // 1. Get arguments - Args args; + Args::Init(); ArgToolchain arg_gcc; - args.AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); - args.Parse(argc, argv); + Args::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); + Args::Parse(argc, argv); // 2. Initialize your environment - Register reg(args); + Register reg; + ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/target_info/build.cpp b/example/hybrid/target_info/build.cpp index f4926d01..9125677c 100644 --- a/example/hybrid/target_info/build.cpp +++ b/example/hybrid/target_info/build.cpp @@ -14,15 +14,16 @@ static void genericadd2_build_cb(BaseTarget &genericadd, int main(int argc, char **argv) { // 1. Get arguments - Args args; + 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::AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); + Args::AddToolchain("msvc", "Generic msvc toolchain", arg_msvc); + Args::Parse(argc, argv); // 2. Initialize your environment - Register reg(args); + Register reg; + ; // 3. Pre-build steps reg.Clean(clean_cb); From bbcfb0d89d60d2d392551eb13283c64fddf5679e Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 15:17:58 -0700 Subject: [PATCH 03/14] Updated args --- buildcc/lib/args/include/args/args.h | 1 - buildcc/lib/args/src/args.cpp | 6 ------ 2 files changed, 7 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index 50e5e975..449108b8 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -93,7 +93,6 @@ class Args { Args(Args &&) = delete; static void Init(); - static void Deinit(); /** * @brief Parse command line information to CLI11 diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index a3822d23..7d8467e4 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -104,12 +104,6 @@ void Args::Init() { target_ = Ref().add_subcommand(kTargetSubcommand, kTargetDesc); } -void Args::Deinit() { - toolchain_->clear(); - target_->clear(); - Ref().clear(); -} - CLI::App &Args::Ref() { return GetStaticCliApp(); } const CLI::App &Args::ConstRef() { return GetStaticCliApp(); } From ea6538ed816479b0eb68f606cb72ea3edd9dc494 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 15:20:36 -0700 Subject: [PATCH 04/14] Updated build files --- buildcc/lib/args/include/args/args.h | 2 ++ example/hybrid/custom_target/build.main.cpp | 1 - example/hybrid/dep_chaining/build.cpp | 1 - example/hybrid/external_lib/build.main.cpp | 1 - example/hybrid/foolib/build.main.cpp | 1 - example/hybrid/generic/build.cpp | 1 - example/hybrid/pch/build.cpp | 1 - example/hybrid/simple/build.cpp | 1 - example/hybrid/single/build.cpp | 1 - example/hybrid/target_info/build.cpp | 1 - 10 files changed, 2 insertions(+), 9 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index 449108b8..58a2849e 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -85,6 +85,8 @@ struct ArgTarget { std::string link_command{""}; }; +class ArgsInstance {}; + class Args { public: public: diff --git a/example/hybrid/custom_target/build.main.cpp b/example/hybrid/custom_target/build.main.cpp index e5d65053..50390bd3 100644 --- a/example/hybrid/custom_target/build.main.cpp +++ b/example/hybrid/custom_target/build.main.cpp @@ -22,7 +22,6 @@ int main(int argc, char **argv) { // 2. Initialize your environment Register reg; - ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/dep_chaining/build.cpp b/example/hybrid/dep_chaining/build.cpp index ef66a09b..915507bd 100644 --- a/example/hybrid/dep_chaining/build.cpp +++ b/example/hybrid/dep_chaining/build.cpp @@ -25,7 +25,6 @@ int main(int argc, char **argv) { // 2. Initialize your environment Register reg; - ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/external_lib/build.main.cpp b/example/hybrid/external_lib/build.main.cpp index ee4fac01..fd56b11f 100644 --- a/example/hybrid/external_lib/build.main.cpp +++ b/example/hybrid/external_lib/build.main.cpp @@ -20,7 +20,6 @@ int main(int argc, char **argv) { // 2. Initialize your environment Register reg; - ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/foolib/build.main.cpp b/example/hybrid/foolib/build.main.cpp index 3dffd809..bbd3eba6 100644 --- a/example/hybrid/foolib/build.main.cpp +++ b/example/hybrid/foolib/build.main.cpp @@ -20,7 +20,6 @@ int main(int argc, char **argv) { // 2. Initialize your environment Register reg; - ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/generic/build.cpp b/example/hybrid/generic/build.cpp index a776dfcb..aeba69ac 100644 --- a/example/hybrid/generic/build.cpp +++ b/example/hybrid/generic/build.cpp @@ -46,7 +46,6 @@ int main(int argc, char **argv) { // 2. Initialize your environment Register reg; - ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/pch/build.cpp b/example/hybrid/pch/build.cpp index da8f97d5..7badb4b6 100644 --- a/example/hybrid/pch/build.cpp +++ b/example/hybrid/pch/build.cpp @@ -22,7 +22,6 @@ int main(int argc, char **argv) { // 2. Initialize your environment Register reg; - ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/simple/build.cpp b/example/hybrid/simple/build.cpp index 5e2df66e..4f7458e9 100644 --- a/example/hybrid/simple/build.cpp +++ b/example/hybrid/simple/build.cpp @@ -22,7 +22,6 @@ int main(int argc, char **argv) { // 2. Initialize your environment Register reg; - ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/single/build.cpp b/example/hybrid/single/build.cpp index 107b6823..ec21de0a 100644 --- a/example/hybrid/single/build.cpp +++ b/example/hybrid/single/build.cpp @@ -17,7 +17,6 @@ int main(int argc, char **argv) { // 2. Initialize your environment Register reg; - ; // 3. Pre-build steps reg.Clean(clean_cb); diff --git a/example/hybrid/target_info/build.cpp b/example/hybrid/target_info/build.cpp index 9125677c..b679a2df 100644 --- a/example/hybrid/target_info/build.cpp +++ b/example/hybrid/target_info/build.cpp @@ -23,7 +23,6 @@ int main(int argc, char **argv) { // 2. Initialize your environment Register reg; - ; // 3. Pre-build steps reg.Clean(clean_cb); From 0188c96e79e69278f48c5acd45bb39b6ea3db0af Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 15:29:24 -0700 Subject: [PATCH 05/14] Update args.h --- buildcc/lib/args/include/args/args.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index 58a2849e..449108b8 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -85,8 +85,6 @@ struct ArgTarget { std::string link_command{""}; }; -class ArgsInstance {}; - class Args { public: public: From bf7b4718bcaa32d24d5be3dae2f9b9a3130c7541 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 15:33:33 -0700 Subject: [PATCH 06/14] Update args.cpp --- buildcc/lib/args/src/args.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index 7d8467e4..8483fc9b 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -115,6 +115,8 @@ 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) { + 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); @@ -138,6 +140,8 @@ 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) { + 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) From e78e585f36b6708e192e9f3436772c656da45b6e Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 15:59:57 -0700 Subject: [PATCH 07/14] Update args_setup.cpp --- buildexe/src/args_setup.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/buildexe/src/args_setup.cpp b/buildexe/src/args_setup.cpp index 0959bbd6..3ec0fb4f 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -33,6 +33,7 @@ static const std::unordered_map kTargetTypeMap{ }; void BuildExeArgs::Setup() { + Args::Init(); Args::AddToolchain("host", "Host Toolchain", host_toolchain_arg_); SetupBuildMode(); SetupTargetInfo(); From f40c0c57140abf2b82d6b20a5f3f2e1f38adbb36 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 16:12:30 -0700 Subject: [PATCH 08/14] Update args.cpp --- buildcc/lib/args/src/args.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index 8483fc9b..5a3251c5 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -174,8 +174,8 @@ void Args::RootArgs() { } CLI::App &Args::GetStaticCliApp() { - static CLI::App app_{"BuildCC buildsystem"}; - return app_; + static CLI::App app{"BuildCC buildsystem"}; + return app; } } // namespace buildcc From bd374b4721c5ec9fc3b373f03688e708faaeb0a2 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 16:27:34 -0700 Subject: [PATCH 09/14] Updated args --- buildcc/lib/args/include/args/args.h | 2 +- buildcc/lib/args/src/args.cpp | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index 449108b8..a8b43d51 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -93,6 +93,7 @@ class Args { Args(Args &&) = delete; static void Init(); + static void Deinit(); /** * @brief Parse command line information to CLI11 @@ -144,7 +145,6 @@ class Args { private: static void RootArgs(); - static CLI::App &GetStaticCliApp(); }; } // namespace buildcc diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index 5a3251c5..0e2581fb 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -91,6 +91,7 @@ fs::path project_root_dir_{""}; fs::path project_build_dir_{"_internal"}; // Internal +std::unique_ptr app_; CLI::App *toolchain_{nullptr}; CLI::App *target_{nullptr}; @@ -99,13 +100,18 @@ CLI::App *target_{nullptr}; namespace buildcc { void Args::Init() { - RootArgs(); - toolchain_ = Ref().add_subcommand(kToolchainSubcommand, kToolchainDesc); - target_ = Ref().add_subcommand(kTargetSubcommand, kTargetDesc); + if (!app_) { + app_ = std::make_unique("BuildCC buildsystem"); + toolchain_ = Ref().add_subcommand(kToolchainSubcommand, kToolchainDesc); + target_ = Ref().add_subcommand(kTargetSubcommand, kTargetDesc); + RootArgs(); + } } -CLI::App &Args::Ref() { return GetStaticCliApp(); } -const CLI::App &Args::ConstRef() { return GetStaticCliApp(); } +void Args::Deinit() { app_.reset(nullptr); } + +CLI::App &Args::Ref() { return *app_; } +const CLI::App &Args::ConstRef() { return *app_; } bool Args::Clean() { return clean_; } env::LogLevel Args::GetLogLevel() { return loglevel_; } @@ -173,9 +179,4 @@ void Args::RootArgs() { ->required(); } -CLI::App &Args::GetStaticCliApp() { - static CLI::App app{"BuildCC buildsystem"}; - return app; -} - } // namespace buildcc From 95b1858cdb9cc4d8ae885a9f67460be85f9a5a2b Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 16:28:14 -0700 Subject: [PATCH 10/14] Update test_args.h --- buildcc/lib/args/mock/test_args.h | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/buildcc/lib/args/mock/test_args.h b/buildcc/lib/args/mock/test_args.h index 5a9d10a6..860f039f 100644 --- a/buildcc/lib/args/mock/test_args.h +++ b/buildcc/lib/args/mock/test_args.h @@ -7,14 +7,7 @@ namespace buildcc::m { -inline void ArgsDeinit() { - auto subcommand_list = - buildcc::Args::Ref().get_subcommands([](CLI::App *) { return true; }); - for (auto *subcommand : subcommand_list) { - assert(buildcc::Args::Ref().remove_subcommand(subcommand)); - } - buildcc::Args::Ref().clear(); -} +inline void ArgsDeinit() { Args::Deinit(); } } // namespace buildcc::m From a73b2307f020de87cc39958017af118ea0a08ea9 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 18:29:52 -0700 Subject: [PATCH 11/14] Updated unit tests --- buildcc/lib/args/mock/test_args.h | 14 -------------- buildcc/lib/args/test/test_args.cpp | 8 ++------ buildcc/lib/args/test/test_register.cpp | 10 ++++------ 3 files changed, 6 insertions(+), 26 deletions(-) delete mode 100644 buildcc/lib/args/mock/test_args.h diff --git a/buildcc/lib/args/mock/test_args.h b/buildcc/lib/args/mock/test_args.h deleted file mode 100644 index 860f039f..00000000 --- a/buildcc/lib/args/mock/test_args.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef ARGS_MOCK_TEST_ARGS_H_ -#define ARGS_MOCK_TEST_ARGS_H_ - -#include "args/args.h" - -#include - -namespace buildcc::m { - -inline void ArgsDeinit() { Args::Deinit(); } - -} // namespace buildcc::m - -#endif diff --git a/buildcc/lib/args/test/test_args.cpp b/buildcc/lib/args/test/test_args.cpp index 87d30316..60d5cdcd 100644 --- a/buildcc/lib/args/test/test_args.cpp +++ b/buildcc/lib/args/test/test_args.cpp @@ -1,7 +1,5 @@ #include "args/args.h" -#include "test_args.h" - // NOTE, Make sure all these includes are AFTER the system and header includes #include "CppUTest/CommandLineTestRunner.h" #include "CppUTest/MemoryLeakDetectorNewMacros.h" @@ -12,8 +10,7 @@ TEST_GROUP(ArgsTestGroup) { void teardown() { - buildcc::m::ArgsDeinit(); - buildcc::Args::Ref().clear(); + buildcc::Args::Deinit(); } }; // clang-format on @@ -23,7 +20,6 @@ TEST(ArgsTestGroup, Args_BasicParse) { std::vector av{"", "--config", "configs/basic_parse.toml"}; int argc = av.size(); - // buildcc::Args::Init(); buildcc::Args::Init(); buildcc::Args::Parse(argc, av.data()); @@ -268,6 +264,6 @@ TEST(ArgsTestGroup, Args_MultipleCustomTarget) { } int main(int ac, char **av) { - MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); + MemoryLeakWarningPlugin::destroyGlobalDetector(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/args/test/test_register.cpp b/buildcc/lib/args/test/test_register.cpp index ee9b07a8..81dbd9cf 100644 --- a/buildcc/lib/args/test/test_register.cpp +++ b/buildcc/lib/args/test/test_register.cpp @@ -1,7 +1,5 @@ #include "args/register.h" -#include "test_args.h" - #include "expect_command.h" #include "mock_command_copier.h" @@ -17,7 +15,7 @@ TEST_GROUP(RegisterTestGroup) { void teardown() { - buildcc::m::ArgsDeinit(); + buildcc::Args::Deinit(); mock().clear(); } }; @@ -54,7 +52,7 @@ TEST(RegisterTestGroup, Register_Clean) { buildcc::Register reg; mock().expectOneCall("CleanCb"); reg.Clean([]() { mock().actualCall("CleanCb"); }); - buildcc::m::ArgsDeinit(); + buildcc::Args::Deinit(); } { @@ -77,7 +75,7 @@ TEST(RegisterTestGroup, Register_Clean) { buildcc::Register reg; reg.Clean([]() { mock().actualCall("CleanCb"); }); - buildcc::m::ArgsDeinit(); + buildcc::Args::Deinit(); } mock().checkExpectations(); @@ -686,7 +684,7 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { } int main(int ac, char **av) { - MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); + MemoryLeakWarningPlugin::destroyGlobalDetector(); buildcc::env::m::VectorStringCopier copier; mock().installCopier(TEST_VECTOR_STRING_TYPE, copier); return CommandLineTestRunner::RunAllTests(ac, av); From bd231e85222d4dd0ff38f915e2bd98d18c2e1003 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 18:30:23 -0700 Subject: [PATCH 12/14] Update args.cpp --- buildcc/lib/args/src/args.cpp | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index 0e2581fb..ec6b4a33 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -91,27 +91,37 @@ fs::path project_root_dir_{""}; fs::path project_build_dir_{"_internal"}; // Internal -std::unique_ptr app_; -CLI::App *toolchain_{nullptr}; -CLI::App *target_{nullptr}; +// std::unique_ptr 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 args_instance_; } // namespace namespace buildcc { void Args::Init() { - if (!app_) { - app_ = std::make_unique("BuildCC buildsystem"); - toolchain_ = Ref().add_subcommand(kToolchainSubcommand, kToolchainDesc); - target_ = Ref().add_subcommand(kTargetSubcommand, kTargetDesc); + if (!args_instance_) { + args_instance_ = std::make_unique(); + args_instance_->toolchain_ = + Ref().add_subcommand(kToolchainSubcommand, kToolchainDesc); + args_instance_->target_ = + Ref().add_subcommand(kTargetSubcommand, kTargetDesc); RootArgs(); } } -void Args::Deinit() { app_.reset(nullptr); } +void Args::Deinit() { args_instance_.reset(nullptr); } -CLI::App &Args::Ref() { return *app_; } -const CLI::App &Args::ConstRef() { return *app_; } +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_; } @@ -121,6 +131,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_; env::assert_fatal(toolchain_ != nullptr, "Initialize Args using the Args::Init API"); CLI::App *t_user = @@ -146,6 +157,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_; env::assert_fatal(target_ != nullptr, "Initialize Args using the Args::Init API"); CLI::App *target_user = From 926f879b56c334a6a485c2d6a5bb22e66c27e629 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 19:13:39 -0700 Subject: [PATCH 13/14] Update CMakeLists.txt --- example/hybrid/generic/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/example/hybrid/generic/CMakeLists.txt b/example/hybrid/generic/CMakeLists.txt index 6d0520a0..8695177f 100644 --- a/example/hybrid/generic/CMakeLists.txt +++ b/example/hybrid/generic/CMakeLists.txt @@ -23,8 +23,6 @@ endif() # Run your build file add_custom_target(run_hybrid_generic_example - COMMAND hybrid_generic_example --help-all - COMMAND hybrid_generic_example toolchain --help-all COMMAND hybrid_generic_example --config ${CMAKE_CURRENT_SOURCE_DIR}/build_generic.toml # COMMAND dot -Tpng graph.dot -o graph.PNG WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} From af11695f6a7e09c9b1831c7d727f478db57f9902 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 27 Mar 2022 19:20:53 -0700 Subject: [PATCH 14/14] Update test_args.cpp --- buildcc/lib/args/test/test_args.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/buildcc/lib/args/test/test_args.cpp b/buildcc/lib/args/test/test_args.cpp index 60d5cdcd..8c4c3979 100644 --- a/buildcc/lib/args/test/test_args.cpp +++ b/buildcc/lib/args/test/test_args.cpp @@ -21,12 +21,15 @@ TEST(ArgsTestGroup, Args_BasicParse) { int argc = av.size(); buildcc::Args::Init(); + buildcc::Args::Init(); // Second init does nothing when already initialized buildcc::Args::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()); + buildcc::Args::Ref().name("new_name"); + STRCMP_EQUAL(buildcc::Args::Ref().get_name().c_str(), "new_name"); } TEST(ArgsTestGroup, Args_BasicExit) {