From 9a2f2d07b05c308168ff50720f7f82dbd6906981 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 22 Feb 2022 03:46:13 -0800 Subject: [PATCH 01/21] Shifted flag_api.h header to `toolchain` but implementation remains in `target` --- buildcc/lib/target/src/api/flag_api.cpp | 1 + .../target => toolchain/include/toolchain}/api/flag_api.h | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) rename buildcc/lib/{target/include/target => toolchain/include/toolchain}/api/flag_api.h (92%) diff --git a/buildcc/lib/target/src/api/flag_api.cpp b/buildcc/lib/target/src/api/flag_api.cpp index 856b46bb..fd20e541 100644 --- a/buildcc/lib/target/src/api/flag_api.cpp +++ b/buildcc/lib/target/src/api/flag_api.cpp @@ -77,5 +77,6 @@ template void FlagApi::AddLinkFlag(const std::string &flag) { } template class FlagApi; +template class FlagApi; } // namespace buildcc::internal diff --git a/buildcc/lib/target/include/target/api/flag_api.h b/buildcc/lib/toolchain/include/toolchain/api/flag_api.h similarity index 92% rename from buildcc/lib/target/include/target/api/flag_api.h rename to buildcc/lib/toolchain/include/toolchain/api/flag_api.h index a51ae94f..b62b78ba 100644 --- a/buildcc/lib/target/include/target/api/flag_api.h +++ b/buildcc/lib/toolchain/include/toolchain/api/flag_api.h @@ -14,16 +14,16 @@ * limitations under the License. */ -#ifndef TARGET_API_FLAG_API_H_ -#define TARGET_API_FLAG_API_H_ +#ifndef TOOLCHAIN_API_FLAG_API_H_ +#define TOOLCHAIN_API_FLAG_API_H_ #include namespace buildcc::internal { // Requires -// - TargetStorer -// - TargetState +// TargetSchema +// FunctionLock template class FlagApi { public: void AddPreprocessorFlag(const std::string &flag); From c4582236f63a7c3dc5478f5e8b816f465fc716d5 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 22 Feb 2022 03:46:30 -0800 Subject: [PATCH 02/21] Shifted function_lock to toolchain --- .../target => toolchain/include/toolchain}/common/function_lock.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename buildcc/lib/{target/include/target => toolchain/include/toolchain}/common/function_lock.h (100%) diff --git a/buildcc/lib/target/include/target/common/function_lock.h b/buildcc/lib/toolchain/include/toolchain/common/function_lock.h similarity index 100% rename from buildcc/lib/target/include/target/common/function_lock.h rename to buildcc/lib/toolchain/include/toolchain/common/function_lock.h From 29b8f00cdad128e1b819c094d1b2a56b6e10f363 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 22 Feb 2022 03:47:58 -0800 Subject: [PATCH 03/21] Updated toolchain.h with ToolchainSchema and FunctionLock for FlagApi --- .../lib/target/include/target/target_info.h | 1 - .../toolchain/include/toolchain/toolchain.h | 25 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/buildcc/lib/target/include/target/target_info.h b/buildcc/lib/target/include/target/target_info.h index 98115a51..6bc6ef94 100644 --- a/buildcc/lib/target/include/target/target_info.h +++ b/buildcc/lib/target/include/target/target_info.h @@ -21,7 +21,6 @@ #include "toolchain/toolchain.h" -#include "target/common/function_lock.h" #include "target/common/target_config.h" #include "target/common/target_env.h" #include "target/common/target_state.h" diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index dec04968..824af2a2 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -21,14 +21,29 @@ #include #include +#include "toolchain/common/function_lock.h" #include "toolchain/common/toolchain_config.h" +#include "toolchain/api/flag_api.h" #include "toolchain/api/toolchain_verify.h" namespace buildcc { +// TODO, Make this private +struct UserToolchainSchema { + std::unordered_set preprocessor_flags; + std::unordered_set common_compile_flags; + std::unordered_set pch_compile_flags; + std::unordered_set pch_object_flags; + std::unordered_set asm_compile_flags; + std::unordered_set c_compile_flags; + std::unordered_set cpp_compile_flags; + std::unordered_set link_flags; +}; + // Base toolchain class -class Toolchain : public ToolchainVerify { +class Toolchain : public internal::FlagApi, + public ToolchainVerify { public: enum class Id { Gcc = 0, ///< GCC Toolchain @@ -69,6 +84,8 @@ class Toolchain : public ToolchainVerify { virtual void UpdateConfig(ToolchainConfig &config) { (void)config; } private: + friend class internal::FlagApi; + friend class ToolchainVerify; private: @@ -79,8 +96,12 @@ class Toolchain : public ToolchainVerify { std::string cpp_compiler_; std::string archiver_; std::string linker_; - ToolchainConfig config_; + + // + UserToolchainSchema user_; + + FunctionLock lock_; }; typedef Toolchain::Id ToolchainId; From 3f1dc2780a6740b4846e3e55f6ae59dd48ae2e7e Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 22 Feb 2022 03:49:15 -0800 Subject: [PATCH 04/21] Updated TODO statements --- buildcc/lib/target/include/target/generator.h | 1 + buildcc/lib/target/include/target/target_info.h | 1 + 2 files changed, 2 insertions(+) diff --git a/buildcc/lib/target/include/target/generator.h b/buildcc/lib/target/include/target/generator.h index fe013450..74f9612a 100644 --- a/buildcc/lib/target/include/target/generator.h +++ b/buildcc/lib/target/include/target/generator.h @@ -39,6 +39,7 @@ namespace buildcc { +// TODO, Make this private struct UserGeneratorSchema : public internal::GeneratorSchema { fs_unordered_set inputs; }; diff --git a/buildcc/lib/target/include/target/target_info.h b/buildcc/lib/target/include/target/target_info.h index 6bc6ef94..b421874d 100644 --- a/buildcc/lib/target/include/target/target_info.h +++ b/buildcc/lib/target/include/target/target_info.h @@ -38,6 +38,7 @@ namespace buildcc { +// TODO, Make this private struct UserTargetSchema : public internal::TargetSchema { fs_unordered_set sources; fs_unordered_set headers; From 1eee2f8eb5e6941f389e932eb61511a1a9607a51 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 22 Feb 2022 21:28:35 -0800 Subject: [PATCH 05/21] Updated files with removed flag_api.h --- buildcc/lib/target/cmake/common_target_src.cmake | 1 - buildcc/lib/target/include/target/target_info.h | 1 - buildcc/lib/target/src/api/flag_api.cpp | 2 +- buildcc/lib/toolchain/CMakeLists.txt | 1 + 4 files changed, 2 insertions(+), 3 deletions(-) diff --git a/buildcc/lib/target/cmake/common_target_src.cmake b/buildcc/lib/target/cmake/common_target_src.cmake index 6f2bb771..fc14a040 100644 --- a/buildcc/lib/target/cmake/common_target_src.cmake +++ b/buildcc/lib/target/cmake/common_target_src.cmake @@ -23,7 +23,6 @@ set(COMMON_TARGET_SRCS include/target/api/include_api.h include/target/api/lib_api.h include/target/api/pch_api.h - include/target/api/flag_api.h include/target/api/deps_api.h src/api/sync_api.cpp diff --git a/buildcc/lib/target/include/target/target_info.h b/buildcc/lib/target/include/target/target_info.h index b421874d..7df1d119 100644 --- a/buildcc/lib/target/include/target/target_info.h +++ b/buildcc/lib/target/include/target/target_info.h @@ -26,7 +26,6 @@ #include "target/common/target_state.h" #include "target/api/deps_api.h" -#include "target/api/flag_api.h" #include "target/api/include_api.h" #include "target/api/lib_api.h" #include "target/api/pch_api.h" diff --git a/buildcc/lib/target/src/api/flag_api.cpp b/buildcc/lib/target/src/api/flag_api.cpp index fd20e541..82b0b6d1 100644 --- a/buildcc/lib/target/src/api/flag_api.cpp +++ b/buildcc/lib/target/src/api/flag_api.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "target/api/flag_api.h" +#include "toolchain/api/flag_api.h" #include "target/target_info.h" diff --git a/buildcc/lib/toolchain/CMakeLists.txt b/buildcc/lib/toolchain/CMakeLists.txt index 6d8252a3..4d05ae0e 100644 --- a/buildcc/lib/toolchain/CMakeLists.txt +++ b/buildcc/lib/toolchain/CMakeLists.txt @@ -9,6 +9,7 @@ set(TOOLCHAIN_SRCS # Features src/api/toolchain_verify.cpp include/toolchain/api/toolchain_verify.h + include/toolchain/api/flag_api.h ) if (${TESTING}) add_library(mock_toolchain From 2e5b4d44756130e10880f20b2d56fc3a141fa99d Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 14 Mar 2022 23:59:00 -0700 Subject: [PATCH 06/21] Update toolchain.h --- buildcc/lib/toolchain/include/toolchain/toolchain.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index 824af2a2..7c1dd415 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -68,6 +68,10 @@ class Toolchain : public internal::FlagApi, Toolchain(Toolchain &&toolchain) = default; Toolchain(const Toolchain &toolchain) = delete; + void Lock() { + lock_.Lock(); + // TODO, In the future add some more code here + } // Getters Id GetId() const { return id_; } @@ -78,6 +82,7 @@ class Toolchain : public internal::FlagApi, const std::string &GetArchiver() const { return archiver_; } const std::string &GetLinker() const { return linker_; } + const FunctionLock &GetLockInfo() const { return lock_; } const ToolchainConfig &GetConfig() const { return config_; } private: @@ -86,6 +91,9 @@ 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: From 2f81b18be4810fec16cff03b902d00f28bc7fd00 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 14 Mar 2022 23:59:26 -0700 Subject: [PATCH 07/21] Update target.h --- buildcc/lib/target/include/target/target.h | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/buildcc/lib/target/include/target/target.h b/buildcc/lib/target/include/target/target.h index ed72277f..adea83ed 100644 --- a/buildcc/lib/target/include/target/target.h +++ b/buildcc/lib/target/include/target/target.h @@ -140,22 +140,20 @@ class Target : public internal::BuilderInterface, std::string name_; TargetType type_; internal::TargetSerialization serialization_; - - // Friend classes internal::CompilePch compile_pch_; internal::CompileObject compile_object_; internal::LinkTarget link_target_; + // + TargetState state_; + env::Command command_; + tf::Taskflow tf_; + // Task states tf::Task target_start_task_; tf::Task target_end_task_; - std::mutex task_state_mutex_; env::TaskState task_state_{env::TaskState::SUCCESS}; - - // - env::Command command_; - tf::Taskflow tf_; }; typedef Target BaseTarget; From e1c84352ef4c813726d9e102c568f8b5e683c51d Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 15 Mar 2022 19:32:44 -0700 Subject: [PATCH 08/21] Removed TargetState from TargetInfo and added to target.h --- .../target/include/target/api/target_getter.h | 7 +++++++ .../include/target/api/target_info_getter.h | 5 ----- .../lib/target/include/target/target_info.h | 2 -- buildcc/lib/target/src/api/target_getter.cpp | 19 +++++++++++++++++++ .../lib/target/src/api/target_info_getter.cpp | 19 ------------------- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/buildcc/lib/target/include/target/api/target_getter.h b/buildcc/lib/target/include/target/api/target_getter.h index fc1da53f..3c8f0f88 100644 --- a/buildcc/lib/target/include/target/api/target_getter.h +++ b/buildcc/lib/target/include/target/api/target_getter.h @@ -24,6 +24,8 @@ #include "toolchain/toolchain.h" +#include "target/common/target_state.h" + #include "taskflow/taskflow.hpp" namespace fs = std::filesystem; @@ -32,6 +34,11 @@ namespace buildcc::internal { template class TargetGetter { public: + // Target State + const TargetState &GetState() const; + bool IsBuilt() const; + bool IsLocked() 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 bf912122..1bc939a7 100644 --- a/buildcc/lib/target/include/target/api/target_info_getter.h +++ b/buildcc/lib/target/include/target/api/target_info_getter.h @@ -31,11 +31,6 @@ namespace buildcc::internal { // - TargetConfig template class TargetInfoGetter { public: - // Target State - const TargetState &GetState() const; - bool IsBuilt() const; - bool IsLocked() const; - // Target Env const fs::path &GetTargetRootDir() const; const fs::path &GetTargetBuildDir() const; diff --git a/buildcc/lib/target/include/target/target_info.h b/buildcc/lib/target/include/target/target_info.h index 7df1d119..8642d869 100644 --- a/buildcc/lib/target/include/target/target_info.h +++ b/buildcc/lib/target/include/target/target_info.h @@ -23,7 +23,6 @@ #include "target/common/target_config.h" #include "target/common/target_env.h" -#include "target/common/target_state.h" #include "target/api/deps_api.h" #include "target/api/include_api.h" @@ -89,7 +88,6 @@ class TargetInfo : public internal::SourceApi, UserTargetSchema user_; FunctionLock lock_; - TargetState state_; }; typedef TargetInfo BaseTargetInfo; diff --git a/buildcc/lib/target/src/api/target_getter.cpp b/buildcc/lib/target/src/api/target_getter.cpp index 0c490c25..b5c45fd9 100644 --- a/buildcc/lib/target/src/api/target_getter.cpp +++ b/buildcc/lib/target/src/api/target_getter.cpp @@ -20,6 +20,25 @@ namespace buildcc::internal { +// Target State +template const TargetState &TargetGetter::GetState() const { + const T &t = static_cast(*this); + + return t.state_; +} + +template bool TargetGetter::IsBuilt() const { + const T &t = static_cast(*this); + + return t.state_.IsBuilt(); +} + +template bool TargetGetter::IsLocked() const { + const T &t = static_cast(*this); + + return t.lock_.IsLocked(); +} + template const fs::path &TargetGetter::GetBinaryPath() 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 7efdc88a..5d0a0085 100644 --- a/buildcc/lib/target/src/api/target_info_getter.cpp +++ b/buildcc/lib/target/src/api/target_info_getter.cpp @@ -20,25 +20,6 @@ namespace buildcc::internal { -// Target State -template const TargetState &TargetInfoGetter::GetState() const { - const T &t = static_cast(*this); - - return t.state_; -} - -template bool TargetInfoGetter::IsBuilt() const { - const T &t = static_cast(*this); - - return t.state_.IsBuilt(); -} - -template bool TargetInfoGetter::IsLocked() const { - const T &t = static_cast(*this); - - return t.lock_.IsLocked(); -} - // Target Env template const fs::path &TargetInfoGetter::GetTargetRootDir() const { From 31d3b03e431c0a199fdd60ac0f78f015bdc84a88 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 15 Mar 2022 20:01:23 -0700 Subject: [PATCH 09/21] Updated *_api header files --- buildcc/lib/target/include/target/api/deps_api.h | 1 - buildcc/lib/target/include/target/api/include_api.h | 1 - buildcc/lib/target/include/target/api/lib_api.h | 1 - buildcc/lib/target/include/target/api/pch_api.h | 1 - buildcc/lib/target/include/target/api/source_api.h | 1 - buildcc/lib/target/include/target/api/sync_api.h | 1 - buildcc/lib/target/include/target/api/target_info_getter.h | 1 - 7 files changed, 7 deletions(-) diff --git a/buildcc/lib/target/include/target/api/deps_api.h b/buildcc/lib/target/include/target/api/deps_api.h index 16ba7707..0e0c3e61 100644 --- a/buildcc/lib/target/include/target/api/deps_api.h +++ b/buildcc/lib/target/include/target/api/deps_api.h @@ -25,7 +25,6 @@ namespace buildcc::internal { // Requires // - TargetStorer -// - TargetState // - TargetEnv template class DepsApi { public: diff --git a/buildcc/lib/target/include/target/api/include_api.h b/buildcc/lib/target/include/target/api/include_api.h index 94307e81..1c98ab54 100644 --- a/buildcc/lib/target/include/target/api/include_api.h +++ b/buildcc/lib/target/include/target/api/include_api.h @@ -25,7 +25,6 @@ namespace buildcc::internal { // Requires // - TargetStorer -// - TargetState // - TargetConfig // - TargetEnv template class IncludeApi { diff --git a/buildcc/lib/target/include/target/api/lib_api.h b/buildcc/lib/target/include/target/api/lib_api.h index 834ec3e7..ecfa44cf 100644 --- a/buildcc/lib/target/include/target/api/lib_api.h +++ b/buildcc/lib/target/include/target/api/lib_api.h @@ -32,7 +32,6 @@ namespace buildcc::internal { // Requires // - TargetStorer -// - TargetState // - TargetEnv // T::GetTargetPath template class LibApi { diff --git a/buildcc/lib/target/include/target/api/pch_api.h b/buildcc/lib/target/include/target/api/pch_api.h index 0955ff95..42c53d7a 100644 --- a/buildcc/lib/target/include/target/api/pch_api.h +++ b/buildcc/lib/target/include/target/api/pch_api.h @@ -25,7 +25,6 @@ namespace buildcc::internal { // Requires // - TargetStorer -// - TargetState // - TargetConfig // - TargetEnv template class PchApi { diff --git a/buildcc/lib/target/include/target/api/source_api.h b/buildcc/lib/target/include/target/api/source_api.h index f90c2118..35bd6cd2 100644 --- a/buildcc/lib/target/include/target/api/source_api.h +++ b/buildcc/lib/target/include/target/api/source_api.h @@ -25,7 +25,6 @@ namespace buildcc::internal { // Requires // - TargetStorer -// - TargetState // - TargetConfig // - TargetEnv template class SourceApi { diff --git a/buildcc/lib/target/include/target/api/sync_api.h b/buildcc/lib/target/include/target/api/sync_api.h index 37910d67..c374caab 100644 --- a/buildcc/lib/target/include/target/api/sync_api.h +++ b/buildcc/lib/target/include/target/api/sync_api.h @@ -43,7 +43,6 @@ enum class SyncOption { // Requires // - TargetStorer -// - TargetState template class SyncApi { public: /** 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 1bc939a7..f8d4b08b 100644 --- a/buildcc/lib/target/include/target/api/target_info_getter.h +++ b/buildcc/lib/target/include/target/api/target_info_getter.h @@ -26,7 +26,6 @@ namespace buildcc::internal { // Requires // - TargetStorer -// - TargetState // - TargetEnv // - TargetConfig template class TargetInfoGetter { From fa205c0fc75b4863628a6c21f3c68875a01f03ac Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 15 Mar 2022 20:42:10 -0700 Subject: [PATCH 10/21] Updated unit tests for toolchain lock expectations --- buildcc/lib/args/test/test_persistent_storage.cpp | 6 ++++-- buildcc/lib/args/test/test_register.cpp | 7 +++++++ buildcc/lib/target/include/target/target_info.h | 6 ++++-- buildcc/lib/target/test/target/test_base_target.cpp | 6 ++++-- buildcc/lib/target/test/target/test_compile_object.cpp | 2 ++ .../lib/target/test/target/test_target_external_lib.cpp | 6 ++++-- .../lib/target/test/target/test_target_failure_states.cpp | 6 ++++-- buildcc/lib/target/test/target/test_target_flags.cpp | 6 ++++-- buildcc/lib/target/test/target/test_target_include_dir.cpp | 6 ++++-- buildcc/lib/target/test/target/test_target_lib_dep.cpp | 6 ++++-- buildcc/lib/target/test/target/test_target_lock.cpp | 6 ++++-- buildcc/lib/target/test/target/test_target_pch.cpp | 6 ++++-- buildcc/lib/target/test/target/test_target_source.cpp | 6 ++++-- .../target/test/target/test_target_source_out_of_root.cpp | 6 ++++-- buildcc/lib/target/test/target/test_target_sync.cpp | 6 ++++-- buildcc/lib/target/test/target/test_target_user_deps.cpp | 6 ++++-- 16 files changed, 65 insertions(+), 28 deletions(-) diff --git a/buildcc/lib/args/test/test_persistent_storage.cpp b/buildcc/lib/args/test/test_persistent_storage.cpp index 16079c4e..3bee0a7e 100644 --- a/buildcc/lib/args/test/test_persistent_storage.cpp +++ b/buildcc/lib/args/test/test_persistent_storage.cpp @@ -16,8 +16,8 @@ TEST_GROUP(PersistentStorageTestGroup) }; // clang-format on -buildcc::BaseToolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", - "ar", "ld"); +static buildcc::BaseToolchain gcc(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); TEST(PersistentStorageTestGroup, BasicUsage) { buildcc::PersistentStorage persistent; @@ -56,5 +56,7 @@ TEST(PersistentStorageTestGroup, NullptrDelete) { int main(int ac, char **av) { buildcc::env::init(fs::current_path(), fs::current_path()); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/args/test/test_register.cpp b/buildcc/lib/args/test/test_register.cpp index 62e4ad38..058f8e21 100644 --- a/buildcc/lib/args/test/test_register.cpp +++ b/buildcc/lib/args/test/test_register.cpp @@ -102,6 +102,7 @@ TEST(RegisterTestGroup, Register_Build) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); + toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); @@ -150,6 +151,7 @@ TEST(RegisterTestGroup, Register_NoBuildAndDep) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); + toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, @@ -234,6 +236,7 @@ TEST(RegisterTestGroup, Register_BuildAndDep) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); + toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, @@ -329,6 +332,7 @@ TEST(RegisterTestGroup, Register_DepDuplicate) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); + toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, @@ -405,6 +409,7 @@ TEST(RegisterTestGroup, Register_DepCyclic) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); + toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, @@ -481,6 +486,7 @@ TEST(RegisterTestGroup, Register_Test) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); + toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, @@ -566,6 +572,7 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); + toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, diff --git a/buildcc/lib/target/include/target/target_info.h b/buildcc/lib/target/include/target/target_info.h index 8642d869..8271bdcd 100644 --- a/buildcc/lib/target/include/target/target_info.h +++ b/buildcc/lib/target/include/target/target_info.h @@ -63,7 +63,9 @@ class TargetInfo : public internal::SourceApi, public: TargetInfo(const BaseToolchain &toolchain, const TargetEnv &env, const TargetConfig &config = TargetConfig()) - : toolchain_(toolchain), env_(env), config_(config) {} + : toolchain_(toolchain), env_(env), config_(config) { + toolchain_.GetLockInfo().ExpectsLock(__FUNCTION__); + } private: // Inputs @@ -85,8 +87,8 @@ class TargetInfo : public internal::SourceApi, TargetEnv env_; TargetConfig config_; + // UserTargetSchema user_; - FunctionLock lock_; }; diff --git a/buildcc/lib/target/test/target/test_base_target.cpp b/buildcc/lib/target/test/target/test_base_target.cpp index 582f1a8e..c1491f13 100644 --- a/buildcc/lib/target/test/target/test_base_target.cpp +++ b/buildcc/lib/target/test/target/test_base_target.cpp @@ -21,8 +21,8 @@ TEST_GROUP(TargetBaseTestGroup) } }; // clang-format on -static const buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", - "gcc", "g++", "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); TEST(TargetBaseTestGroup, InvalidTargetType) { constexpr const char *const INVALID_NAME = "Invalid.random"; @@ -101,5 +101,7 @@ TEST(TargetBaseTestGroup, TargetConfig_BadLinkCommand) { int main(int ac, char **av) { MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_compile_object.cpp b/buildcc/lib/target/test/target/test_compile_object.cpp index 0284b395..6e218c0d 100644 --- a/buildcc/lib/target/test/target/test_compile_object.cpp +++ b/buildcc/lib/target/test/target/test_compile_object.cpp @@ -33,5 +33,7 @@ int main(int ac, char **av) { buildcc::env::init(fs::current_path(), fs::current_path() / "intermediate" / "target_compile_object"); fs::remove_all(buildcc::env::get_project_build_dir()); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 7e12128e..e2d72cf0 100644 --- a/buildcc/lib/target/test/target/test_target_external_lib.cpp +++ b/buildcc/lib/target/test/target/test_target_external_lib.cpp @@ -27,8 +27,8 @@ TEST_GROUP(TargetTestExternalLib) }; // clang-format on -static const buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", - "gcc", "g++", "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); static const fs::path intermediate_path = fs::path(BUILD_TARGET_EXTERNAL_LIB_INTERMEDIATE_DIR) / gcc.GetName(); @@ -143,5 +143,7 @@ TEST(TargetTestExternalLib, TestAddExternalLibDep_RebuildChanged) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_EXTERNAL_LIB_INTERMEDIATE_DIR); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 bfe00ed9..e170e7ef 100644 --- a/buildcc/lib/target/test/target/test_target_failure_states.cpp +++ b/buildcc/lib/target/test/target/test_target_failure_states.cpp @@ -25,8 +25,8 @@ TEST_GROUP(TargetTestFailureStates) }; // clang-format on -buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", - "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); TEST(TargetTestFailureStates, StartTaskEnvFailure) { buildcc::env::set_task_state(buildcc::env::TaskState::FAILURE); @@ -297,5 +297,7 @@ int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_FAILURE_STATES_BUILD_DIR); fs::remove_all(buildcc::env::get_project_build_dir()); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_target_flags.cpp b/buildcc/lib/target/test/target/test_target_flags.cpp index 087dab6f..a7337ad2 100644 --- a/buildcc/lib/target/test/target/test_target_flags.cpp +++ b/buildcc/lib/target/test/target/test_target_flags.cpp @@ -21,8 +21,8 @@ // Constants -static const buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", - "gcc", "g++", "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); // ------------- PREPROCESSOR FLAGS --------------- @@ -647,5 +647,7 @@ TEST(TargetTestLinkFlagsGroup, Target_ChangedLinkFlag) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_FLAG_INTERMEDIATE_DIR); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 323a6935..c4863e71 100644 --- a/buildcc/lib/target/test/target/test_target_include_dir.cpp +++ b/buildcc/lib/target/test/target/test_target_include_dir.cpp @@ -26,8 +26,8 @@ TEST_GROUP(TargetTestIncludeDirGroup) }; // clang-format on -static const buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", - "gcc", "g++", "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); static const fs::path target_include_dir_intermediate_path = fs::path(BUILD_TARGET_INCLUDE_DIR_INTERMEDIATE_DIR) / gcc.GetName(); @@ -323,5 +323,7 @@ TEST(TargetTestIncludeDirGroup, TargetBuildHeaderFile) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_INCLUDE_DIR_INTERMEDIATE_DIR); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 a5cbda68..dc728128 100644 --- a/buildcc/lib/target/test/target/test_target_lib_dep.cpp +++ b/buildcc/lib/target/test/target/test_target_lib_dep.cpp @@ -30,8 +30,8 @@ TEST_GROUP(TargetTestLibDep) }; // clang-format on -static const buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", - "gcc", "g++", "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); static const fs::path intermediate_path = fs::path(BUILD_TARGET_LIB_DEP_INTERMEDIATE_DIR) / gcc.GetName(); @@ -257,5 +257,7 @@ TEST(TargetTestLibDep, TargetDep_UpdateExistingLibraryTest) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_LIB_DEP_INTERMEDIATE_DIR); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_target_lock.cpp b/buildcc/lib/target/test/target/test_target_lock.cpp index 944e5b10..b0b3d77b 100644 --- a/buildcc/lib/target/test/target/test_target_lock.cpp +++ b/buildcc/lib/target/test/target/test_target_lock.cpp @@ -25,8 +25,8 @@ TEST_GROUP(TargetTestLock) }; // clang-format on -static const buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", - "gcc", "g++", "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); TEST(TargetTestLock, LockState) { constexpr const char *const NAME = "LockState.exe"; @@ -120,5 +120,7 @@ int main(int ac, char **av) { fs::remove_all(target_source_intermediate_path); buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_LOCK_INTERMEDIATE_DIR); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_target_pch.cpp b/buildcc/lib/target/test/target/test_target_pch.cpp index fcfc3653..8ad6605b 100644 --- a/buildcc/lib/target/test/target/test_target_pch.cpp +++ b/buildcc/lib/target/test/target/test_target_pch.cpp @@ -30,8 +30,8 @@ TEST_GROUP(TargetPchTestGroup) }; // clang-format on -static const buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", - "gcc", "g++", "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); TEST(TargetPchTestGroup, Target_AddPch) { constexpr const char *const NAME = "AddPch.exe"; @@ -291,5 +291,7 @@ int main(int ac, char **av) { fs::remove_all(target_source_intermediate_path); buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_PCH_INTERMEDIATE_DIR); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_target_source.cpp b/buildcc/lib/target/test/target/test_target_source.cpp index 45ed348f..1fb06356 100644 --- a/buildcc/lib/target/test/target/test_target_source.cpp +++ b/buildcc/lib/target/test/target/test_target_source.cpp @@ -27,8 +27,8 @@ TEST_GROUP(TargetTestSourceGroup) }; // clang-format on -static const buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", - "gcc", "g++", "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); static const fs::path target_source_intermediate_path = fs::path(BUILD_TARGET_SOURCE_INTERMEDIATE_DIR) / gcc.GetName(); @@ -247,5 +247,7 @@ TEST(TargetTestSourceGroup, Target_CompileCommand_Throws) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_SOURCE_INTERMEDIATE_DIR); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 e2155224..c4d26409 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,8 +26,8 @@ TEST_GROUP(TargetTestSourceOutOfRootGroup) }; // clang-format on -static const buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", - "gcc", "g++", "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); static const fs::path target_source_intermediate_path = fs::path(BUILD_TARGET_SOURCE_OUT_OF_ROOT_INTERMEDIATE_DIR) / gcc.GetName(); @@ -89,5 +89,7 @@ int main(int ac, char **av) { "random dir"); buildcc::env::init(fs::path(BUILD_SCRIPT_SOURCE) / "data" / "random dir", BUILD_TARGET_SOURCE_OUT_OF_ROOT_INTERMEDIATE_DIR); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_target_sync.cpp b/buildcc/lib/target/test/target/test_target_sync.cpp index 9bceb565..6088ad61 100644 --- a/buildcc/lib/target/test/target/test_target_sync.cpp +++ b/buildcc/lib/target/test/target/test_target_sync.cpp @@ -19,8 +19,8 @@ TEST_GROUP(TargetTestSyncGroup) }; // clang-format on -buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", - "ar", "ldd"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ldd"); TEST(TargetTestSyncGroup, CopyByConstRef) { buildcc::BaseTarget srcTarget("srcTarget", buildcc::TargetType::Executable, @@ -319,5 +319,7 @@ TEST(TargetTestSyncGroup, InsertCrash) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_SYNC_INTERMEDIATE_DIR); fs::remove_all(buildcc::env::get_project_build_dir()); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 8af6c4f0..e2516466 100644 --- a/buildcc/lib/target/test/target/test_target_user_deps.cpp +++ b/buildcc/lib/target/test/target/test_target_user_deps.cpp @@ -27,8 +27,8 @@ TEST_GROUP(TargetTestUserDepsGroup) }; // clang-format on -static const buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", - "gcc", "g++", "ar", "ld"); +static buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); static const fs::path target_source_intermediate_path = fs::path(BUILD_TARGET_USER_DEPS_INTERMEDIATE_DIR) / gcc.GetName(); @@ -144,5 +144,7 @@ int main(int ac, char **av) { fs::remove_all(target_source_intermediate_path); buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_USER_DEPS_INTERMEDIATE_DIR); + + gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } From 6e714fc47210fca05d1dafd1e890d990c0816cc2 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Tue, 15 Mar 2022 21:31:07 -0700 Subject: [PATCH 11/21] Updated flag_api.h with getter apis --- .../include/target/api/target_info_getter.h | 9 +-- buildcc/lib/target/src/api/flag_api.cpp | 43 +++++++++++++ .../lib/target/src/api/target_info_getter.cpp | 64 ------------------- .../include/toolchain/api/flag_api.h | 11 ++++ 4 files changed, 55 insertions(+), 72 deletions(-) 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 f8d4b08b..1640c19c 100644 --- a/buildcc/lib/target/include/target/api/target_info_getter.h +++ b/buildcc/lib/target/include/target/api/target_info_getter.h @@ -45,14 +45,7 @@ template class TargetInfoGetter { const std::vector &GetExternalLibDeps() const; const fs_unordered_set &GetIncludeDirs() const; const fs_unordered_set &GetLibDirs() const; - const std::unordered_set &GetPreprocessorFlags() const; - const std::unordered_set &GetCommonCompileFlags() const; - const std::unordered_set &GetPchCompileFlags() const; - const std::unordered_set &GetPchObjectFlags() const; - const std::unordered_set &GetAsmCompileFlags() const; - const std::unordered_set &GetCCompileFlags() const; - const std::unordered_set &GetCppCompileFlags() const; - const std::unordered_set &GetLinkFlags() const; + const fs_unordered_set &GetCompileDependencies() const; const fs_unordered_set &GetLinkDependencies() const; }; diff --git a/buildcc/lib/target/src/api/flag_api.cpp b/buildcc/lib/target/src/api/flag_api.cpp index 82b0b6d1..a7535250 100644 --- a/buildcc/lib/target/src/api/flag_api.cpp +++ b/buildcc/lib/target/src/api/flag_api.cpp @@ -76,6 +76,49 @@ template void FlagApi::AddLinkFlag(const std::string &flag) { t.user_.link_flags.insert(flag); } +template +const std::unordered_set & +FlagApi::GetPreprocessorFlags() const { + const T &t = static_cast(*this); + return t.user_.preprocessor_flags; +} +template +const std::unordered_set & +FlagApi::GetCommonCompileFlags() const { + const T &t = static_cast(*this); + return t.user_.common_compile_flags; +} +template +const std::unordered_set &FlagApi::GetPchCompileFlags() const { + const T &t = static_cast(*this); + return t.user_.pch_compile_flags; +} +template +const std::unordered_set &FlagApi::GetPchObjectFlags() const { + const T &t = static_cast(*this); + return t.user_.pch_object_flags; +} +template +const std::unordered_set &FlagApi::GetAsmCompileFlags() const { + const T &t = static_cast(*this); + return t.user_.asm_compile_flags; +} +template +const std::unordered_set &FlagApi::GetCCompileFlags() const { + const T &t = static_cast(*this); + return t.user_.c_compile_flags; +} +template +const std::unordered_set &FlagApi::GetCppCompileFlags() const { + const T &t = static_cast(*this); + return t.user_.cpp_compile_flags; +} +template +const std::unordered_set &FlagApi::GetLinkFlags() const { + const T &t = static_cast(*this); + return t.user_.link_flags; +} + template class FlagApi; template class FlagApi; diff --git a/buildcc/lib/target/src/api/target_info_getter.cpp b/buildcc/lib/target/src/api/target_info_getter.cpp index 5d0a0085..75c0d28b 100644 --- a/buildcc/lib/target/src/api/target_info_getter.cpp +++ b/buildcc/lib/target/src/api/target_info_getter.cpp @@ -94,70 +94,6 @@ const fs_unordered_set &TargetInfoGetter::GetLibDirs() const { return t.user_.lib_dirs; } -template -const std::unordered_set & -TargetInfoGetter::GetPreprocessorFlags() const { - const T &t = static_cast(*this); - - return t.user_.preprocessor_flags; -} - -template -const std::unordered_set & -TargetInfoGetter::GetCommonCompileFlags() const { - const T &t = static_cast(*this); - - return t.user_.common_compile_flags; -} - -template -const std::unordered_set & -TargetInfoGetter::GetPchCompileFlags() const { - const T &t = static_cast(*this); - - return t.user_.pch_compile_flags; -} - -template -const std::unordered_set & -TargetInfoGetter::GetPchObjectFlags() const { - const T &t = static_cast(*this); - - return t.user_.pch_object_flags; -} - -template -const std::unordered_set & -TargetInfoGetter::GetAsmCompileFlags() const { - const T &t = static_cast(*this); - - return t.user_.asm_compile_flags; -} - -template -const std::unordered_set & -TargetInfoGetter::GetCCompileFlags() const { - const T &t = static_cast(*this); - - return t.user_.c_compile_flags; -} - -template -const std::unordered_set & -TargetInfoGetter::GetCppCompileFlags() const { - const T &t = static_cast(*this); - - return t.user_.cpp_compile_flags; -} - -template -const std::unordered_set & -TargetInfoGetter::GetLinkFlags() const { - const T &t = static_cast(*this); - - return t.user_.link_flags; -} - template const fs_unordered_set &TargetInfoGetter::GetCompileDependencies() const { const T &t = static_cast(*this); diff --git a/buildcc/lib/toolchain/include/toolchain/api/flag_api.h b/buildcc/lib/toolchain/include/toolchain/api/flag_api.h index b62b78ba..2fb283ba 100644 --- a/buildcc/lib/toolchain/include/toolchain/api/flag_api.h +++ b/buildcc/lib/toolchain/include/toolchain/api/flag_api.h @@ -18,6 +18,7 @@ #define TOOLCHAIN_API_FLAG_API_H_ #include +#include namespace buildcc::internal { @@ -34,6 +35,16 @@ template class FlagApi { void AddCCompileFlag(const std::string &flag); void AddCppCompileFlag(const std::string &flag); void AddLinkFlag(const std::string &flag); + + // Getters + const std::unordered_set &GetPreprocessorFlags() const; + const std::unordered_set &GetCommonCompileFlags() const; + const std::unordered_set &GetPchCompileFlags() const; + const std::unordered_set &GetPchObjectFlags() const; + const std::unordered_set &GetAsmCompileFlags() const; + const std::unordered_set &GetCCompileFlags() const; + const std::unordered_set &GetCppCompileFlags() const; + const std::unordered_set &GetLinkFlags() const; }; } // namespace buildcc::internal From 6c54266615ed536436c5ecf94fdb4f4ed1ea98f7 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 01:31:01 -0700 Subject: [PATCH 12/21] Added test case of toolchain_flag_api --- .../lib/target/cmake/common_target_src.cmake | 5 +- .../lib/target/include/target/target_info.h | 5 +- .../target/src/target_info/target_info.cpp | 27 +++++++ buildcc/lib/target/test/target/CMakeLists.txt | 9 +++ .../test/target/test_toolchain_flag_api.cpp | 75 +++++++++++++++++++ .../toolchain/include/toolchain/toolchain.h | 1 - 6 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 buildcc/lib/target/src/target_info/target_info.cpp create mode 100644 buildcc/lib/target/test/target/test_toolchain_flag_api.cpp diff --git a/buildcc/lib/target/cmake/common_target_src.cmake b/buildcc/lib/target/cmake/common_target_src.cmake index fc14a040..76564d86 100644 --- a/buildcc/lib/target/cmake/common_target_src.cmake +++ b/buildcc/lib/target/cmake/common_target_src.cmake @@ -37,6 +37,10 @@ set(COMMON_TARGET_SRCS src/generator/generator.cpp include/target/generator.h + # Target Info + src/target_info/target_info.cpp + include/target/target_info.h + # Target friend src/target/friend/compile_pch.cpp src/target/friend/compile_object.cpp @@ -48,6 +52,5 @@ set(COMMON_TARGET_SRCS # Target src/target/target.cpp src/target/build.cpp - include/target/target_info.h include/target/target.h ) diff --git a/buildcc/lib/target/include/target/target_info.h b/buildcc/lib/target/include/target/target_info.h index 8271bdcd..0b85bac2 100644 --- a/buildcc/lib/target/include/target/target_info.h +++ b/buildcc/lib/target/include/target/target_info.h @@ -64,7 +64,7 @@ class TargetInfo : public internal::SourceApi, TargetInfo(const BaseToolchain &toolchain, const TargetEnv &env, const TargetConfig &config = TargetConfig()) : toolchain_(toolchain), env_(env), config_(config) { - toolchain_.GetLockInfo().ExpectsLock(__FUNCTION__); + Initialize(); } private: @@ -90,6 +90,9 @@ class TargetInfo : public internal::SourceApi, // UserTargetSchema user_; FunctionLock lock_; + +private: + void Initialize(); }; typedef TargetInfo BaseTargetInfo; diff --git a/buildcc/lib/target/src/target_info/target_info.cpp b/buildcc/lib/target/src/target_info/target_info.cpp new file mode 100644 index 00000000..f3d0aff3 --- /dev/null +++ b/buildcc/lib/target/src/target_info/target_info.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2021-2022 Niket Naidu. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "target/target_info.h" + +namespace buildcc { + +// PRIVATE + +void TargetInfo::Initialize() { + toolchain_.GetLockInfo().ExpectsLock(__FUNCTION__); +} + +} // namespace buildcc diff --git a/buildcc/lib/target/test/target/CMakeLists.txt b/buildcc/lib/target/test/target/CMakeLists.txt index 83d29bbe..44acb230 100644 --- a/buildcc/lib/target/test/target/CMakeLists.txt +++ b/buildcc/lib/target/test/target/CMakeLists.txt @@ -8,6 +8,15 @@ target_link_libraries(target_interface INTERFACE mock_target ) +# Toolchain + +add_executable(test_toolchain_flag_api + test_toolchain_flag_api.cpp +) +target_link_libraries(test_toolchain_flag_api PRIVATE target_interface) + +add_test(NAME test_toolchain_flag_api COMMAND test_toolchain_flag_api) + # Interfaces add_executable(test_builder_interface test_builder_interface.cpp diff --git a/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp b/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp new file mode 100644 index 00000000..c9b0cb08 --- /dev/null +++ b/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp @@ -0,0 +1,75 @@ +#include "toolchain/toolchain.h" + +#include "target/target_info.h" + +// NOTE, Make sure all these includes are AFTER the system and header includes +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/MemoryLeakDetectorNewMacros.h" +#include "CppUTest/TestHarness.h" +#include "CppUTest/Utest.h" + +// clang-format off +TEST_GROUP(ToolchainFlagApiTestGroup) +{ +}; +// clang-format on + +TEST(ToolchainFlagApiTestGroup, BasicToolchainTest) { + buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); + toolchain.AddPreprocessorFlag("-preprocessor"); + toolchain.AddAsmCompileFlag("-asm"); + toolchain.AddPchCompileFlag("-pchcompile"); + toolchain.AddPchObjectFlag("-pchobject"); + toolchain.AddCommonCompileFlag("-common"); + toolchain.AddCCompileFlag("-c"); + toolchain.AddCppCompileFlag("-cpp"); + toolchain.AddLinkFlag("-link"); + CHECK_FALSE(toolchain.GetLockInfo().IsLocked()); + toolchain.Lock(); + CHECK_TRUE(toolchain.GetLockInfo().IsLocked()); + + CHECK_EQUAL(toolchain.GetPreprocessorFlags().size(), 1); + CHECK_EQUAL(toolchain.GetAsmCompileFlags().size(), 1); + CHECK_EQUAL(toolchain.GetPchCompileFlags().size(), 1); + CHECK_EQUAL(toolchain.GetPchObjectFlags().size(), 1); + CHECK_EQUAL(toolchain.GetCommonCompileFlags().size(), 1); + CHECK_EQUAL(toolchain.GetCCompileFlags().size(), 1); + CHECK_EQUAL(toolchain.GetCppCompileFlags().size(), 1); + CHECK_EQUAL(toolchain.GetLinkFlags().size(), 1); +} + +TEST(ToolchainFlagApiTestGroup, BasicTargetTest) { + buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld"); + + toolchain.AddPreprocessorFlag("-preprocessor"); + toolchain.AddAsmCompileFlag("-asm"); + toolchain.AddPchCompileFlag("-pchcompile"); + toolchain.AddPchObjectFlag("-pchobject"); + toolchain.AddCommonCompileFlag("-common"); + toolchain.AddCCompileFlag("-c"); + toolchain.AddCppCompileFlag("-cpp"); + toolchain.AddLinkFlag("-link"); + + CHECK_FALSE(toolchain.GetLockInfo().IsLocked()); + { CHECK_THROWS(std::exception, (buildcc::TargetInfo(toolchain, ""))); } + + toolchain.Lock(); + CHECK_TRUE(toolchain.GetLockInfo().IsLocked()); + { + buildcc::TargetInfo targetinfo(toolchain, ""); + // CHECK_EQUAL(targetinfo.GetPreprocessorFlags().size(), 1); + // CHECK_EQUAL(targetinfo.GetAsmCompileFlags().size(), 1); + // CHECK_EQUAL(targetinfo.GetPchCompileFlags().size(), 1); + // CHECK_EQUAL(targetinfo.GetPchObjectFlags().size(), 1); + // CHECK_EQUAL(targetinfo.GetCommonCompileFlags().size(), 1); + // CHECK_EQUAL(targetinfo.GetCCompileFlags().size(), 1); + // CHECK_EQUAL(targetinfo.GetCppCompileFlags().size(), 1); + // CHECK_EQUAL(targetinfo.GetLinkFlags().size(), 1); + } +} + +int main(int ac, char **av) { + return CommandLineTestRunner::RunAllTests(ac, av); +} diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index 7c1dd415..56dfa53d 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -108,7 +108,6 @@ class Toolchain : public internal::FlagApi, // UserToolchainSchema user_; - FunctionLock lock_; }; From 96596972e038d8538852c96e442270d54b80d082 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 01:40:52 -0700 Subject: [PATCH 13/21] Updated toolchain flag api test and target_info initialize API --- .../target/src/target_info/target_info.cpp | 25 +++++++++++++++++++ .../test/target/test_toolchain_flag_api.cpp | 16 ++++++------ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/buildcc/lib/target/src/target_info/target_info.cpp b/buildcc/lib/target/src/target_info/target_info.cpp index f3d0aff3..ca67827a 100644 --- a/buildcc/lib/target/src/target_info/target_info.cpp +++ b/buildcc/lib/target/src/target_info/target_info.cpp @@ -22,6 +22,31 @@ namespace buildcc { void TargetInfo::Initialize() { toolchain_.GetLockInfo().ExpectsLock(__FUNCTION__); + + std::for_each(toolchain_.GetPreprocessorFlags().begin(), + toolchain_.GetPreprocessorFlags().end(), + [&](const std::string &flag) { AddPreprocessorFlag(flag); }); + std::for_each(toolchain_.GetCommonCompileFlags().begin(), + toolchain_.GetCommonCompileFlags().end(), + [&](const std::string &flag) { AddCommonCompileFlag(flag); }); + std::for_each(toolchain_.GetPchCompileFlags().begin(), + toolchain_.GetPchCompileFlags().end(), + [&](const std::string &flag) { AddPchCompileFlag(flag); }); + std::for_each(toolchain_.GetPchObjectFlags().begin(), + toolchain_.GetPchObjectFlags().end(), + [&](const std::string &flag) { AddPchObjectFlag(flag); }); + std::for_each(toolchain_.GetAsmCompileFlags().begin(), + toolchain_.GetAsmCompileFlags().end(), + [&](const std::string &flag) { AddAsmCompileFlag(flag); }); + std::for_each(toolchain_.GetCCompileFlags().begin(), + toolchain_.GetCCompileFlags().end(), + [&](const std::string &flag) { AddCCompileFlag(flag); }); + std::for_each(toolchain_.GetCppCompileFlags().begin(), + toolchain_.GetCppCompileFlags().end(), + [&](const std::string &flag) { AddCppCompileFlag(flag); }); + std::for_each(toolchain_.GetLinkFlags().begin(), + toolchain_.GetLinkFlags().end(), + [&](const std::string &flag) { AddLinkFlag(flag); }); } } // namespace buildcc diff --git a/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp b/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp index c9b0cb08..b5efcdf4 100644 --- a/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp +++ b/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp @@ -59,14 +59,14 @@ TEST(ToolchainFlagApiTestGroup, BasicTargetTest) { CHECK_TRUE(toolchain.GetLockInfo().IsLocked()); { buildcc::TargetInfo targetinfo(toolchain, ""); - // CHECK_EQUAL(targetinfo.GetPreprocessorFlags().size(), 1); - // CHECK_EQUAL(targetinfo.GetAsmCompileFlags().size(), 1); - // CHECK_EQUAL(targetinfo.GetPchCompileFlags().size(), 1); - // CHECK_EQUAL(targetinfo.GetPchObjectFlags().size(), 1); - // CHECK_EQUAL(targetinfo.GetCommonCompileFlags().size(), 1); - // CHECK_EQUAL(targetinfo.GetCCompileFlags().size(), 1); - // CHECK_EQUAL(targetinfo.GetCppCompileFlags().size(), 1); - // CHECK_EQUAL(targetinfo.GetLinkFlags().size(), 1); + CHECK_EQUAL(targetinfo.GetPreprocessorFlags().size(), 1); + CHECK_EQUAL(targetinfo.GetAsmCompileFlags().size(), 1); + CHECK_EQUAL(targetinfo.GetPchCompileFlags().size(), 1); + CHECK_EQUAL(targetinfo.GetPchObjectFlags().size(), 1); + CHECK_EQUAL(targetinfo.GetCommonCompileFlags().size(), 1); + CHECK_EQUAL(targetinfo.GetCCompileFlags().size(), 1); + CHECK_EQUAL(targetinfo.GetCppCompileFlags().size(), 1); + CHECK_EQUAL(targetinfo.GetLinkFlags().size(), 1); } } From 69581be82fb830f9a16c757819f81a3c73420a5f Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 02:06:19 -0700 Subject: [PATCH 14/21] Updated bootstrap files --- bootstrap/main.buildcc.cpp | 2 ++ bootstrap/src/build_buildcc.cpp | 1 + buildcc/lib/target/src/target_info/target_info.cpp | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/bootstrap/main.buildcc.cpp b/bootstrap/main.buildcc.cpp index 8ec1d5a7..215ddc3f 100644 --- a/bootstrap/main.buildcc.cpp +++ b/bootstrap/main.buildcc.cpp @@ -42,6 +42,8 @@ int main(int argc, char **argv) { reg.Clean(clean_cb); BaseToolchain toolchain = custom_toolchain_arg.ConstructToolchain(); + // TODO, Add toolchain specific flags here + toolchain.Lock(); BuildBuildCC buildcc( reg, toolchain, diff --git a/bootstrap/src/build_buildcc.cpp b/bootstrap/src/build_buildcc.cpp index 70765e9d..82fd6aac 100644 --- a/bootstrap/src/build_buildcc.cpp +++ b/bootstrap/src/build_buildcc.cpp @@ -72,6 +72,7 @@ void buildcc_cb(BaseTarget &target, const BaseGenerator &schema_gen, target.GlobSources("lib/target/src/common"); target.GlobSources("lib/target/src/generator"); target.GlobSources("lib/target/src/api"); + target.GlobSources("lib/target/src/target_info"); target.GlobSources("lib/target/src/target"); target.GlobSources("lib/target/src/target/friend"); diff --git a/buildcc/lib/target/src/target_info/target_info.cpp b/buildcc/lib/target/src/target_info/target_info.cpp index ca67827a..34dec92f 100644 --- a/buildcc/lib/target/src/target_info/target_info.cpp +++ b/buildcc/lib/target/src/target_info/target_info.cpp @@ -21,7 +21,7 @@ namespace buildcc { // PRIVATE void TargetInfo::Initialize() { - toolchain_.GetLockInfo().ExpectsLock(__FUNCTION__); + toolchain_.GetLockInfo().ExpectsLock("TargetInfo with Toolchain"); std::for_each(toolchain_.GetPreprocessorFlags().begin(), toolchain_.GetPreprocessorFlags().end(), From 3744dae217eb7f1f2fd0eca47613786350c07568 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 02:06:25 -0700 Subject: [PATCH 15/21] Update function_lock.h --- buildcc/lib/toolchain/include/toolchain/common/function_lock.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildcc/lib/toolchain/include/toolchain/common/function_lock.h b/buildcc/lib/toolchain/include/toolchain/common/function_lock.h index 3f15bddf..9eff7e6c 100644 --- a/buildcc/lib/toolchain/include/toolchain/common/function_lock.h +++ b/buildcc/lib/toolchain/include/toolchain/common/function_lock.h @@ -30,10 +30,12 @@ class FunctionLock { void Lock() { lock_ = true; } void Unlock() { lock_ = false; } bool IsLocked() const { return lock_; } + // TODO, Make this better void ExpectsUnlock(std::string_view tag) const { env::assert_fatal(!lock_, fmt::format("Cannot use {} when lock == true", tag)); } + // TODO, Make this better void ExpectsLock(std::string_view tag) const { env::assert_fatal(lock_, fmt::format("Cannot use {} when lock == false", tag)); From d4f7f793674ad1bc54f9a9da6b10f18adc5ecfb8 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 18:31:40 -0700 Subject: [PATCH 16/21] Update tests --- .../lib/args/test/test_persistent_storage.cpp | 2 -- buildcc/lib/args/test/test_register.cpp | 7 ------- .../target/test/target/test_base_target.cpp | 2 -- .../target/test/target/test_compile_object.cpp | 2 -- .../test/target/test_target_external_lib.cpp | 2 -- .../test/target/test_target_failure_states.cpp | 2 -- .../target/test/target/test_target_flags.cpp | 2 -- .../test/target/test_target_include_dir.cpp | 2 -- .../target/test/target/test_target_lib_dep.cpp | 2 -- .../target/test/target/test_target_lock.cpp | 2 -- .../lib/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 -- .../test/target/test_toolchain_flag_api.cpp | 18 ++++++++++++++++-- 16 files changed, 16 insertions(+), 37 deletions(-) diff --git a/buildcc/lib/args/test/test_persistent_storage.cpp b/buildcc/lib/args/test/test_persistent_storage.cpp index 3bee0a7e..97cc167a 100644 --- a/buildcc/lib/args/test/test_persistent_storage.cpp +++ b/buildcc/lib/args/test/test_persistent_storage.cpp @@ -56,7 +56,5 @@ TEST(PersistentStorageTestGroup, NullptrDelete) { int main(int ac, char **av) { buildcc::env::init(fs::current_path(), fs::current_path()); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/args/test/test_register.cpp b/buildcc/lib/args/test/test_register.cpp index 058f8e21..62e4ad38 100644 --- a/buildcc/lib/args/test/test_register.cpp +++ b/buildcc/lib/args/test/test_register.cpp @@ -102,7 +102,6 @@ TEST(RegisterTestGroup, Register_Build) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); - toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); @@ -151,7 +150,6 @@ TEST(RegisterTestGroup, Register_NoBuildAndDep) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); - toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, @@ -236,7 +234,6 @@ TEST(RegisterTestGroup, Register_BuildAndDep) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); - toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, @@ -332,7 +329,6 @@ TEST(RegisterTestGroup, Register_DepDuplicate) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); - toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, @@ -409,7 +405,6 @@ TEST(RegisterTestGroup, Register_DepCyclic) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); - toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, @@ -486,7 +481,6 @@ TEST(RegisterTestGroup, Register_Test) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); - toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, @@ -572,7 +566,6 @@ TEST(RegisterTestGroup, Register_TestWithOutput) { buildcc::env::init(fs::current_path(), fs::current_path()); buildcc::Toolchain toolchain(buildcc::Toolchain::Id::Gcc, "", "", "", "", "", ""); - toolchain.Lock(); buildcc::BaseTarget target("dummyT", buildcc::TargetType::Executable, toolchain, ""); buildcc::BaseTarget dependency("depT", buildcc::TargetType::Executable, diff --git a/buildcc/lib/target/test/target/test_base_target.cpp b/buildcc/lib/target/test/target/test_base_target.cpp index c1491f13..4f8d7639 100644 --- a/buildcc/lib/target/test/target/test_base_target.cpp +++ b/buildcc/lib/target/test/target/test_base_target.cpp @@ -101,7 +101,5 @@ TEST(TargetBaseTestGroup, TargetConfig_BadLinkCommand) { int main(int ac, char **av) { MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_compile_object.cpp b/buildcc/lib/target/test/target/test_compile_object.cpp index 6e218c0d..0284b395 100644 --- a/buildcc/lib/target/test/target/test_compile_object.cpp +++ b/buildcc/lib/target/test/target/test_compile_object.cpp @@ -33,7 +33,5 @@ int main(int ac, char **av) { buildcc::env::init(fs::current_path(), fs::current_path() / "intermediate" / "target_compile_object"); fs::remove_all(buildcc::env::get_project_build_dir()); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 e2d72cf0..ec6bfcc5 100644 --- a/buildcc/lib/target/test/target/test_target_external_lib.cpp +++ b/buildcc/lib/target/test/target/test_target_external_lib.cpp @@ -143,7 +143,5 @@ TEST(TargetTestExternalLib, TestAddExternalLibDep_RebuildChanged) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_EXTERNAL_LIB_INTERMEDIATE_DIR); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 e170e7ef..5f64f4d9 100644 --- a/buildcc/lib/target/test/target/test_target_failure_states.cpp +++ b/buildcc/lib/target/test/target/test_target_failure_states.cpp @@ -297,7 +297,5 @@ int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_FAILURE_STATES_BUILD_DIR); fs::remove_all(buildcc::env::get_project_build_dir()); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_target_flags.cpp b/buildcc/lib/target/test/target/test_target_flags.cpp index a7337ad2..54434648 100644 --- a/buildcc/lib/target/test/target/test_target_flags.cpp +++ b/buildcc/lib/target/test/target/test_target_flags.cpp @@ -647,7 +647,5 @@ TEST(TargetTestLinkFlagsGroup, Target_ChangedLinkFlag) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_FLAG_INTERMEDIATE_DIR); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 c4863e71..e3a23dc7 100644 --- a/buildcc/lib/target/test/target/test_target_include_dir.cpp +++ b/buildcc/lib/target/test/target/test_target_include_dir.cpp @@ -323,7 +323,5 @@ TEST(TargetTestIncludeDirGroup, TargetBuildHeaderFile) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_INCLUDE_DIR_INTERMEDIATE_DIR); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 dc728128..9b71856a 100644 --- a/buildcc/lib/target/test/target/test_target_lib_dep.cpp +++ b/buildcc/lib/target/test/target/test_target_lib_dep.cpp @@ -257,7 +257,5 @@ TEST(TargetTestLibDep, TargetDep_UpdateExistingLibraryTest) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_LIB_DEP_INTERMEDIATE_DIR); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_target_lock.cpp b/buildcc/lib/target/test/target/test_target_lock.cpp index b0b3d77b..5bd6b2c8 100644 --- a/buildcc/lib/target/test/target/test_target_lock.cpp +++ b/buildcc/lib/target/test/target/test_target_lock.cpp @@ -120,7 +120,5 @@ int main(int ac, char **av) { fs::remove_all(target_source_intermediate_path); buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_LOCK_INTERMEDIATE_DIR); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_target_pch.cpp b/buildcc/lib/target/test/target/test_target_pch.cpp index 8ad6605b..38833475 100644 --- a/buildcc/lib/target/test/target/test_target_pch.cpp +++ b/buildcc/lib/target/test/target/test_target_pch.cpp @@ -291,7 +291,5 @@ int main(int ac, char **av) { fs::remove_all(target_source_intermediate_path); buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_PCH_INTERMEDIATE_DIR); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_target_source.cpp b/buildcc/lib/target/test/target/test_target_source.cpp index 1fb06356..389dda74 100644 --- a/buildcc/lib/target/test/target/test_target_source.cpp +++ b/buildcc/lib/target/test/target/test_target_source.cpp @@ -247,7 +247,5 @@ TEST(TargetTestSourceGroup, Target_CompileCommand_Throws) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_SOURCE_INTERMEDIATE_DIR); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 c4d26409..478b104e 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 @@ -89,7 +89,5 @@ int main(int ac, char **av) { "random dir"); buildcc::env::init(fs::path(BUILD_SCRIPT_SOURCE) / "data" / "random dir", BUILD_TARGET_SOURCE_OUT_OF_ROOT_INTERMEDIATE_DIR); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_target_sync.cpp b/buildcc/lib/target/test/target/test_target_sync.cpp index 6088ad61..2b813406 100644 --- a/buildcc/lib/target/test/target/test_target_sync.cpp +++ b/buildcc/lib/target/test/target/test_target_sync.cpp @@ -319,7 +319,5 @@ TEST(TargetTestSyncGroup, InsertCrash) { int main(int ac, char **av) { buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_SYNC_INTERMEDIATE_DIR); fs::remove_all(buildcc::env::get_project_build_dir()); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } 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 e2516466..237da156 100644 --- a/buildcc/lib/target/test/target/test_target_user_deps.cpp +++ b/buildcc/lib/target/test/target/test_target_user_deps.cpp @@ -144,7 +144,5 @@ int main(int ac, char **av) { fs::remove_all(target_source_intermediate_path); buildcc::env::init(BUILD_SCRIPT_SOURCE, BUILD_TARGET_USER_DEPS_INTERMEDIATE_DIR); - - gcc.Lock(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp b/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp index b5efcdf4..3d698891 100644 --- a/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp +++ b/buildcc/lib/target/test/target/test_toolchain_flag_api.cpp @@ -14,9 +14,22 @@ TEST_GROUP(ToolchainFlagApiTestGroup) }; // clang-format on -TEST(ToolchainFlagApiTestGroup, BasicToolchainTest) { +TEST(ToolchainFlagApiTestGroup, BasicToolchainTest_Lock) { buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); + CHECK_THROWS(std::exception, toolchain.AddPreprocessorFlag("-preprocessor")); + CHECK_THROWS(std::exception, toolchain.AddAsmCompileFlag("-asm")); + CHECK_THROWS(std::exception, toolchain.AddPchCompileFlag("-pchcompile")); + CHECK_THROWS(std::exception, toolchain.AddPchObjectFlag("-pchobject")); + CHECK_THROWS(std::exception, toolchain.AddCommonCompileFlag("-common")); + CHECK_THROWS(std::exception, toolchain.AddCCompileFlag("-c")); + CHECK_THROWS(std::exception, toolchain.AddCppCompileFlag("-cpp")); + CHECK_THROWS(std::exception, toolchain.AddLinkFlag("-link")); +} + +TEST(ToolchainFlagApiTestGroup, BasicToolchainTest_Unlock) { + buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", + "g++", "ar", "ld", false); toolchain.AddPreprocessorFlag("-preprocessor"); toolchain.AddAsmCompileFlag("-asm"); toolchain.AddPchCompileFlag("-pchcompile"); @@ -26,6 +39,7 @@ TEST(ToolchainFlagApiTestGroup, BasicToolchainTest) { toolchain.AddCppCompileFlag("-cpp"); toolchain.AddLinkFlag("-link"); CHECK_FALSE(toolchain.GetLockInfo().IsLocked()); + toolchain.Lock(); CHECK_TRUE(toolchain.GetLockInfo().IsLocked()); @@ -41,7 +55,7 @@ TEST(ToolchainFlagApiTestGroup, BasicToolchainTest) { TEST(ToolchainFlagApiTestGroup, BasicTargetTest) { buildcc::Toolchain toolchain(buildcc::ToolchainId::Gcc, "gcc", "as", "gcc", - "g++", "ar", "ld"); + "g++", "ar", "ld", false); toolchain.AddPreprocessorFlag("-preprocessor"); toolchain.AddAsmCompileFlag("-asm"); From ac478028b3babeffdc9593f37a0522fda8092d9e Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 18:32:09 -0700 Subject: [PATCH 17/21] Update main.buildcc.cpp --- bootstrap/main.buildcc.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/bootstrap/main.buildcc.cpp b/bootstrap/main.buildcc.cpp index 215ddc3f..8ec1d5a7 100644 --- a/bootstrap/main.buildcc.cpp +++ b/bootstrap/main.buildcc.cpp @@ -42,8 +42,6 @@ int main(int argc, char **argv) { reg.Clean(clean_cb); BaseToolchain toolchain = custom_toolchain_arg.ConstructToolchain(); - // TODO, Add toolchain specific flags here - toolchain.Lock(); BuildBuildCC buildcc( reg, toolchain, From 33b4a4f5f320ebc46b364236de28b10bc8cffb18 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 18:33:02 -0700 Subject: [PATCH 18/21] Update toolchain.h --- buildcc/lib/toolchain/include/toolchain/toolchain.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index 56dfa53d..2d021b2a 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -58,11 +58,12 @@ class Toolchain : public internal::FlagApi, 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, + std::string_view linker, bool locked = 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) { + locked ? lock_.Lock() : lock_.Unlock(); UpdateConfig(config_); } From 61f679e2152114b306a84bb0dd4902d216dd7133 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 19:32:05 -0700 Subject: [PATCH 19/21] Added toolchain.cpp --- buildcc/lib/toolchain/CMakeLists.txt | 14 ++++--- .../include/toolchain/common/function_lock.h | 8 +++- .../toolchain/include/toolchain/toolchain.h | 42 +++++++++---------- .../lib/toolchain/src/toolchain/toolchain.cpp | 25 +++++++++++ 4 files changed, 60 insertions(+), 29 deletions(-) create mode 100644 buildcc/lib/toolchain/src/toolchain/toolchain.cpp diff --git a/buildcc/lib/toolchain/CMakeLists.txt b/buildcc/lib/toolchain/CMakeLists.txt index 4d05ae0e..91570b7d 100644 --- a/buildcc/lib/toolchain/CMakeLists.txt +++ b/buildcc/lib/toolchain/CMakeLists.txt @@ -1,15 +1,19 @@ set(TOOLCHAIN_SRCS - include/toolchain/toolchain.h - - include/toolchain/common/file_ext.h - + # COMMON src/common/toolchain_config.cpp include/toolchain/common/toolchain_config.h + include/toolchain/common/file_ext.h + include/toolchain/common/function_lock.h + + # API + include/toolchain/api/flag_api.h + + src/toolchain/toolchain.cpp + include/toolchain/toolchain.h # Features src/api/toolchain_verify.cpp include/toolchain/api/toolchain_verify.h - include/toolchain/api/flag_api.h ) if (${TESTING}) add_library(mock_toolchain diff --git a/buildcc/lib/toolchain/include/toolchain/common/function_lock.h b/buildcc/lib/toolchain/include/toolchain/common/function_lock.h index 9eff7e6c..246b8ee7 100644 --- a/buildcc/lib/toolchain/include/toolchain/common/function_lock.h +++ b/buildcc/lib/toolchain/include/toolchain/common/function_lock.h @@ -27,8 +27,12 @@ namespace buildcc { class FunctionLock { public: - void Lock() { lock_ = true; } - void Unlock() { lock_ = false; } + FunctionLock(bool initial_value = false) : lock_(initial_value) {} + + void SetLock(bool lock) { lock_ = lock; } + void Lock() { SetLock(true); } + void Unlock() { SetLock(false); } + bool IsLocked() const { return lock_; } // TODO, Make this better void ExpectsUnlock(std::string_view tag) const { diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index 2d021b2a..b58bf968 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -29,18 +29,6 @@ namespace buildcc { -// TODO, Make this private -struct UserToolchainSchema { - std::unordered_set preprocessor_flags; - std::unordered_set common_compile_flags; - std::unordered_set pch_compile_flags; - std::unordered_set pch_object_flags; - std::unordered_set asm_compile_flags; - std::unordered_set c_compile_flags; - std::unordered_set cpp_compile_flags; - std::unordered_set link_flags; -}; - // Base toolchain class class Toolchain : public internal::FlagApi, public ToolchainVerify { @@ -58,21 +46,18 @@ class Toolchain : public internal::FlagApi, 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 locked = true, + std::string_view linker, 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) { - locked ? lock_.Lock() : lock_.Unlock(); - UpdateConfig(config_); + archiver_(archiver), linker_(linker), config_(config), lock_(lock) { + Initialize(); } Toolchain(Toolchain &&toolchain) = default; Toolchain(const Toolchain &toolchain) = delete; - void Lock() { - lock_.Lock(); - // TODO, In the future add some more code here - } + + void Lock(); // Getters Id GetId() const { return id_; } @@ -86,8 +71,21 @@ class Toolchain : public internal::FlagApi, const FunctionLock &GetLockInfo() const { return lock_; } const ToolchainConfig &GetConfig() const { return config_; } +private: + struct UserSchema { + std::unordered_set preprocessor_flags; + std::unordered_set common_compile_flags; + std::unordered_set pch_compile_flags; + std::unordered_set pch_object_flags; + std::unordered_set asm_compile_flags; + std::unordered_set c_compile_flags; + std::unordered_set cpp_compile_flags; + std::unordered_set link_flags; + }; + private: virtual void UpdateConfig(ToolchainConfig &config) { (void)config; } + void Initialize(); private: friend class internal::FlagApi; @@ -106,10 +104,10 @@ class Toolchain : public internal::FlagApi, std::string archiver_; std::string linker_; ToolchainConfig config_; + FunctionLock lock_; // - UserToolchainSchema user_; - FunctionLock lock_; + UserSchema user_; }; typedef Toolchain::Id ToolchainId; diff --git a/buildcc/lib/toolchain/src/toolchain/toolchain.cpp b/buildcc/lib/toolchain/src/toolchain/toolchain.cpp new file mode 100644 index 00000000..3a3ae354 --- /dev/null +++ b/buildcc/lib/toolchain/src/toolchain/toolchain.cpp @@ -0,0 +1,25 @@ +/* + * Copyright 2021-2022 Niket Naidu. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "toolchain/toolchain.h" + +namespace buildcc { + +void Toolchain::Initialize() { UpdateConfig(config_); } + +void Toolchain::Lock() { lock_.Lock(); } + +} // namespace buildcc From 790566c8199d931af0732516842f3bdbc8539686 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 19:38:16 -0700 Subject: [PATCH 20/21] Update build_buildcc.cpp --- bootstrap/src/build_buildcc.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/bootstrap/src/build_buildcc.cpp b/bootstrap/src/build_buildcc.cpp index 82fd6aac..0d367c3d 100644 --- a/bootstrap/src/build_buildcc.cpp +++ b/bootstrap/src/build_buildcc.cpp @@ -63,6 +63,7 @@ void buildcc_cb(BaseTarget &target, const BaseGenerator &schema_gen, // TOOLCHAIN target.GlobSources("lib/toolchain/src/api"); target.GlobSources("lib/toolchain/src/common"); + target.GlobSources("lib/toolchain/src/toolchain"); target.AddIncludeDir("lib/toolchain/include"); target.GlobHeaders("lib/toolchain/include/toolchain"); target.GlobHeaders("lib/toolchain/include/toolchain/api"); From aed12a3d5a3ed455754e74f0b442dd87bc605a99 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Wed, 16 Mar 2022 19:53:05 -0700 Subject: [PATCH 21/21] Update toolchain_utils.rst --- docs/source/user_api/toolchain_utils.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/source/user_api/toolchain_utils.rst b/docs/source/user_api/toolchain_utils.rst index 0e812633..8c2dfcd7 100644 --- a/docs/source/user_api/toolchain_utils.rst +++ b/docs/source/user_api/toolchain_utils.rst @@ -8,6 +8,11 @@ file_ext.h .. doxygenenum:: buildcc::FileExt +function_lock.h +----------------- + +.. doxygenclass:: buildcc::FunctionLock + toolchain_config.h --------------------