From 9a8c8fea4442eb01742cebf739e47f2b1bad534f Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 02:54:21 -0800 Subject: [PATCH 01/30] Update generator.h --- buildcc/lib/target/include/target/generator.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/buildcc/lib/target/include/target/generator.h b/buildcc/lib/target/include/target/generator.h index 0436d128..349c34b5 100644 --- a/buildcc/lib/target/include/target/generator.h +++ b/buildcc/lib/target/include/target/generator.h @@ -33,17 +33,18 @@ #include "target/interface/builder_interface.h" #include "target/base/generator_loader.h" + #include "target/common/path.h" +#include "target/common/target_env.h" namespace buildcc::base { class Generator : public BuilderInterface { public: - Generator(const std::string &name, - const fs::path &target_path_relative_to_root, bool parallel = false) - : name_(name), generator_root_dir_(env::get_project_root_dir() / - target_path_relative_to_root), - generator_build_dir_(env::get_project_build_dir() / name), + Generator(const std::string &name, const TargetEnv &env, + bool parallel = false) + : name_(name), generator_root_dir_(env.GetTargetRootDir()), + generator_build_dir_(env.GetTargetBuildDir() / name), loader_(name, generator_build_dir_), parallel_(parallel) { Initialize(); } From 0acb76045b1ecaffa32544a10d390e689f044da0 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 02:54:42 -0800 Subject: [PATCH 02/30] Update win_cmake_build.yml --- .github/workflows/win_cmake_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/win_cmake_build.yml b/.github/workflows/win_cmake_build.yml index cb7fd826..b3a16ea2 100644 --- a/.github/workflows/win_cmake_build.yml +++ b/.github/workflows/win_cmake_build.yml @@ -58,7 +58,7 @@ jobs: - name: BuildExe IM example tiny-process-library working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} run: | - cmake --build . --target run_buildexe_im_tpl_win_msvc + cmake --build . --config Release --target run_buildexe_im_tpl_win_msvc - name: Install working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} From 6fca2332b2d225773a053bb8e51c6700f14624f0 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 02:55:36 -0800 Subject: [PATCH 03/30] Added BuildBuildCC to build_buildcc.h --- bootstrap/include/bootstrap/build_buildcc.h | 33 +++++++ bootstrap/src/build_buildcc.cpp | 98 +++++++++++++++++++++ 2 files changed, 131 insertions(+) diff --git a/bootstrap/include/bootstrap/build_buildcc.h b/bootstrap/include/bootstrap/build_buildcc.h index a0c37e09..5ccdffa3 100644 --- a/bootstrap/include/bootstrap/build_buildcc.h +++ b/bootstrap/include/bootstrap/build_buildcc.h @@ -19,6 +19,13 @@ #include "buildcc.h" +#include "build_cli11.h" +#include "build_flatbuffers.h" +#include "build_fmtlib.h" +#include "build_spdlog.h" +#include "build_taskflow.h" +#include "build_tpl.h" + namespace buildcc { void schema_gen_cb(BaseGenerator &generator, const BaseTarget &flatc_exe); @@ -28,6 +35,32 @@ void buildcc_cb(BaseTarget &target, const BaseGenerator &schema_gen, const TargetInfo &spdlog_ho, const TargetInfo &cli11_ho, const TargetInfo &taskflow_ho, const BaseTarget &tpl); +/** + * @brief + * + */ +class BuildBuildCC { +public: + BuildBuildCC(Register ®, const BaseToolchain &toolchain, + const TargetEnv &env) + : reg_(reg), toolchain_(toolchain), env_(env) {} + BuildBuildCC(const BuildBuildCC &) = delete; + + void Setup(const ArgToolchainState &state); + + // Getters + StaticTarget_generic &GetBuildcc() { + return storage_.Ref("libbuildcc"); + } + +private: + Register ®_; + const BaseToolchain &toolchain_; + TargetEnv env_; + + PersistentStorage storage_; +}; + } // namespace buildcc #endif diff --git a/bootstrap/src/build_buildcc.cpp b/bootstrap/src/build_buildcc.cpp index f8ae45e5..3ee9ca69 100644 --- a/bootstrap/src/build_buildcc.cpp +++ b/bootstrap/src/build_buildcc.cpp @@ -154,4 +154,102 @@ void buildcc_cb(BaseTarget &target, const BaseGenerator &schema_gen, target.Build(); } +// TODO, Update this +static void global_flags_cb(TargetInfo &global_info, + const BaseToolchain &toolchain) { + // TODO, Clang + switch (toolchain.GetId()) { + case ToolchainId::Gcc: + case ToolchainId::MinGW: + global_info.AddCppCompileFlag("-std=c++17"); + global_info.AddCppCompileFlag("-Os"); + global_info.AddCppCompileFlag("-Wall"); + global_info.AddCppCompileFlag("-Wextra"); + global_info.AddCppCompileFlag("-Werror"); + break; + case ToolchainId::Msvc: + global_info.AddPreprocessorFlag("/D_CRT_SECURE_NO_WARNINGS"); + global_info.AddCppCompileFlag("/std:c++17"); + global_info.AddCppCompileFlag("/Ot"); + global_info.AddCppCompileFlag("/W4"); + global_info.AddCppCompileFlag("/WX"); + default: + break; + } +} + +// TODO, Remove magic strings +// TODO, Replace Callback with CallbackIf +void BuildBuildCC::Setup(const ArgToolchainState &state) { + auto &flatc_exe = storage_.Add( + "flatc", "flatc", toolchain_, + TargetEnv(env_.GetTargetRootDir() / "third_party" / "flatbuffers", + env_.GetTargetBuildDir())); + + reg_.Callback(global_flags_cb, flatc_exe, toolchain_); + reg_.Build(state, build_flatc_exe_cb, flatc_exe); + + // Schema + auto &schema_gen = storage_.Add( + "schema_gen", "schema_gen", + TargetEnv(env_.GetTargetRootDir() / "buildcc" / "schema", + env_.GetTargetBuildDir() / toolchain_.GetName())); + reg_.Build(schema_gen_cb, schema_gen, flatc_exe); + reg_.Dep(schema_gen, flatc_exe); + + // Flatbuffers HO lib + auto &flatbuffers_ho_lib = storage_.Add( + "flatbuffers_ho", + TargetEnv(env_.GetTargetRootDir() / "third_party" / "flatbuffers", + env_.GetTargetBuildDir())); + reg_.Callback(flatbuffers_ho_cb, flatbuffers_ho_lib); + + // CLI11 HO lib + auto &cli11_ho_lib = storage_.Add( + "cli11_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "CLI11", + env_.GetTargetBuildDir())); + reg_.Callback(cli11_ho_cb, cli11_ho_lib); + + // fmt HO lib + auto &fmt_ho_lib = storage_.Add( + "fmt_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "fmt", + env_.GetTargetBuildDir())); + reg_.Callback(fmt_ho_cb, fmt_ho_lib); + + // spdlog HO lib + auto &spdlog_ho_lib = storage_.Add( + "spdlog_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "spdlog", + env_.GetTargetBuildDir())); + reg_.Callback(spdlog_ho_cb, spdlog_ho_lib); + + // taskflow HO lib + auto &taskflow_ho_lib = storage_.Add( + "taskflow_ho", + TargetEnv(env_.GetTargetRootDir() / "third_party" / "taskflow", + env_.GetTargetBuildDir())); + reg_.Callback(taskflow_ho_cb, taskflow_ho_lib); + + // Tiny-process-library lib + // TODO, Make this a generic selection between StaticTarget and + // DynamicTarget + auto &tpl_lib = storage_.Add( + "libtpl", "libtpl", toolchain_, + TargetEnv(env_.GetTargetRootDir() / "third_party" / + "tiny-process-library", + env_.GetTargetBuildDir())); + reg_.CallbackIf(state, global_flags_cb, tpl_lib, toolchain_); + reg_.Build(state, tpl_cb, tpl_lib); + + // TODO, Make this a generic selection between StaticTarget and + // DynamicTarget + auto &buildcc_lib = storage_.Add( + "libbuildcc", "libbuildcc", toolchain_, + TargetEnv(env_.GetTargetRootDir() / "buildcc", env_.GetTargetBuildDir())); + reg_.CallbackIf(state, global_flags_cb, buildcc_lib, toolchain_); + reg_.Build(state, buildcc_cb, buildcc_lib, schema_gen, flatbuffers_ho_lib, + fmt_ho_lib, spdlog_ho_lib, cli11_ho_lib, taskflow_ho_lib, tpl_lib); + reg_.Dep(buildcc_lib, schema_gen); + reg_.Dep(buildcc_lib, tpl_lib); +} + } // namespace buildcc From 0e368f385a4acad85368a2140b94c62c5fa39910 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 02:56:28 -0800 Subject: [PATCH 04/30] Update main.buildcc.cpp --- bootstrap/main.buildcc.cpp | 99 ++------------------------------------ 1 file changed, 5 insertions(+), 94 deletions(-) diff --git a/bootstrap/main.buildcc.cpp b/bootstrap/main.buildcc.cpp index 6f92455f..a51e5bda 100644 --- a/bootstrap/main.buildcc.cpp +++ b/bootstrap/main.buildcc.cpp @@ -28,12 +28,6 @@ using namespace buildcc; static void clean_cb(); -static void global_flags_cb(TargetInfo &global_info, - const BaseToolchain &toolchain); - -static void setup_buildcc_cb(PersistentStorage &storage, Register ®, - const ArgToolchain &custom_toolchain_arg, - const BaseToolchain &toolchain); static void hybrid_simple_example_cb(BaseTarget &target, const BaseTarget &libbuildcc); @@ -50,11 +44,12 @@ int main(int argc, char **argv) { BaseToolchain toolchain = custom_toolchain_arg.ConstructToolchain(); PersistentStorage storage; - setup_buildcc_cb(storage, reg, custom_toolchain_arg, toolchain); - - const StaticTarget_generic &buildcc_lib = - storage.ConstRef("libbuildcc"); + BuildBuildCC buildcc( + reg, toolchain, + TargetEnv(env::get_project_root_dir(), env::get_project_build_dir())); + buildcc.Setup(custom_toolchain_arg.state); + const auto &buildcc_lib = buildcc.GetBuildcc(); ExecutableTarget_generic buildcc_hybrid_simple_example( "buildcc_hybrid_simple_example", toolchain, "example/hybrid/simple"); reg.Build(custom_toolchain_arg.state, hybrid_simple_example_cb, @@ -78,90 +73,6 @@ int main(int argc, char **argv) { static void clean_cb() {} -static void global_flags_cb(TargetInfo &global_info, - const BaseToolchain &toolchain) { - // TODO, Clang - switch (toolchain.GetId()) { - case ToolchainId::Gcc: - case ToolchainId::MinGW: - global_info.AddCppCompileFlag("-std=c++17"); - global_info.AddCppCompileFlag("-Os"); - global_info.AddCppCompileFlag("-Wall"); - global_info.AddCppCompileFlag("-Wextra"); - global_info.AddCppCompileFlag("-Werror"); - break; - case ToolchainId::Msvc: - global_info.AddPreprocessorFlag("/D_CRT_SECURE_NO_WARNINGS"); - global_info.AddCppCompileFlag("/std:c++17"); - global_info.AddCppCompileFlag("/Ot"); - global_info.AddCppCompileFlag("/W4"); - global_info.AddCppCompileFlag("/WX"); - default: - break; - } -} - -static void setup_buildcc_cb(PersistentStorage &storage, Register ®, - const ArgToolchain &custom_toolchain_arg, - const BaseToolchain &toolchain) { - - // Flatc Executable - ExecutableTarget_generic &flatc_exe = storage.Add( - "flatc", "flatc", toolchain, "third_party/flatbuffers"); - reg.CallbackIf(custom_toolchain_arg.state, global_flags_cb, flatc_exe, - toolchain); - reg.Build(custom_toolchain_arg.state, build_flatc_exe_cb, flatc_exe); - - // Schema - BaseGenerator &schema_gen = - storage.Add("schema_gen", "schema_gen", "buildcc/schema"); - reg.Build(schema_gen_cb, schema_gen, flatc_exe); - reg.Dep(schema_gen, flatc_exe); - - // Flatbuffers HO lib - TargetInfo &flatbuffers_ho_lib = - storage.Add("flatbuffers_ho", "third_party/flatbuffers"); - reg.Callback(flatbuffers_ho_cb, flatbuffers_ho_lib); - - // CLI11 HO lib - TargetInfo &cli11_ho_lib = - storage.Add("cli11_ho", "third_party/CLI11"); - reg.Callback(cli11_ho_cb, cli11_ho_lib); - - // fmt HO lib - TargetInfo &fmt_ho_lib = storage.Add("fmt_ho", "third_party/fmt"); - reg.Callback(fmt_ho_cb, fmt_ho_lib); - - // spdlog HO lib - TargetInfo &spdlog_ho_lib = - storage.Add("spdlog_ho", "third_party/spdlog"); - reg.Callback(spdlog_ho_cb, spdlog_ho_lib); - - // taskflow HO lib - TargetInfo &taskflow_ho_lib = - storage.Add("taskflow_ho", "third_party/taskflow"); - reg.Callback(taskflow_ho_cb, taskflow_ho_lib); - - // Tiny-process-library lib - // TODO, Make this a generic selection between StaticTarget and DynamicTarget - StaticTarget_generic &tpl_lib = storage.Add( - "libtpl", "libtpl", toolchain, "third_party/tiny-process-library"); - reg.CallbackIf(custom_toolchain_arg.state, global_flags_cb, tpl_lib, - toolchain); - reg.Build(custom_toolchain_arg.state, tpl_cb, tpl_lib); - - // TODO, Make this a generic selection between StaticTarget and DynamicTarget - StaticTarget_generic &buildcc_lib = storage.Add( - "libbuildcc", "libbuildcc", toolchain, "buildcc"); - reg.CallbackIf(custom_toolchain_arg.state, global_flags_cb, buildcc_lib, - toolchain); - reg.Build(custom_toolchain_arg.state, buildcc_cb, buildcc_lib, schema_gen, - flatbuffers_ho_lib, fmt_ho_lib, spdlog_ho_lib, cli11_ho_lib, - taskflow_ho_lib, tpl_lib); - reg.Dep(buildcc_lib, schema_gen); - reg.Dep(buildcc_lib, tpl_lib); -} - static void hybrid_simple_example_cb(BaseTarget &target, const BaseTarget &libbuildcc) { target.Insert(libbuildcc, { From 711ba8e6685834062d991e70a7bb0bb8f08473f4 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 02:57:59 -0800 Subject: [PATCH 05/30] Update build_buildcc.cpp --- bootstrap/src/build_buildcc.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bootstrap/src/build_buildcc.cpp b/bootstrap/src/build_buildcc.cpp index 3ee9ca69..61eb4a50 100644 --- a/bootstrap/src/build_buildcc.cpp +++ b/bootstrap/src/build_buildcc.cpp @@ -179,14 +179,14 @@ static void global_flags_cb(TargetInfo &global_info, } // TODO, Remove magic strings -// TODO, Replace Callback with CallbackIf +// TODO, Replace CallbackIf state, with CallbackIf void BuildBuildCC::Setup(const ArgToolchainState &state) { auto &flatc_exe = storage_.Add( "flatc", "flatc", toolchain_, TargetEnv(env_.GetTargetRootDir() / "third_party" / "flatbuffers", env_.GetTargetBuildDir())); - reg_.Callback(global_flags_cb, flatc_exe, toolchain_); + reg_.CallbackIf(state, global_flags_cb, flatc_exe, toolchain_); reg_.Build(state, build_flatc_exe_cb, flatc_exe); // Schema @@ -202,32 +202,32 @@ void BuildBuildCC::Setup(const ArgToolchainState &state) { "flatbuffers_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "flatbuffers", env_.GetTargetBuildDir())); - reg_.Callback(flatbuffers_ho_cb, flatbuffers_ho_lib); + reg_.CallbackIf(state, flatbuffers_ho_cb, flatbuffers_ho_lib); // CLI11 HO lib auto &cli11_ho_lib = storage_.Add( "cli11_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "CLI11", env_.GetTargetBuildDir())); - reg_.Callback(cli11_ho_cb, cli11_ho_lib); + reg_.CallbackIf(state, cli11_ho_cb, cli11_ho_lib); // fmt HO lib auto &fmt_ho_lib = storage_.Add( "fmt_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "fmt", env_.GetTargetBuildDir())); - reg_.Callback(fmt_ho_cb, fmt_ho_lib); + reg_.CallbackIf(state, fmt_ho_cb, fmt_ho_lib); // spdlog HO lib auto &spdlog_ho_lib = storage_.Add( "spdlog_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "spdlog", env_.GetTargetBuildDir())); - reg_.Callback(spdlog_ho_cb, spdlog_ho_lib); + reg_.CallbackIf(state, spdlog_ho_cb, spdlog_ho_lib); // taskflow HO lib auto &taskflow_ho_lib = storage_.Add( "taskflow_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "taskflow", env_.GetTargetBuildDir())); - reg_.Callback(taskflow_ho_cb, taskflow_ho_lib); + reg_.CallbackIf(state, taskflow_ho_cb, taskflow_ho_lib); // Tiny-process-library lib // TODO, Make this a generic selection between StaticTarget and From fc3266b526a29ed480fe9e06fe446203655877e0 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 03:04:40 -0800 Subject: [PATCH 06/30] Replaced magic strings --- bootstrap/include/bootstrap/build_buildcc.h | 20 +++++++++++++- bootstrap/src/build_buildcc.cpp | 30 ++++++++++----------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/bootstrap/include/bootstrap/build_buildcc.h b/bootstrap/include/bootstrap/build_buildcc.h index 5ccdffa3..14133279 100644 --- a/bootstrap/include/bootstrap/build_buildcc.h +++ b/bootstrap/include/bootstrap/build_buildcc.h @@ -40,6 +40,24 @@ void buildcc_cb(BaseTarget &target, const BaseGenerator &schema_gen, * */ class BuildBuildCC { +public: + // TargetInfo / Header Only + static constexpr const char *const kFlatbuffersHoName = "flatbuffers_ho"; + static constexpr const char *const kCli11HoName = "cli11_ho"; + static constexpr const char *const kFmtHoName = "fmtlib_ho"; + static constexpr const char *const kSpdlogHoName = "spdlog_ho"; + static constexpr const char *const kTaskflowHoName = "taskflow_ho"; + + // Executable + static constexpr const char *const kFlatcExeName = "flatc"; + + // Generator + static constexpr const char *const kSchemaGenName = "schema_gen"; + + // Libraries + static constexpr const char *const kTplLibName = "libtpl"; + static constexpr const char *const kBuildccLibName = "libbuildcc"; + public: BuildBuildCC(Register ®, const BaseToolchain &toolchain, const TargetEnv &env) @@ -50,7 +68,7 @@ class BuildBuildCC { // Getters StaticTarget_generic &GetBuildcc() { - return storage_.Ref("libbuildcc"); + return storage_.Ref(kBuildccLibName); } private: diff --git a/bootstrap/src/build_buildcc.cpp b/bootstrap/src/build_buildcc.cpp index 61eb4a50..ec40da1b 100644 --- a/bootstrap/src/build_buildcc.cpp +++ b/bootstrap/src/build_buildcc.cpp @@ -154,7 +154,8 @@ void buildcc_cb(BaseTarget &target, const BaseGenerator &schema_gen, target.Build(); } -// TODO, Update this +// TODO, Shift this inside BuildBuildcc class if required +// TODO, Add this to options static void global_flags_cb(TargetInfo &global_info, const BaseToolchain &toolchain) { // TODO, Clang @@ -178,11 +179,9 @@ static void global_flags_cb(TargetInfo &global_info, } } -// TODO, Remove magic strings -// TODO, Replace CallbackIf state, with CallbackIf void BuildBuildCC::Setup(const ArgToolchainState &state) { auto &flatc_exe = storage_.Add( - "flatc", "flatc", toolchain_, + kFlatcExeName, kFlatcExeName, toolchain_, TargetEnv(env_.GetTargetRootDir() / "third_party" / "flatbuffers", env_.GetTargetBuildDir())); @@ -191,7 +190,7 @@ void BuildBuildCC::Setup(const ArgToolchainState &state) { // Schema auto &schema_gen = storage_.Add( - "schema_gen", "schema_gen", + kSchemaGenName, kSchemaGenName, TargetEnv(env_.GetTargetRootDir() / "buildcc" / "schema", env_.GetTargetBuildDir() / toolchain_.GetName())); reg_.Build(schema_gen_cb, schema_gen, flatc_exe); @@ -199,32 +198,33 @@ void BuildBuildCC::Setup(const ArgToolchainState &state) { // Flatbuffers HO lib auto &flatbuffers_ho_lib = storage_.Add( - "flatbuffers_ho", + kFlatbuffersHoName, TargetEnv(env_.GetTargetRootDir() / "third_party" / "flatbuffers", env_.GetTargetBuildDir())); reg_.CallbackIf(state, flatbuffers_ho_cb, flatbuffers_ho_lib); // CLI11 HO lib auto &cli11_ho_lib = storage_.Add( - "cli11_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "CLI11", - env_.GetTargetBuildDir())); + kCli11HoName, TargetEnv(env_.GetTargetRootDir() / "third_party" / "CLI11", + env_.GetTargetBuildDir())); reg_.CallbackIf(state, cli11_ho_cb, cli11_ho_lib); // fmt HO lib auto &fmt_ho_lib = storage_.Add( - "fmt_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "fmt", - env_.GetTargetBuildDir())); + kFmtHoName, TargetEnv(env_.GetTargetRootDir() / "third_party" / "fmt", + env_.GetTargetBuildDir())); reg_.CallbackIf(state, fmt_ho_cb, fmt_ho_lib); // spdlog HO lib auto &spdlog_ho_lib = storage_.Add( - "spdlog_ho", TargetEnv(env_.GetTargetRootDir() / "third_party" / "spdlog", - env_.GetTargetBuildDir())); + kSpdlogHoName, + TargetEnv(env_.GetTargetRootDir() / "third_party" / "spdlog", + env_.GetTargetBuildDir())); reg_.CallbackIf(state, spdlog_ho_cb, spdlog_ho_lib); // taskflow HO lib auto &taskflow_ho_lib = storage_.Add( - "taskflow_ho", + kTaskflowHoName, TargetEnv(env_.GetTargetRootDir() / "third_party" / "taskflow", env_.GetTargetBuildDir())); reg_.CallbackIf(state, taskflow_ho_cb, taskflow_ho_lib); @@ -233,7 +233,7 @@ void BuildBuildCC::Setup(const ArgToolchainState &state) { // TODO, Make this a generic selection between StaticTarget and // DynamicTarget auto &tpl_lib = storage_.Add( - "libtpl", "libtpl", toolchain_, + kTplLibName, kTplLibName, toolchain_, TargetEnv(env_.GetTargetRootDir() / "third_party" / "tiny-process-library", env_.GetTargetBuildDir())); @@ -243,7 +243,7 @@ void BuildBuildCC::Setup(const ArgToolchainState &state) { // TODO, Make this a generic selection between StaticTarget and // DynamicTarget auto &buildcc_lib = storage_.Add( - "libbuildcc", "libbuildcc", toolchain_, + kBuildccLibName, kBuildccLibName, toolchain_, TargetEnv(env_.GetTargetRootDir() / "buildcc", env_.GetTargetBuildDir())); reg_.CallbackIf(state, global_flags_cb, buildcc_lib, toolchain_); reg_.Build(state, buildcc_cb, buildcc_lib, schema_gen, flatbuffers_ho_lib, From 58aa64454c0dd612bbc6a769e8750cfd6b6e9168 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 12:55:21 -0800 Subject: [PATCH 07/30] Update toolchain_verify.h --- .../include/toolchain/api/toolchain_verify.h | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/buildcc/lib/toolchain/include/toolchain/api/toolchain_verify.h b/buildcc/lib/toolchain/include/toolchain/api/toolchain_verify.h index fee24b9f..d6d8023f 100644 --- a/buildcc/lib/toolchain/include/toolchain/api/toolchain_verify.h +++ b/buildcc/lib/toolchain/include/toolchain/api/toolchain_verify.h @@ -55,12 +55,7 @@ struct VerifiedToolchain { std::string target_arch; // TODO, Add more here as needed - void Print() const { - env::log_info( - __FUNCTION__, - fmt::format("Path: {}, Compiler Version: {}, Target Triple Arch: {}", - path.string(), compiler_version, target_arch)); - } + std::string ToString() const { return fmt::format("{}", *this); } }; template class ToolchainVerify { @@ -78,4 +73,22 @@ typedef base::VerifiedToolchain VerifiedToolchain; } // namespace buildcc +constexpr const char *const kVerifiedToolchainFormat = R"({{ + "path": "{}", + "compiler_version": "{}", + "target_arch": "{}" +}})"; + +template <> +struct fmt::formatter + : formatter { + template + auto format(const buildcc::base::VerifiedToolchain &vt, FormatContext &ctx) { + std::string verified_toolchain_info = + fmt::format(kVerifiedToolchainFormat, vt.path.string(), + vt.compiler_version, vt.target_arch); + return formatter::format(verified_toolchain_info, ctx); + } +}; + #endif From df7ac94faf37c9231c1a2bd2a58364d3decdd63f Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 13:48:05 -0800 Subject: [PATCH 08/30] Update util.h --- buildcc/lib/env/include/env/util.h | 33 ++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/buildcc/lib/env/include/env/util.h b/buildcc/lib/env/include/env/util.h index 391b5743..7300af04 100644 --- a/buildcc/lib/env/include/env/util.h +++ b/buildcc/lib/env/include/env/util.h @@ -33,6 +33,7 @@ #ifndef ENV_UTIL_H_ #define ENV_UTIL_H_ +#include #include #include #include @@ -120,6 +121,38 @@ inline std::vector split(const std::string &s, char delim) { return result; } +// https://stackoverflow.com/questions/44973435/stdptr-fun-replacement-for-c17/44973498#44973498 +inline std::string ltrim(const std::string &s) { + std::string tr{s}; + // Checks from left (beginning) and finds the `end point` where no `isspace` + // char is detected + auto l_tr_end = std::find_if(tr.begin(), tr.end(), + [](char c) { return !std::isspace(c); }); + tr.erase(tr.begin(), l_tr_end); + return tr; +} + +inline std::string rtrim(const std::string &s) { + std::string tr{s}; + // Checks from right (ending) and finds the `start point` where no `isspace` + // char is detected + // Gets the base iterator (which is forward in nature) + auto r_tr_begin = std::find_if(tr.rbegin(), tr.rend(), [](char c) { + return !std::isspace(c); + }).base(); + tr.erase(r_tr_begin, tr.end()); + return tr; +} + +/** + * @brief Trims both left and right part of the string + */ +inline std::string trim(const std::string &s) { + std::string tr = ltrim(s); + tr = rtrim(tr); + return tr; +} + } // namespace buildcc::env #endif From 5f0e596536f04391595a86dc1acda7c9aa0b76c4 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 13:48:21 -0800 Subject: [PATCH 09/30] Update toolchain_verify.cpp --- buildcc/lib/toolchain/src/api/toolchain_verify.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp index 71048ec4..9e93c65d 100644 --- a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp +++ b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp @@ -222,8 +222,8 @@ ToolchainVerify::Verify(const VerifyToolchainConfig &config) { VerifiedToolchain vt; vt.path = p; - vt.compiler_version = GetCompilerVersion(p, t).value_or(""); - vt.target_arch = GetCompilerArchitecture(p, t).value_or(""); + 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); } From 7d3b1f726ef3151d96ec897ac878fffbcdb2a9b2 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 14:19:24 -0800 Subject: [PATCH 10/30] Added host_toolchain_verification --- buildexe/buildexe.cpp | 90 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 5 deletions(-) diff --git a/buildexe/buildexe.cpp b/buildexe/buildexe.cpp index eb0218a0..581e75b0 100644 --- a/buildexe/buildexe.cpp +++ b/buildexe/buildexe.cpp @@ -64,11 +64,13 @@ static void clean_cb(); static void setup_arg_target_info(Args &args, ArgTargetInfo &out); static void setup_arg_target_inputs(Args &args, ArgTargetInputs &out); +static void host_toolchain_verify(const BaseToolchain &toolchain); static void user_output_target_cb(BaseTarget &target, const ArgTargetInputs &inputs); // TODO, Add BuildExeMode::Script usage +// TODO, Refactor magic strings int main(int argc, char **argv) { Args args; @@ -92,10 +94,9 @@ int main(int argc, char **argv) { ArgTargetInputs out_targetinputs; setup_arg_target_inputs(args, out_targetinputs); - // TODO, Add base (git cloned raw versions) - // TODO, Add libraries (compiled version of code! with libs and header - // linkage options) - // TODO, Add extension + // TODO, Add buildcc (git cloned) + // TODO, Add libraries (git cloned) + // TODO, Add extension (git cloned) args.Parse(argc, argv); @@ -104,7 +105,35 @@ int main(int argc, char **argv) { // Build BaseToolchain toolchain = custom_toolchain_arg.ConstructToolchain(); - // TODO, Verify toolchain by compiling a dummy program + + // BaseToolchain toolchain = custom_toolchain_arg.ConstructToolchain(); + auto verified_toolchains = toolchain.Verify(); + env::assert_fatal(!verified_toolchains.empty(), + "Toolchain could not be verified. Please input correct " + "Gcc, Msvc, Clang or MinGW toolchain executable names"); + if (verified_toolchains.size() > 1) { + env::log_info( + kTag, + fmt::format( + "Found {} toolchains. By default using the first added" + "toolchain. Modify your environment `PATH` information if you " + "would like compiler precedence when similar compilers are " + "detected in different folders", + verified_toolchains.size())); + } + + // TODO, Print them by indexes here + // TODO, Add verified toolchain to `fmt::format` specialization + int counter = 1; + for (const auto &vt : verified_toolchains) { + std::string info = fmt::format("{}. : {}", counter, vt.ToString()); + env::log_info("Host Toolchain", info); + counter++; + } + + if (mode == BuildExeMode::Script) { + host_toolchain_verify(toolchain); + } Target_generic user_output_target(out_targetinfo.name, out_targetinfo.type, toolchain, @@ -171,6 +200,57 @@ static void setup_arg_target_inputs(Args &args, ArgTargetInputs &out) { app.add_option("--link_flags", out.link_flags, "Provide Link Flags"); } +static void host_toolchain_verify(const BaseToolchain &toolchain) { + env::log_info(kTag, "*** Starting Toolchain verification ***"); + + fs::path file = env::get_project_build_dir() / "verify_host_toolchain" / + "verify_host_toolchain.cpp"; + fs::create_directories(file.parent_path()); + std::string file_data = R"(// Generated by BuildExe +#include +#include + +namespace fs = std::filesystem; + +int main() { + std::cout << "Verifying host toolchain" << std::endl; + std::cout << "Current Path: " << fs::current_path() << std::endl; + return 0; +})"; + env::save_file(path_as_string(file).c_str(), file_data, false); + + ExecutableTarget_generic target( + "verify", toolchain, TargetEnv(file.parent_path(), file.parent_path())); + + target.AddSource(file); + switch (toolchain.GetId()) { + case ToolchainId::Gcc: + case ToolchainId::MinGW: + target.AddCppCompileFlag("-std=c++17"); + break; + case ToolchainId::Msvc: + target.AddCppCompileFlag("/std:c++17"); + break; + default: + env::assert_fatal("Invalid Compiler Id"); + } + target.Build(); + + // Build + tf::Executor executor; + executor.run(target.GetTaskflow()); + executor.wait_for_all(); + env::assert_fatal(env::get_task_state() == env::TaskState::SUCCESS, + "Input toolchain could not compile host program. " + "Requires HOST toolchain"); + + // Run + bool execute = env::Command::Execute(fmt::format( + "{executable}", fmt::arg("executable", target.GetTargetPath().string()))); + env::assert_fatal(execute, "Could not execute verification target"); + env::log_info(kTag, "*** Toolchain verification done ***"); +} + static void user_output_target_cb(BaseTarget &target, const ArgTargetInputs &inputs) { for (const auto &s : inputs.source_files) { From c2bf30035a1fa940aaf7fa7d0f58d44ffc3bd00d Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 14:20:17 -0800 Subject: [PATCH 11/30] Update buildexe.cpp --- buildexe/buildexe.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/buildexe/buildexe.cpp b/buildexe/buildexe.cpp index 581e75b0..50a27e8a 100644 --- a/buildexe/buildexe.cpp +++ b/buildexe/buildexe.cpp @@ -122,8 +122,7 @@ int main(int argc, char **argv) { verified_toolchains.size())); } - // TODO, Print them by indexes here - // TODO, Add verified toolchain to `fmt::format` specialization + // Print int counter = 1; for (const auto &vt : verified_toolchains) { std::string info = fmt::format("{}. : {}", counter, vt.ToString()); From dc75dac3ed638d6c72c44c13b9161e481fcbf6f1 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 14:35:20 -0800 Subject: [PATCH 12/30] Update build_buildcc.h --- bootstrap/include/bootstrap/build_buildcc.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bootstrap/include/bootstrap/build_buildcc.h b/bootstrap/include/bootstrap/build_buildcc.h index 14133279..2bbbfbc6 100644 --- a/bootstrap/include/bootstrap/build_buildcc.h +++ b/bootstrap/include/bootstrap/build_buildcc.h @@ -67,6 +67,9 @@ class BuildBuildCC { void Setup(const ArgToolchainState &state); // Getters + StaticTarget_generic &GetTpl() { + return storage_.Ref(kTplLibName); + } StaticTarget_generic &GetBuildcc() { return storage_.Ref(kBuildccLibName); } From fddffc49a96a7eaa5a5d3ad5299f24b0496a2ec6 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 14:40:56 -0800 Subject: [PATCH 13/30] Create sm_simple.toml --- buildexe/example_configs/sm_simple.toml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 buildexe/example_configs/sm_simple.toml diff --git a/buildexe/example_configs/sm_simple.toml b/buildexe/example_configs/sm_simple.toml new file mode 100644 index 00000000..b59c3078 --- /dev/null +++ b/buildexe/example_configs/sm_simple.toml @@ -0,0 +1,22 @@ +root_dir = ".." +build_dir = "../_build_buildexe_simple" + +loglevel = "debug" +clean = false + +# TODO, verification +# [verification] +# os = ["win", "linux"] + +# BuildExe run mode +# mode = "immediate" +mode = "script" + +# Target information +# [build.info] +name = "simple" +type = "executable" +relative_to_root = "example/hybrid/simple" + +# [build.inputs] +srcs = ["build.cpp"] From 826ed1f516a0dc87600d380d8ae8895371d23e0a Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 14:47:44 -0800 Subject: [PATCH 14/30] Update CMakeLists.txt --- buildexe/CMakeLists.txt | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/buildexe/CMakeLists.txt b/buildexe/CMakeLists.txt index 2c130297..e9bcbb8b 100644 --- a/buildexe/CMakeLists.txt +++ b/buildexe/CMakeLists.txt @@ -1,6 +1,18 @@ add_executable(buildexe buildexe.cpp ) +target_sources(buildexe PRIVATE + ../bootstrap/src/build_buildcc.cpp + ../bootstrap/src/build_cli11.cpp + ../bootstrap/src/build_flatbuffers.cpp + ../bootstrap/src/build_fmtlib.cpp + ../bootstrap/src/build_spdlog.cpp + ../bootstrap/src/build_taskflow.cpp + ../bootstrap/src/build_tpl.cpp +) +target_include_directories(buildexe PRIVATE + ../bootstrap/include +) target_link_libraries(buildexe PRIVATE buildcc) # TODO, Add this only if MINGW is used @@ -18,7 +30,7 @@ add_custom_target(run_buildexe_help ) # [Immediate Mode] Tpl example WIN MSVC -add_custom_target(run_buildexe_im_tpl_win_msvc +add_custom_target(run_buildexe_im_tpl_msvc_win COMMAND buildexe --help-all COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/tpl_win.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_msvc_win.toml WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} @@ -26,9 +38,25 @@ add_custom_target(run_buildexe_im_tpl_win_msvc ) # [Immediate Mode] Tpl example LINUX GCC -add_custom_target(run_buildexe_im_tpl_linux_gcc +add_custom_target(run_buildexe_im_tpl_gcc_linux COMMAND buildexe --help-all COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/tpl_linux.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_gcc_linux.toml WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} VERBATIM USES_TERMINAL ) + +# [Script Mode] Simple example WIN GCC +add_custom_target(run_buildexe_sm_simple_gcc_win + COMMAND buildexe --help-all + COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/sm_simple.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_gcc_win.toml + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + VERBATIM USES_TERMINAL +) + +# [Script Mode] Simple example LINUX GCC +add_custom_target(run_buildexe_sm_simple_gcc_linux + COMMAND buildexe --help-all + COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/sm_simple.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_gcc_linux.toml + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + VERBATIM USES_TERMINAL +) From dc240e31f55289ff66224b8aef756a247c360e87 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 17:42:10 -0800 Subject: [PATCH 15/30] Updated target for ordered lib deps --- .../target/include/target/api/target_info_getter.h | 2 +- .../lib/target/include/target/base/target_storer.h | 7 ++++++- buildcc/lib/target/src/api/lib_api.cpp | 2 +- buildcc/lib/target/src/api/sync_api.cpp | 11 ++++++----- buildcc/lib/target/src/api/target_info_getter.cpp | 5 ++--- .../lib/target/src/target/friend/link_target.cpp | 14 ++++++++++---- buildcc/lib/target/src/target/target_storer.cpp | 3 ++- 7 files changed, 28 insertions(+), 16 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 aa4be8e0..5ab24825 100644 --- a/buildcc/lib/target/include/target/api/target_info_getter.h +++ b/buildcc/lib/target/include/target/api/target_info_getter.h @@ -47,7 +47,7 @@ template class TargetInfoGetter { const internal::fs_unordered_set &GetCurrentSourceFiles() const; const internal::fs_unordered_set &GetCurrentHeaderFiles() const; const internal::fs_unordered_set &GetCurrentPchFiles() const; - const internal::fs_unordered_set &GetTargetLibDeps() const; + const std::vector &GetTargetLibDeps() const; const std::unordered_set &GetCurrentExternalLibDeps() const; const internal::fs_unordered_set &GetCurrentIncludeDirs() const; const internal::fs_unordered_set &GetCurrentLibDirs() const; diff --git a/buildcc/lib/target/include/target/base/target_storer.h b/buildcc/lib/target/include/target/base/target_storer.h index d6ff3996..ec1a7c50 100644 --- a/buildcc/lib/target/include/target/base/target_storer.h +++ b/buildcc/lib/target/include/target/base/target_storer.h @@ -27,11 +27,16 @@ struct TargetStorer { internal::RelationalPathFiles current_source_files; internal::RelationalPathFiles current_header_files; internal::RelationalPathFiles current_pch_files; - internal::RelationalPathFiles current_lib_deps; + + // NOTE, Order matters (BuildCC takes care of the order here) + std::vector current_user_lib_deps; + internal::path_unordered_set current_internal_lib_deps; internal::fs_unordered_set current_include_dirs; internal::fs_unordered_set current_lib_dirs; + // NOTE, Order matters (user takes care of the order here) + // TODO, Update this with vector instead to preserve order! std::unordered_set current_external_lib_deps; std::unordered_set current_preprocessor_flags; diff --git a/buildcc/lib/target/src/api/lib_api.cpp b/buildcc/lib/target/src/api/lib_api.cpp index 5fcd05d5..0fd22af7 100644 --- a/buildcc/lib/target/src/api/lib_api.cpp +++ b/buildcc/lib/target/src/api/lib_api.cpp @@ -41,7 +41,7 @@ template void LibApi::AddLibDep(const Target &lib_dep) { T &t = static_cast(*this); t.state_.ExpectsUnlock(); - t.storer_.current_lib_deps.user.insert(lib_dep.GetTargetPath()); + t.storer_.current_user_lib_deps.push_back(lib_dep.GetTargetPath()); } template void LibApi::AddLibDep(const std::string &lib_dep) { diff --git a/buildcc/lib/target/src/api/sync_api.cpp b/buildcc/lib/target/src/api/sync_api.cpp index 99b06407..54be2287 100644 --- a/buildcc/lib/target/src/api/sync_api.cpp +++ b/buildcc/lib/target/src/api/sync_api.cpp @@ -97,8 +97,8 @@ void SyncApi::SpecializedCopy(TargetType target, std::move(target.storer_.current_pch_files.user); break; case SyncOption::LibDeps: - t.storer_.current_lib_deps.user = - std::move(target.storer_.current_lib_deps.user); + t.storer_.current_user_lib_deps = + std::move(target.storer_.current_user_lib_deps); break; case SyncOption::IncludeDirs: t.storer_.current_include_dirs = @@ -228,9 +228,10 @@ void SyncApi::SpecializedInsert(TargetType target, std::make_move_iterator(target.storer_.current_pch_files.user.end())); break; case SyncOption::LibDeps: - t.storer_.current_lib_deps.user.insert( - std::make_move_iterator(target.storer_.current_lib_deps.user.begin()), - std::make_move_iterator(target.storer_.current_lib_deps.user.end())); + t.storer_.current_user_lib_deps.insert( + t.storer_.current_user_lib_deps.end(), + std::make_move_iterator(target.storer_.current_user_lib_deps.begin()), + std::make_move_iterator(target.storer_.current_user_lib_deps.end())); break; case SyncOption::IncludeDirs: t.storer_.current_include_dirs.insert( diff --git a/buildcc/lib/target/src/api/target_info_getter.cpp b/buildcc/lib/target/src/api/target_info_getter.cpp index 2d413cf8..c4aef5ea 100644 --- a/buildcc/lib/target/src/api/target_info_getter.cpp +++ b/buildcc/lib/target/src/api/target_info_getter.cpp @@ -88,11 +88,10 @@ TargetInfoGetter::GetCurrentPchFiles() const { } template -const internal::fs_unordered_set & -TargetInfoGetter::GetTargetLibDeps() const { +const std::vector &TargetInfoGetter::GetTargetLibDeps() const { const T &t = static_cast(*this); - return t.storer_.current_lib_deps.user; + return t.storer_.current_user_lib_deps; } template diff --git a/buildcc/lib/target/src/target/friend/link_target.cpp b/buildcc/lib/target/src/target/friend/link_target.cpp index ec935194..28945d1e 100644 --- a/buildcc/lib/target/src/target/friend/link_target.cpp +++ b/buildcc/lib/target/src/target/friend/link_target.cpp @@ -41,10 +41,11 @@ void LinkTarget::CacheLinkCommand() { { {kOutput, output_target}, {kCompiledSources, aggregated_compiled_sources}, + // NOTE, This needs to be ORDERED {kLibDeps, fmt::format("{} {}", - internal::aggregate(storer.current_external_lib_deps), - internal::aggregate(storer.current_lib_deps.user))}, + internal::aggregate(storer.current_user_lib_deps), + internal::aggregate(storer.current_external_lib_deps))}, }); } @@ -61,7 +62,10 @@ fs::path LinkTarget::ConstructOutputPath() const { void LinkTarget::PreLink() { auto &storer = target_.storer_; - storer.current_lib_deps.Convert(); + for (const auto &p : storer.current_user_lib_deps) { + storer.current_internal_lib_deps.emplace( + internal::Path::CreateExistingPath(p)); + } storer.current_link_dependencies.Convert(); } @@ -82,8 +86,10 @@ void LinkTarget::BuildLink() { storer.current_external_lib_deps); target_.RecheckPaths(loader.GetLoadedLinkDependencies(), storer.current_link_dependencies.internal); + + // NOTE, This needs to be UNORDERED target_.RecheckPaths(loader.GetLoadedLibDeps(), - storer.current_lib_deps.internal); + storer.current_internal_lib_deps); if (!loader.GetLoadedTargetLinked()) { target_.dirty_ = true; } diff --git a/buildcc/lib/target/src/target/target_storer.cpp b/buildcc/lib/target/src/target/target_storer.cpp index 20f06a0d..951fc899 100644 --- a/buildcc/lib/target/src/target/target_storer.cpp +++ b/buildcc/lib/target/src/target/target_storer.cpp @@ -50,8 +50,9 @@ bool Target::Store() { builder, storer_.current_header_files.internal); auto fbs_pch_files = internal::create_fbs_vector_path( builder, storer_.current_pch_files.internal); + // NOTE, This can be UNORDERED auto fbs_lib_deps = internal::create_fbs_vector_path( - builder, storer_.current_lib_deps.internal); + builder, storer_.current_internal_lib_deps); auto fbs_external_lib_deps = internal::create_fbs_vector_string( builder, storer_.current_external_lib_deps); From cb6aed762f2cde7f9cccba7518651351e69da4f0 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 17:43:11 -0800 Subject: [PATCH 16/30] Updated buildexe for Buildcc compilation from BUILDCC_HOME environment --- buildexe/buildexe.cpp | 72 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/buildexe/buildexe.cpp b/buildexe/buildexe.cpp index 50a27e8a..af649492 100644 --- a/buildexe/buildexe.cpp +++ b/buildexe/buildexe.cpp @@ -16,6 +16,14 @@ #include "buildcc.h" +#include "bootstrap/build_buildcc.h" +#include "bootstrap/build_cli11.h" +#include "bootstrap/build_flatbuffers.h" +#include "bootstrap/build_fmtlib.h" +#include "bootstrap/build_spdlog.h" +#include "bootstrap/build_taskflow.h" +#include "bootstrap/build_tpl.h" + using namespace buildcc; constexpr const char *const kTag = "BuildExe"; @@ -66,6 +74,8 @@ static void setup_arg_target_info(Args &args, ArgTargetInfo &out); static void setup_arg_target_inputs(Args &args, ArgTargetInputs &out); static void host_toolchain_verify(const BaseToolchain &toolchain); +static fs::path get_env_buildcc_home(); + static void user_output_target_cb(BaseTarget &target, const ArgTargetInputs &inputs); @@ -130,21 +140,53 @@ int main(int argc, char **argv) { counter++; } + // TODO, Update Toolchain with VerifiedToolchain + // toolchain.UpdateFrom(verified_toolchain); + if (mode == BuildExeMode::Script) { host_toolchain_verify(toolchain); } + PersistentStorage storage; Target_generic user_output_target(out_targetinfo.name, out_targetinfo.type, toolchain, TargetEnv(out_targetinfo.relative_to_root)); - // if (mode == BuildExeMode::Script) { - // TODO, Compile BuildCC here (and make persistent) - // NOTE, Add to user_output_target - // reg.Callback([&]() { user_output_target.AddLibDep(libbuildcc); }); - // } + if (mode == BuildExeMode::Script) { + // Compile buildcc using the constructed toolchain + fs::path buildcc_home = get_env_buildcc_home(); + auto &buildcc_package = storage.Add( + "BuildccPackage", reg, toolchain, + TargetEnv(buildcc_home / "buildcc", + buildcc_home / "buildcc" / "_build_exe")); + buildcc_package.Setup(custom_toolchain_arg.state); + + // Add buildcc as a dependency to user_output_target + user_output_target.AddLibDep(buildcc_package.GetBuildcc()); + user_output_target.AddLibDep(buildcc_package.GetTpl()); + user_output_target.Insert(buildcc_package.GetBuildcc(), + { + SyncOption::PreprocessorFlags, + SyncOption::CppCompileFlags, + SyncOption::IncludeDirs, + }); + switch (toolchain.GetId()) { + case ToolchainId::Gcc: + case ToolchainId::MinGW: + user_output_target.AddLinkFlag("-Wl,--allow-multiple-definition"); + break; + default: + break; + } + } + reg.Build(custom_toolchain_arg.state, user_output_target_cb, user_output_target, out_targetinputs); + if (mode == BuildExeMode::Script) { + auto &buildcc_package = storage.Ref("BuildccPackage"); + reg.Dep(user_output_target, buildcc_package.GetBuildcc()); + } + // Runners reg.RunBuild(); @@ -250,6 +292,26 @@ int main() { env::log_info(kTag, "*** Toolchain verification done ***"); } +static fs::path get_env_buildcc_home() { + const char *buildcc_home = getenv("BUILDCC_HOME"); + env::assert_fatal(buildcc_home != nullptr, + "BUILDCC_HOME environment variable not defined"); + + // NOTE, Verify BUILDCC_HOME + // auto &buildcc_path = storage.Add("buildcc_path", buildcc_home); + fs::path buildcc_home_path{buildcc_home}; + env::assert_fatal(fs::exists(buildcc_home_path), + "{BUILDCC_HOME} path not found path not found"); + env::assert_fatal(fs::exists(buildcc_home_path / "buildcc"), + "{BUILDCC_HOME}/buildcc path not found"); + env::assert_fatal(fs::exists(buildcc_home_path / "libs"), + "{BUILDCC_HOME}/libs path not found"); + env::assert_fatal(fs::exists(buildcc_home_path / "extensions"), + "{BUILDCC_HOME}/extensions path not found"); + + return buildcc_home_path; +} + static void user_output_target_cb(BaseTarget &target, const ArgTargetInputs &inputs) { for (const auto &s : inputs.source_files) { From 366e0f69f0abcac49d47d6a6f855187c9e5d5fd3 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 18:09:40 -0800 Subject: [PATCH 17/30] Added std::vector for ORDERED storage of external_lib_deps --- .../target/include/target/api/target_info_getter.h | 2 +- .../lib/target/include/target/base/target_storer.h | 4 ++-- buildcc/lib/target/src/api/lib_api.cpp | 2 +- buildcc/lib/target/src/api/sync_api.cpp | 11 ++++++----- buildcc/lib/target/src/api/target_info_getter.cpp | 4 ++-- buildcc/lib/target/src/target/friend/link_target.cpp | 12 ++++++++---- buildcc/lib/target/src/target/target_storer.cpp | 3 ++- 7 files changed, 22 insertions(+), 16 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 5ab24825..6e3b6b52 100644 --- a/buildcc/lib/target/include/target/api/target_info_getter.h +++ b/buildcc/lib/target/include/target/api/target_info_getter.h @@ -48,7 +48,7 @@ template class TargetInfoGetter { const internal::fs_unordered_set &GetCurrentHeaderFiles() const; const internal::fs_unordered_set &GetCurrentPchFiles() const; const std::vector &GetTargetLibDeps() const; - const std::unordered_set &GetCurrentExternalLibDeps() const; + const std::vector &GetCurrentExternalLibDeps() const; const internal::fs_unordered_set &GetCurrentIncludeDirs() const; const internal::fs_unordered_set &GetCurrentLibDirs() const; const std::unordered_set &GetCurrentPreprocessorFlags() const; diff --git a/buildcc/lib/target/include/target/base/target_storer.h b/buildcc/lib/target/include/target/base/target_storer.h index ec1a7c50..b12f5dde 100644 --- a/buildcc/lib/target/include/target/base/target_storer.h +++ b/buildcc/lib/target/include/target/base/target_storer.h @@ -36,8 +36,8 @@ struct TargetStorer { internal::fs_unordered_set current_lib_dirs; // NOTE, Order matters (user takes care of the order here) - // TODO, Update this with vector instead to preserve order! - std::unordered_set current_external_lib_deps; + std::vector current_user_external_lib_deps; + std::unordered_set current_internal_external_lib_deps; std::unordered_set current_preprocessor_flags; std::unordered_set current_common_compile_flags; diff --git a/buildcc/lib/target/src/api/lib_api.cpp b/buildcc/lib/target/src/api/lib_api.cpp index 0fd22af7..55eca4b1 100644 --- a/buildcc/lib/target/src/api/lib_api.cpp +++ b/buildcc/lib/target/src/api/lib_api.cpp @@ -48,7 +48,7 @@ template void LibApi::AddLibDep(const std::string &lib_dep) { T &t = static_cast(*this); t.state_.ExpectsUnlock(); - t.storer_.current_external_lib_deps.insert(lib_dep); + t.storer_.current_user_external_lib_deps.push_back(lib_dep); } template class LibApi; diff --git a/buildcc/lib/target/src/api/sync_api.cpp b/buildcc/lib/target/src/api/sync_api.cpp index 54be2287..80746dd0 100644 --- a/buildcc/lib/target/src/api/sync_api.cpp +++ b/buildcc/lib/target/src/api/sync_api.cpp @@ -108,8 +108,8 @@ void SyncApi::SpecializedCopy(TargetType target, t.storer_.current_lib_dirs = std::move(target.storer_.current_lib_dirs); break; case SyncOption::ExternalLibDeps: - t.storer_.current_external_lib_deps = - std::move(target.storer_.current_external_lib_deps); + t.storer_.current_user_external_lib_deps = + std::move(target.storer_.current_user_external_lib_deps); break; default: env::assert_fatal("Invalid Option added"); @@ -244,11 +244,12 @@ void SyncApi::SpecializedInsert(TargetType target, std::make_move_iterator(target.storer_.current_lib_dirs.end())); break; case SyncOption::ExternalLibDeps: - t.storer_.current_external_lib_deps.insert( + t.storer_.current_user_external_lib_deps.insert( + t.storer_.current_user_external_lib_deps.end(), std::make_move_iterator( - target.storer_.current_external_lib_deps.begin()), + target.storer_.current_user_external_lib_deps.begin()), std::make_move_iterator( - target.storer_.current_external_lib_deps.end())); + target.storer_.current_user_external_lib_deps.end())); break; default: env::assert_fatal("Invalid Option added"); diff --git a/buildcc/lib/target/src/api/target_info_getter.cpp b/buildcc/lib/target/src/api/target_info_getter.cpp index c4aef5ea..4383401b 100644 --- a/buildcc/lib/target/src/api/target_info_getter.cpp +++ b/buildcc/lib/target/src/api/target_info_getter.cpp @@ -95,11 +95,11 @@ const std::vector &TargetInfoGetter::GetTargetLibDeps() const { } template -const std::unordered_set & +const std::vector & TargetInfoGetter::GetCurrentExternalLibDeps() const { const T &t = static_cast(*this); - return t.storer_.current_external_lib_deps; + return t.storer_.current_user_external_lib_deps; } template diff --git a/buildcc/lib/target/src/target/friend/link_target.cpp b/buildcc/lib/target/src/target/friend/link_target.cpp index 28945d1e..d3f7908c 100644 --- a/buildcc/lib/target/src/target/friend/link_target.cpp +++ b/buildcc/lib/target/src/target/friend/link_target.cpp @@ -43,9 +43,9 @@ void LinkTarget::CacheLinkCommand() { {kCompiledSources, aggregated_compiled_sources}, // NOTE, This needs to be ORDERED {kLibDeps, - fmt::format("{} {}", - internal::aggregate(storer.current_user_lib_deps), - internal::aggregate(storer.current_external_lib_deps))}, + fmt::format( + "{} {}", internal::aggregate(storer.current_user_lib_deps), + internal::aggregate(storer.current_user_external_lib_deps))}, }); } @@ -67,6 +67,10 @@ void LinkTarget::PreLink() { internal::Path::CreateExistingPath(p)); } + storer.current_internal_external_lib_deps.insert( + storer.current_user_external_lib_deps.begin(), + storer.current_user_external_lib_deps.end()); + storer.current_link_dependencies.Convert(); } @@ -83,7 +87,7 @@ void LinkTarget::BuildLink() { target_.GetCurrentLinkFlags()); target_.RecheckDirs(loader.GetLoadedLibDirs(), target_.GetCurrentLibDirs()); target_.RecheckExternalLib(loader.GetLoadedExternalLibDeps(), - storer.current_external_lib_deps); + storer.current_internal_external_lib_deps); target_.RecheckPaths(loader.GetLoadedLinkDependencies(), storer.current_link_dependencies.internal); diff --git a/buildcc/lib/target/src/target/target_storer.cpp b/buildcc/lib/target/src/target/target_storer.cpp index 951fc899..cf76ff9f 100644 --- a/buildcc/lib/target/src/target/target_storer.cpp +++ b/buildcc/lib/target/src/target/target_storer.cpp @@ -54,8 +54,9 @@ bool Target::Store() { auto fbs_lib_deps = internal::create_fbs_vector_path( builder, storer_.current_internal_lib_deps); + // NOTE, This can be UNORDERED auto fbs_external_lib_deps = internal::create_fbs_vector_string( - builder, storer_.current_external_lib_deps); + builder, storer_.current_internal_external_lib_deps); auto fbs_include_dirs = internal::create_fbs_vector_string(builder, storer_.current_include_dirs); From 6d54106cfb5d3aea05561d2ba66aaa35efcb31ef Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 18:37:02 -0800 Subject: [PATCH 18/30] Updated buildexe with ArgScriptInfo for configs --- buildexe/buildexe.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/buildexe/buildexe.cpp b/buildexe/buildexe.cpp index af649492..f58e710f 100644 --- a/buildexe/buildexe.cpp +++ b/buildexe/buildexe.cpp @@ -57,6 +57,10 @@ struct ArgTargetInputs { std::vector link_flags; }; +struct ArgScriptInfo { + std::vector configs; +}; + static const std::unordered_map kTargetTypeMap{ {"executable", TargetType::Executable}, {"staticLibrary", TargetType::StaticLibrary}, @@ -72,6 +76,8 @@ static void clean_cb(); static void setup_arg_target_info(Args &args, ArgTargetInfo &out); static void setup_arg_target_inputs(Args &args, ArgTargetInputs &out); +static void setup_arg_script_mode(Args &args, ArgScriptInfo &out); + static void host_toolchain_verify(const BaseToolchain &toolchain); static fs::path get_env_buildcc_home(); @@ -104,6 +110,11 @@ int main(int argc, char **argv) { ArgTargetInputs out_targetinputs; setup_arg_target_inputs(args, out_targetinputs); + ArgScriptInfo out_scriptinfo; + setup_arg_script_mode(args, out_scriptinfo); + + // script mode specific arguments + // TODO, Add buildcc (git cloned) // TODO, Add libraries (git cloned) // TODO, Add extension (git cloned) @@ -190,6 +201,26 @@ int main(int argc, char **argv) { // Runners reg.RunBuild(); + // Run + if (mode == BuildExeMode::Script) { + std::vector configs; + for (const auto &c : out_scriptinfo.configs) { + std::string config = fmt::format("--config {}", c); + configs.push_back(config); + } + std::string aggregated_configs = fmt::format("{}", fmt::join(configs, " ")); + + env::Command command; + std::string command_str = command.Construct( + "{executable} {configs}", + { + {"executable", + fmt::format("{}", user_output_target.GetTargetPath())}, + {"configs", aggregated_configs}, + }); + env::Command::Execute(command_str); + } + // - Clang Compile Commands plugin::ClangCompileCommands({&user_output_target}).Generate(); @@ -241,6 +272,12 @@ static void setup_arg_target_inputs(Args &args, ArgTargetInputs &out) { app.add_option("--link_flags", out.link_flags, "Provide Link Flags"); } +static void setup_arg_script_mode(Args &args, ArgScriptInfo &out) { + auto *script_args = args.Ref().add_subcommand("script"); + script_args->add_option("--configs", out.configs, + "Config files for script mode"); +} + static void host_toolchain_verify(const BaseToolchain &toolchain) { env::log_info(kTag, "*** Starting Toolchain verification ***"); From fdfddf61bd71adb611bf39a6641e52e20328dc66 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 18:37:44 -0800 Subject: [PATCH 19/30] Updated sm_hybrid_simple example --- buildexe/CMakeLists.txt | 4 ++-- buildexe/example_configs/sm_simple.toml | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/buildexe/CMakeLists.txt b/buildexe/CMakeLists.txt index e9bcbb8b..9f799366 100644 --- a/buildexe/CMakeLists.txt +++ b/buildexe/CMakeLists.txt @@ -49,7 +49,7 @@ add_custom_target(run_buildexe_im_tpl_gcc_linux add_custom_target(run_buildexe_sm_simple_gcc_win COMMAND buildexe --help-all COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/sm_simple.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_gcc_win.toml - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../example/hybrid/simple VERBATIM USES_TERMINAL ) @@ -57,6 +57,6 @@ add_custom_target(run_buildexe_sm_simple_gcc_win add_custom_target(run_buildexe_sm_simple_gcc_linux COMMAND buildexe --help-all COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/sm_simple.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_gcc_linux.toml - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../example/hybrid/simple VERBATIM USES_TERMINAL ) diff --git a/buildexe/example_configs/sm_simple.toml b/buildexe/example_configs/sm_simple.toml index b59c3078..d1993cd7 100644 --- a/buildexe/example_configs/sm_simple.toml +++ b/buildexe/example_configs/sm_simple.toml @@ -1,5 +1,5 @@ -root_dir = ".." -build_dir = "../_build_buildexe_simple" +root_dir = "" +build_dir = "_build_buildexe_simple" loglevel = "debug" clean = false @@ -16,7 +16,10 @@ mode = "script" # [build.info] name = "simple" type = "executable" -relative_to_root = "example/hybrid/simple" +relative_to_root = "" # [build.inputs] srcs = ["build.cpp"] + +[script] +configs = ["build_linux.toml"] From 2d5fb479d8c0044d8831e63d003a37fa714bb343 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 19:34:47 -0800 Subject: [PATCH 20/30] Update main.buildcc.cpp --- bootstrap/main.buildcc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap/main.buildcc.cpp b/bootstrap/main.buildcc.cpp index a51e5bda..ee26e955 100644 --- a/bootstrap/main.buildcc.cpp +++ b/bootstrap/main.buildcc.cpp @@ -75,6 +75,7 @@ static void clean_cb() {} static void hybrid_simple_example_cb(BaseTarget &target, const BaseTarget &libbuildcc) { + target.AddLibDep(libbuildcc); target.Insert(libbuildcc, { SyncOption::PreprocessorFlags, SyncOption::CppCompileFlags, @@ -85,6 +86,5 @@ static void hybrid_simple_example_cb(BaseTarget &target, SyncOption::ExternalLibDeps, }); target.AddSource("build.cpp"); - target.AddLibDep(libbuildcc); target.Build(); } From e7b2aa18886a221a7cc37aecd60852c5f406c9de Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 19:45:10 -0800 Subject: [PATCH 21/30] Update buildexe.cpp --- buildexe/buildexe.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/buildexe/buildexe.cpp b/buildexe/buildexe.cpp index f58e710f..36738ead 100644 --- a/buildexe/buildexe.cpp +++ b/buildexe/buildexe.cpp @@ -173,12 +173,16 @@ int main(int argc, char **argv) { // Add buildcc as a dependency to user_output_target user_output_target.AddLibDep(buildcc_package.GetBuildcc()); - user_output_target.AddLibDep(buildcc_package.GetTpl()); user_output_target.Insert(buildcc_package.GetBuildcc(), { SyncOption::PreprocessorFlags, SyncOption::CppCompileFlags, SyncOption::IncludeDirs, + SyncOption::LinkFlags, + SyncOption::HeaderFiles, + SyncOption::IncludeDirs, + SyncOption::LibDeps, + SyncOption::ExternalLibDeps, }); switch (toolchain.GetId()) { case ToolchainId::Gcc: From e9be31e334037b89f0d3ad8ee1777fdce5d008f9 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 19:59:55 -0800 Subject: [PATCH 22/30] Update linux_gcc_cmake_build.yml --- .github/workflows/linux_gcc_cmake_build.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/linux_gcc_cmake_build.yml b/.github/workflows/linux_gcc_cmake_build.yml index 0d339a6f..8f4b6e8a 100644 --- a/.github/workflows/linux_gcc_cmake_build.yml +++ b/.github/workflows/linux_gcc_cmake_build.yml @@ -71,7 +71,12 @@ jobs: - name: BuildExe IM example tiny-process-library working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_ALL}} run: | - cmake --build . --target run_buildexe_im_tpl_linux_gcc + cmake --build . --target run_buildexe_im_tpl_gcc_linux + + - name: BuildExe SM simple hyrid example + working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_ALL}} + run: | + cmake --build . --target run_buildexe_sm_simple_gcc_linux - name: Install working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_ALL}} @@ -192,7 +197,12 @@ jobs: - name: BuildExe IM example tiny-process-library working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_SINGLE}} run: | - cmake --build . --target run_buildexe_im_tpl_linux_gcc + cmake --build . --target run_buildexe_im_tpl_gcc_linux + + - name: BuildExe SM simple hyrid example + working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_SINGLE}} + run: | + cmake --build . --target run_buildexe_sm_simple_gcc_linux - name: Install working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_SINGLE}} From 680d2323b09ada651754593c5026ef1ddd9747ba Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 20:19:03 -0800 Subject: [PATCH 23/30] Updated build files for buildexe --- buildexe/CMakeLists.txt | 12 +++++++-- .../{sm_simple.toml => sm_simple_linux.toml} | 0 buildexe/example_configs/sm_simple_win.toml | 25 +++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) rename buildexe/example_configs/{sm_simple.toml => sm_simple_linux.toml} (100%) create mode 100644 buildexe/example_configs/sm_simple_win.toml diff --git a/buildexe/CMakeLists.txt b/buildexe/CMakeLists.txt index 9f799366..cd4bc7d8 100644 --- a/buildexe/CMakeLists.txt +++ b/buildexe/CMakeLists.txt @@ -48,7 +48,15 @@ add_custom_target(run_buildexe_im_tpl_gcc_linux # [Script Mode] Simple example WIN GCC add_custom_target(run_buildexe_sm_simple_gcc_win COMMAND buildexe --help-all - COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/sm_simple.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_gcc_win.toml + COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/sm_simple_linux.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_gcc_win.toml + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../example/hybrid/simple + VERBATIM USES_TERMINAL +) + +# [Script Mode] Simple example WIN MSVC +add_custom_target(run_buildexe_sm_simple_msvc_win + COMMAND buildexe --help-all + COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/sm_simple_win.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_msvc_win.toml WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../example/hybrid/simple VERBATIM USES_TERMINAL ) @@ -56,7 +64,7 @@ add_custom_target(run_buildexe_sm_simple_gcc_win # [Script Mode] Simple example LINUX GCC add_custom_target(run_buildexe_sm_simple_gcc_linux COMMAND buildexe --help-all - COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/sm_simple.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_gcc_linux.toml + COMMAND buildexe --config ${CMAKE_CURRENT_SOURCE_DIR}/example_configs/sm_simple_linux.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_gcc_linux.toml WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../example/hybrid/simple VERBATIM USES_TERMINAL ) diff --git a/buildexe/example_configs/sm_simple.toml b/buildexe/example_configs/sm_simple_linux.toml similarity index 100% rename from buildexe/example_configs/sm_simple.toml rename to buildexe/example_configs/sm_simple_linux.toml diff --git a/buildexe/example_configs/sm_simple_win.toml b/buildexe/example_configs/sm_simple_win.toml new file mode 100644 index 00000000..f76d2d04 --- /dev/null +++ b/buildexe/example_configs/sm_simple_win.toml @@ -0,0 +1,25 @@ +root_dir = "" +build_dir = "_build_buildexe_simple" + +loglevel = "debug" +clean = false + +# TODO, verification +# [verification] +# os = ["win", "linux"] + +# BuildExe run mode +# mode = "immediate" +mode = "script" + +# Target information +# [build.info] +name = "simple" +type = "executable" +relative_to_root = "" + +# [build.inputs] +srcs = ["build.cpp"] + +[script] +configs = ["build_win.toml"] From ef6d52adc44f7954d74be1683f8ba9c49e079a10 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 20:23:52 -0800 Subject: [PATCH 24/30] Update win_cmake_build.yml --- .github/workflows/win_cmake_build.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/win_cmake_build.yml b/.github/workflows/win_cmake_build.yml index b3a16ea2..d16c310e 100644 --- a/.github/workflows/win_cmake_build.yml +++ b/.github/workflows/win_cmake_build.yml @@ -58,7 +58,12 @@ jobs: - name: BuildExe IM example tiny-process-library working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} run: | - cmake --build . --config Release --target run_buildexe_im_tpl_win_msvc + cmake --build . --config Release --target run_buildexe_im_tpl_msvc_win + + - name: BuildExe SM simple hyrid example + working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} + run: | + cmake --build . --config Release --target run_buildexe_sm_simple_msvc_win - name: Install working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} From 0515a576f9327c2f1b850a2c6a73096e393b0564 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 20:40:49 -0800 Subject: [PATCH 25/30] Updated github ci/cd with environment variable BUILDCC_HOME --- .github/workflows/linux_gcc_cmake_build.yml | 1 + .github/workflows/win_cmake_build.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/linux_gcc_cmake_build.yml b/.github/workflows/linux_gcc_cmake_build.yml index 8f4b6e8a..c2c9bb9e 100644 --- a/.github/workflows/linux_gcc_cmake_build.yml +++ b/.github/workflows/linux_gcc_cmake_build.yml @@ -202,6 +202,7 @@ jobs: - name: BuildExe SM simple hyrid example working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_SINGLE}} run: | + export BUILDCC_HOME="${{github.workspace}}" cmake --build . --target run_buildexe_sm_simple_gcc_linux - name: Install diff --git a/.github/workflows/win_cmake_build.yml b/.github/workflows/win_cmake_build.yml index d16c310e..c397bb8d 100644 --- a/.github/workflows/win_cmake_build.yml +++ b/.github/workflows/win_cmake_build.yml @@ -63,6 +63,7 @@ jobs: - name: BuildExe SM simple hyrid example working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} run: | + $env:BUILDCC_HOME = "${{github.workspace}}" cmake --build . --config Release --target run_buildexe_sm_simple_msvc_win - name: Install From aad9972b62053ff640ce6ee5c87d33220b090150 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 21:11:19 -0800 Subject: [PATCH 26/30] Upload BuildExe artifacts --- .github/workflows/linux_gcc_cmake_build.yml | 17 +++++++---------- .github/workflows/win_cmake_build.yml | 12 +++++++----- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/.github/workflows/linux_gcc_cmake_build.yml b/.github/workflows/linux_gcc_cmake_build.yml index c2c9bb9e..a9ff625c 100644 --- a/.github/workflows/linux_gcc_cmake_build.yml +++ b/.github/workflows/linux_gcc_cmake_build.yml @@ -73,11 +73,6 @@ jobs: run: | cmake --build . --target run_buildexe_im_tpl_gcc_linux - - name: BuildExe SM simple hyrid example - working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_ALL}} - run: | - cmake --build . --target run_buildexe_sm_simple_gcc_linux - - name: Install working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_ALL}} run: | @@ -199,11 +194,13 @@ jobs: run: | cmake --build . --target run_buildexe_im_tpl_gcc_linux - - name: BuildExe SM simple hyrid example - working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_SINGLE}} - run: | - export BUILDCC_HOME="${{github.workspace}}" - cmake --build . --target run_buildexe_sm_simple_gcc_linux + # - name: TODO, BuildExe SM simple hyrid example + + - name: Upload BuildExe + uses: actions/upload-artifact@v2 + with: + name: "BuildExe_Linux" + path: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_SINGLE}}/buildexe/buildexe - name: Install working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_SINGLE}} diff --git a/.github/workflows/win_cmake_build.yml b/.github/workflows/win_cmake_build.yml index c397bb8d..2e3df6bc 100644 --- a/.github/workflows/win_cmake_build.yml +++ b/.github/workflows/win_cmake_build.yml @@ -60,11 +60,13 @@ jobs: run: | cmake --build . --config Release --target run_buildexe_im_tpl_msvc_win - - name: BuildExe SM simple hyrid example - working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} - run: | - $env:BUILDCC_HOME = "${{github.workspace}}" - cmake --build . --config Release --target run_buildexe_sm_simple_msvc_win + # - name: TODO, BuildExe SM simple hyrid example + + - name: Upload BuildExe + uses: actions/upload-artifact@v2 + with: + name: "BuildExe_Win" + path: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}}/buildexe/buildexe.exe - name: Install working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} From 60375cdd710d72ad05c0db73c07513ad82cadcc8 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Fri, 10 Dec 2021 21:33:05 -0800 Subject: [PATCH 27/30] Update win_cmake_build.yml --- .github/workflows/win_cmake_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/win_cmake_build.yml b/.github/workflows/win_cmake_build.yml index 2e3df6bc..32987a40 100644 --- a/.github/workflows/win_cmake_build.yml +++ b/.github/workflows/win_cmake_build.yml @@ -66,7 +66,7 @@ jobs: uses: actions/upload-artifact@v2 with: name: "BuildExe_Win" - path: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}}/buildexe/buildexe.exe + path: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}}/buildexe/Release/buildexe.exe - name: Install working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} From fc24c7a6953ca605536b1949a1a95b61ad181b1f Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sat, 11 Dec 2021 13:35:27 -0800 Subject: [PATCH 28/30] Updated toolchain_verify.cpp --- buildcc/lib/toolchain/src/api/toolchain_verify.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp index 9e93c65d..9d72cb5d 100644 --- a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp +++ b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp @@ -209,11 +209,16 @@ ToolchainVerify::Verify(const VerifyToolchainConfig &config) { // For each directory, Check if ALL toolchain filenames are found for (const auto &dir_iter : fs::directory_iterator(p)) { - if (!dir_iter.is_regular_file()) { - continue; + try { + if (!dir_iter.is_regular_file()) { + continue; + } + const auto &filename = dir_iter.path().filename().string(); + matcher.Check(filename); + } catch (const std::exception &e) { + // NOTE, Certain paths might not be accessible i.e restricted + env::log_critical(__FUNCTION__, e.what()); } - const auto &filename = dir_iter.path().filename().string(); - matcher.Check(filename); } // Store verified toolchain path if found From 228b68c80cad2100d0390a1b6bec8ec0ad813d3a Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sat, 11 Dec 2021 16:43:09 -0800 Subject: [PATCH 29/30] Updated toolchain verify for edge error cases --- .../toolchain/src/api/toolchain_verify.cpp | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp index 9d72cb5d..1afcf998 100644 --- a/buildcc/lib/toolchain/src/api/toolchain_verify.cpp +++ b/buildcc/lib/toolchain/src/api/toolchain_verify.cpp @@ -20,6 +20,8 @@ #include #include +#include + #include "toolchain/toolchain.h" #include "env/assert_fatal.h" @@ -207,18 +209,20 @@ ToolchainVerify::Verify(const VerifyToolchainConfig &config) { continue; } + std::error_code ec; + auto directory_iterator = fs::directory_iterator(p, ec); + if (ec) { + continue; + } + // For each directory, Check if ALL toolchain filenames are found - for (const auto &dir_iter : fs::directory_iterator(p)) { - try { - if (!dir_iter.is_regular_file()) { - continue; - } - const auto &filename = dir_iter.path().filename().string(); - matcher.Check(filename); - } catch (const std::exception &e) { - // NOTE, Certain paths might not be accessible i.e restricted - env::log_critical(__FUNCTION__, e.what()); + for (const auto &dir_iter : directory_iterator) { + bool is_regular_file = dir_iter.is_regular_file(ec); + if (!is_regular_file || ec) { + continue; } + const auto &filename = dir_iter.path().filename().string(); + matcher.Check(filename); } // Store verified toolchain path if found From 24d993fb24c17ab6ae037ab3819f54fae3e0f68d Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sat, 11 Dec 2021 16:43:34 -0800 Subject: [PATCH 30/30] Updated test_toolchain_verify unit test --- .../toolchain/test/test_toolchain_verify.cpp | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/buildcc/lib/toolchain/test/test_toolchain_verify.cpp b/buildcc/lib/toolchain/test/test_toolchain_verify.cpp index 4a92e7cc..451bcc54 100644 --- a/buildcc/lib/toolchain/test/test_toolchain_verify.cpp +++ b/buildcc/lib/toolchain/test/test_toolchain_verify.cpp @@ -176,6 +176,34 @@ TEST(ToolchainTestGroup, VerifyToolchain_PathContainsDir) { CHECK_TRUE(verified_toolchains.empty()); } +TEST(ToolchainTestGroup, VerifyToolchain_LockedFolder) { + std::error_code err; + fs::permissions(fs::current_path() / "toolchains" / "gcc", fs::perms::none, + err); + if (err) { + FAIL_TEST("Could not set file permissions"); + } + + 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()); + + std::vector verified_toolchains = + gcc.Verify(config); + UT_PRINT(std::to_string(verified_toolchains.size()).c_str()); + CHECK_TRUE(verified_toolchains.empty()); + + fs::permissions(fs::current_path() / "toolchains" / "gcc", fs::perms::all, + err); + if (err) { + FAIL_TEST("Could not set file permissions"); + } +} + int main(int ac, char **av) { buildcc::env::m::VectorStringCopier copier; mock().installCopier(TEST_VECTOR_STRING_TYPE, copier);