From a45bbbc2a3da453576e050156ce0a4c0300419d2 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 4 Jan 2022 07:12:47 -0800 Subject: [PATCH 1/7] Update toolchain.h --- buildcc/lib/toolchain/include/toolchain/toolchain.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index 17d292e1..9eeb278c 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -58,6 +58,9 @@ class Toolchain : public ToolchainVerify { const std::string &GetArchiver() const { return archiver_; } const std::string &GetLinker() const { return linker_; } +private: + friend class ToolchainVerify; + private: Id id_; std::string name_; From cbf1cd1f86331eb13d27d53f492edef1601b99e7 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 4 Jan 2022 07:13:13 -0800 Subject: [PATCH 2/7] Updated toolchain_verify config options --- .../include/toolchain/api/toolchain_verify.h | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/buildcc/lib/toolchain/include/toolchain/api/toolchain_verify.h b/buildcc/lib/toolchain/include/toolchain/api/toolchain_verify.h index d6d8023f..35e006bc 100644 --- a/buildcc/lib/toolchain/include/toolchain/api/toolchain_verify.h +++ b/buildcc/lib/toolchain/include/toolchain/api/toolchain_verify.h @@ -18,6 +18,7 @@ #define TOOLCHAIN_TOOLCHAIN_VERIFY_H_ #include +#include #include #include "env/logging.h" @@ -42,6 +43,13 @@ namespace buildcc::base { struct VerifyToolchainConfig { std::vector absolute_search_paths; std::vector env_vars{"PATH"}; + + std::optional compiler_version; + std::optional target_arch; + + // Updates the toolchain with absolute paths once verified + // If multiple toolchains are found, uses the first in the list + bool update{true}; }; /** @@ -60,8 +68,21 @@ struct VerifiedToolchain { template class ToolchainVerify { public: + /** + * @brief Verify your toolchain executables by searching your operating system + * paths + * Only add the verified path IF all toolchain executables are matched + * + * @param config Search paths to find toolchains + * @return std::vector Operating system can contain + * multiple toolchains of similar names with different versions. Collect all + * of them + */ std::vector Verify(const VerifyToolchainConfig &config = VerifyToolchainConfig()); + +protected: + VerifiedToolchain verified_toolchain_; }; } // namespace buildcc::base From 5dea59fc2d8cad36e75602175067df8e55ff3cb2 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 4 Jan 2022 07:13:22 -0800 Subject: [PATCH 3/7] Update toolchain_verify.cpp --- .../lib/toolchain/src/api/toolchain_verify.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp index 1afcf998..7f21a856 100644 --- a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp +++ b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp @@ -233,13 +233,28 @@ ToolchainVerify::Verify(const VerifyToolchainConfig &config) { vt.path = p; vt.compiler_version = env::trim(GetCompilerVersion(p, t).value_or("")); vt.target_arch = env::trim(GetCompilerArchitecture(p, t).value_or("")); - verified_toolchains.push_back(vt); + + // Check add + bool add{true}; + if (config.compiler_version.has_value()) { + add = add && (config.compiler_version.value() == vt.compiler_version); + } + if (config.target_arch.has_value()) { + add = add && (config.target_arch.value() == vt.target_arch); + } + if (add) { + verified_toolchains.push_back(vt); + } } // Reset matcher.FillWithToolchainFilenames(); } + if (config.update && !verified_toolchains.empty()) { + // TODO, Update logic here + } + return verified_toolchains; } From 7cbc7c382e695fc4c6a2946eed1e09d6ab91cfa8 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 4 Jan 2022 07:13:36 -0800 Subject: [PATCH 4/7] Update test_toolchain_verify.cpp --- .../toolchain/test/test_toolchain_verify.cpp | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/buildcc/lib/toolchain/test/test_toolchain_verify.cpp b/buildcc/lib/toolchain/test/test_toolchain_verify.cpp index 451bcc54..ddc14f56 100644 --- a/buildcc/lib/toolchain/test/test_toolchain_verify.cpp +++ b/buildcc/lib/toolchain/test/test_toolchain_verify.cpp @@ -204,6 +204,113 @@ TEST(ToolchainTestGroup, VerifyToolchain_LockedFolder) { } } +TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_CompilerVersion) { + buildcc::base::Toolchain gcc(buildcc::base::Toolchain::Id::Gcc, "gcc", "as", + "gcc", "g++", "ar", "ld"); + + buildcc::base::VerifyToolchainConfig config; + config.env_vars.clear(); + config.absolute_search_paths.push_back( + (fs::current_path() / "toolchains" / "gcc").string()); + config.compiler_version = "10.2.1"; + + std::vector compiler_version{"10.2.1"}; + std::vector arch{"none"}; + buildcc::env::m::CommandExpect_Execute(1, true, &compiler_version, nullptr); + buildcc::env::m::CommandExpect_Execute(1, true, &arch, nullptr); + + std::vector verified_toolchains = + gcc.Verify(config); + UT_PRINT(std::to_string(verified_toolchains.size()).c_str()); + CHECK_EQUAL(verified_toolchains.size(), 1); +} + +TEST(ToolchainTestGroup, + VerifyToolchain_ConditionalAdd_CompilerVersionFailure) { + buildcc::base::Toolchain gcc(buildcc::base::Toolchain::Id::Gcc, "gcc", "as", + "gcc", "g++", "ar", "ld"); + + buildcc::base::VerifyToolchainConfig config; + config.env_vars.clear(); + config.absolute_search_paths.push_back( + (fs::current_path() / "toolchains" / "gcc").string()); + config.compiler_version = "11.0.0"; + + std::vector compiler_version{"10.2.1"}; + std::vector arch{"none"}; + buildcc::env::m::CommandExpect_Execute(1, true, &compiler_version, nullptr); + buildcc::env::m::CommandExpect_Execute(1, true, &arch, nullptr); + + std::vector verified_toolchains = + gcc.Verify(config); + UT_PRINT(std::to_string(verified_toolchains.size()).c_str()); + CHECK_EQUAL(verified_toolchains.size(), 0); +} + +TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_TargetArch) { + buildcc::base::Toolchain gcc(buildcc::base::Toolchain::Id::Gcc, "gcc", "as", + "gcc", "g++", "ar", "ld"); + + buildcc::base::VerifyToolchainConfig config; + config.env_vars.clear(); + config.absolute_search_paths.push_back( + (fs::current_path() / "toolchains" / "gcc").string()); + config.target_arch = "arm-none-eabi"; + + std::vector compiler_version{"10.2.1"}; + std::vector arch{"arm-none-eabi"}; + buildcc::env::m::CommandExpect_Execute(1, true, &compiler_version, nullptr); + buildcc::env::m::CommandExpect_Execute(1, true, &arch, nullptr); + + std::vector verified_toolchains = + gcc.Verify(config); + UT_PRINT(std::to_string(verified_toolchains.size()).c_str()); + CHECK_EQUAL(verified_toolchains.size(), 1); +} + +TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_TargetArchFailure) { + buildcc::base::Toolchain gcc(buildcc::base::Toolchain::Id::Gcc, "gcc", "as", + "gcc", "g++", "ar", "ld"); + + buildcc::base::VerifyToolchainConfig config; + config.env_vars.clear(); + config.absolute_search_paths.push_back( + (fs::current_path() / "toolchains" / "gcc").string()); + config.target_arch = "none"; + + std::vector compiler_version{"10.2.1"}; + std::vector arch{"arm-none-eabi"}; + buildcc::env::m::CommandExpect_Execute(1, true, &compiler_version, nullptr); + buildcc::env::m::CommandExpect_Execute(1, true, &arch, nullptr); + + std::vector verified_toolchains = + gcc.Verify(config); + UT_PRINT(std::to_string(verified_toolchains.size()).c_str()); + CHECK_EQUAL(verified_toolchains.size(), 0); +} + +TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_BothFailure) { + buildcc::base::Toolchain gcc(buildcc::base::Toolchain::Id::Gcc, "gcc", "as", + "gcc", "g++", "ar", "ld"); + + buildcc::base::VerifyToolchainConfig config; + config.env_vars.clear(); + config.absolute_search_paths.push_back( + (fs::current_path() / "toolchains" / "gcc").string()); + config.compiler_version = "none"; + config.target_arch = "none"; + + std::vector compiler_version{"10.2.1"}; + std::vector arch{"arm-none-eabi"}; + buildcc::env::m::CommandExpect_Execute(1, true, &compiler_version, nullptr); + buildcc::env::m::CommandExpect_Execute(1, true, &arch, nullptr); + + std::vector verified_toolchains = + gcc.Verify(config); + UT_PRINT(std::to_string(verified_toolchains.size()).c_str()); + CHECK_EQUAL(verified_toolchains.size(), 0); +} + int main(int ac, char **av) { buildcc::env::m::VectorStringCopier copier; mock().installCopier(TEST_VECTOR_STRING_TYPE, copier); From e2ab799b7f1cdfd619f0b1b3791931f2a6ef8f3b Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 4 Jan 2022 07:26:40 -0800 Subject: [PATCH 5/7] Update toolchain_verify.cpp --- buildcc/lib/toolchain/src/api/toolchain_verify.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp index 7f21a856..dceacdfd 100644 --- a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp +++ b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp @@ -197,7 +197,7 @@ ToolchainVerify::Verify(const VerifyToolchainConfig &config) { } std::vector verified_toolchains; - const T &t = static_cast(*this); + T &t = static_cast(*this); ToolchainMatcher matcher(t); matcher.FillWithToolchainFilenames(); @@ -252,7 +252,17 @@ ToolchainVerify::Verify(const VerifyToolchainConfig &config) { } if (config.update && !verified_toolchains.empty()) { - // TODO, Update logic here + verified_toolchain_ = verified_toolchains[0]; + t.asm_compiler_ = + (verified_toolchain_.path / t.asm_compiler_).make_preferred().string(); + t.c_compiler_ = + (verified_toolchain_.path / t.c_compiler_).make_preferred().string(); + t.cpp_compiler_ = + (verified_toolchain_.path / t.cpp_compiler_).make_preferred().string(); + t.archiver_ = + (verified_toolchain_.path / t.archiver_).make_preferred().string(); + t.linker_ = + (verified_toolchain_.path / t.linker_).make_preferred().string(); } return verified_toolchains; From e659571b25968483258fd0eac4bfca4e82ba0d47 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 4 Jan 2022 07:26:51 -0800 Subject: [PATCH 6/7] Update test_toolchain_verify.cpp --- .../toolchain/test/test_toolchain_verify.cpp | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/buildcc/lib/toolchain/test/test_toolchain_verify.cpp b/buildcc/lib/toolchain/test/test_toolchain_verify.cpp index ddc14f56..d6b26da5 100644 --- a/buildcc/lib/toolchain/test/test_toolchain_verify.cpp +++ b/buildcc/lib/toolchain/test/test_toolchain_verify.cpp @@ -311,6 +311,29 @@ TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_BothFailure) { CHECK_EQUAL(verified_toolchains.size(), 0); } +TEST(ToolchainTestGroup, VerifyToolchain_UpdateFalse) { + buildcc::base::Toolchain gcc(buildcc::base::Toolchain::Id::Gcc, "gcc", "as", + "gcc", "g++", "ar", "ld"); + + buildcc::base::VerifyToolchainConfig config; + config.env_vars.clear(); + config.absolute_search_paths.push_back( + (fs::current_path() / "toolchains" / "gcc").string()); + // config.compiler_version = "none"; + // config.target_arch = "none"; + config.update = false; + + std::vector compiler_version{"10.2.1"}; + std::vector arch{"arm-none-eabi"}; + buildcc::env::m::CommandExpect_Execute(1, true, &compiler_version, nullptr); + buildcc::env::m::CommandExpect_Execute(1, true, &arch, nullptr); + + std::vector verified_toolchains = + gcc.Verify(config); + UT_PRINT(std::to_string(verified_toolchains.size()).c_str()); + CHECK_EQUAL(verified_toolchains.size(), 1); +} + int main(int ac, char **av) { buildcc::env::m::VectorStringCopier copier; mock().installCopier(TEST_VECTOR_STRING_TYPE, copier); From ffa64f1cf82655037e4d0e8815ed9e6ea3217be8 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 4 Jan 2022 07:35:46 -0800 Subject: [PATCH 7/7] Update toolchain_verify.cpp --- .../toolchain/src/api/toolchain_verify.cpp | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp index dceacdfd..289c13bf 100644 --- a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp +++ b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp @@ -252,17 +252,32 @@ ToolchainVerify::Verify(const VerifyToolchainConfig &config) { } if (config.update && !verified_toolchains.empty()) { + constexpr const char *os_executable_ext = + buildcc::env::get_os_executable_extension(); + buildcc::env::assert_fatal( + "OS not supported"); + verified_toolchain_ = verified_toolchains[0]; - t.asm_compiler_ = - (verified_toolchain_.path / t.asm_compiler_).make_preferred().string(); - t.c_compiler_ = - (verified_toolchain_.path / t.c_compiler_).make_preferred().string(); - t.cpp_compiler_ = - (verified_toolchain_.path / t.cpp_compiler_).make_preferred().string(); - t.archiver_ = - (verified_toolchain_.path / t.archiver_).make_preferred().string(); - t.linker_ = - (verified_toolchain_.path / t.linker_).make_preferred().string(); + 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(); } return verified_toolchains;