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..a8b43d51 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,18 @@ class Args { * * TODO, Update with other options for TargetConfig */ - void AddTarget(const std::string &name, const std::string &description, - ArgTarget &out, const ArgTarget &initial = ArgTarget()); + static void AddTarget(const std::string &name, const std::string &description, + ArgTarget &out, const ArgTarget &initial = ArgTarget()); // Getters - bool Clean() const { return clean_; } - env::LogLevel GetLogLevel() const { return loglevel_; } - - const fs::path &GetProjectRootDir() const { return project_root_dir_; } - const fs::path &GetProjectBuildDir() const { return project_build_dir_; } + static bool Clean(); + static env::LogLevel GetLogLevel(); -private: - void Initialize(); - void RootArgs(); + static const fs::path &GetProjectRootDir(); + static const fs::path &GetProjectBuildDir(); private: - // Required parameters - bool clean_{false}; - env::LogLevel loglevel_{env::LogLevel::Info}; - fs::path project_root_dir_{""}; - fs::path project_build_dir_{"_internal"}; - - // Internal - CLI::App app_{"BuildCC buildsystem"}; - CLI::App *toolchain_{nullptr}; - CLI::App *target_{nullptr}; + static void RootArgs(); }; } // namespace buildcc 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/src/args.cpp b/buildcc/lib/args/src/args.cpp index e6cd76a1..ec6b4a33 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -84,12 +84,56 @@ 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 +// 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 (!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() { args_instance_.reset(nullptr); } + +CLI::App &Args::Ref() { return args_instance_->app_; } +const CLI::App &Args::ConstRef() { return args_instance_->app_; } + +bool Args::Clean() { return clean_; } +env::LogLevel Args::GetLogLevel() { return loglevel_; } + +const fs::path &Args::GetProjectRootDir() { return project_root_dir_; } +const fs::path &Args::GetProjectBuildDir() { return project_build_dir_; } + void Args::AddToolchain(const std::string &name, const std::string &description, ArgToolchain &out, const ArgToolchain &initial) { + CLI::App *toolchain_ = args_instance_->toolchain_; + env::assert_fatal(toolchain_ != nullptr, + "Initialize Args using the Args::Init API"); CLI::App *t_user = toolchain_->add_subcommand(name, description)->group(kToolchainGroup); t_user->add_flag(kToolchainBuildParam, out.state.build); @@ -113,6 +157,9 @@ void Args::AddToolchain(const std::string &name, const std::string &description, void Args::AddTarget(const std::string &name, const std::string &description, ArgTarget &out, const ArgTarget &initial) { + CLI::App *target_ = args_instance_->target_; + env::assert_fatal(target_ != nullptr, + "Initialize Args using the Args::Init API"); CLI::App *target_user = target_->add_subcommand(name, description)->group(kTargetGroup); target_user->add_option(kTargetCompileCommandParam, out.compile_command) @@ -123,20 +170,15 @@ void Args::AddTarget(const std::string &name, const std::string &description, // Private -void Args::Initialize() { - RootArgs(); - toolchain_ = app_.add_subcommand(kToolchainSubcommand, kToolchainDesc); - target_ = app_.add_subcommand(kTargetSubcommand, kTargetDesc); -} - void Args::RootArgs() { - app_.set_help_all_flag(kHelpAllParam, kHelpAllDesc); + Ref().set_help_all_flag(kHelpAllParam, kHelpAllDesc); - app_.set_config(kConfigParam, "", kConfigDesc) + Ref() + .set_config(kConfigParam, "", kConfigDesc) ->expected(kMinFiles, kMaxFiles); // Root flags - auto *root_group = app_.add_option_group(kRootGroup); + auto *root_group = Ref().add_option_group(kRootGroup); root_group->add_flag(kCleanParam, clean_, kCleanDesc); root_group->add_option(kLoglevelParam, loglevel_, kLoglevelDesc) 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..8c4c3979 100644 --- a/buildcc/lib/args/test/test_args.cpp +++ b/buildcc/lib/args/test/test_args.cpp @@ -9,29 +9,37 @@ // clang-format off TEST_GROUP(ArgsTestGroup) { + void teardown() { + buildcc::Args::Deinit(); + } }; // 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(); // Second init does nothing when already initialized + 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::Args::Ref().name("new_name"); + STRCMP_EQUAL(buildcc::Args::Ref().get_name().c_str(), "new_name"); } 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 +47,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 +61,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 +95,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 +133,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 +159,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 +207,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()); + 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(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()); // GCC @@ -258,6 +267,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 948ba972..81dbd9cf 100644 --- a/buildcc/lib/args/test/test_register.cpp +++ b/buildcc/lib/args/test/test_register.cpp @@ -14,9 +14,10 @@ // clang-format off TEST_GROUP(RegisterTestGroup) { - void teardown() { - mock().clear(); - } + void teardown() { + buildcc::Args::Deinit(); + mock().clear(); + } }; // clang-format on @@ -24,15 +25,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 +41,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::Args::Deinit(); } { @@ -63,16 +65,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::Args::Deinit(); } mock().checkExpectations(); @@ -86,17 +89,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 +111,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 +119,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 +137,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 +170,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 +187,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 +197,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 +221,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 +254,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 +266,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 +279,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 +292,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 +316,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 +343,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 +358,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 +392,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 +419,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 +434,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 +468,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 +501,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 +553,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 +578,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 +595,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 +613,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 +631,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 +650,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 +667,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; }, @@ -681,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); 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(); 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..3ec0fb4f 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -33,7 +33,8 @@ static const std::unordered_map kTargetTypeMap{ }; void BuildExeArgs::Setup() { - args_.AddToolchain("host", "Host Toolchain", host_toolchain_arg_); + Args::Init(); + Args::AddToolchain("host", "Host Toolchain", host_toolchain_arg_); SetupBuildMode(); SetupTargetInfo(); SetupTargetInputs(); @@ -42,7 +43,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 +52,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 +75,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 +110,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..50390bd3 100644 --- a/example/hybrid/custom_target/build.main.cpp +++ b/example/hybrid/custom_target/build.main.cpp @@ -9,19 +9,19 @@ 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..915507bd 100644 --- a/example/hybrid/dep_chaining/build.cpp +++ b/example/hybrid/dep_chaining/build.cpp @@ -16,15 +16,15 @@ 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..fd56b11f 100644 --- a/example/hybrid/external_lib/build.main.cpp +++ b/example/hybrid/external_lib/build.main.cpp @@ -11,15 +11,15 @@ 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..bbd3eba6 100644 --- a/example/hybrid/foolib/build.main.cpp +++ b/example/hybrid/foolib/build.main.cpp @@ -11,15 +11,15 @@ 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/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} diff --git a/example/hybrid/generic/build.cpp b/example/hybrid/generic/build.cpp index 605ed4a0..aeba69ac 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,21 @@ 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..7badb4b6 100644 --- a/example/hybrid/pch/build.cpp +++ b/example/hybrid/pch/build.cpp @@ -13,15 +13,15 @@ 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..4f7458e9 100644 --- a/example/hybrid/simple/build.cpp +++ b/example/hybrid/simple/build.cpp @@ -13,15 +13,15 @@ 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..ec21de0a 100644 --- a/example/hybrid/single/build.cpp +++ b/example/hybrid/single/build.cpp @@ -10,13 +10,13 @@ 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..b679a2df 100644 --- a/example/hybrid/target_info/build.cpp +++ b/example/hybrid/target_info/build.cpp @@ -14,15 +14,15 @@ 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);