From a1abee19d1ea992b43427d13675867adbdb34b71 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sat, 8 Jan 2022 08:17:40 -0800 Subject: [PATCH 01/29] Added BuildccHome class --- buildexe/include/buildexe/build_env_setup.h | 34 +++++++++++++++++++++ buildexe/src/build_env_setup.cpp | 33 ++++++++++++-------- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/buildexe/include/buildexe/build_env_setup.h b/buildexe/include/buildexe/build_env_setup.h index 4cc219d5..234da81a 100644 --- a/buildexe/include/buildexe/build_env_setup.h +++ b/buildexe/include/buildexe/build_env_setup.h @@ -24,6 +24,40 @@ namespace buildcc { +class BuildccHome { +public: + static void Init(); + + static const fs::path &GetBuildccHomeDir() { + ExpectInitialized(); + return buildcc_home_; + } + static const fs::path &GetBuildccBaseDir() { + ExpectInitialized(); + return buildcc_base_; + } + static const fs::path &GetBuildccLibsDir() { + ExpectInitialized(); + return buildcc_libs_; + } + static const fs::path &GetBuildccExtensionsDir() { + ExpectInitialized(); + return buildcc_extensions_; + } + + static bool IsInitialized() { return initialized_; } + static void ExpectInitialized() { + env::assert_fatal(IsInitialized(), "BuildccHome is not initialized"); + } + +private: + static fs::path buildcc_home_; + static fs::path buildcc_base_; + static fs::path buildcc_libs_; + static fs::path buildcc_extensions_; + static bool initialized_; +}; + class BuildEnvSetup { public: static constexpr const char *const kBuildccPackageName = "BuildccPackage"; diff --git a/buildexe/src/build_env_setup.cpp b/buildexe/src/build_env_setup.cpp index 1c65d8c1..0b497ead 100644 --- a/buildexe/src/build_env_setup.cpp +++ b/buildexe/src/build_env_setup.cpp @@ -18,24 +18,34 @@ namespace buildcc { -static fs::path get_env_buildcc_home() { +fs::path BuildccHome::buildcc_home_{""}; +fs::path BuildccHome::buildcc_base_{""}; +fs::path BuildccHome::buildcc_libs_{""}; +fs::path BuildccHome::buildcc_extensions_{""}; +bool BuildccHome::initialized_{false}; + +void BuildccHome::Init() { + env::assert_fatal(!initialized_, "BuildccHome is already initialized"); + 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"); - env::assert_fatal(fs::exists(buildcc_home_path / "buildcc"), + buildcc_home_ = fs::path(buildcc_home); + buildcc_base_ = buildcc_home_ / "buildcc"; + buildcc_libs_ = buildcc_home_ / "libs"; + buildcc_extensions_ = buildcc_home_ / "extensions"; + + env::assert_fatal(fs::exists(buildcc_home_), "{BUILDCC_HOME} path not found"); + env::assert_fatal(fs::exists(buildcc_base_), "{BUILDCC_HOME}/buildcc path not found"); - env::assert_fatal(fs::exists(buildcc_home_path / "libs"), + env::assert_fatal(fs::exists(buildcc_libs_), "{BUILDCC_HOME}/libs path not found"); - env::assert_fatal(fs::exists(buildcc_home_path / "extensions"), + env::assert_fatal(fs::exists(buildcc_extensions_), "{BUILDCC_HOME}/extensions path not found"); - return buildcc_home_path; + initialized_ = true; } void BuildEnvSetup::ConstructUserTarget() { @@ -80,11 +90,10 @@ void BuildEnvSetup::DepUserTargetOnBuildcc() { } void BuildEnvSetup::BuildccTargetSetup() { - fs::path buildcc_home = get_env_buildcc_home(); + const fs::path &buildcc_base = BuildccHome::GetBuildccBaseDir(); auto &buildcc_package = storage_.Add( kBuildccPackageName, reg_, toolchain_, - TargetEnv(buildcc_home / "buildcc", - buildcc_home / "buildcc" / "_build_exe")); + TargetEnv(buildcc_base, buildcc_base / "_build_exe")); buildcc_package.Setup(state_); } From f580c7ddde60516479b6925bd7e49a8eaa01b310 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sat, 8 Jan 2022 08:34:45 -0800 Subject: [PATCH 02/29] Added build_env_home.h/.cpp --- buildexe/CMakeLists.txt | 3 ++ buildexe/include/buildexe/build_env_home.h | 60 ++++++++++++++++++++++ buildexe/src/build_env_home.cpp | 51 ++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 buildexe/include/buildexe/build_env_home.h create mode 100644 buildexe/src/build_env_home.cpp diff --git a/buildexe/CMakeLists.txt b/buildexe/CMakeLists.txt index 51ba908c..d48289cd 100644 --- a/buildexe/CMakeLists.txt +++ b/buildexe/CMakeLists.txt @@ -1,6 +1,9 @@ add_executable(buildexe buildexe.cpp + src/build_env_home.cpp + include/buildexe/build_env_home.h + src/args_setup.cpp include/buildexe/args_setup.h diff --git a/buildexe/include/buildexe/build_env_home.h b/buildexe/include/buildexe/build_env_home.h new file mode 100644 index 00000000..03911e6f --- /dev/null +++ b/buildexe/include/buildexe/build_env_home.h @@ -0,0 +1,60 @@ +/* + * 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. + */ + +#ifndef BUILDEXE_BUILD_ENV_HOME_H_ +#define BUILDEXE_BUILD_ENV_HOME_H_ + +#include "buildcc.h" + +namespace buildcc { + +class BuildccHome { +public: + static void Init(); + + static const fs::path &GetBuildccHomeDir() { + ExpectInitialized(); + return buildcc_home_; + } + static const fs::path &GetBuildccBaseDir() { + ExpectInitialized(); + return buildcc_base_; + } + static const fs::path &GetBuildccLibsDir() { + ExpectInitialized(); + return buildcc_libs_; + } + static const fs::path &GetBuildccExtensionsDir() { + ExpectInitialized(); + return buildcc_extensions_; + } + + static bool IsInitialized() { return initialized_; } + static void ExpectInitialized() { + env::assert_fatal(IsInitialized(), "BuildccHome is not initialized"); + } + +private: + static fs::path buildcc_home_; + static fs::path buildcc_base_; + static fs::path buildcc_libs_; + static fs::path buildcc_extensions_; + static bool initialized_; +}; + +} // namespace buildcc + +#endif diff --git a/buildexe/src/build_env_home.cpp b/buildexe/src/build_env_home.cpp new file mode 100644 index 00000000..503258dc --- /dev/null +++ b/buildexe/src/build_env_home.cpp @@ -0,0 +1,51 @@ +/* + * 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 "buildexe/build_env_home.h" + +namespace buildcc { + +fs::path BuildccHome::buildcc_home_{""}; +fs::path BuildccHome::buildcc_base_{""}; +fs::path BuildccHome::buildcc_libs_{""}; +fs::path BuildccHome::buildcc_extensions_{""}; +bool BuildccHome::initialized_{false}; + +void BuildccHome::Init() { + env::assert_fatal(!initialized_, "BuildccHome is already initialized"); + + const char *buildcc_home = getenv("BUILDCC_HOME"); + env::assert_fatal(buildcc_home != nullptr, + "BUILDCC_HOME environment variable not defined"); + + // NOTE, Verify BUILDCC_HOME + buildcc_home_ = fs::path(buildcc_home); + buildcc_base_ = buildcc_home_ / "buildcc"; + buildcc_libs_ = buildcc_home_ / "libs"; + buildcc_extensions_ = buildcc_home_ / "extensions"; + + env::assert_fatal(fs::exists(buildcc_home_), "{BUILDCC_HOME} path not found"); + env::assert_fatal(fs::exists(buildcc_base_), + "{BUILDCC_HOME}/buildcc path not found"); + env::assert_fatal(fs::exists(buildcc_libs_), + "{BUILDCC_HOME}/libs path not found"); + env::assert_fatal(fs::exists(buildcc_extensions_), + "{BUILDCC_HOME}/extensions path not found"); + + initialized_ = true; +} + +} // namespace buildcc From c7a17959691069098c3d508917d5b6bc58c48e14 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sat, 8 Jan 2022 08:35:32 -0800 Subject: [PATCH 03/29] Updated build_env_setup.h/.cpp --- buildexe/include/buildexe/build_env_setup.h | 35 +-------------------- buildexe/src/build_env_setup.cpp | 31 +----------------- 2 files changed, 2 insertions(+), 64 deletions(-) diff --git a/buildexe/include/buildexe/build_env_setup.h b/buildexe/include/buildexe/build_env_setup.h index 234da81a..91fad608 100644 --- a/buildexe/include/buildexe/build_env_setup.h +++ b/buildexe/include/buildexe/build_env_setup.h @@ -20,44 +20,11 @@ #include "buildcc.h" #include "bootstrap/build_buildcc.h" + #include "buildexe/args_setup.h" namespace buildcc { -class BuildccHome { -public: - static void Init(); - - static const fs::path &GetBuildccHomeDir() { - ExpectInitialized(); - return buildcc_home_; - } - static const fs::path &GetBuildccBaseDir() { - ExpectInitialized(); - return buildcc_base_; - } - static const fs::path &GetBuildccLibsDir() { - ExpectInitialized(); - return buildcc_libs_; - } - static const fs::path &GetBuildccExtensionsDir() { - ExpectInitialized(); - return buildcc_extensions_; - } - - static bool IsInitialized() { return initialized_; } - static void ExpectInitialized() { - env::assert_fatal(IsInitialized(), "BuildccHome is not initialized"); - } - -private: - static fs::path buildcc_home_; - static fs::path buildcc_base_; - static fs::path buildcc_libs_; - static fs::path buildcc_extensions_; - static bool initialized_; -}; - class BuildEnvSetup { public: static constexpr const char *const kBuildccPackageName = "BuildccPackage"; diff --git a/buildexe/src/build_env_setup.cpp b/buildexe/src/build_env_setup.cpp index 0b497ead..dad2e326 100644 --- a/buildexe/src/build_env_setup.cpp +++ b/buildexe/src/build_env_setup.cpp @@ -15,39 +15,10 @@ */ #include "buildexe/build_env_setup.h" +#include "buildexe/build_env_home.h" namespace buildcc { -fs::path BuildccHome::buildcc_home_{""}; -fs::path BuildccHome::buildcc_base_{""}; -fs::path BuildccHome::buildcc_libs_{""}; -fs::path BuildccHome::buildcc_extensions_{""}; -bool BuildccHome::initialized_{false}; - -void BuildccHome::Init() { - env::assert_fatal(!initialized_, "BuildccHome is already initialized"); - - const char *buildcc_home = getenv("BUILDCC_HOME"); - env::assert_fatal(buildcc_home != nullptr, - "BUILDCC_HOME environment variable not defined"); - - // NOTE, Verify BUILDCC_HOME - buildcc_home_ = fs::path(buildcc_home); - buildcc_base_ = buildcc_home_ / "buildcc"; - buildcc_libs_ = buildcc_home_ / "libs"; - buildcc_extensions_ = buildcc_home_ / "extensions"; - - env::assert_fatal(fs::exists(buildcc_home_), "{BUILDCC_HOME} path not found"); - env::assert_fatal(fs::exists(buildcc_base_), - "{BUILDCC_HOME}/buildcc path not found"); - env::assert_fatal(fs::exists(buildcc_libs_), - "{BUILDCC_HOME}/libs path not found"); - env::assert_fatal(fs::exists(buildcc_extensions_), - "{BUILDCC_HOME}/extensions path not found"); - - initialized_ = true; -} - void BuildEnvSetup::ConstructUserTarget() { UserTargetSetup(); UserTargetCb(); From 9d022d7fed47626a67f53b0a019c2ac6fbcf0409 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sat, 8 Jan 2022 09:00:46 -0800 Subject: [PATCH 04/29] Added BuildExeArgs class --- buildexe/include/buildexe/args_setup.h | 32 +++++++++++++++++++++++ buildexe/src/args_setup.cpp | 36 ++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/buildexe/include/buildexe/args_setup.h b/buildexe/include/buildexe/args_setup.h index d511a116..051c9ea6 100644 --- a/buildexe/include/buildexe/args_setup.h +++ b/buildexe/include/buildexe/args_setup.h @@ -54,6 +54,38 @@ struct ArgScriptInfo { std::vector configs; }; +class BuildExeArgs { +public: + void Setup(); + void Parse(int argc, char **argv) { args_.Parse(argc, argv); } + + // Getters + const Args &GetArgs() const { return args_; } + const ArgToolchain &GetHostToolchainArg() const { + return host_toolchain_arg_; + } + const ArgTargetInfo &GetTargetInfo() const { return out_targetinfo_; } + const ArgTargetInputs &GetTargetInputs() const { return out_targetinputs_; } + const ArgScriptInfo &GetScriptInfo() const { return out_scriptinfo_; } + BuildExeMode GetBuildMode() const { return out_mode_; } + +private: + // void SetupBuildMode(); + // void SetupTargetInfo(); + // void SetupTargetInputs(); + void SetupLibs(); + +private: + Args args_; + ArgToolchain host_toolchain_arg_; + ArgTargetInfo out_targetinfo_; + ArgTargetInputs out_targetinputs_; + ArgScriptInfo out_scriptinfo_; + + BuildExeMode out_mode_; + std::vector> lib_build_files_; +}; + void setup_arg_buildexe_mode(Args &args, BuildExeMode &out); void setup_arg_target_info(Args &args, ArgTargetInfo &out); void setup_arg_target_inputs(Args &args, ArgTargetInputs &out); diff --git a/buildexe/src/args_setup.cpp b/buildexe/src/args_setup.cpp index c69c9be6..2fb8785f 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -15,6 +15,7 @@ */ #include "buildexe/args_setup.h" +#include "buildexe/build_env_home.h" namespace buildcc { @@ -29,6 +30,41 @@ static const std::unordered_map kTargetTypeMap{ {"dynamicLibrary", TargetType::DynamicLibrary}, }; +void BuildExeArgs::Setup() { + args_.AddToolchain("host", "Host Toolchain", host_toolchain_arg_); + setup_arg_buildexe_mode(args_, out_mode_); + setup_arg_target_info(args_, out_targetinfo_); + setup_arg_target_inputs(args_, out_targetinputs_); + setup_arg_script_mode(args_, out_scriptinfo_); + SetupLibs(); +} + +void BuildExeArgs::SetupLibs() { + CLI::callback_t results_cb = + [&](const std::vector &data) -> bool { + lib_build_files_.push_back(data); + return true; + }; + + auto *libs_app = args_.Ref().add_subcommand("libs", "Libraries"); + std::error_code ec; + fs::directory_iterator dir_iter = + fs::directory_iterator(BuildccHome::GetBuildccLibsDir(), ec); + env::assert_fatal(ec.value() == 0, + "Cannot iterate over {BUILDCC_HOME}/libs directory"); + + for (const auto &dir : dir_iter) { + if (!dir.is_directory()) { + continue; + } + + std::string lib_name = dir.path().filename().string(); + libs_app->add_option_function>( + fmt::format("--{}", lib_name), results_cb, + fmt::format("{} library", lib_name)); + } +} + void setup_arg_buildexe_mode(Args &args, BuildExeMode &out) { args.Ref() .add_option("--mode", out, "Provide BuildExe run mode") From 6039ef07cce7fbe9c1e021dd0abac5b51cbf2423 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sat, 8 Jan 2022 09:01:01 -0800 Subject: [PATCH 05/29] Updated buildexe with BuildExeArgs class --- buildexe/buildexe.cpp | 44 ++++++++++++-------------------- buildexe/src/build_env_setup.cpp | 5 ++++ 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/buildexe/buildexe.cpp b/buildexe/buildexe.cpp index 1c4aff44..3f078900 100644 --- a/buildexe/buildexe.cpp +++ b/buildexe/buildexe.cpp @@ -17,6 +17,7 @@ #include "buildcc.h" #include "buildexe/args_setup.h" +#include "buildexe/build_env_home.h" #include "buildexe/build_env_setup.h" #include "buildexe/toolchain_setup.h" @@ -35,24 +36,13 @@ constexpr const char *const kTag = "BuildExe"; static void clean_cb(); int main(int argc, char **argv) { - Args args; + // + BuildccHome::Init(); - ArgToolchain host_toolchain_arg; - args.AddToolchain("host", "Host Toolchain", host_toolchain_arg); - - BuildExeMode out_mode; - setup_arg_buildexe_mode(args, out_mode); - - ArgTargetInfo out_targetinfo; - setup_arg_target_info(args, out_targetinfo); - - ArgTargetInputs out_targetinputs; - setup_arg_target_inputs(args, out_targetinputs); - - ArgScriptInfo out_scriptinfo; - setup_arg_script_mode(args, out_scriptinfo); - - args.Parse(argc, argv); + // + BuildExeArgs buildexe_args; + buildexe_args.Setup(); + buildexe_args.Parse(argc, argv); // TODO, Add Verification subcommand here for OS, Compiler etc! // os win, linux considerations @@ -63,19 +53,21 @@ int main(int argc, char **argv) { // TODO, Add libraries (git cloned) // TODO, Add extension (git cloned) - Register reg(args); + Register reg(buildexe_args.GetArgs()); reg.Clean(clean_cb); // Build - BaseToolchain toolchain = host_toolchain_arg.ConstructToolchain(); + BaseToolchain toolchain = + buildexe_args.GetHostToolchainArg().ConstructToolchain(); find_toolchain_verify(toolchain); - if (out_mode == BuildExeMode::Script) { + if (buildexe_args.GetBuildMode() == BuildExeMode::Script) { host_toolchain_verify(toolchain); } // Build environment - BuildEnvSetup build_setup(reg, toolchain, out_targetinfo, out_targetinputs); - if (out_mode == BuildExeMode::Script) { + BuildEnvSetup build_setup(reg, toolchain, buildexe_args.GetTargetInfo(), + buildexe_args.GetTargetInputs()); + if (buildexe_args.GetBuildMode() == BuildExeMode::Script) { // buildcc and user target build_setup.ConstructUserTargetWithBuildcc(); } else { @@ -85,11 +77,9 @@ int main(int argc, char **argv) { reg.RunBuild(); // Run - if (out_mode == BuildExeMode::Script) { - env::log_info(kTag, - fmt::format("************** Running '{}' **************", - out_targetinfo.name)); - build_setup.RunUserTarget(out_scriptinfo); + if (buildexe_args.GetBuildMode() == BuildExeMode::Script) { + + build_setup.RunUserTarget(buildexe_args.GetScriptInfo()); } // - Clang Compile Commands diff --git a/buildexe/src/build_env_setup.cpp b/buildexe/src/build_env_setup.cpp index dad2e326..64d45ddc 100644 --- a/buildexe/src/build_env_setup.cpp +++ b/buildexe/src/build_env_setup.cpp @@ -34,7 +34,12 @@ void BuildEnvSetup::ConstructUserTargetWithBuildcc() { DepUserTargetOnBuildcc(); } +constexpr const char *const kTag = "BuildExe"; + void BuildEnvSetup::RunUserTarget(const ArgScriptInfo &arg_script_info) { + env::log_info(kTag, fmt::format("************** Running '{}' **************", + arg_target_info_.name)); + // Aggregate the different input build .toml files to // `--config .toml` files std::vector configs; From be2ffb297a767ad8a482a4be028876bb3c88578b Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sat, 8 Jan 2022 10:13:38 -0800 Subject: [PATCH 06/29] Added build files to arg_lib_path --- buildexe/include/buildexe/args_setup.h | 2 +- buildexe/src/args_setup.cpp | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/buildexe/include/buildexe/args_setup.h b/buildexe/include/buildexe/args_setup.h index 051c9ea6..5c4d5c98 100644 --- a/buildexe/include/buildexe/args_setup.h +++ b/buildexe/include/buildexe/args_setup.h @@ -83,7 +83,7 @@ class BuildExeArgs { ArgScriptInfo out_scriptinfo_; BuildExeMode out_mode_; - std::vector> lib_build_files_; + std::vector lib_build_files_; }; void setup_arg_buildexe_mode(Args &args, BuildExeMode &out); diff --git a/buildexe/src/args_setup.cpp b/buildexe/src/args_setup.cpp index 2fb8785f..743b678d 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -40,12 +40,6 @@ void BuildExeArgs::Setup() { } void BuildExeArgs::SetupLibs() { - CLI::callback_t results_cb = - [&](const std::vector &data) -> bool { - lib_build_files_.push_back(data); - return true; - }; - auto *libs_app = args_.Ref().add_subcommand("libs", "Libraries"); std::error_code ec; fs::directory_iterator dir_iter = @@ -57,10 +51,17 @@ void BuildExeArgs::SetupLibs() { if (!dir.is_directory()) { continue; } - - std::string lib_name = dir.path().filename().string(); + fs::path lib_path = dir.path(); + std::string lib_name = lib_path.filename().string(); libs_app->add_option_function>( - fmt::format("--{}", lib_name), results_cb, + fmt::format("--{}", lib_name), + [&lib_path, this](const std::vector &paths) -> bool { + for (const auto &p : paths) { + fs::path absolute_file_path = lib_path / p; + lib_build_files_.push_back(absolute_file_path); + } + return true; + }, fmt::format("{} library", lib_name)); } } From 7e80b86bf3a09069b14f521cddd1e8abdcdc7fb9 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 03:18:35 -0800 Subject: [PATCH 07/29] Updated build_env_setup --- buildexe/include/buildexe/build_env_setup.h | 15 ++-- buildexe/src/build_env_setup.cpp | 84 ++++++++++++--------- 2 files changed, 56 insertions(+), 43 deletions(-) diff --git a/buildexe/include/buildexe/build_env_setup.h b/buildexe/include/buildexe/build_env_setup.h index 91fad608..e3a1b6e2 100644 --- a/buildexe/include/buildexe/build_env_setup.h +++ b/buildexe/include/buildexe/build_env_setup.h @@ -32,15 +32,12 @@ class BuildEnvSetup { public: BuildEnvSetup(Register ®, const BaseToolchain &toolchain, - const ArgTargetInfo &arg_target_info, - const ArgTargetInputs &arg_target_inputs) - : reg_(reg), toolchain_(toolchain), arg_target_info_(arg_target_info), - arg_target_inputs_(arg_target_inputs) { + const BuildExeArgs &buildexe_args) + : reg_(reg), toolchain_(toolchain), buildexe_args_(buildexe_args) { state_.build = true; } - void ConstructUserTarget(); - void ConstructUserTargetWithBuildcc(); + void ConstructTarget(); void RunUserTarget(const ArgScriptInfo &arg_script_info); @@ -53,6 +50,9 @@ class BuildEnvSetup { } private: + void ConstructUserTarget(); + void ConstructUserTargetWithBuildcc(); + void BuildccTargetSetup(); void UserTargetSetup(); void UserTargetCb(); @@ -64,8 +64,7 @@ class BuildEnvSetup { private: Register ®_; const BaseToolchain &toolchain_; - const ArgTargetInfo &arg_target_info_; - const ArgTargetInputs &arg_target_inputs_; + const BuildExeArgs &buildexe_args_; ArgToolchainState state_; PersistentStorage storage_; diff --git a/buildexe/src/build_env_setup.cpp b/buildexe/src/build_env_setup.cpp index 64d45ddc..8f3563ea 100644 --- a/buildexe/src/build_env_setup.cpp +++ b/buildexe/src/build_env_setup.cpp @@ -19,26 +19,22 @@ namespace buildcc { -void BuildEnvSetup::ConstructUserTarget() { - UserTargetSetup(); - UserTargetCb(); - UserTargetBuild(); -} +constexpr const char *const kTag = "BuildExe"; -void BuildEnvSetup::ConstructUserTargetWithBuildcc() { - BuildccTargetSetup(); - UserTargetSetup(); - UserTargetCb(); - UserTargetWithBuildccSetup(); - UserTargetBuild(); - DepUserTargetOnBuildcc(); +void BuildEnvSetup::ConstructTarget() { + if (buildexe_args_.GetBuildMode() == BuildExeMode::Script) { + // buildcc and user target + ConstructUserTargetWithBuildcc(); + } else { + // user target + ConstructUserTarget(); + } + reg_.RunBuild(); } -constexpr const char *const kTag = "BuildExe"; - void BuildEnvSetup::RunUserTarget(const ArgScriptInfo &arg_script_info) { env::log_info(kTag, fmt::format("************** Running '{}' **************", - arg_target_info_.name)); + buildexe_args_.GetTargetInfo().name)); // Aggregate the different input build .toml files to // `--config .toml` files @@ -61,8 +57,19 @@ void BuildEnvSetup::RunUserTarget(const ArgScriptInfo &arg_script_info) { // Private -void BuildEnvSetup::DepUserTargetOnBuildcc() { - reg_.Dep(GetUserTarget(), GetBuildcc()); +void BuildEnvSetup::ConstructUserTarget() { + UserTargetSetup(); + UserTargetCb(); + UserTargetBuild(); +} + +void BuildEnvSetup::ConstructUserTargetWithBuildcc() { + BuildccTargetSetup(); + UserTargetSetup(); + UserTargetCb(); + UserTargetWithBuildccSetup(); + UserTargetBuild(); + DepUserTargetOnBuildcc(); } void BuildEnvSetup::BuildccTargetSetup() { @@ -74,9 +81,10 @@ void BuildEnvSetup::BuildccTargetSetup() { } void BuildEnvSetup::UserTargetSetup() { - storage_.Add(kUserTargetName, arg_target_info_.name, - arg_target_info_.type, toolchain_, - TargetEnv(arg_target_info_.relative_to_root)); + const ArgTargetInfo &arg_target_info = buildexe_args_.GetTargetInfo(); + storage_.Add(kUserTargetName, arg_target_info.name, + arg_target_info.type, toolchain_, + TargetEnv(arg_target_info.relative_to_root)); } /** @@ -94,44 +102,41 @@ void BuildEnvSetup::UserTargetSetup() { * Link flags */ void BuildEnvSetup::UserTargetCb() { + const ArgTargetInputs arg_target_inputs = buildexe_args_.GetTargetInputs(); Target_generic &user_target = GetUserTarget(); - for (const auto &s : arg_target_inputs_.source_files) { + + for (const auto &s : arg_target_inputs.source_files) { user_target.AddSource(s); } - for (const auto &i : arg_target_inputs_.include_dirs) { + for (const auto &i : arg_target_inputs.include_dirs) { user_target.AddIncludeDir(i); } - for (const auto &l : arg_target_inputs_.lib_dirs) { + for (const auto &l : arg_target_inputs.lib_dirs) { user_target.AddLibDir(l); } - for (const auto &el : arg_target_inputs_.external_lib_deps) { + for (const auto &el : arg_target_inputs.external_lib_deps) { user_target.AddLibDep(el); } - for (const auto &flag : arg_target_inputs_.preprocessor_flags) { + for (const auto &flag : arg_target_inputs.preprocessor_flags) { user_target.AddPreprocessorFlag(flag); } - for (const auto &flag : arg_target_inputs_.common_compile_flags) { + for (const auto &flag : arg_target_inputs.common_compile_flags) { user_target.AddCommonCompileFlag(flag); } - for (const auto &flag : arg_target_inputs_.asm_compile_flags) { + for (const auto &flag : arg_target_inputs.asm_compile_flags) { user_target.AddAsmCompileFlag(flag); } - for (const auto &flag : arg_target_inputs_.c_compile_flags) { + for (const auto &flag : arg_target_inputs.c_compile_flags) { user_target.AddCCompileFlag(flag); } - for (const auto &flag : arg_target_inputs_.cpp_compile_flags) { + for (const auto &flag : arg_target_inputs.cpp_compile_flags) { user_target.AddCppCompileFlag(flag); } - for (const auto &flag : arg_target_inputs_.link_flags) { + for (const auto &flag : arg_target_inputs.link_flags) { user_target.AddLinkFlag(flag); } } -void BuildEnvSetup::UserTargetBuild() { - reg_.Build( - state_, [](BaseTarget &target) { target.Build(); }, GetUserTarget()); -} - void BuildEnvSetup::UserTargetWithBuildccSetup() { GetUserTarget().AddLibDep(GetBuildcc()); GetUserTarget().Insert(GetBuildcc(), { @@ -153,4 +158,13 @@ void BuildEnvSetup::UserTargetWithBuildccSetup() { } } +void BuildEnvSetup::UserTargetBuild() { + reg_.Build( + state_, [](BaseTarget &target) { target.Build(); }, GetUserTarget()); +} + +void BuildEnvSetup::DepUserTargetOnBuildcc() { + reg_.Dep(GetUserTarget(), GetBuildcc()); +} + } // namespace buildcc From d68b5eb5a2c43e13d318575360a5f1cfb6181856 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 03:18:40 -0800 Subject: [PATCH 08/29] Update buildexe.cpp --- buildexe/buildexe.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/buildexe/buildexe.cpp b/buildexe/buildexe.cpp index 3f078900..cb906856 100644 --- a/buildexe/buildexe.cpp +++ b/buildexe/buildexe.cpp @@ -35,6 +35,7 @@ constexpr const char *const kTag = "BuildExe"; static void clean_cb(); +// TODO, Update BuildExeArgs with internal functions int main(int argc, char **argv) { // BuildccHome::Init(); @@ -64,21 +65,12 @@ int main(int argc, char **argv) { host_toolchain_verify(toolchain); } - // Build environment - BuildEnvSetup build_setup(reg, toolchain, buildexe_args.GetTargetInfo(), - buildexe_args.GetTargetInputs()); - if (buildexe_args.GetBuildMode() == BuildExeMode::Script) { - // buildcc and user target - build_setup.ConstructUserTargetWithBuildcc(); - } else { - // user target - build_setup.ConstructUserTarget(); - } - reg.RunBuild(); + // Build + BuildEnvSetup build_setup(reg, toolchain, buildexe_args); + build_setup.ConstructTarget(); // Run if (buildexe_args.GetBuildMode() == BuildExeMode::Script) { - build_setup.RunUserTarget(buildexe_args.GetScriptInfo()); } From 9307f57cb8398f0084489524b1c07ca546ca4d5b Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 03:29:15 -0800 Subject: [PATCH 09/29] Updated args_setup --- buildexe/include/buildexe/args_setup.h | 12 +-- buildexe/src/args_setup.cpp | 116 +++++++++++++------------ 2 files changed, 66 insertions(+), 62 deletions(-) diff --git a/buildexe/include/buildexe/args_setup.h b/buildexe/include/buildexe/args_setup.h index 5c4d5c98..75825a4f 100644 --- a/buildexe/include/buildexe/args_setup.h +++ b/buildexe/include/buildexe/args_setup.h @@ -70,9 +70,10 @@ class BuildExeArgs { BuildExeMode GetBuildMode() const { return out_mode_; } private: - // void SetupBuildMode(); - // void SetupTargetInfo(); - // void SetupTargetInputs(); + void SetupBuildMode(); + void SetupTargetInfo(); + void SetupTargetInputs(); + void SetupScriptMode(); void SetupLibs(); private: @@ -86,11 +87,6 @@ class BuildExeArgs { std::vector lib_build_files_; }; -void setup_arg_buildexe_mode(Args &args, BuildExeMode &out); -void setup_arg_target_info(Args &args, ArgTargetInfo &out); -void setup_arg_target_inputs(Args &args, ArgTargetInputs &out); -void setup_arg_script_mode(Args &args, ArgScriptInfo &out); - } // namespace buildcc #endif diff --git a/buildexe/src/args_setup.cpp b/buildexe/src/args_setup.cpp index 743b678d..538bd446 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -32,103 +32,111 @@ static const std::unordered_map kTargetTypeMap{ void BuildExeArgs::Setup() { args_.AddToolchain("host", "Host Toolchain", host_toolchain_arg_); - setup_arg_buildexe_mode(args_, out_mode_); - setup_arg_target_info(args_, out_targetinfo_); - setup_arg_target_inputs(args_, out_targetinputs_); - setup_arg_script_mode(args_, out_scriptinfo_); + SetupBuildMode(); + SetupTargetInfo(); + SetupTargetInputs(); + SetupScriptMode(); SetupLibs(); } -void BuildExeArgs::SetupLibs() { - auto *libs_app = args_.Ref().add_subcommand("libs", "Libraries"); - std::error_code ec; - fs::directory_iterator dir_iter = - fs::directory_iterator(BuildccHome::GetBuildccLibsDir(), ec); - env::assert_fatal(ec.value() == 0, - "Cannot iterate over {BUILDCC_HOME}/libs directory"); - - for (const auto &dir : dir_iter) { - if (!dir.is_directory()) { - continue; - } - fs::path lib_path = dir.path(); - std::string lib_name = lib_path.filename().string(); - libs_app->add_option_function>( - fmt::format("--{}", lib_name), - [&lib_path, this](const std::vector &paths) -> bool { - for (const auto &p : paths) { - fs::path absolute_file_path = lib_path / p; - lib_build_files_.push_back(absolute_file_path); - } - return true; - }, - fmt::format("{} library", lib_name)); - } -} - -void setup_arg_buildexe_mode(Args &args, BuildExeMode &out) { - args.Ref() - .add_option("--mode", out, "Provide BuildExe run mode") +void BuildExeArgs::SetupBuildMode() { + args_.Ref() + .add_option("--mode", out_mode_, "Provide BuildExe run mode") ->transform(CLI::CheckedTransformer(kBuildExeModeMap, CLI::ignore_case)) ->required(); } // TODO, Add subcommand [build.info] -void setup_arg_target_info(Args &args, ArgTargetInfo &out) { +void BuildExeArgs::SetupTargetInfo() { constexpr const char *const kProjectInfo = "Project Info"; - auto &app = args.Ref(); + auto &app = args_.Ref(); auto *project_info_app = app.add_option_group(kProjectInfo); - project_info_app->add_option("--name", out.name, "Provide Target name") + project_info_app + ->add_option("--name", out_targetinfo_.name, "Provide Target name") ->required(); - project_info_app->add_option("--type", out.type, "Provide Target Type") + project_info_app + ->add_option("--type", out_targetinfo_.type, "Provide Target Type") ->transform(CLI::CheckedTransformer(kTargetTypeMap, CLI::ignore_case)) ->required(); project_info_app - ->add_option("--relative_to_root", out.relative_to_root, + ->add_option("--relative_to_root", out_targetinfo_.relative_to_root, "Provide Target relative to root") ->required(); } // TODO, Add subcommand [build.inputs] // TODO, Add group, group by sources, headers, inncludes on CLI -void setup_arg_target_inputs(Args &args, ArgTargetInputs &out) { +void BuildExeArgs::SetupTargetInputs() { constexpr const char *const kTargetInputs = "Target Inputs"; - auto &app = args.Ref(); + auto &app = args_.Ref(); auto *target_inputs_app = app.add_option_group(kTargetInputs); - target_inputs_app->add_option("--srcs", out.source_files, + target_inputs_app->add_option("--srcs", out_targetinputs_.source_files, "Provide source files"); - target_inputs_app->add_option("--includes", out.include_dirs, + target_inputs_app->add_option("--includes", out_targetinputs_.include_dirs, "Provide include dirs"); - target_inputs_app->add_option("--lib_dirs", out.lib_dirs, "Provide lib dirs"); - target_inputs_app->add_option("--external_libs", out.external_lib_deps, + target_inputs_app->add_option("--lib_dirs", out_targetinputs_.lib_dirs, + "Provide lib dirs"); + target_inputs_app->add_option("--external_libs", + out_targetinputs_.external_lib_deps, "Provide external libs"); - target_inputs_app->add_option("--preprocessor_flags", out.preprocessor_flags, + target_inputs_app->add_option("--preprocessor_flags", + out_targetinputs_.preprocessor_flags, "Provide Preprocessor flags"); target_inputs_app->add_option("--common_compile_flags", - out.common_compile_flags, + out_targetinputs_.common_compile_flags, "Provide CommonCompile Flags"); - target_inputs_app->add_option("--asm_compile_flags", out.asm_compile_flags, + target_inputs_app->add_option("--asm_compile_flags", + out_targetinputs_.asm_compile_flags, "Provide AsmCompile Flags"); - target_inputs_app->add_option("--c_compile_flags", out.c_compile_flags, + target_inputs_app->add_option("--c_compile_flags", + out_targetinputs_.c_compile_flags, "Provide CCompile Flags"); - target_inputs_app->add_option("--cpp_compile_flags", out.cpp_compile_flags, + target_inputs_app->add_option("--cpp_compile_flags", + out_targetinputs_.cpp_compile_flags, "Provide CppCompile Flags"); - target_inputs_app->add_option("--link_flags", out.link_flags, + target_inputs_app->add_option("--link_flags", out_targetinputs_.link_flags, "Provide Link Flags"); } -void setup_arg_script_mode(Args &args, ArgScriptInfo &out) { - auto *script_args = args.Ref().add_subcommand("script"); - script_args->add_option("--configs", out.configs, +void BuildExeArgs::SetupScriptMode() { + auto *script_args = args_.Ref().add_subcommand("script"); + script_args->add_option("--configs", out_scriptinfo_.configs, "Config files for script mode"); } +void BuildExeArgs::SetupLibs() { + auto *libs_app = args_.Ref().add_subcommand("libs", "Libraries"); + std::error_code ec; + fs::directory_iterator dir_iter = + fs::directory_iterator(BuildccHome::GetBuildccLibsDir(), ec); + env::assert_fatal(ec.value() == 0, + "Cannot iterate over {BUILDCC_HOME}/libs directory"); + + for (const auto &dir : dir_iter) { + if (!dir.is_directory()) { + continue; + } + fs::path lib_path = dir.path(); + std::string lib_name = lib_path.filename().string(); + libs_app->add_option_function>( + fmt::format("--{}", lib_name), + [&lib_path, this](const std::vector &paths) -> bool { + for (const auto &p : paths) { + fs::path absolute_file_path = lib_path / p; + lib_build_files_.push_back(absolute_file_path); + } + return true; + }, + fmt::format("{} library", lib_name)); + } +} + } // namespace buildcc From 61c26cb102b8bb3525bdb7ce13aafcbb4e55d267 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 03:30:24 -0800 Subject: [PATCH 10/29] Update buildexe.cpp --- buildexe/buildexe.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildexe/buildexe.cpp b/buildexe/buildexe.cpp index cb906856..faa7ede4 100644 --- a/buildexe/buildexe.cpp +++ b/buildexe/buildexe.cpp @@ -57,7 +57,7 @@ int main(int argc, char **argv) { Register reg(buildexe_args.GetArgs()); reg.Clean(clean_cb); - // Build + // Host Toolchain BaseToolchain toolchain = buildexe_args.GetHostToolchainArg().ConstructToolchain(); find_toolchain_verify(toolchain); @@ -65,11 +65,11 @@ int main(int argc, char **argv) { host_toolchain_verify(toolchain); } - // Build + // Build Target BuildEnvSetup build_setup(reg, toolchain, buildexe_args); build_setup.ConstructTarget(); - // Run + // Run Target if script mode if (buildexe_args.GetBuildMode() == BuildExeMode::Script) { build_setup.RunUserTarget(buildexe_args.GetScriptInfo()); } From 59550aed3817f8751028bc60cd2058925397abd9 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 05:10:40 -0800 Subject: [PATCH 11/29] Added UserTargetWithLibsSetup private API for script mode --- buildexe/include/buildexe/args_setup.h | 3 +++ buildexe/include/buildexe/build_env_setup.h | 4 +-- buildexe/src/build_env_setup.cpp | 27 +++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/buildexe/include/buildexe/args_setup.h b/buildexe/include/buildexe/args_setup.h index 75825a4f..c793595e 100644 --- a/buildexe/include/buildexe/args_setup.h +++ b/buildexe/include/buildexe/args_setup.h @@ -68,6 +68,9 @@ class BuildExeArgs { const ArgTargetInputs &GetTargetInputs() const { return out_targetinputs_; } const ArgScriptInfo &GetScriptInfo() const { return out_scriptinfo_; } BuildExeMode GetBuildMode() const { return out_mode_; } + const std::vector &GetLibBuildFiles() const { + return lib_build_files_; + } private: void SetupBuildMode(); diff --git a/buildexe/include/buildexe/build_env_setup.h b/buildexe/include/buildexe/build_env_setup.h index e3a1b6e2..d73c9e9c 100644 --- a/buildexe/include/buildexe/build_env_setup.h +++ b/buildexe/include/buildexe/build_env_setup.h @@ -56,9 +56,9 @@ class BuildEnvSetup { void BuildccTargetSetup(); void UserTargetSetup(); void UserTargetCb(); - void UserTargetBuild(); - void UserTargetWithBuildccSetup(); + void UserTargetWithLibsSetup(); + void UserTargetBuild(); void DepUserTargetOnBuildcc(); private: diff --git a/buildexe/src/build_env_setup.cpp b/buildexe/src/build_env_setup.cpp index 8f3563ea..cb515ec2 100644 --- a/buildexe/src/build_env_setup.cpp +++ b/buildexe/src/build_env_setup.cpp @@ -68,6 +68,7 @@ void BuildEnvSetup::ConstructUserTargetWithBuildcc() { UserTargetSetup(); UserTargetCb(); UserTargetWithBuildccSetup(); + UserTargetWithLibsSetup(); UserTargetBuild(); DepUserTargetOnBuildcc(); } @@ -158,6 +159,32 @@ void BuildEnvSetup::UserTargetWithBuildccSetup() { } } +void BuildEnvSetup::UserTargetWithLibsSetup() { + auto &target = GetUserTarget(); + + // Segregate valid lib files into sources and include dirs + internal::fs_unordered_set sources; + internal::fs_unordered_set include_dirs; + for (const auto &lib_build_file : buildexe_args_.GetLibBuildFiles()) { + if (target.GetConfig().IsValidSource(lib_build_file)) { + sources.insert(lib_build_file); + } + if (target.GetConfig().IsValidHeader(lib_build_file)) { + include_dirs.insert(lib_build_file.parent_path()); + } + } + + // Add sources to target + for (const auto &s : sources) { + target.AddSourceAbsolute(s); + } + + // Add include dirs to target + for (const auto &idir : include_dirs) { + target.AddIncludeDir(idir); + } +} + void BuildEnvSetup::UserTargetBuild() { reg_.Build( state_, [](BaseTarget &target) { target.Build(); }, GetUserTarget()); From f850842d54c604748366eb0504fac97906abe90e Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 08:17:40 -0800 Subject: [PATCH 12/29] Update args_setup.cpp --- buildexe/src/args_setup.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/buildexe/src/args_setup.cpp b/buildexe/src/args_setup.cpp index 538bd446..3dbda7c8 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -19,6 +19,8 @@ namespace buildcc { +constexpr const char *const kTag = "BuildExe"; + static const std::unordered_map kBuildExeModeMap{ {"immediate", BuildExeMode::Immediate}, {"script", BuildExeMode::Script}, @@ -126,15 +128,16 @@ void BuildExeArgs::SetupLibs() { } fs::path lib_path = dir.path(); std::string lib_name = lib_path.filename().string(); + auto add_lib_files_cb_func = [lib_path, + this](const std::vector &paths) { + for (const auto &p : paths) { + fs::path absolute_file_path = lib_path / p; + lib_build_files_.push_back(absolute_file_path); + } + }; + libs_app->add_option_function>( - fmt::format("--{}", lib_name), - [&lib_path, this](const std::vector &paths) -> bool { - for (const auto &p : paths) { - fs::path absolute_file_path = lib_path / p; - lib_build_files_.push_back(absolute_file_path); - } - return true; - }, + fmt::format("--{}", lib_name), add_lib_files_cb_func, fmt::format("{} library", lib_name)); } } From a7c1e9e55ee59f9d8499399905f2ee67cc4218e2 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 09:03:04 -0800 Subject: [PATCH 13/29] Update build_env_setup.cpp --- buildexe/src/build_env_setup.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/buildexe/src/build_env_setup.cpp b/buildexe/src/build_env_setup.cpp index cb515ec2..682c9c09 100644 --- a/buildexe/src/build_env_setup.cpp +++ b/buildexe/src/build_env_setup.cpp @@ -160,28 +160,33 @@ void BuildEnvSetup::UserTargetWithBuildccSetup() { } void BuildEnvSetup::UserTargetWithLibsSetup() { - auto &target = GetUserTarget(); + auto &user_target = GetUserTarget(); // Segregate valid lib files into sources and include dirs internal::fs_unordered_set sources; internal::fs_unordered_set include_dirs; + internal::fs_unordered_set headers; for (const auto &lib_build_file : buildexe_args_.GetLibBuildFiles()) { - if (target.GetConfig().IsValidSource(lib_build_file)) { + if (user_target.GetConfig().IsValidSource(lib_build_file)) { sources.insert(lib_build_file); } - if (target.GetConfig().IsValidHeader(lib_build_file)) { + if (user_target.GetConfig().IsValidHeader(lib_build_file)) { include_dirs.insert(lib_build_file.parent_path()); + headers.insert(lib_build_file); } } - // Add sources to target + // Add sources to user_target for (const auto &s : sources) { - target.AddSourceAbsolute(s); + user_target.AddSourceAbsolute(s); } - - // Add include dirs to target + // Add include dirs to user_target for (const auto &idir : include_dirs) { - target.AddIncludeDir(idir); + user_target.AddIncludeDir(idir, false); + } + // Add headers to user_target + for (const auto &h : headers) { + user_target.AddHeaderAbsolute(h); } } From 6d05bc48068e977a98b11047dbcb931d89786b63 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 16:50:49 -0800 Subject: [PATCH 14/29] Updated args setup with LibInfo --- buildexe/include/buildexe/args_setup.h | 9 +++++++++ buildexe/src/args_setup.cpp | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/buildexe/include/buildexe/args_setup.h b/buildexe/include/buildexe/args_setup.h index c793595e..5fc9faff 100644 --- a/buildexe/include/buildexe/args_setup.h +++ b/buildexe/include/buildexe/args_setup.h @@ -54,6 +54,11 @@ struct ArgScriptInfo { std::vector configs; }; +struct LibInfo { + std::string lib_name; + std::string absolute_lib_path; +}; + class BuildExeArgs { public: void Setup(); @@ -68,6 +73,8 @@ class BuildExeArgs { const ArgTargetInputs &GetTargetInputs() const { return out_targetinputs_; } const ArgScriptInfo &GetScriptInfo() const { return out_scriptinfo_; } BuildExeMode GetBuildMode() const { return out_mode_; } + + const std::vector &GetLibsInfo() const { return libs_info_; } const std::vector &GetLibBuildFiles() const { return lib_build_files_; } @@ -87,6 +94,8 @@ class BuildExeArgs { ArgScriptInfo out_scriptinfo_; BuildExeMode out_mode_; + + std::vector libs_info_; std::vector lib_build_files_; }; diff --git a/buildexe/src/args_setup.cpp b/buildexe/src/args_setup.cpp index 3dbda7c8..a797bf95 100644 --- a/buildexe/src/args_setup.cpp +++ b/buildexe/src/args_setup.cpp @@ -128,6 +128,12 @@ void BuildExeArgs::SetupLibs() { } fs::path lib_path = dir.path(); std::string lib_name = lib_path.filename().string(); + + LibInfo lib_info; + lib_info.lib_name = lib_name; + lib_info.absolute_lib_path = fmt::format("{}", lib_path); + libs_info_.push_back(lib_info); + auto add_lib_files_cb_func = [lib_path, this](const std::vector &paths) { for (const auto &p : paths) { From d5ab12387f9d202490a8efae814b13d13d0720b1 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 16:52:25 -0800 Subject: [PATCH 15/29] Update build_env_setup.cpp --- buildexe/src/build_env_setup.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/buildexe/src/build_env_setup.cpp b/buildexe/src/build_env_setup.cpp index 682c9c09..6884a1de 100644 --- a/buildexe/src/build_env_setup.cpp +++ b/buildexe/src/build_env_setup.cpp @@ -162,6 +162,37 @@ void BuildEnvSetup::UserTargetWithBuildccSetup() { void BuildEnvSetup::UserTargetWithLibsSetup() { auto &user_target = GetUserTarget(); + // Generate buildexe_lib_dirs.h with the absolute path to library folders + // Query the information through BuildExeLibDir::[lib_folder_name] + { + constexpr const char *const kConstexprLibNameFormat = + "static constexpr const char *const {lib_name} = " + "\"{absolute_lib_dir}\";"; + constexpr const char *const kLibDirsFormat = R"(// Generated by BuildCC +#pragma once + +struct BuildExeLibDir {{ +{lib_dirs} +}}; +)"; + + const auto &libs_info = buildexe_args_.GetLibsInfo(); + std::vector lib_constants; + for (const auto &linfo : libs_info) { + std::string lib_constant = fmt::format( + kConstexprLibNameFormat, fmt::arg("lib_name", linfo.lib_name), + fmt::arg("absolute_lib_dir", linfo.absolute_lib_path)); + lib_constants.push_back(lib_constant); + } + fs::path lib_dirs_filename = + user_target.GetTargetBuildDir() / "buildexe_lib_dirs.h"; + std::string data = fmt::format( + kLibDirsFormat, fmt::arg("lib_dirs", fmt::join(lib_constants, "\r\n"))); + env::save_file(lib_dirs_filename.string().c_str(), data, false); + + user_target.AddIncludeDirAbsolute(user_target.GetTargetBuildDir(), true); + } + // Segregate valid lib files into sources and include dirs internal::fs_unordered_set sources; internal::fs_unordered_set include_dirs; From 3d418b6f454d7f8981c1c03083a5431481b1d0bd Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 16:59:32 -0800 Subject: [PATCH 16/29] Added a buildexe specific libs example --- example/buildexe/libs/build.main.cpp | 79 ++++++++++++++++++++++++++++ example/buildexe/libs/build.toml | 10 ++++ example/buildexe/libs/compile.toml | 20 +++++++ example/buildexe/libs/src/main.cpp | 6 +++ 4 files changed, 115 insertions(+) create mode 100644 example/buildexe/libs/build.main.cpp create mode 100644 example/buildexe/libs/build.toml create mode 100644 example/buildexe/libs/compile.toml create mode 100644 example/buildexe/libs/src/main.cpp diff --git a/example/buildexe/libs/build.main.cpp b/example/buildexe/libs/build.main.cpp new file mode 100644 index 00000000..0159796c --- /dev/null +++ b/example/buildexe/libs/build.main.cpp @@ -0,0 +1,79 @@ +#include "buildcc.h" + +// Included through libs +#include "build.fmt.h" + +// Generated by BuildCC +// See the `_build_internal` directory +#include "buildexe_lib_dirs.h" + +using namespace buildcc; + +constexpr const char *const EXE = "build"; + +// Function Prototypes +static void clean_cb(); +static void hello_world_build_cb(BaseTarget &target, BaseTarget &fmt_lib); + +int main(int argc, char **argv) { + // 1. Get arguments + Args args; + ArgToolchain arg_gcc; + args.AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); + args.Parse(argc, argv); + + // 2. Initialize your environment + Register reg(args); + + // 3. Pre-build steps + reg.Clean(clean_cb); + + // 4. Build steps + // Explicit toolchain - target pairs + Toolchain_gcc gcc; + auto verified_toolchains = gcc.Verify(); + env::assert_fatal(!verified_toolchains.empty(), "GCC Toolchain not found"); + + StaticTarget_gcc fmt_lib( + "libfmt", gcc, + TargetEnv(BuildExeLibDir::fmt, env::get_project_build_dir() / "fmt")); + FmtConfig fmt_config; + reg.Build(arg_gcc.state, build_fmt_cb, fmt_lib, fmt_config); + + ExecutableTarget_gcc hello_world("hello_world", gcc, ""); + reg.Build(arg_gcc.state, hello_world_build_cb, hello_world, fmt_lib); + + reg.Dep(hello_world, fmt_lib); + + // 5. Test steps + reg.Test(arg_gcc.state, "{executable}", hello_world); + + // 6. Build Target + reg.RunBuild(); + + // 7. Test Target + reg.RunTest(); + + // 8. Post Build steps + // - Clang Compile Commands + plugin::ClangCompileCommands({&hello_world}).Generate(); + // - Graphviz dump + std::cout << reg.GetTaskflow().dump() << std::endl; + + return 0; +} + +static void clean_cb() { + env::log_info(EXE, fmt::format("Cleaning {}", env::get_project_build_dir())); + fs::remove_all(env::get_project_build_dir()); +} + +static void hello_world_build_cb(BaseTarget &target, BaseTarget &fmt_lib) { + target.AddSource("main.cpp", "src"); + target.AddLibDep(fmt_lib); + target.Insert(fmt_lib, { + SyncOption::IncludeDirs, + SyncOption::HeaderFiles, + }); + target.Build(); +} diff --git a/example/buildexe/libs/build.toml b/example/buildexe/libs/build.toml new file mode 100644 index 00000000..45233263 --- /dev/null +++ b/example/buildexe/libs/build.toml @@ -0,0 +1,10 @@ +# Root +root_dir = "" +build_dir = "_build" +loglevel = "debug" +clean = true + +# Toolchain +[toolchain.gcc] +build = true +test = true diff --git a/example/buildexe/libs/compile.toml b/example/buildexe/libs/compile.toml new file mode 100644 index 00000000..db93b6cd --- /dev/null +++ b/example/buildexe/libs/compile.toml @@ -0,0 +1,20 @@ +# Settings +root_dir = "" +build_dir = "_build_internal" +loglevel = "debug" +clean = false + +# BuildExe run mode +mode = "script" + +# Target information +name = "single" +type = "executable" +relative_to_root = "" +srcs = ["build.main.cpp"] + +[script] +configs = ["build.toml"] + +[libs] +fmt = ["build.fmt.cpp", "build.fmt.h"] diff --git a/example/buildexe/libs/src/main.cpp b/example/buildexe/libs/src/main.cpp new file mode 100644 index 00000000..4a638183 --- /dev/null +++ b/example/buildexe/libs/src/main.cpp @@ -0,0 +1,6 @@ +#include "fmt/format.h" + +int main() { + fmt::print("{} {}", "Hello", "World"); + return 0; +} From c03696b0b2ff132fbba6c621ec52bdcdea0fd6c4 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 17:04:18 -0800 Subject: [PATCH 17/29] Update CMakeLists.txt --- buildexe/CMakeLists.txt | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/buildexe/CMakeLists.txt b/buildexe/CMakeLists.txt index d48289cd..b05801bb 100644 --- a/buildexe/CMakeLists.txt +++ b/buildexe/CMakeLists.txt @@ -87,3 +87,27 @@ add_custom_target(run_buildexe_sm_simple_linux_gcc WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../example/hybrid/simple VERBATIM USES_TERMINAL ) + +# [Script Mode] BuildExe libs example WIN GCC +add_custom_target(run_buildexe_libs_hybrid_win_gcc + COMMAND buildexe --help-all + COMMAND buildexe --config compile.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_win_gcc.toml + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../example/buildexe/libs + VERBATIM USES_TERMINAL +) + +# [Script Mode] BuildExe libs example WIN MSVC +add_custom_target(run_buildexe_libs_hybrid_win_msvc + COMMAND buildexe --help-all + COMMAND buildexe --config compile.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_win_msvc.toml + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../example/buildexe/libs + VERBATIM USES_TERMINAL +) + +# [Script Mode] BuildExe libs example LINUX GCC +add_custom_target(run_buildexe_libs_hybrid_linux_gcc + COMMAND buildexe --help-all + COMMAND buildexe --config compile.toml --config ${CMAKE_CURRENT_SOURCE_DIR}/../bootstrap/config/toolchain_linux_gcc.toml + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../example/buildexe/libs + VERBATIM USES_TERMINAL +) From bfe1c9cd27ba4125f0efc669746e621995b8f040 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 17:57:07 -0800 Subject: [PATCH 18/29] Added buildexe package manager document --- .../buildexe_package_manager.rst | 35 +++++++++++++++++++ docs/source/getting_started/toc.rst | 1 + 2 files changed, 36 insertions(+) create mode 100644 docs/source/getting_started/buildexe_package_manager.rst diff --git a/docs/source/getting_started/buildexe_package_manager.rst b/docs/source/getting_started/buildexe_package_manager.rst new file mode 100644 index 00000000..eacbb243 --- /dev/null +++ b/docs/source/getting_started/buildexe_package_manager.rst @@ -0,0 +1,35 @@ +BuildExe as a Package Manager +============================= + +Basic Procedure +---------------- + +.. uml:: + + usecase "build.user_project.cpp" as build_cpp + usecase "libs/library/build.library.h" as build_lib_header + usecase "libs/library/build.library.cpp" as build_lib_source + + usecase "compile.toml" as compile_toml + usecase "host_toolchain.toml" as host_toolchain_toml + rectangle "./build.user_project" as build_project_exe + usecase "build.toml" as build_toml + + rectangle "./buildexe" as buildexe_exe + + artifact "library" as library + artifact "./hello_world" as hello_world_exe + + build_cpp -right-> buildexe_exe + build_lib_header -right-> buildexe_exe + build_lib_source -right-> buildexe_exe + + compile_toml -up-> buildexe_exe + host_toolchain_toml -up-> buildexe_exe + + buildexe_exe -right-> build_project_exe + + build_toml -up-> build_project_exe + build_project_exe -right-> hello_world_exe + + library -up-> hello_world_exe diff --git a/docs/source/getting_started/toc.rst b/docs/source/getting_started/toc.rst index 3657d28f..b60c4826 100644 --- a/docs/source/getting_started/toc.rst +++ b/docs/source/getting_started/toc.rst @@ -6,6 +6,7 @@ Getting Started buildexe_setup buildexe_script_example buildexe_immediate_example + buildexe_package_manager walkthroughs all_compile_options all_default_build_options From 4ecaf0186ed88dcc05df6fac7ad246070d48a0a7 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 18:57:35 -0800 Subject: [PATCH 19/29] Update buildexe_setup.rst --- .../source/getting_started/buildexe_setup.rst | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/docs/source/getting_started/buildexe_setup.rst b/docs/source/getting_started/buildexe_setup.rst index dd06ac93..8d2b5918 100644 --- a/docs/source/getting_started/buildexe_setup.rst +++ b/docs/source/getting_started/buildexe_setup.rst @@ -106,5 +106,53 @@ This folder will contain the .toml files of all the HOST toolchains present on y *** msvc_am64_19.29.30137.toml @endmindmap +Libs +------- -.. note:: **Extensions** and **Libs** will come later in the tutorial +* Any library that the user needs to use in their projects can be **git cloned** into the libs folder. +* BuildExe can then be used to compile the library build files along with the "script". +* The library build files define how a particular library is built. +* These functions can be used in the "script" to define how your target should be built. + +In this way we achieve a package manager like functionality with BuildExe and git. (Local package manager) + +For example we download the **fmt library** to our libs folder + +.. code-block:: bash + + cd $BUILDCC_HOME/libs + git clone https://github.com/fmtlib/fmt.git + +.. important:: This might sound strange, but the git cloned library **folder name** must also be a valid C++ **variable name**. + +* Since the **fmt** lib does not have support for BuildCC style build files we write our own +* Please see the :doc:`buildexe_package_manager` document for a simple example. + +.. uml:: + + @startmindmap + * ENV[BUILDCC_HOME] + ** bin + *** flatc + *** buildexe + ** buildcc + *** [git cloned] + ** extensions + *** [empty] + ** libs + *** fmt + **** [git cloned] + *** spdlog + **** [git cloned] + *** flatbuffers + **** [git cloned] + ** host + *** gcc_x86_64-linux-gnu_9.3.0.toml + *** mingw_x86_64-w64-mingw32_10.2.0.toml + *** msvc_am64_19.29.30137.toml + @endmindmap + +Extensions +------------- + +.. note:: Extensions support in BuildExe is incomplete and there currently aren't any third party extensions for BuildCC. From 0e07154d0d3719ad14201aabbb82274609fb093a Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 18:57:45 -0800 Subject: [PATCH 20/29] Update buildexe_package_manager.rst --- docs/source/getting_started/buildexe_package_manager.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/source/getting_started/buildexe_package_manager.rst b/docs/source/getting_started/buildexe_package_manager.rst index eacbb243..ade655a9 100644 --- a/docs/source/getting_started/buildexe_package_manager.rst +++ b/docs/source/getting_started/buildexe_package_manager.rst @@ -1,6 +1,12 @@ BuildExe as a Package Manager ============================= +When we are **compiling** our "script" to an executable we can also add additional library build files which define how the library is built. + +The procedure is similar to git cloning the library to the **ENV{BUILDCC_HOME}/libs** folder using the ``libs`` options in buildexe. + +Please see :doc:`buildexe_setup` to setup your libs folder appropriately. + Basic Procedure ---------------- From 02f6558a3f04e9547e86d6e621d1d81c78e36316 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 19:07:34 -0800 Subject: [PATCH 21/29] Update buildexe_package_manager.rst --- .../buildexe_package_manager.rst | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/docs/source/getting_started/buildexe_package_manager.rst b/docs/source/getting_started/buildexe_package_manager.rst index ade655a9..c068389d 100644 --- a/docs/source/getting_started/buildexe_package_manager.rst +++ b/docs/source/getting_started/buildexe_package_manager.rst @@ -39,3 +39,60 @@ Basic Procedure build_project_exe -right-> hello_world_exe library -up-> hello_world_exe + +Helloworld "fmtlib" example +---------------------------- + +* Git clone the ``fmt`` library into your ``ENV{BUILDCC_HOME}/libs`` folder +* Run ``buildexe libs --help-all``. + * You should automatically see the library folder name pop up under the ``libs`` submodule. + * In this case it will be the ``fmt`` option. + +.. code-block:: shell + :linenos: + :emphasize-lines: 8 + + script + Options: + --configs TEXT ... Config files for script mode + + libs + Libraries + Options: + --fmt TEXT ... fmt library + +* Since we want to use the ``fmt`` library in our project we can now write your ``compile.toml`` file as given below. + +Directory structure ++++++++++++++++++++++ + +.. uml:: + + @startmindmap + * [workspace] + ** [src] + *** main.cpp + ** build.helloworld.cpp + ** compile.toml + ** build.toml + @endmindmap + +Write your C++ "script" +++++++++++++++++++++++++ + +Write your ``compile.toml`` file +++++++++++++++++++++++++++++++++ + +Write your ``build.toml`` file ++++++++++++++++++++++++++++++++ + +Write your ``main.cpp`` helloworld example in fmtlib +++++++++++++++++++++++++++++++++++++++++++++++++++++ + +.. code-block:: cpp + + #include "fmt/format.h" + int main() { + fmt::print("{} {}", "Hello", "World"); + return 0; + } From bb7f6cd2c4af8aaeeeb15318e33f1c75d256a878 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 19:20:59 -0800 Subject: [PATCH 22/29] Update buildexe_package_manager.rst --- .../buildexe_package_manager.rst | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/docs/source/getting_started/buildexe_package_manager.rst b/docs/source/getting_started/buildexe_package_manager.rst index c068389d..e6e5e4ed 100644 --- a/docs/source/getting_started/buildexe_package_manager.rst +++ b/docs/source/getting_started/buildexe_package_manager.rst @@ -77,6 +77,87 @@ Directory structure ** build.toml @endmindmap +Write your fmtlib build files +++++++++++++++++++++++++++++++ + +.. note:: This process might seem like a hassle. But please note that fmtlib does not currently have support for BuildCC like build files and it must be provided by the user. + +.. code-block:: cpp + :linenos: + :caption: build.fmt.h + + #pragma once + + #include "buildcc.h" + + using namespace buildcc; + + /** + * @brief User configurable options + * default_flags: Adds default preprocessor, compile and link flags to the fmt + * library if true. If false these would need to be provided by the user. + */ + struct FmtConfig { + bool default_flags{true}; + // NOTE, Add more options here as required to customize your fmtlib build + }; + + /** + * @brief Build the libfmt static or dynamic library + * + * @param target Initialized specialized library target + * @param config See FmtConfig above + */ + void build_fmt_cb(BaseTarget& target, const FmtConfig& config = FmtConfig()); + + /** + * @brief Information for fmt header only library + * + * @param target_info Holds the include dirs, headers and preprocessor flag + * information + */ + void build_fmt_ho_cb(TargetInfo& target_info); + +.. code-block:: cpp + :linenos: + :caption: build.fmt.cpp + + #include "build.fmt.h" + + void build_fmt_cb(BaseTarget& target, const FmtConfig& config) { + target.AddSource("src/os.cc"); + target.AddSource("src/format.cc"); + target.AddIncludeDir("include", false); + target.GlobHeaders("include/fmt"); + + // Toolchain specific flags added + // if default_flags == true + if (config.default_flags) { + switch (target.GetToolchain().GetId()) { + case ToolchainId::Gcc: + target.AddCppCompileFlag("-std=c++11"); + break; + case ToolchainId::MinGW: + target.AddCppCompileFlag("-std=c++11"); + break; + case ToolchainId::Msvc: + target.AddCppCompileFlag("/std:c++11"); + break; + default: + break; + } + } + + target.Build(); + } + + void build_fmt_ho_cb(TargetInfo& target_info) { + target_info.AddIncludeDir("include", false); + target_info.GlobHeaders("include/fmt"); + target_info.AddPreprocessorFlag("-DFMT_HEADER_ONLY=1"); + } + + Write your C++ "script" ++++++++++++++++++++++++ From e3d0a9880b34cb8866a1a5a7ead92d5d567c955b Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 19:46:01 -0800 Subject: [PATCH 23/29] Update buildexe_package_manager.rst --- .../buildexe_package_manager.rst | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/docs/source/getting_started/buildexe_package_manager.rst b/docs/source/getting_started/buildexe_package_manager.rst index e6e5e4ed..0652fe6d 100644 --- a/docs/source/getting_started/buildexe_package_manager.rst +++ b/docs/source/getting_started/buildexe_package_manager.rst @@ -148,6 +148,7 @@ Write your fmtlib build files } } + // Register your fmt lib tasks target.Build(); } @@ -161,6 +162,126 @@ Write your fmtlib build files Write your C++ "script" ++++++++++++++++++++++++ +* Boilerplate is similar to the BuildExe helloworld "script" example in :doc:`buildexe_script_example` + +**Core build setup is highlighted below** + +* On line 4 we include our ``build.fmt.h`` include file. See ``compile.toml`` libs submodule to correlate +* On line 8 we include the ``buildexe_lib_dirs.h`` include file. This is a generated include file which contains the absolute paths of the library folders. + * Access is through ``BuildExeLibDir::[lib_folder_name]`` + * This is the reason why we need to make sure that our git cloned library folder name is also a valid C++ variable name. +* On line 40 we point to the absolute ``fmt`` libs folder path for the sources and **redirect** the output to our ``env::get_project_build_dir() / "fmt"`` folder. + * In this way we can safely use out of root projects and redirect the output files to our build location + * There are other input source -> output object redirect options through additional APIs. +* On line 43 and 44 we directly use our fmtlib build APIs to define how fmtlib should be built +* On line 47 and 48 we define our Hello World executable target + * See ``main.cpp`` below for fmtlib hello world example + * See ``hello_world_build_cb`` for build steps +* On line 79 ``hello_world_build_cb`` in additional to compiling our ``main.cpp`` file + * We need to link our compiled ``fmt_lib`` using the ``AddLibDep`` API + * We also insert the ``fmt_lib`` include dirs to the hello world target since we need to ``#include "fmt/format.h"`` in ``main.cpp`` +* On line 52 we register a dependency of ``fmt_lib`` on ``hello_world``. + * This guarantees that the fmt library will be built before the hello world executable. + * This is essential because we need to **link** fmtlib with our hello world executable. + +.. code-block:: cpp + :linenos: + :emphasize-lines: 4,8,38,39,40,43,44,47,48,52,79 + + #include "buildcc.h" + + // Included through libs + #include "build.fmt.h" + + // Generated by BuildCC + // See the `_build_internal` directory + #include "buildexe_lib_dirs.h" + + using namespace buildcc; + + // Function Prototypes + static void clean_cb(); + static void hello_world_build_cb(BaseTarget &target, BaseTarget &fmt_lib); + + int main(int argc, char **argv) { + // 1. Get arguments + Args args; + ArgToolchain arg_gcc; + args.AddToolchain("gcc", "Generic gcc toolchain", arg_gcc); + args.Parse(argc, argv); + + // 2. Initialize your environment + Register reg(args); + + // 3. Pre-build steps + reg.Clean(clean_cb); + + // 4. Build steps + // Explicit toolchain - target pairs + Toolchain_gcc gcc; + auto verified_toolchains = gcc.Verify(); + env::assert_fatal(!verified_toolchains.empty(), "GCC Toolchain not found"); + + // Setup your [Library]Target_[toolchain] fmtlib instance + // Update your TargetEnv to point to `BuildExeLibDir::fmt` folder + // The generated build files will go into your current `project_build_dir / fmt` folder + StaticTarget_gcc fmt_lib( + "libfmt", gcc, + TargetEnv(BuildExeLibDir::fmt, env::get_project_build_dir() / "fmt")); + + // We use the build.fmt.h and build.fmt.cpp APIs to define how we build our fmtlib + FmtConfig fmt_config; + reg.Build(arg_gcc.state, build_fmt_cb, fmt_lib, fmt_config); + + // Define our hello world executable + ExecutableTarget_gcc hello_world("hello_world", gcc, ""); + reg.Build(arg_gcc.state, hello_world_build_cb, hello_world, fmt_lib); + + // Fmt lib is a dependency to the Hello world executable + // This means that fmt lib is guaranteed to be built before the hello world executable + reg.Dep(hello_world, fmt_lib); + + // 5. Test steps i.e Hello world is automatically run + reg.Test(arg_gcc.state, "{executable}", hello_world); + + // 6. Build Target + // Builds libfmt.a and ./hello_world + reg.RunBuild(); + + // 7. Test Target + // Executes ./hello_world + // Output -> Hello World + reg.RunTest(); + + // 8. Post Build steps + // - Clang Compile Commands + plugin::ClangCompileCommands({&hello_world}).Generate(); + // - Graphviz dump + std::cout << reg.GetTaskflow().dump() << std::endl; + + return 0; + } + + static void clean_cb() { + fs::remove_all(env::get_project_build_dir()); + } + + static void hello_world_build_cb(BaseTarget &target, BaseTarget &fmt_lib) { + target.AddSource("main.cpp", "src"); + + // Add fmt_lib as a library dependency + target.AddLibDep(fmt_lib); + // We need to insert the fmt lib include dirs and header files into our hello_world executable target (naturally) + target.Insert(fmt_lib, { + SyncOption::IncludeDirs, + SyncOption::HeaderFiles, + }); + + // Register your tasks + target.Build(); + } + + Write your ``compile.toml`` file ++++++++++++++++++++++++++++++++ From 223d937cd9ba4787e0baa19840057dfb8f4f56f3 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 19:49:53 -0800 Subject: [PATCH 24/29] Update buildexe_package_manager.rst --- .../buildexe_package_manager.rst | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/source/getting_started/buildexe_package_manager.rst b/docs/source/getting_started/buildexe_package_manager.rst index 0652fe6d..fb300db9 100644 --- a/docs/source/getting_started/buildexe_package_manager.rst +++ b/docs/source/getting_started/buildexe_package_manager.rst @@ -285,6 +285,37 @@ Write your C++ "script" Write your ``compile.toml`` file ++++++++++++++++++++++++++++++++ +* The only difference from the ``compile.toml`` in :doc:`buildexe_script_example` is the additional of the ``libs`` submodule +* We use the ``fmt`` option since we git cloned the library into the libs folder +* We add the various fmt build files that need to be compiled with our "script" +* See highlighed lines 19 and 20 + +.. code-block:: toml + :linenos: + :emphasize-lines: 19,20 + + # Settings + root_dir = "" + build_dir = "_build_internal" + loglevel = "debug" + clean = false + + # BuildExe run mode + mode = "script" + + # Target information + name = "single" + type = "executable" + relative_to_root = "" + srcs = ["build.main.cpp"] + + [script] + configs = ["build.toml"] + + [libs] + fmt = ["build.fmt.cpp", "build.fmt.h"] + + Write your ``build.toml`` file +++++++++++++++++++++++++++++++ From 3daa57506c5a20338e947c0a799c56b234620500 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 19:51:17 -0800 Subject: [PATCH 25/29] Update buildexe_package_manager.rst --- .../buildexe_package_manager.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/source/getting_started/buildexe_package_manager.rst b/docs/source/getting_started/buildexe_package_manager.rst index fb300db9..2edf759b 100644 --- a/docs/source/getting_started/buildexe_package_manager.rst +++ b/docs/source/getting_started/buildexe_package_manager.rst @@ -319,6 +319,23 @@ Write your ``compile.toml`` file Write your ``build.toml`` file +++++++++++++++++++++++++++++++ +* Exact same ``build.toml`` as seen in the document :doc:`buildexe_script_example` + +.. code-block:: toml + :linenos: + + # Root + root_dir = "" + build_dir = "_build" + loglevel = "debug" + clean = true + + # Toolchain + [toolchain.gcc] + build = true + test = true + + Write your ``main.cpp`` helloworld example in fmtlib ++++++++++++++++++++++++++++++++++++++++++++++++++++ From 08bf3ef8bb246e9ba4cc23063ada0e3b0fdddb65 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 9 Jan 2022 19:55:34 -0800 Subject: [PATCH 26/29] Update buildexe_package_manager.rst --- docs/source/getting_started/buildexe_package_manager.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/source/getting_started/buildexe_package_manager.rst b/docs/source/getting_started/buildexe_package_manager.rst index 2edf759b..161e09ad 100644 --- a/docs/source/getting_started/buildexe_package_manager.rst +++ b/docs/source/getting_started/buildexe_package_manager.rst @@ -61,7 +61,13 @@ Helloworld "fmtlib" example Options: --fmt TEXT ... fmt library -* Since we want to use the ``fmt`` library in our project we can now write your ``compile.toml`` file as given below. +* Since we want to use the ``fmt`` library in our project we can now write our ``compile.toml`` file as given below. (See highlighted lines) +* We then write our "script", include the ``fmt`` build header file and define our targets and dependencies. +* Lastly we invoke buildexe to build our project + +.. code-block:: bash + + buildexe --config compile.toml --config $BUILDCC_HOME/host/host_toolchain.toml Directory structure +++++++++++++++++++++ From fc945d8212a6de8a4ff257bebdc05fd8071941b1 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 10 Jan 2022 05:42:15 -0800 Subject: [PATCH 27/29] Updated linux and win with BuildExe Layout Setup --- .github/workflows/linux_gcc_cmake_build.yml | 24 +++++++++++++++++++++ .github/workflows/win_cmake_build.yml | 12 +++++++++++ 2 files changed, 36 insertions(+) diff --git a/.github/workflows/linux_gcc_cmake_build.yml b/.github/workflows/linux_gcc_cmake_build.yml index e694565d..d77464de 100644 --- a/.github/workflows/linux_gcc_cmake_build.yml +++ b/.github/workflows/linux_gcc_cmake_build.yml @@ -63,9 +63,21 @@ jobs: run: | cmake --build . --target run_buildcc_lib_bootstrap_linux_gcc --config Release + - name: BuildExe Layout setup + working-directory: ${{github.workspace}}/.. + run: | + mkdir buildcc_home + export BUILDCC_HOME="${{github.workspace}}/../buildcc_home" + echo $BUILDCC_HOME + cd buildcc_home + mkdir buildcc + mkdir libs + mkdir extensions + - name: BuildExe IM example tiny-process-library working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_ALL}} run: | + echo $BUILDCC_HOME cmake --build . --target run_buildexe_im_tpl_linux_gcc --config Release - name: CPack Release @@ -200,9 +212,21 @@ jobs: run: | cmake --build . --target run_buildcc_lib_bootstrap_linux_gcc --config Release + - name: BuildExe Layout setup + working-directory: ${{github.workspace}}/.. + run: | + mkdir buildcc_home + export BUILDCC_HOME="${{github.workspace}}/../buildcc_home" + echo $BUILDCC_HOME + cd buildcc_home + mkdir buildcc + mkdir libs + mkdir extensions + - name: BuildExe IM example tiny-process-library working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_SINGLE}} run: | + echo $BUILDCC_HOME cmake --build . --target run_buildexe_im_tpl_linux_gcc --config Release # - name: TODO, BuildExe SM simple hyrid example diff --git a/.github/workflows/win_cmake_build.yml b/.github/workflows/win_cmake_build.yml index badc6173..67478c0b 100644 --- a/.github/workflows/win_cmake_build.yml +++ b/.github/workflows/win_cmake_build.yml @@ -55,9 +55,21 @@ jobs: run: | cmake --build . --config Release --target run_buildcc_lib_bootstrap_win_msvc --parallel 2 + - name: BuildExe Layout setup + working-directory: ${{github.workspace}}/.. + run: | + mkdir buildcc_home + $env:BUILDCC_HOME = "${{github.workspace}}/../buildcc_home" + $env:BUILDCC_HOME + cd buildcc_home + mkdir buildcc + mkdir libs + mkdir extensions + - name: BuildExe IM example tiny-process-library working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} run: | + $env:BUILDCC_HOME cmake --build . --config Release --target run_buildexe_im_tpl_win_msvc # - name: TODO, BuildExe SM simple hyrid example From 613713b221990cd6c022716bd9d1de0ecb6aa471 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 10 Jan 2022 05:58:18 -0800 Subject: [PATCH 28/29] Update win_cmake_build.yml --- .github/workflows/win_cmake_build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/win_cmake_build.yml b/.github/workflows/win_cmake_build.yml index 67478c0b..2bcadad4 100644 --- a/.github/workflows/win_cmake_build.yml +++ b/.github/workflows/win_cmake_build.yml @@ -65,11 +65,13 @@ jobs: mkdir buildcc mkdir libs mkdir extensions + cd .. + dir - name: BuildExe IM example tiny-process-library working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} run: | - $env:BUILDCC_HOME + $env:BUILDCC_HOME = "${{github.workspace}}/../buildcc_home" cmake --build . --config Release --target run_buildexe_im_tpl_win_msvc # - name: TODO, BuildExe SM simple hyrid example From c27bee5f116f921d6958c3128b398030a55c63c3 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 10 Jan 2022 06:22:21 -0800 Subject: [PATCH 29/29] Update linux_gcc_cmake_build.yml --- .github/workflows/linux_gcc_cmake_build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/linux_gcc_cmake_build.yml b/.github/workflows/linux_gcc_cmake_build.yml index d77464de..5d327756 100644 --- a/.github/workflows/linux_gcc_cmake_build.yml +++ b/.github/workflows/linux_gcc_cmake_build.yml @@ -73,10 +73,13 @@ jobs: mkdir buildcc mkdir libs mkdir extensions + cd .. + ls - name: BuildExe IM example tiny-process-library working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_ALL}} run: | + export BUILDCC_HOME="${{github.workspace}}/../buildcc_home" echo $BUILDCC_HOME cmake --build . --target run_buildexe_im_tpl_linux_gcc --config Release @@ -222,10 +225,13 @@ jobs: mkdir buildcc mkdir libs mkdir extensions + cd .. + ls - name: BuildExe IM example tiny-process-library working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_SINGLE}} run: | + export BUILDCC_HOME="${{github.workspace}}/../buildcc_home" echo $BUILDCC_HOME cmake --build . --target run_buildexe_im_tpl_linux_gcc --config Release