From f65b22f9a8fd0aa89b3daf7638c23e92b8338f51 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 21:56:16 -0700 Subject: [PATCH 01/12] Update target_info.h --- buildcc/lib/target/include/target/target_info.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildcc/lib/target/include/target/target_info.h b/buildcc/lib/target/include/target/target_info.h index 0b85bac2..cf78457b 100644 --- a/buildcc/lib/target/include/target/target_info.h +++ b/buildcc/lib/target/include/target/target_info.h @@ -88,8 +88,8 @@ class TargetInfo : public internal::SourceApi, TargetConfig config_; // - UserTargetSchema user_; FunctionLock lock_; + UserTargetSchema user_; private: void Initialize(); From 1b2ad584818a88b842f9785e6b87130b4ebcdc40 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 21:56:34 -0700 Subject: [PATCH 02/12] Updated Expects_* API --- buildcc/lib/target/src/target/build.cpp | 2 +- buildcc/lib/target/src/target_info/target_info.cpp | 3 ++- .../include/toolchain/common/function_lock.h | 12 +++++------- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/buildcc/lib/target/src/target/build.cpp b/buildcc/lib/target/src/target/build.cpp index 7435e7a5..82014ebc 100644 --- a/buildcc/lib/target/src/target/build.cpp +++ b/buildcc/lib/target/src/target/build.cpp @@ -54,7 +54,7 @@ namespace buildcc { void Target::Build() { env::log_trace(name_, __FUNCTION__); - lock_.ExpectsUnlock(__FUNCTION__); + lock_.ExpectsUnlock("Target::Build"); lock_.Lock(); // PCH state diff --git a/buildcc/lib/target/src/target_info/target_info.cpp b/buildcc/lib/target/src/target_info/target_info.cpp index 34dec92f..c338d9f6 100644 --- a/buildcc/lib/target/src/target_info/target_info.cpp +++ b/buildcc/lib/target/src/target_info/target_info.cpp @@ -21,7 +21,8 @@ namespace buildcc { // PRIVATE void TargetInfo::Initialize() { - toolchain_.GetLockInfo().ExpectsLock("TargetInfo with Toolchain"); + toolchain_.GetLockInfo().ExpectsLock( + "Toolchain should be locked before usage through `Toolchain::Lock`"); std::for_each(toolchain_.GetPreprocessorFlags().begin(), toolchain_.GetPreprocessorFlags().end(), diff --git a/buildcc/lib/toolchain/include/toolchain/common/function_lock.h b/buildcc/lib/toolchain/include/toolchain/common/function_lock.h index 246b8ee7..bef3ee34 100644 --- a/buildcc/lib/toolchain/include/toolchain/common/function_lock.h +++ b/buildcc/lib/toolchain/include/toolchain/common/function_lock.h @@ -34,15 +34,13 @@ class FunctionLock { void Unlock() { SetLock(false); } bool IsLocked() const { return lock_; } - // TODO, Make this better - void ExpectsUnlock(std::string_view tag) const { + + void ExpectsUnlock(std::string_view message) const { env::assert_fatal(!lock_, - fmt::format("Cannot use {} when lock == true", tag)); + fmt::format("Expects lock == false. {}", message)); } - // TODO, Make this better - void ExpectsLock(std::string_view tag) const { - env::assert_fatal(lock_, - fmt::format("Cannot use {} when lock == false", tag)); + void ExpectsLock(std::string_view message) const { + env::assert_fatal(lock_, fmt::format("Expects lock == true. {}", message)); } private: From 11e38a87e29100723a05dca2277924f9c44e5416 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 22:11:28 -0700 Subject: [PATCH 03/12] Updated toolchain.h with binaries --- .../toolchain/include/toolchain/toolchain.h | 55 ++++++++++++------- .../toolchain/src/api/toolchain_verify.cpp | 45 ++++++++------- 2 files changed, 59 insertions(+), 41 deletions(-) diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index b58bf968..171881a6 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -29,6 +29,19 @@ namespace buildcc { +struct ToolchainBinaries { + ToolchainBinaries(std::string_view as, std::string_view c, + std::string_view cpp, std::string_view ar, + std::string_view link) + : assembler(as), c_compiler(c), cpp_compiler(cpp), archiver(ar), + linker(link) {} + std::string assembler; + std::string c_compiler; + std::string cpp_compiler; + std::string archiver; + std::string linker; +}; + // Base toolchain class class Toolchain : public internal::FlagApi, public ToolchainVerify { @@ -44,16 +57,23 @@ class Toolchain : public internal::FlagApi, public: explicit Toolchain(Id id, std::string_view name, - std::string_view asm_compiler, std::string_view c_compiler, - std::string_view cpp_compiler, std::string_view archiver, - std::string_view linker, bool lock = true, + const ToolchainBinaries &binaries, bool lock = true, const ToolchainConfig &config = ToolchainConfig()) - : id_(id), name_(name), asm_compiler_(asm_compiler), - c_compiler_(c_compiler), cpp_compiler_(cpp_compiler), - archiver_(archiver), linker_(linker), config_(config), lock_(lock) { + : id_(id), name_(name), binaries_(binaries), lock_(lock), + config_(config) { Initialize(); } + explicit Toolchain(Id id, std::string_view name, std::string_view assembler, + std::string_view c_compiler, std::string_view cpp_compiler, + std::string_view archiver, std::string_view linker, + bool lock = true, + const ToolchainConfig &config = ToolchainConfig()) + : Toolchain(id, name, + ToolchainBinaries(assembler, c_compiler, cpp_compiler, + archiver, linker), + lock, config) {} + Toolchain(Toolchain &&toolchain) = default; Toolchain(const Toolchain &toolchain) = delete; @@ -62,11 +82,12 @@ class Toolchain : public internal::FlagApi, // Getters Id GetId() const { return id_; } const std::string &GetName() const { return name_; } - const std::string &GetAsmCompiler() const { return asm_compiler_; } - const std::string &GetCCompiler() const { return c_compiler_; } - const std::string &GetCppCompiler() const { return cpp_compiler_; } - const std::string &GetArchiver() const { return archiver_; } - const std::string &GetLinker() const { return linker_; } + const std::string &GetAsmCompiler() const { return binaries_.assembler; } + const std::string &GetCCompiler() const { return binaries_.c_compiler; } + const std::string &GetCppCompiler() const { return binaries_.cpp_compiler; } + const std::string &GetArchiver() const { return binaries_.archiver; } + const std::string &GetLinker() const { return binaries_.linker; } + const ToolchainBinaries &GetToolchainBinaries() const { return binaries_; } const FunctionLock &GetLockInfo() const { return lock_; } const ToolchainConfig &GetConfig() const { return config_; } @@ -89,22 +110,14 @@ class Toolchain : public internal::FlagApi, private: friend class internal::FlagApi; - - // TODO, Remove this and have a virtual `Verify` function instead - // Anti-pattern: ToolchainVerify contains GCC and MSVC specific - // implementations in a "Base" toolchain class friend class ToolchainVerify; private: Id id_; std::string name_; - std::string asm_compiler_; - std::string c_compiler_; - std::string cpp_compiler_; - std::string archiver_; - std::string linker_; - ToolchainConfig config_; + ToolchainBinaries binaries_; FunctionLock lock_; + ToolchainConfig config_; // UserSchema user_; diff --git a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp index 44ce6021..57edd391 100644 --- a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp +++ b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp @@ -258,26 +258,31 @@ ToolchainVerify::Verify(const VerifyToolchainConfig &config) { "OS not supported"); verified_toolchain_ = verified_toolchains[0]; - t.asm_compiler_ = (verified_toolchain_.path / - fmt::format("{}{}", t.asm_compiler_, os_executable_ext)) - .make_preferred() - .string(); - t.c_compiler_ = (verified_toolchain_.path / - fmt::format("{}{}", t.c_compiler_, os_executable_ext)) - .make_preferred() - .string(); - t.cpp_compiler_ = (verified_toolchain_.path / - fmt::format("{}{}", t.cpp_compiler_, os_executable_ext)) - .make_preferred() - .string(); - t.archiver_ = (verified_toolchain_.path / - fmt::format("{}{}", t.archiver_, os_executable_ext)) - .make_preferred() - .string(); - t.linker_ = (verified_toolchain_.path / - fmt::format("{}{}", t.linker_, os_executable_ext)) - .make_preferred() - .string(); + t.binaries_.assembler = + (verified_toolchain_.path / + fmt::format("{}{}", t.binaries_.assembler, os_executable_ext)) + .make_preferred() + .string(); + t.binaries_.c_compiler = + (verified_toolchain_.path / + fmt::format("{}{}", t.binaries_.c_compiler, os_executable_ext)) + .make_preferred() + .string(); + t.binaries_.cpp_compiler = + (verified_toolchain_.path / + fmt::format("{}{}", t.binaries_.cpp_compiler, os_executable_ext)) + .make_preferred() + .string(); + t.binaries_.archiver = + (verified_toolchain_.path / + fmt::format("{}{}", t.binaries_.archiver, os_executable_ext)) + .make_preferred() + .string(); + t.binaries_.linker = + (verified_toolchain_.path / + fmt::format("{}{}", t.binaries_.linker, os_executable_ext)) + .make_preferred() + .string(); } return verified_toolchains; From e64dd7984e179cc46c48b6ad30ed9e0c0496d05c Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 23:25:18 -0700 Subject: [PATCH 04/12] Renamed GetAsmCompiler to GetAssembler --- buildcc/lib/target/src/target/build.cpp | 2 +- buildcc/lib/target/src/target/target.cpp | 2 +- buildcc/lib/toolchain/include/toolchain/toolchain.h | 2 +- buildcc/lib/toolchain/src/api/toolchain_verify.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildcc/lib/target/src/target/build.cpp b/buildcc/lib/target/src/target/build.cpp index 82014ebc..43a1572e 100644 --- a/buildcc/lib/target/src/target/build.cpp +++ b/buildcc/lib/target/src/target/build.cpp @@ -87,7 +87,7 @@ void Target::Build() { {kLinkFlags, internal::aggregate(GetLinkFlags())}, // Toolchain executables here - {kAsmCompiler, fmt::format("{}", fs::path(toolchain_.GetAsmCompiler()))}, + {kAsmCompiler, fmt::format("{}", fs::path(toolchain_.GetAssembler()))}, {kCCompiler, fmt::format("{}", fs::path(toolchain_.GetCCompiler()))}, {kCppCompiler, fmt::format("{}", fs::path(toolchain_.GetCppCompiler()))}, {kArchiver, fmt::format("{}", fs::path(toolchain_.GetArchiver()))}, diff --git a/buildcc/lib/target/src/target/target.cpp b/buildcc/lib/target/src/target/target.cpp index dd4aedbe..ab5532bd 100644 --- a/buildcc/lib/target/src/target/target.cpp +++ b/buildcc/lib/target/src/target/target.cpp @@ -109,7 +109,7 @@ std::optional Target::SelectCompileFlags(FileExt ext) const { std::optional Target::SelectCompiler(FileExt ext) const { switch (ext) { case FileExt::Asm: - return GetToolchain().GetAsmCompiler(); + return GetToolchain().GetAssembler(); break; case FileExt::C: return GetToolchain().GetCCompiler(); diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index 171881a6..f1559759 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -82,7 +82,7 @@ class Toolchain : public internal::FlagApi, // Getters Id GetId() const { return id_; } const std::string &GetName() const { return name_; } - const std::string &GetAsmCompiler() const { return binaries_.assembler; } + const std::string &GetAssembler() const { return binaries_.assembler; } const std::string &GetCCompiler() const { return binaries_.c_compiler; } const std::string &GetCppCompiler() const { return binaries_.cpp_compiler; } const std::string &GetArchiver() const { return binaries_.archiver; } diff --git a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp index 57edd391..0b1a2739 100644 --- a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp +++ b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp @@ -157,7 +157,7 @@ class ToolchainMatcher { matcher_.clear(); matcher_.insert( - fmt::format("{}{}", toolchain_.GetAsmCompiler(), os_executable_ext)); + fmt::format("{}{}", toolchain_.GetAssembler(), os_executable_ext)); matcher_.insert( fmt::format("{}{}", toolchain_.GetCCompiler(), os_executable_ext)); matcher_.insert( From baf7d870ce0d44eccfe7f4a00a553b751157bc2e Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 23:30:28 -0700 Subject: [PATCH 05/12] Update toolchain.h --- .../lib/toolchain/include/toolchain/toolchain.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index f1559759..8949f56e 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -30,16 +30,17 @@ namespace buildcc { struct ToolchainBinaries { - ToolchainBinaries(std::string_view as, std::string_view c, - std::string_view cpp, std::string_view ar, - std::string_view link) + explicit ToolchainBinaries() = default; + explicit ToolchainBinaries(std::string_view as, std::string_view c, + std::string_view cpp, std::string_view ar, + std::string_view link) : assembler(as), c_compiler(c), cpp_compiler(cpp), archiver(ar), linker(link) {} - std::string assembler; - std::string c_compiler; - std::string cpp_compiler; - std::string archiver; - std::string linker; + std::string assembler{""}; + std::string c_compiler{""}; + std::string cpp_compiler{""}; + std::string archiver{""}; + std::string linker{""}; }; // Base toolchain class From 737f3becb646d13cdee48e1eb3b49d2e09588c18 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Thu, 17 Mar 2022 00:20:00 -0700 Subject: [PATCH 06/12] Updated args with ToolchainBinaries --- buildcc/lib/args/include/args/args.h | 19 ++++----- buildcc/lib/args/src/args.cpp | 20 +++++----- buildcc/lib/args/test/test_args.cpp | 60 ++++++++++++++-------------- 3 files changed, 47 insertions(+), 52 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index b57e2a6a..c9be79ff 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -48,33 +48,28 @@ struct ArgToolchainState { struct ArgToolchain { ArgToolchain(){}; ArgToolchain(ToolchainId initial_id, const std::string &initial_name, - const std::string &initial_asm_compiler, + const std::string &initial_assembler, const std::string &initial_c_compiler, const std::string &initial_cpp_compiler, const std::string &initial_archiver, const std::string &initial_linker) - : id(initial_id), name(initial_name), asm_compiler(initial_asm_compiler), - c_compiler(initial_c_compiler), cpp_compiler(initial_cpp_compiler), - archiver(initial_archiver), linker(initial_linker) {} + : id(initial_id), name(initial_name), + binaries(initial_assembler, initial_c_compiler, initial_cpp_compiler, + initial_archiver, initial_linker) {} /** * @brief Construct a BaseToolchain from the arguments supplied through the * command line information */ + // TODO, Update this for lock and ToolchainConfig BaseToolchain ConstructToolchain() const { - BaseToolchain toolchain(id, name, asm_compiler, c_compiler, cpp_compiler, - archiver, linker); - return toolchain; + return BaseToolchain(id, name, binaries); } ArgToolchainState state; ToolchainId id{ToolchainId::Undefined}; std::string name{""}; - std::string asm_compiler{""}; - std::string c_compiler{""}; - std::string cpp_compiler{""}; - std::string archiver{""}; - std::string linker{""}; + ToolchainBinaries binaries; }; // NOTE, Incomplete without pch_compile_command diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index ad1605b0..26232694 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -99,16 +99,16 @@ void Args::AddToolchain(const std::string &name, const std::string &description, ->transform(CLI::CheckedTransformer(kToolchainIdMap, CLI::ignore_case)) ->default_val(initial.id); t_user->add_option(kToolchainNameParam, out.name)->default_val(initial.name); - t_user->add_option(kToolchainAsmCompilerParam, out.asm_compiler) - ->default_val(initial.asm_compiler); - t_user->add_option(kToolchainCCompilerParam, out.c_compiler) - ->default_val(initial.c_compiler); - t_user->add_option(kToolchainCppCompilerParam, out.cpp_compiler) - ->default_val(initial.cpp_compiler); - t_user->add_option(kToolchainArchiverParam, out.archiver) - ->default_val(initial.archiver); - t_user->add_option(kToolchainLinkerParam, out.linker) - ->default_val(initial.linker); + t_user->add_option(kToolchainAsmCompilerParam, out.binaries.assembler) + ->default_val(initial.binaries.assembler); + t_user->add_option(kToolchainCCompilerParam, out.binaries.c_compiler) + ->default_val(initial.binaries.c_compiler); + t_user->add_option(kToolchainCppCompilerParam, out.binaries.cpp_compiler) + ->default_val(initial.binaries.cpp_compiler); + t_user->add_option(kToolchainArchiverParam, out.binaries.archiver) + ->default_val(initial.binaries.archiver); + t_user->add_option(kToolchainLinkerParam, out.binaries.linker) + ->default_val(initial.binaries.linker); } void Args::AddTarget(const std::string &name, const std::string &description, diff --git a/buildcc/lib/args/test/test_args.cpp b/buildcc/lib/args/test/test_args.cpp index 7a686577..36b3eb15 100644 --- a/buildcc/lib/args/test/test_args.cpp +++ b/buildcc/lib/args/test/test_args.cpp @@ -68,11 +68,11 @@ TEST(ArgsTestGroup, Args_CustomToolchain) { CHECK_FALSE(gcc_toolchain.state.test); CHECK(gcc_toolchain.id == buildcc::Toolchain::Id::Gcc); STRCMP_EQUAL(gcc_toolchain.name.c_str(), "gcc"); - STRCMP_EQUAL(gcc_toolchain.asm_compiler.c_str(), "as"); - STRCMP_EQUAL(gcc_toolchain.c_compiler.c_str(), "gcc"); - STRCMP_EQUAL(gcc_toolchain.cpp_compiler.c_str(), "g++"); - STRCMP_EQUAL(gcc_toolchain.archiver.c_str(), "ar"); - STRCMP_EQUAL(gcc_toolchain.linker.c_str(), "ld"); + STRCMP_EQUAL(gcc_toolchain.binaries.assembler.c_str(), "as"); + STRCMP_EQUAL(gcc_toolchain.binaries.c_compiler.c_str(), "gcc"); + STRCMP_EQUAL(gcc_toolchain.binaries.cpp_compiler.c_str(), "g++"); + STRCMP_EQUAL(gcc_toolchain.binaries.archiver.c_str(), "ar"); + STRCMP_EQUAL(gcc_toolchain.binaries.linker.c_str(), "ld"); } TEST(ArgsTestGroup, Args_MultipleCustomToolchain) { @@ -106,22 +106,22 @@ TEST(ArgsTestGroup, Args_MultipleCustomToolchain) { CHECK_FALSE(gcc_toolchain.state.test); CHECK(gcc_toolchain.id == buildcc::Toolchain::Id::Gcc); STRCMP_EQUAL(gcc_toolchain.name.c_str(), "gcc"); - STRCMP_EQUAL(gcc_toolchain.asm_compiler.c_str(), "as"); - STRCMP_EQUAL(gcc_toolchain.c_compiler.c_str(), "gcc"); - STRCMP_EQUAL(gcc_toolchain.cpp_compiler.c_str(), "g++"); - STRCMP_EQUAL(gcc_toolchain.archiver.c_str(), "ar"); - STRCMP_EQUAL(gcc_toolchain.linker.c_str(), "ld"); + STRCMP_EQUAL(gcc_toolchain.binaries.assembler.c_str(), "as"); + STRCMP_EQUAL(gcc_toolchain.binaries.c_compiler.c_str(), "gcc"); + STRCMP_EQUAL(gcc_toolchain.binaries.cpp_compiler.c_str(), "g++"); + STRCMP_EQUAL(gcc_toolchain.binaries.archiver.c_str(), "ar"); + STRCMP_EQUAL(gcc_toolchain.binaries.linker.c_str(), "ld"); // MSVC CHECK_TRUE(msvc_toolchain.state.build); CHECK_TRUE(msvc_toolchain.state.test); CHECK(msvc_toolchain.id == buildcc::Toolchain::Id::Msvc); STRCMP_EQUAL(msvc_toolchain.name.c_str(), "msvc"); - STRCMP_EQUAL(msvc_toolchain.asm_compiler.c_str(), "cl"); - STRCMP_EQUAL(msvc_toolchain.c_compiler.c_str(), "cl"); - STRCMP_EQUAL(msvc_toolchain.cpp_compiler.c_str(), "cl"); - STRCMP_EQUAL(msvc_toolchain.archiver.c_str(), "lib"); - STRCMP_EQUAL(msvc_toolchain.linker.c_str(), "link"); + STRCMP_EQUAL(msvc_toolchain.binaries.assembler.c_str(), "cl"); + STRCMP_EQUAL(msvc_toolchain.binaries.c_compiler.c_str(), "cl"); + STRCMP_EQUAL(msvc_toolchain.binaries.cpp_compiler.c_str(), "cl"); + STRCMP_EQUAL(msvc_toolchain.binaries.archiver.c_str(), "lib"); + STRCMP_EQUAL(msvc_toolchain.binaries.linker.c_str(), "link"); } TEST(ArgsTestGroup, Args_DuplicateCustomToolchain) { @@ -167,11 +167,11 @@ TEST(ArgsTestGroup, Args_CustomTarget) { CHECK_FALSE(gcc_toolchain.state.test); CHECK(gcc_toolchain.id == buildcc::Toolchain::Id::Gcc); STRCMP_EQUAL(gcc_toolchain.name.c_str(), "gcc"); - STRCMP_EQUAL(gcc_toolchain.asm_compiler.c_str(), "as"); - STRCMP_EQUAL(gcc_toolchain.c_compiler.c_str(), "gcc"); - STRCMP_EQUAL(gcc_toolchain.cpp_compiler.c_str(), "g++"); - STRCMP_EQUAL(gcc_toolchain.archiver.c_str(), "ar"); - STRCMP_EQUAL(gcc_toolchain.linker.c_str(), "ld"); + STRCMP_EQUAL(gcc_toolchain.binaries.assembler.c_str(), "as"); + STRCMP_EQUAL(gcc_toolchain.binaries.c_compiler.c_str(), "gcc"); + STRCMP_EQUAL(gcc_toolchain.binaries.cpp_compiler.c_str(), "g++"); + STRCMP_EQUAL(gcc_toolchain.binaries.archiver.c_str(), "ar"); + STRCMP_EQUAL(gcc_toolchain.binaries.linker.c_str(), "ld"); // Target STRCMP_EQUAL(gcc_target.compile_command.c_str(), @@ -221,11 +221,11 @@ TEST(ArgsTestGroup, Args_MultipleCustomTarget) { CHECK_FALSE(gcc_toolchain.state.test); CHECK(gcc_toolchain.id == buildcc::Toolchain::Id::Gcc); STRCMP_EQUAL(gcc_toolchain.name.c_str(), "gcc"); - STRCMP_EQUAL(gcc_toolchain.asm_compiler.c_str(), "as"); - STRCMP_EQUAL(gcc_toolchain.c_compiler.c_str(), "gcc"); - STRCMP_EQUAL(gcc_toolchain.cpp_compiler.c_str(), "g++"); - STRCMP_EQUAL(gcc_toolchain.archiver.c_str(), "ar"); - STRCMP_EQUAL(gcc_toolchain.linker.c_str(), "ld"); + STRCMP_EQUAL(gcc_toolchain.binaries.assembler.c_str(), "as"); + STRCMP_EQUAL(gcc_toolchain.binaries.c_compiler.c_str(), "gcc"); + STRCMP_EQUAL(gcc_toolchain.binaries.cpp_compiler.c_str(), "g++"); + STRCMP_EQUAL(gcc_toolchain.binaries.archiver.c_str(), "ar"); + STRCMP_EQUAL(gcc_toolchain.binaries.linker.c_str(), "ld"); // Target STRCMP_EQUAL(gcc_target.compile_command.c_str(), @@ -242,11 +242,11 @@ TEST(ArgsTestGroup, Args_MultipleCustomTarget) { CHECK_TRUE(msvc_toolchain.state.test); CHECK(msvc_toolchain.id == buildcc::Toolchain::Id::Msvc); STRCMP_EQUAL(msvc_toolchain.name.c_str(), "msvc"); - STRCMP_EQUAL(msvc_toolchain.asm_compiler.c_str(), "cl"); - STRCMP_EQUAL(msvc_toolchain.c_compiler.c_str(), "cl"); - STRCMP_EQUAL(msvc_toolchain.cpp_compiler.c_str(), "cl"); - STRCMP_EQUAL(msvc_toolchain.archiver.c_str(), "lib"); - STRCMP_EQUAL(msvc_toolchain.linker.c_str(), "link"); + STRCMP_EQUAL(msvc_toolchain.binaries.assembler.c_str(), "cl"); + STRCMP_EQUAL(msvc_toolchain.binaries.c_compiler.c_str(), "cl"); + STRCMP_EQUAL(msvc_toolchain.binaries.cpp_compiler.c_str(), "cl"); + STRCMP_EQUAL(msvc_toolchain.binaries.archiver.c_str(), "lib"); + STRCMP_EQUAL(msvc_toolchain.binaries.linker.c_str(), "link"); // Target STRCMP_EQUAL(msvc_target.compile_command.c_str(), From 919d5593fc2c66dd3233c4c1b0d53807885f2f99 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Thu, 17 Mar 2022 01:15:26 -0700 Subject: [PATCH 07/12] Update args.h --- buildcc/lib/args/include/args/args.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/buildcc/lib/args/include/args/args.h b/buildcc/lib/args/include/args/args.h index c9be79ff..05311272 100644 --- a/buildcc/lib/args/include/args/args.h +++ b/buildcc/lib/args/include/args/args.h @@ -47,15 +47,19 @@ struct ArgToolchainState { */ struct ArgToolchain { ArgToolchain(){}; + ArgToolchain(ToolchainId initial_id, const std::string &initial_name, + const ToolchainBinaries &initial_binaries) + : id(initial_id), name(initial_name), binaries(initial_binaries) {} ArgToolchain(ToolchainId initial_id, const std::string &initial_name, const std::string &initial_assembler, const std::string &initial_c_compiler, const std::string &initial_cpp_compiler, const std::string &initial_archiver, const std::string &initial_linker) - : id(initial_id), name(initial_name), - binaries(initial_assembler, initial_c_compiler, initial_cpp_compiler, - initial_archiver, initial_linker) {} + : ArgToolchain(initial_id, initial_name, + ToolchainBinaries(initial_assembler, initial_c_compiler, + initial_cpp_compiler, initial_archiver, + initial_linker)) {} /** * @brief Construct a BaseToolchain from the arguments supplied through the From 1f8c721412802b293187fd35e6c34672b076109a Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Thu, 17 Mar 2022 18:38:50 -0700 Subject: [PATCH 08/12] Shifted TargetConfig to target.h instead of target_info.h --- buildcc/lib/target/include/target/api/target_getter.h | 4 ++++ .../target/include/target/api/target_info_getter.h | 4 ---- buildcc/lib/target/include/target/target.h | 11 +++++------ buildcc/lib/target/include/target/target_info.h | 6 ++---- buildcc/lib/target/src/api/target_getter.cpp | 7 +++++++ buildcc/lib/target/src/api/target_info_getter.cpp | 8 -------- 6 files changed, 18 insertions(+), 22 deletions(-) diff --git a/buildcc/lib/target/include/target/api/target_getter.h b/buildcc/lib/target/include/target/api/target_getter.h index 3c8f0f88..3ffdca5e 100644 --- a/buildcc/lib/target/include/target/api/target_getter.h +++ b/buildcc/lib/target/include/target/api/target_getter.h @@ -24,6 +24,7 @@ #include "toolchain/toolchain.h" +#include "target/common/target_config.h" #include "target/common/target_state.h" #include "taskflow/taskflow.hpp" @@ -39,6 +40,9 @@ template class TargetGetter { bool IsBuilt() const; bool IsLocked() const; + // Target Config + const TargetConfig &GetConfig() const; + const std::string &GetName() const; const Toolchain &GetToolchain() const; TargetType GetType() const; diff --git a/buildcc/lib/target/include/target/api/target_info_getter.h b/buildcc/lib/target/include/target/api/target_info_getter.h index 1640c19c..814a8238 100644 --- a/buildcc/lib/target/include/target/api/target_info_getter.h +++ b/buildcc/lib/target/include/target/api/target_info_getter.h @@ -19,7 +19,6 @@ #include "schema/path.h" -#include "target/common/target_config.h" #include "target/common/target_state.h" namespace buildcc::internal { @@ -34,9 +33,6 @@ template class TargetInfoGetter { const fs::path &GetTargetRootDir() const; const fs::path &GetTargetBuildDir() const; - // Target Config - const TargetConfig &GetConfig() const; - // Target Storer const fs_unordered_set &GetSourceFiles() const; const fs_unordered_set &GetHeaderFiles() const; diff --git a/buildcc/lib/target/include/target/target.h b/buildcc/lib/target/include/target/target.h index adea83ed..cb9b1049 100644 --- a/buildcc/lib/target/include/target/target.h +++ b/buildcc/lib/target/include/target/target.h @@ -69,12 +69,10 @@ class Target : public internal::BuilderInterface, explicit Target(const std::string &name, TargetType type, const Toolchain &toolchain, const TargetEnv &env, const TargetConfig &config = TargetConfig()) - : TargetInfo( - toolchain, - TargetEnv(env.GetTargetRootDir(), - env.GetTargetBuildDir() / toolchain.GetName() / name), - config), - name_(name), type_(type), + : TargetInfo(toolchain, TargetEnv(env.GetTargetRootDir(), + env.GetTargetBuildDir() / + toolchain.GetName() / name)), + name_(name), type_(type), config_(config), serialization_(env_.GetTargetBuildDir() / fmt::format("{}.bin", name)), compile_pch_(*this), compile_object_(*this), link_target_(*this) { Initialize(); @@ -139,6 +137,7 @@ class Target : public internal::BuilderInterface, private: std::string name_; TargetType type_; + TargetConfig config_; internal::TargetSerialization serialization_; internal::CompilePch compile_pch_; internal::CompileObject compile_object_; diff --git a/buildcc/lib/target/include/target/target_info.h b/buildcc/lib/target/include/target/target_info.h index cf78457b..4b9f6746 100644 --- a/buildcc/lib/target/include/target/target_info.h +++ b/buildcc/lib/target/include/target/target_info.h @@ -61,9 +61,8 @@ class TargetInfo : public internal::SourceApi, public internal::SyncApi, public internal::TargetInfoGetter { public: - TargetInfo(const BaseToolchain &toolchain, const TargetEnv &env, - const TargetConfig &config = TargetConfig()) - : toolchain_(toolchain), env_(env), config_(config) { + TargetInfo(const BaseToolchain &toolchain, const TargetEnv &env) + : toolchain_(toolchain), env_(env) { Initialize(); } @@ -85,7 +84,6 @@ class TargetInfo : public internal::SourceApi, protected: const BaseToolchain &toolchain_; TargetEnv env_; - TargetConfig config_; // FunctionLock lock_; diff --git a/buildcc/lib/target/src/api/target_getter.cpp b/buildcc/lib/target/src/api/target_getter.cpp index b5c45fd9..61540bff 100644 --- a/buildcc/lib/target/src/api/target_getter.cpp +++ b/buildcc/lib/target/src/api/target_getter.cpp @@ -33,6 +33,13 @@ template bool TargetGetter::IsBuilt() const { return t.state_.IsBuilt(); } +// Target Config +template const TargetConfig &TargetGetter::GetConfig() const { + const T &t = static_cast(*this); + + return t.config_; +} + template bool TargetGetter::IsLocked() const { const T &t = static_cast(*this); diff --git a/buildcc/lib/target/src/api/target_info_getter.cpp b/buildcc/lib/target/src/api/target_info_getter.cpp index 75c0d28b..7083fa48 100644 --- a/buildcc/lib/target/src/api/target_info_getter.cpp +++ b/buildcc/lib/target/src/api/target_info_getter.cpp @@ -35,14 +35,6 @@ const fs::path &TargetInfoGetter::GetTargetBuildDir() const { return t.env_.GetTargetBuildDir(); } -// Target Config -template -const TargetConfig &TargetInfoGetter::GetConfig() const { - const T &t = static_cast(*this); - - return t.config_; -} - // Target Storer template const fs_unordered_set &TargetInfoGetter::GetSourceFiles() const { From 0e44a1418ca6506dd0bc14e7b59120c56897a6f6 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Thu, 17 Mar 2022 19:01:22 -0700 Subject: [PATCH 09/12] Update toolchain.h --- .../toolchain/include/toolchain/toolchain.h | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index 8949f56e..5f0d2b5b 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -57,26 +57,26 @@ class Toolchain : public internal::FlagApi, }; public: - explicit Toolchain(Id id, std::string_view name, - const ToolchainBinaries &binaries, bool lock = true, - const ToolchainConfig &config = ToolchainConfig()) + Toolchain() = default; + Toolchain(Id id, std::string_view name, const ToolchainBinaries &binaries, + bool lock = true, const ToolchainConfig &config = ToolchainConfig()) : id_(id), name_(name), binaries_(binaries), lock_(lock), config_(config) { Initialize(); } - - explicit Toolchain(Id id, std::string_view name, std::string_view assembler, - std::string_view c_compiler, std::string_view cpp_compiler, - std::string_view archiver, std::string_view linker, - bool lock = true, - const ToolchainConfig &config = ToolchainConfig()) + Toolchain(Id id, std::string_view name, std::string_view assembler, + std::string_view c_compiler, std::string_view cpp_compiler, + std::string_view archiver, std::string_view linker, + bool lock = true, const ToolchainConfig &config = ToolchainConfig()) : Toolchain(id, name, ToolchainBinaries(assembler, c_compiler, cpp_compiler, archiver, linker), lock, config) {} - Toolchain(Toolchain &&toolchain) = default; - Toolchain(const Toolchain &toolchain) = delete; + Toolchain(Toolchain &&) = default; + Toolchain &operator=(Toolchain &&) = default; + Toolchain(const Toolchain &) = delete; + Toolchain &operator=(const Toolchain &) = delete; void Lock(); From b1bb2515d7d8b3e33b3b68c5a7a55e3a5d7426b7 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Thu, 17 Mar 2022 19:17:34 -0700 Subject: [PATCH 10/12] Updated Toolchain::Id to ToolchainId --- buildcc/lib/args/src/args.cpp | 2 +- buildcc/lib/args/test/test_args.cpp | 12 +++---- buildcc/lib/args/test/test_register.cpp | 14 ++++----- .../target/test/target/test_base_target.cpp | 2 +- .../test/target/test_compile_object.cpp | 2 +- .../test/target/test_target_external_lib.cpp | 2 +- .../target/test_target_failure_states.cpp | 2 +- .../target/test/target/test_target_flags.cpp | 2 +- .../test/target/test_target_include_dir.cpp | 2 +- .../test/target/test_target_lib_dep.cpp | 2 +- .../target/test/target/test_target_lock.cpp | 2 +- .../target/test/target/test_target_pch.cpp | 2 +- .../target/test/target/test_target_source.cpp | 2 +- .../target/test_target_source_out_of_root.cpp | 2 +- .../target/test/target/test_target_sync.cpp | 2 +- .../test/target/test_target_user_deps.cpp | 2 +- .../toolchain/include/toolchain/toolchain.h | 31 +++++++++---------- .../toolchain/src/api/toolchain_verify.cpp | 16 +++++----- .../toolchain/test/test_toolchain_verify.cpp | 30 +++++++++--------- .../include/toolchains/toolchain_gcc.h | 2 +- .../include/toolchains/toolchain_msvc.h | 3 +- 21 files changed, 67 insertions(+), 69 deletions(-) diff --git a/buildcc/lib/args/src/args.cpp b/buildcc/lib/args/src/args.cpp index 26232694..9c95eb5c 100644 --- a/buildcc/lib/args/src/args.cpp +++ b/buildcc/lib/args/src/args.cpp @@ -75,7 +75,7 @@ const std::unordered_map kLogLevelMap{ {"critical", buildcc::env::LogLevel::Critical}, }; -const std::unordered_map kToolchainIdMap{ +const std::unordered_map kToolchainIdMap{ {"gcc", buildcc::ToolchainId::Gcc}, {"msvc", buildcc::ToolchainId::Msvc}, {"mingw", buildcc::ToolchainId::MinGW}, diff --git a/buildcc/lib/args/test/test_args.cpp b/buildcc/lib/args/test/test_args.cpp index 36b3eb15..b52179cf 100644 --- a/buildcc/lib/args/test/test_args.cpp +++ b/buildcc/lib/args/test/test_args.cpp @@ -66,7 +66,7 @@ TEST(ArgsTestGroup, Args_CustomToolchain) { // Toolchain CHECK_TRUE(gcc_toolchain.state.build); CHECK_FALSE(gcc_toolchain.state.test); - CHECK(gcc_toolchain.id == buildcc::Toolchain::Id::Gcc); + CHECK(gcc_toolchain.id == buildcc::ToolchainId::Gcc); STRCMP_EQUAL(gcc_toolchain.name.c_str(), "gcc"); STRCMP_EQUAL(gcc_toolchain.binaries.assembler.c_str(), "as"); STRCMP_EQUAL(gcc_toolchain.binaries.c_compiler.c_str(), "gcc"); @@ -104,7 +104,7 @@ TEST(ArgsTestGroup, Args_MultipleCustomToolchain) { // GCC CHECK_TRUE(gcc_toolchain.state.build); CHECK_FALSE(gcc_toolchain.state.test); - CHECK(gcc_toolchain.id == buildcc::Toolchain::Id::Gcc); + CHECK(gcc_toolchain.id == buildcc::ToolchainId::Gcc); STRCMP_EQUAL(gcc_toolchain.name.c_str(), "gcc"); STRCMP_EQUAL(gcc_toolchain.binaries.assembler.c_str(), "as"); STRCMP_EQUAL(gcc_toolchain.binaries.c_compiler.c_str(), "gcc"); @@ -115,7 +115,7 @@ TEST(ArgsTestGroup, Args_MultipleCustomToolchain) { // MSVC CHECK_TRUE(msvc_toolchain.state.build); CHECK_TRUE(msvc_toolchain.state.test); - CHECK(msvc_toolchain.id == buildcc::Toolchain::Id::Msvc); + CHECK(msvc_toolchain.id == buildcc::ToolchainId::Msvc); STRCMP_EQUAL(msvc_toolchain.name.c_str(), "msvc"); STRCMP_EQUAL(msvc_toolchain.binaries.assembler.c_str(), "cl"); STRCMP_EQUAL(msvc_toolchain.binaries.c_compiler.c_str(), "cl"); @@ -165,7 +165,7 @@ TEST(ArgsTestGroup, Args_CustomTarget) { // Toolchain CHECK_TRUE(gcc_toolchain.state.build); CHECK_FALSE(gcc_toolchain.state.test); - CHECK(gcc_toolchain.id == buildcc::Toolchain::Id::Gcc); + CHECK(gcc_toolchain.id == buildcc::ToolchainId::Gcc); STRCMP_EQUAL(gcc_toolchain.name.c_str(), "gcc"); STRCMP_EQUAL(gcc_toolchain.binaries.assembler.c_str(), "as"); STRCMP_EQUAL(gcc_toolchain.binaries.c_compiler.c_str(), "gcc"); @@ -219,7 +219,7 @@ TEST(ArgsTestGroup, Args_MultipleCustomTarget) { // Toolchain CHECK_TRUE(gcc_toolchain.state.build); CHECK_FALSE(gcc_toolchain.state.test); - CHECK(gcc_toolchain.id == buildcc::Toolchain::Id::Gcc); + CHECK(gcc_toolchain.id == buildcc::ToolchainId::Gcc); STRCMP_EQUAL(gcc_toolchain.name.c_str(), "gcc"); STRCMP_EQUAL(gcc_toolchain.binaries.assembler.c_str(), "as"); STRCMP_EQUAL(gcc_toolchain.binaries.c_compiler.c_str(), "gcc"); @@ -240,7 +240,7 @@ TEST(ArgsTestGroup, Args_MultipleCustomTarget) { // Toolchain CHECK_TRUE(msvc_toolchain.state.build); CHECK_TRUE(msvc_toolchain.state.test); - CHECK(msvc_toolchain.id == buildcc::Toolchain::Id::Msvc); + CHECK(msvc_toolchain.id == buildcc::ToolchainId::Msvc); STRCMP_EQUAL(msvc_toolchain.name.c_str(), "msvc"); STRCMP_EQUAL(msvc_toolchain.binaries.assembler.c_str(), "cl"); STRCMP_EQUAL(msvc_toolchain.binaries.c_compiler.c_str(), "cl"); diff --git a/buildcc/lib/args/test/test_register.cpp b/buildcc/lib/args/test/test_register.cpp index 62e4ad38..0ccea4bc 100644 --- a/buildcc/lib/args/test/test_register.cpp +++ b/buildcc/lib/args/test/test_register.cpp @@ -100,7 +100,7 @@ TEST(RegisterTestGroup, Register_Build) { // Make dummy toolchain and target buildcc::env::init(fs::current_path(), fs::current_path()); - buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", + buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "", "", "", "", "", ""); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); @@ -148,7 +148,7 @@ TEST(RegisterTestGroup, Register_NoBuildAndDep) { // Make dummy toolchain and target buildcc::env::init(fs::current_path(), fs::current_path()); - buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", + buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "", "", "", "", "", ""); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); @@ -232,7 +232,7 @@ TEST(RegisterTestGroup, Register_BuildAndDep) { // Make dummy toolchain and target buildcc::env::init(fs::current_path(), fs::current_path()); - buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", + buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "", "", "", "", "", ""); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); @@ -327,7 +327,7 @@ TEST(RegisterTestGroup, Register_DepDuplicate) { // Make dummy toolchain and target buildcc::env::init(fs::current_path(), fs::current_path()); - buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", + buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "", "", "", "", "", ""); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); @@ -403,7 +403,7 @@ TEST(RegisterTestGroup, Register_DepCyclic) { // Make dummy toolchain and target buildcc::env::init(fs::current_path(), fs::current_path()); - buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", + buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "", "", "", "", "", ""); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); @@ -479,7 +479,7 @@ TEST(RegisterTestGroup, Register_Test) { // Make dummy toolchain and target buildcc::env::init(fs::current_path(), fs::current_path()); - buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", + buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "", "", "", "", "", ""); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); @@ -564,7 +564,7 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { // Make dummy toolchain and target buildcc::env::init(fs::current_path(), fs::current_path()); - buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", + buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "", "", "", "", "", ""); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); diff --git a/buildcc/lib/target/test/target/test_base_target.cpp b/buildcc/lib/target/test/target/test_base_target.cpp index 4f8d7639..6f772d7d 100644 --- a/buildcc/lib/target/test/target/test_base_target.cpp +++ b/buildcc/lib/target/test/target/test_base_target.cpp @@ -21,7 +21,7 @@ TEST_GROUP(TargetBaseTestGroup) } }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); TEST(TargetBaseTestGroup, InvalidTargetType) { diff --git a/buildcc/lib/target/test/target/test_compile_object.cpp b/buildcc/lib/target/test/target/test_compile_object.cpp index 0284b395..1819509d 100644 --- a/buildcc/lib/target/test/target/test_compile_object.cpp +++ b/buildcc/lib/target/test/target/test_compile_object.cpp @@ -15,7 +15,7 @@ TEST_GROUP(TargetCompileObjectTestGroup) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); TEST(TargetCompileObjectTestGroup, CacheCompileCommand_Invalid) { diff --git a/buildcc/lib/target/test/target/test_target_external_lib.cpp b/buildcc/lib/target/test/target/test_target_external_lib.cpp index ec6bfcc5..6c04a79c 100644 --- a/buildcc/lib/target/test/target/test_target_external_lib.cpp +++ b/buildcc/lib/target/test/target/test_target_external_lib.cpp @@ -27,7 +27,7 @@ TEST_GROUP(TargetTestExternalLib) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); static const fs::path intermediate_path = diff --git a/buildcc/lib/target/test/target/test_target_failure_states.cpp b/buildcc/lib/target/test/target/test_target_failure_states.cpp index 5f64f4d9..20a2aa74 100644 --- a/buildcc/lib/target/test/target/test_target_failure_states.cpp +++ b/buildcc/lib/target/test/target/test_target_failure_states.cpp @@ -25,7 +25,7 @@ TEST_GROUP(TargetTestFailureStates) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); TEST(TargetTestFailureStates, StartTaskEnvFailure) { diff --git a/buildcc/lib/target/test/target/test_target_flags.cpp b/buildcc/lib/target/test/target/test_target_flags.cpp index 54434648..5a177930 100644 --- a/buildcc/lib/target/test/target/test_target_flags.cpp +++ b/buildcc/lib/target/test/target/test_target_flags.cpp @@ -21,7 +21,7 @@ // Constants -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); // ------------- PREPROCESSOR FLAGS --------------- diff --git a/buildcc/lib/target/test/target/test_target_include_dir.cpp b/buildcc/lib/target/test/target/test_target_include_dir.cpp index e3a23dc7..91fa44b4 100644 --- a/buildcc/lib/target/test/target/test_target_include_dir.cpp +++ b/buildcc/lib/target/test/target/test_target_include_dir.cpp @@ -26,7 +26,7 @@ TEST_GROUP(TargetTestIncludeDirGroup) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); static const fs::path target_include_dir_intermediate_path = diff --git a/buildcc/lib/target/test/target/test_target_lib_dep.cpp b/buildcc/lib/target/test/target/test_target_lib_dep.cpp index 9b71856a..5b0815da 100644 --- a/buildcc/lib/target/test/target/test_target_lib_dep.cpp +++ b/buildcc/lib/target/test/target/test_target_lib_dep.cpp @@ -30,7 +30,7 @@ TEST_GROUP(TargetTestLibDep) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); static const fs::path intermediate_path = diff --git a/buildcc/lib/target/test/target/test_target_lock.cpp b/buildcc/lib/target/test/target/test_target_lock.cpp index 5bd6b2c8..3987d2c3 100644 --- a/buildcc/lib/target/test/target/test_target_lock.cpp +++ b/buildcc/lib/target/test/target/test_target_lock.cpp @@ -25,7 +25,7 @@ TEST_GROUP(TargetTestLock) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); TEST(TargetTestLock, LockState) { diff --git a/buildcc/lib/target/test/target/test_target_pch.cpp b/buildcc/lib/target/test/target/test_target_pch.cpp index 38833475..4cfbac1f 100644 --- a/buildcc/lib/target/test/target/test_target_pch.cpp +++ b/buildcc/lib/target/test/target/test_target_pch.cpp @@ -30,7 +30,7 @@ TEST_GROUP(TargetPchTestGroup) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); TEST(TargetPchTestGroup, Target_AddPch) { diff --git a/buildcc/lib/target/test/target/test_target_source.cpp b/buildcc/lib/target/test/target/test_target_source.cpp index 389dda74..58c9f2d2 100644 --- a/buildcc/lib/target/test/target/test_target_source.cpp +++ b/buildcc/lib/target/test/target/test_target_source.cpp @@ -27,7 +27,7 @@ TEST_GROUP(TargetTestSourceGroup) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); static const fs::path target_source_intermediate_path = diff --git a/buildcc/lib/target/test/target/test_target_source_out_of_root.cpp b/buildcc/lib/target/test/target/test_target_source_out_of_root.cpp index 478b104e..6491950d 100644 --- a/buildcc/lib/target/test/target/test_target_source_out_of_root.cpp +++ b/buildcc/lib/target/test/target/test_target_source_out_of_root.cpp @@ -26,7 +26,7 @@ TEST_GROUP(TargetTestSourceOutOfRootGroup) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); static const fs::path target_source_intermediate_path = diff --git a/buildcc/lib/target/test/target/test_target_sync.cpp b/buildcc/lib/target/test/target/test_target_sync.cpp index 2b813406..cbb55d3e 100644 --- a/buildcc/lib/target/test/target/test_target_sync.cpp +++ b/buildcc/lib/target/test/target/test_target_sync.cpp @@ -19,7 +19,7 @@ TEST_GROUP(TargetTestSyncGroup) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ldd"); TEST(TargetTestSyncGroup, CopyByConstRef) { diff --git a/buildcc/lib/target/test/target/test_target_user_deps.cpp b/buildcc/lib/target/test/target/test_target_user_deps.cpp index 237da156..8a4bb451 100644 --- a/buildcc/lib/target/test/target/test_target_user_deps.cpp +++ b/buildcc/lib/target/test/target/test_target_user_deps.cpp @@ -27,7 +27,7 @@ TEST_GROUP(TargetTestUserDepsGroup) }; // clang-format on -static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", +static buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); static const fs::path target_source_intermediate_path = diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index 5f0d2b5b..955726a2 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -29,6 +29,15 @@ namespace buildcc { +enum class ToolchainId { + Gcc = 0, ///< GCC Toolchain + Msvc, ///< MSVC Toolchain + Clang, ///< Clang Toolchain + MinGW, ///< MinGW Toolchain (Similar to GCC, but for Windows) + Custom, ///< Custom Toolchain not defined in this list + Undefined, ///< Default value when unknown +}; + struct ToolchainBinaries { explicit ToolchainBinaries() = default; explicit ToolchainBinaries(std::string_view as, std::string_view c, @@ -47,24 +56,15 @@ struct ToolchainBinaries { class Toolchain : public internal::FlagApi, public ToolchainVerify { public: - enum class Id { - Gcc = 0, ///< GCC Toolchain - Msvc, ///< MSVC Toolchain - Clang, ///< Clang Toolchain - MinGW, ///< MinGW Toolchain (Similar to GCC, but for Windows) - Custom, ///< Custom Toolchain not defined in this list - Undefined, ///< Default value when unknown - }; - public: - Toolchain() = default; - Toolchain(Id id, std::string_view name, const ToolchainBinaries &binaries, - bool lock = true, const ToolchainConfig &config = ToolchainConfig()) + Toolchain(ToolchainId id, std::string_view name, + const ToolchainBinaries &binaries, bool lock = true, + const ToolchainConfig &config = ToolchainConfig()) : id_(id), name_(name), binaries_(binaries), lock_(lock), config_(config) { Initialize(); } - Toolchain(Id id, std::string_view name, std::string_view assembler, + Toolchain(ToolchainId id, std::string_view name, std::string_view assembler, std::string_view c_compiler, std::string_view cpp_compiler, std::string_view archiver, std::string_view linker, bool lock = true, const ToolchainConfig &config = ToolchainConfig()) @@ -81,7 +81,7 @@ class Toolchain : public internal::FlagApi, void Lock(); // Getters - Id GetId() const { return id_; } + ToolchainId GetId() const { return id_; } const std::string &GetName() const { return name_; } const std::string &GetAssembler() const { return binaries_.assembler; } const std::string &GetCCompiler() const { return binaries_.c_compiler; } @@ -114,7 +114,7 @@ class Toolchain : public internal::FlagApi, friend class ToolchainVerify; private: - Id id_; + ToolchainId id_; std::string name_; ToolchainBinaries binaries_; FunctionLock lock_; @@ -124,7 +124,6 @@ class Toolchain : public internal::FlagApi, UserSchema user_; }; -typedef Toolchain::Id ToolchainId; typedef Toolchain BaseToolchain; } // namespace buildcc diff --git a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp index 0b1a2739..157a7c1e 100644 --- a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp +++ b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp @@ -78,12 +78,12 @@ GetCompilerVersion(const fs::path &absolute_path, std::optional compiler_version; switch (toolchain.GetId()) { - case buildcc::Toolchain::Id::Gcc: - case buildcc::Toolchain::Id::MinGW: - case buildcc::Toolchain::Id::Clang: + case buildcc::ToolchainId::Gcc: + case buildcc::ToolchainId::MinGW: + case buildcc::ToolchainId::Clang: compiler_version = GetGccCompilerVersion(command); break; - case buildcc::Toolchain::Id::Msvc: + case buildcc::ToolchainId::Msvc: compiler_version = GetMsvcCompilerVersion(); break; default: @@ -127,12 +127,12 @@ GetCompilerArchitecture(const fs::path &absolute_path, (absolute_path / toolchain.GetCppCompiler()).make_preferred().string()); std::optional target_arch; switch (toolchain.GetId()) { - case buildcc::Toolchain::Id::Gcc: - case buildcc::Toolchain::Id::MinGW: - case buildcc::Toolchain::Id::Clang: + case buildcc::ToolchainId::Gcc: + case buildcc::ToolchainId::MinGW: + case buildcc::ToolchainId::Clang: target_arch = GetGccTargetArchitecture(command); break; - case buildcc::Toolchain::Id::Msvc: + case buildcc::ToolchainId::Msvc: target_arch = GetMsvcTargetArchitecture(); break; default: diff --git a/buildcc/lib/toolchain/test/test_toolchain_verify.cpp b/buildcc/lib/toolchain/test/test_toolchain_verify.cpp index 9e12df5e..0fce266c 100644 --- a/buildcc/lib/toolchain/test/test_toolchain_verify.cpp +++ b/buildcc/lib/toolchain/test/test_toolchain_verify.cpp @@ -27,7 +27,7 @@ TEST_GROUP(ToolchainTestGroup) // NOTE, We are mocking the environment instead of actually querying it TEST(ToolchainTestGroup, VerifyToolchain_Gcc) { - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); std::vector version_stdout_data{"version"}; @@ -56,7 +56,7 @@ TEST(ToolchainTestGroup, VerifyToolchain_Gcc) { } TEST(ToolchainTestGroup, VerifyToolchain_Clang) { - buildcc::Toolchain clang(buildcc::Toolchain::Id::Clang, "clang", "llvm-as", + buildcc::Toolchain clang(buildcc::ToolchainId::Clang, "clang", "llvm-as", "clang", "clang++", "llvm-ar", "lld"); std::vector version_stdout_data{"version"}; @@ -85,8 +85,8 @@ TEST(ToolchainTestGroup, VerifyToolchain_Clang) { } TEST(ToolchainTestGroup, VerifyToolchain_Msvc) { - buildcc::Toolchain msvc(buildcc::Toolchain::Id::Msvc, "msvc", "cl", "cl", - "cl", "lib", "link"); + buildcc::Toolchain msvc(buildcc::ToolchainId::Msvc, "msvc", "cl", "cl", "cl", + "lib", "link"); // Setup ENV // VSCMD_VER std::string vscmd_ver = std::string("VSCMD_VER=version"); @@ -122,8 +122,8 @@ TEST(ToolchainTestGroup, VerifyToolchain_Msvc) { } TEST(ToolchainTestGroup, VerifyToolchain_BadCompilerId) { - buildcc::Toolchain gcc((buildcc::Toolchain::Id)65535, "gcc", "as", "gcc", - "g++", "ar", "ld"); + buildcc::Toolchain gcc((buildcc::ToolchainId)65535, "gcc", "as", "gcc", "g++", + "ar", "ld"); std::string putenv_str = fmt::format("CUSTOM_BUILDCC_PATH={}/toolchains/gcc", fs::current_path().string()); @@ -146,7 +146,7 @@ TEST(ToolchainTestGroup, VerifyToolchain_BadCompilerId) { } TEST(ToolchainTestGroup, VerifyToolchain_BadAbsolutePath) { - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); buildcc::VerifyToolchainConfig config; @@ -161,7 +161,7 @@ TEST(ToolchainTestGroup, VerifyToolchain_BadAbsolutePath) { } TEST(ToolchainTestGroup, VerifyToolchain_PathContainsDir) { - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); buildcc::VerifyToolchainConfig config; @@ -176,7 +176,7 @@ TEST(ToolchainTestGroup, VerifyToolchain_PathContainsDir) { } TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_CompilerVersion) { - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); buildcc::VerifyToolchainConfig config; @@ -198,7 +198,7 @@ TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_CompilerVersion) { TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_CompilerVersionFailure) { - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); buildcc::VerifyToolchainConfig config; @@ -219,7 +219,7 @@ TEST(ToolchainTestGroup, } TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_TargetArch) { - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); buildcc::VerifyToolchainConfig config; @@ -240,7 +240,7 @@ TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_TargetArch) { } TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_TargetArchFailure) { - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); buildcc::VerifyToolchainConfig config; @@ -261,7 +261,7 @@ TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_TargetArchFailure) { } TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_BothFailure) { - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); buildcc::VerifyToolchainConfig config; @@ -283,7 +283,7 @@ TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_BothFailure) { } TEST(ToolchainTestGroup, VerifyToolchain_UpdateFalse) { - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); buildcc::VerifyToolchainConfig config; @@ -315,7 +315,7 @@ TEST(ToolchainTestGroup, VerifyToolchain_LockedFolder) { FAIL_TEST("Could not set file permissions"); } - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + buildcc::Toolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); buildcc::VerifyToolchainConfig config; diff --git a/buildcc/toolchains/include/toolchains/toolchain_gcc.h b/buildcc/toolchains/include/toolchains/toolchain_gcc.h index ebf4be40..9e54351f 100644 --- a/buildcc/toolchains/include/toolchains/toolchain_gcc.h +++ b/buildcc/toolchains/include/toolchains/toolchain_gcc.h @@ -40,7 +40,7 @@ constexpr const char *const kGccPrefixLibDir = "-L"; class Toolchain_gcc : public Toolchain { public: Toolchain_gcc() - : Toolchain(Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld") {} + : Toolchain(ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld") {} Toolchain_gcc(const Toolchain_gcc &gcc) = delete; private: diff --git a/buildcc/toolchains/include/toolchains/toolchain_msvc.h b/buildcc/toolchains/include/toolchains/toolchain_msvc.h index 6a5a8ceb..db40a8d6 100644 --- a/buildcc/toolchains/include/toolchains/toolchain_msvc.h +++ b/buildcc/toolchains/include/toolchains/toolchain_msvc.h @@ -41,8 +41,7 @@ constexpr const char *const kMsvcPrefixLibDir = "/LIBPATH:"; class Toolchain_msvc : public Toolchain { public: Toolchain_msvc() - : Toolchain(Toolchain::Id::Msvc, "msvc", "cl", "cl", "cl", "lib", - "link") {} + : Toolchain(ToolchainId::Msvc, "msvc", "cl", "cl", "cl", "lib", "link") {} Toolchain_msvc(const Toolchain_msvc &gcc) = delete; private: From 664f7787d72efe024cc9dec28bdc60cba0bc2a5a Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Thu, 17 Mar 2022 19:48:20 -0700 Subject: [PATCH 11/12] Update toolchain.h --- buildcc/lib/toolchain/include/toolchain/toolchain.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index 955726a2..f46cc2ad 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -45,11 +45,11 @@ struct ToolchainBinaries { std::string_view link) : assembler(as), c_compiler(c), cpp_compiler(cpp), archiver(ar), linker(link) {} - std::string assembler{""}; - std::string c_compiler{""}; - std::string cpp_compiler{""}; - std::string archiver{""}; - std::string linker{""}; + std::string assembler; + std::string c_compiler; + std::string cpp_compiler; + std::string archiver; + std::string linker; }; // Base toolchain class From 534227171356b5815fbfe76c7e53deb4fffd03fa Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Thu, 17 Mar 2022 19:51:36 -0700 Subject: [PATCH 12/12] Updated docs --- docs/source/user_api/toolchain.rst | 2 -- docs/source/user_api/toolchain_utils.rst | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/source/user_api/toolchain.rst b/docs/source/user_api/toolchain.rst index a3710106..4fd1b5ae 100644 --- a/docs/source/user_api/toolchain.rst +++ b/docs/source/user_api/toolchain.rst @@ -6,8 +6,6 @@ toolchain.h .. doxygenclass:: buildcc::Toolchain -.. doxygentypedef:: ToolchainId - .. doxygentypedef:: BaseToolchain toolchain_verify.h diff --git a/docs/source/user_api/toolchain_utils.rst b/docs/source/user_api/toolchain_utils.rst index 8c2dfcd7..3a2976ae 100644 --- a/docs/source/user_api/toolchain_utils.rst +++ b/docs/source/user_api/toolchain_utils.rst @@ -17,3 +17,10 @@ toolchain_config.h -------------------- .. doxygenstruct:: buildcc::ToolchainConfig + +toolchain.h +-------------- + +.. doxygenenum:: buildcc::ToolchainId + +.. doxygenstruct:: buildcc::ToolchainBinaries