diff --git a/.github/workflows/msvc-analysis.yml b/.github/workflows/msvc-analysis.yml index a2628f34..bd370187 100644 --- a/.github/workflows/msvc-analysis.yml +++ b/.github/workflows/msvc-analysis.yml @@ -25,7 +25,7 @@ env: jobs: analyze: name: Analyze - runs-on: windows-latest + runs-on: windows-2019 steps: - name: Checkout repository diff --git a/bootstrap/src/build_buildcc.cpp b/bootstrap/src/build_buildcc.cpp index 33b1066b..70765e9d 100644 --- a/bootstrap/src/build_buildcc.cpp +++ b/bootstrap/src/build_buildcc.cpp @@ -62,9 +62,11 @@ void buildcc_cb(BaseTarget &target, const BaseGenerator &schema_gen, // TOOLCHAIN target.GlobSources("lib/toolchain/src/api"); + target.GlobSources("lib/toolchain/src/common"); target.AddIncludeDir("lib/toolchain/include"); target.GlobHeaders("lib/toolchain/include/toolchain"); target.GlobHeaders("lib/toolchain/include/toolchain/api"); + target.GlobHeaders("lib/toolchain/include/toolchain/common"); // TARGET target.GlobSources("lib/target/src/common"); @@ -205,33 +207,35 @@ void BuildBuildCC::Setup(const ArgToolchainState &state) { // Flatbuffers HO lib auto &flatbuffers_ho_lib = storage_.Add( - kFlatbuffersHoName, + kFlatbuffersHoName, toolchain_, 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( - kCli11HoName, TargetEnv(env_.GetTargetRootDir() / "third_party" / "CLI11", - env_.GetTargetBuildDir())); + kCli11HoName, toolchain_, + 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( - kFmtHoName, TargetEnv(env_.GetTargetRootDir() / "third_party" / "fmt", - env_.GetTargetBuildDir())); + kFmtHoName, toolchain_, + 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( - kSpdlogHoName, + kSpdlogHoName, toolchain_, 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( - kTaskflowHoName, + kTaskflowHoName, toolchain_, TargetEnv(env_.GetTargetRootDir() / "third_party" / "taskflow", env_.GetTargetBuildDir())); reg_.CallbackIf(state, taskflow_ho_cb, taskflow_ho_lib); diff --git a/buildcc/lib/target/cmake/common_target_src.cmake b/buildcc/lib/target/cmake/common_target_src.cmake index 875e5edf..6f2bb771 100644 --- a/buildcc/lib/target/cmake/common_target_src.cmake +++ b/buildcc/lib/target/cmake/common_target_src.cmake @@ -7,7 +7,6 @@ set(COMMON_TARGET_SRCS src/common/target_state.cpp include/target/common/target_config.h include/target/common/target_state.h - include/target/common/target_file_ext.h include/target/common/target_env.h src/common/util.cpp diff --git a/buildcc/lib/target/cmake/mock_target.cmake b/buildcc/lib/target/cmake/mock_target.cmake index da18b626..39ec8a77 100644 --- a/buildcc/lib/target/cmake/mock_target.cmake +++ b/buildcc/lib/target/cmake/mock_target.cmake @@ -21,7 +21,6 @@ target_link_options(mock_target PUBLIC ${TEST_LINK_FLAGS} ${BUILD_LINK_FLAGS}) target_link_libraries(mock_target PUBLIC Taskflow - mock_schema mock_toolchain CppUTest diff --git a/buildcc/lib/target/cmake/target.cmake b/buildcc/lib/target/cmake/target.cmake index fdb0cd8d..98f16479 100644 --- a/buildcc/lib/target/cmake/target.cmake +++ b/buildcc/lib/target/cmake/target.cmake @@ -28,7 +28,6 @@ if(${BUILDCC_BUILD_AS_INTERFACE}) $ ) target_link_libraries(target PUBLIC - schema toolchain Taskflow ) diff --git a/buildcc/lib/target/include/target/common/target_config.h b/buildcc/lib/target/include/target/common/target_config.h index 172c52b0..a09d2595 100644 --- a/buildcc/lib/target/include/target/common/target_config.h +++ b/buildcc/lib/target/include/target/common/target_config.h @@ -21,8 +21,6 @@ #include #include -#include "target/common/target_file_ext.h" - namespace fs = std::filesystem; namespace buildcc { @@ -30,77 +28,13 @@ namespace buildcc { struct TargetConfig { TargetConfig() = default; - /** - * @brief Get the valid file extension from a path - * - * See TargetConfig::valid_c_ext, TargetConfig::valid_cpp_ext, - * TargetConfig::valid_asm_ext, TargetConfig::valid_header_ext - * - * @param filepath Absolute / Relative path of the file - * @return TargetFileExt File path detected as per TargetConfig::valid_* - * variables - */ - TargetFileExt GetFileExt(const fs::path &filepath) const; - - /** - * @brief Checks for C/C++ source file validity. - * - * See TargetConfig::valid_c_ext, TargetConfig::valid_cpp_ext, - * TargetConfig::valid_asm_ext - * - * @param filepath Absolute / Relative path of file - * @return true If file extension belongs to the above valid_* list - * @return false If file extension does not belong to the above valid_* list - */ - bool IsValidSource(const fs::path &filepath) const; - - /** - * @brief Checks for Header file validity - * - * See TargetConfig::valid_header_ext - * - * @param filepath Absolute / Relative path of file - * @return true If file extension belongs to above valid_* list - * @return false If file extension does not belong to above valid_* list - */ - bool IsValidHeader(const fs::path &filepath) const; - - /** - * @brief Expects Source file validity - * - * env::assert_fatal if not a valid source - * - * @param filepath Absolute / Relative path of file - */ - void ExpectsValidSource(const fs::path &filepath) const; - - /** - * @brief Expects header file validity - * - * env::assert_fatal if not a valid header - * - * @param filepath Absolute / Relative path of file - */ - void ExpectsValidHeader(const fs::path &filepath) const; - std::string target_ext{""}; - std::string obj_ext{".o"}; - std::string pch_header_ext{".h"}; - std::string pch_compile_ext{".gch"}; - - std::string prefix_include_dir{"-I"}; - std::string prefix_lib_dir{"-L"}; // clang-format off std::string pch_command{"{compiler} {preprocessor_flags} {include_dirs} {common_compile_flags} {pch_compile_flags} {compile_flags} -o {output} -c {input}"}; std::string compile_command{"{compiler} {preprocessor_flags} {include_dirs} {common_compile_flags} {pch_object_flags} {compile_flags} -o {output} -c {input}"}; std::string link_command{"{cpp_compiler} {link_flags} {compiled_sources} -o {output} {lib_dirs} {lib_deps}"}; // clang-format on - - std::unordered_set valid_c_ext{".c"}; - std::unordered_set valid_cpp_ext{".cpp", ".cxx", ".cc"}; - std::unordered_set valid_asm_ext{".s", ".S", ".asm"}; - std::unordered_set valid_header_ext{".h", ".hpp"}; }; } // namespace buildcc diff --git a/buildcc/lib/target/include/target/common/target_state.h b/buildcc/lib/target/include/target/common/target_state.h index cc7e06eb..3afc766f 100644 --- a/buildcc/lib/target/include/target/common/target_state.h +++ b/buildcc/lib/target/include/target/common/target_state.h @@ -17,7 +17,7 @@ #ifndef TARGET_COMMON_TARGET_STATE_H_ #define TARGET_COMMON_TARGET_STATE_H_ -#include "target/common/target_file_ext.h" +#include "toolchain/common/file_ext.h" namespace buildcc { @@ -27,7 +27,7 @@ namespace buildcc { // TargetInfo does not have a `Build` method, it is only meant to hold // information struct TargetState { - void SetSourceState(TargetFileExt file_extension); + void SetSourceState(FileExt file_extension); void SetPch(); void SetLock(); diff --git a/buildcc/lib/target/include/target/target.h b/buildcc/lib/target/include/target/target.h index 4a75c230..a9540a14 100644 --- a/buildcc/lib/target/include/target/target.h +++ b/buildcc/lib/target/include/target/target.h @@ -70,10 +70,12 @@ class Target : public internal::BuilderInterface, const Toolchain &toolchain, const TargetEnv &env, const TargetConfig &config = TargetConfig()) : TargetInfo( + toolchain, TargetEnv(env.GetTargetRootDir(), env.GetTargetBuildDir() / toolchain.GetName() / name), config), - name_(name), type_(type), toolchain_(toolchain), + name_(name), type_(type), + // toolchain_(toolchain), // loader_(name, env_.GetTargetBuildDir()), serialization_(env_.GetTargetBuildDir() / fmt::format("{}.bin", name)), compile_pch_(*this), compile_object_(*this), link_target_(*this) { @@ -99,8 +101,8 @@ class Target : public internal::BuilderInterface, void Initialize(); // - std::optional SelectCompileFlags(TargetFileExt ext) const; - std::optional SelectCompiler(TargetFileExt ext) const; + std::optional SelectCompileFlags(FileExt ext) const; + std::optional SelectCompiler(FileExt ext) const; // Recompilation checks void RecheckPaths(const internal::path_unordered_set &previous_path, @@ -139,7 +141,7 @@ class Target : public internal::BuilderInterface, private: std::string name_; TargetType type_; - const Toolchain &toolchain_; + // const Toolchain &toolchain_; internal::TargetSerialization serialization_; // Friend classes diff --git a/buildcc/lib/target/include/target/target_info.h b/buildcc/lib/target/include/target/target_info.h index aa3c22ca..fb795161 100644 --- a/buildcc/lib/target/include/target/target_info.h +++ b/buildcc/lib/target/include/target/target_info.h @@ -19,6 +19,8 @@ #include +#include "toolchain/toolchain.h" + #include "target/common/target_config.h" #include "target/common/target_env.h" #include "target/common/target_state.h" @@ -60,8 +62,9 @@ class TargetInfo : public internal::SourceApi, public internal::SyncApi, public internal::TargetInfoGetter { public: - TargetInfo(const TargetEnv &env, const TargetConfig &config = TargetConfig()) - : env_(env), config_(config) {} + TargetInfo(const BaseToolchain &toolchain, const TargetEnv &env, + const TargetConfig &config = TargetConfig()) + : toolchain_(toolchain), env_(env), config_(config) {} private: // Inputs @@ -79,6 +82,7 @@ class TargetInfo : public internal::SourceApi, friend class internal::TargetInfoGetter; protected: + const BaseToolchain &toolchain_; TargetEnv env_; TargetConfig config_; diff --git a/buildcc/lib/target/src/api/include_api.cpp b/buildcc/lib/target/src/api/include_api.cpp index a1716935..49ca6241 100644 --- a/buildcc/lib/target/src/api/include_api.cpp +++ b/buildcc/lib/target/src/api/include_api.cpp @@ -25,7 +25,7 @@ void IncludeApi::AddHeaderAbsolute(const fs::path &absolute_filepath) { T &t = static_cast(*this); t.state_.ExpectsUnlock(); - t.config_.ExpectsValidHeader(absolute_filepath); + t.toolchain_.GetConfig().ExpectsValidHeader(absolute_filepath); t.user_.headers.insert(absolute_filepath); } @@ -53,7 +53,7 @@ void IncludeApi::GlobHeadersAbsolute(const fs::path &absolute_path) { T &t = static_cast(*this); for (const auto &p : fs::directory_iterator(absolute_path)) { - if (t.config_.IsValidHeader(p.path())) { + if (t.toolchain_.GetConfig().IsValidHeader(p.path())) { AddHeaderAbsolute(p.path()); } } diff --git a/buildcc/lib/target/src/api/pch_api.cpp b/buildcc/lib/target/src/api/pch_api.cpp index 60d3745e..c0695342 100644 --- a/buildcc/lib/target/src/api/pch_api.cpp +++ b/buildcc/lib/target/src/api/pch_api.cpp @@ -25,7 +25,7 @@ void PchApi::AddPchAbsolute(const fs::path &absolute_filepath) { T &t = static_cast(*this); t.state_.ExpectsUnlock(); - t.config_.ExpectsValidHeader(absolute_filepath); + t.toolchain_.GetConfig().ExpectsValidHeader(absolute_filepath); const fs::path absolute_pch = fs::path(absolute_filepath).make_preferred(); t.user_.pchs.insert(absolute_pch); diff --git a/buildcc/lib/target/src/api/source_api.cpp b/buildcc/lib/target/src/api/source_api.cpp index 78d260a9..cc47cda3 100644 --- a/buildcc/lib/target/src/api/source_api.cpp +++ b/buildcc/lib/target/src/api/source_api.cpp @@ -25,7 +25,7 @@ void SourceApi::AddSourceAbsolute(const fs::path &absolute_source) { T &t = static_cast(*this); t.state_.ExpectsUnlock(); - t.config_.ExpectsValidSource(absolute_source); + t.toolchain_.GetConfig().ExpectsValidSource(absolute_source); t.user_.sources.emplace(fs::path(absolute_source).make_preferred()); } @@ -34,7 +34,7 @@ void SourceApi::GlobSourcesAbsolute(const fs::path &absolute_source_dir) { T &t = static_cast(*this); for (const auto &p : fs::directory_iterator(absolute_source_dir)) { - if (t.config_.IsValidSource(p.path())) { + if (t.toolchain_.GetConfig().IsValidSource(p.path())) { AddSourceAbsolute(p.path()); } } @@ -59,7 +59,7 @@ void SourceApi::GlobSources(const fs::path &relative_to_target_path) { fs::path absolute_input_path = t.env_.GetTargetRootDir() / relative_to_target_path; for (const auto &p : fs::directory_iterator(absolute_input_path)) { - if (t.config_.IsValidSource(p.path())) { + if (t.toolchain_.GetConfig().IsValidSource(p.path())) { AddSourceAbsolute(p.path()); } } diff --git a/buildcc/lib/target/src/common/target_config.cpp b/buildcc/lib/target/src/common/target_config.cpp index 3f7b5135..23207ac1 100644 --- a/buildcc/lib/target/src/common/target_config.cpp +++ b/buildcc/lib/target/src/common/target_config.cpp @@ -22,67 +22,4 @@ #include "fmt/format.h" -namespace buildcc { - -TargetFileExt TargetConfig::GetFileExt(const fs::path &filepath) const { - if (!filepath.has_extension()) { - return TargetFileExt::Invalid; - } - - TargetFileExt type = TargetFileExt::Invalid; - const std::string ext = filepath.extension().string(); - - if (valid_c_ext.count(ext) == 1) { - type = TargetFileExt::C; - } else if (valid_cpp_ext.count(ext) == 1) { - type = TargetFileExt::Cpp; - } else if (valid_asm_ext.count(ext) == 1) { - type = TargetFileExt::Asm; - } else if (valid_header_ext.count(ext) == 1) { - type = TargetFileExt::Header; - } - - return type; -} - -bool TargetConfig::IsValidSource(const fs::path &filepath) const { - if (!filepath.has_extension()) { - return false; - } - - const std::string ext = filepath.extension().string(); - bool valid = false; - if ((valid_c_ext.find(ext) != valid_c_ext.end()) || - (valid_cpp_ext.find(ext) != valid_cpp_ext.end()) || - (valid_asm_ext.find(ext) != valid_asm_ext.end())) { - valid = true; - } - return valid; -} - -void TargetConfig::ExpectsValidSource(const fs::path &filepath) const { - env::assert_fatal( - IsValidSource(filepath), - fmt::format("{} does not have a valid source extension", filepath)); -} - -bool TargetConfig::IsValidHeader(const fs::path &filepath) const { - if (!filepath.has_extension()) { - return {}; - } - - const std::string ext = filepath.extension().string(); - bool valid = false; - if ((valid_header_ext.find(ext) != valid_header_ext.end())) { - valid = true; - } - return valid; -} - -void TargetConfig::ExpectsValidHeader(const fs::path &filepath) const { - env::assert_fatal( - IsValidHeader(filepath), - fmt::format("{} does not have a valid header extension", filepath)); -} - -} // namespace buildcc +namespace buildcc {} // namespace buildcc diff --git a/buildcc/lib/target/src/common/target_state.cpp b/buildcc/lib/target/src/common/target_state.cpp index d2740547..95a8a022 100644 --- a/buildcc/lib/target/src/common/target_state.cpp +++ b/buildcc/lib/target/src/common/target_state.cpp @@ -20,19 +20,19 @@ namespace buildcc { -void TargetState::SetSourceState(TargetFileExt file_extension) { +void TargetState::SetSourceState(FileExt file_extension) { switch (file_extension) { - case TargetFileExt::Asm: + case FileExt::Asm: contains_asm = true; break; - case TargetFileExt::C: + case FileExt::C: contains_c = true; break; - case TargetFileExt::Cpp: + case FileExt::Cpp: contains_cpp = true; break; - case TargetFileExt::Header: - case TargetFileExt::Invalid: + case FileExt::Header: + case FileExt::Invalid: default: break; } diff --git a/buildcc/lib/target/src/target/build.cpp b/buildcc/lib/target/src/target/build.cpp index 4e9de6c6..7d00cd19 100644 --- a/buildcc/lib/target/src/target/build.cpp +++ b/buildcc/lib/target/src/target/build.cpp @@ -66,7 +66,7 @@ void Target::Build() { // Source state for (const auto &abs_source : user_.sources) { // Set state - state_.SetSourceState(config_.GetFileExt(abs_source)); + state_.SetSourceState(toolchain_.GetConfig().GetFileExt(abs_source)); // Relate input source with output object compile_object_.AddObjectData(abs_source); @@ -74,10 +74,11 @@ void Target::Build() { // Target default arguments command_.AddDefaultArguments({ - {kIncludeDirs, internal::aggregate_with_prefix(config_.prefix_include_dir, - GetIncludeDirs())}, - {kLibDirs, - internal::aggregate_with_prefix(config_.prefix_lib_dir, GetLibDirs())}, + {kIncludeDirs, + internal::aggregate_with_prefix( + toolchain_.GetConfig().prefix_include_dir, GetIncludeDirs())}, + {kLibDirs, internal::aggregate_with_prefix( + toolchain_.GetConfig().prefix_lib_dir, GetLibDirs())}, {kPreprocessorFlags, internal::aggregate(GetPreprocessorFlags())}, {kCommonCompileFlags, internal::aggregate(GetCommonCompileFlags())}, diff --git a/buildcc/lib/target/src/target/friend/compile_object.cpp b/buildcc/lib/target/src/target/friend/compile_object.cpp index 846108df..c9b46bdf 100644 --- a/buildcc/lib/target/src/target/friend/compile_object.cpp +++ b/buildcc/lib/target/src/target/friend/compile_object.cpp @@ -46,7 +46,8 @@ void CompileObject::CacheCompileCommands() { fmt::format("{}", GetObjectData(absolute_current_source).output); const std::string input = fmt::format("{}", absolute_current_source); - const auto type = target_.config_.GetFileExt(absolute_current_source); + const auto type = + target_.toolchain_.GetConfig().GetFileExt(absolute_current_source); const std::string selected_aggregated_compile_flags = target_.SelectCompileFlags(type).value_or(""); const std::string selected_compiler = @@ -156,7 +157,7 @@ CompileObject::ConstructObjectPath(const fs::path &absolute_source_file) const { fs::path absolute_compiled_source = target_.GetTargetBuildDir() / relative; absolute_compiled_source.replace_filename( fmt::format("{}{}", absolute_source_file.filename().string(), - target_.GetConfig().obj_ext)); + target_.toolchain_.GetConfig().obj_ext)); return absolute_compiled_source; } diff --git a/buildcc/lib/target/src/target/friend/compile_pch.cpp b/buildcc/lib/target/src/target/friend/compile_pch.cpp index 971f36f1..312b8b7c 100644 --- a/buildcc/lib/target/src/target/friend/compile_pch.cpp +++ b/buildcc/lib/target/src/target/friend/compile_pch.cpp @@ -117,13 +117,14 @@ void CompilePch::BuildCompile() { fs::path CompilePch::ConstructHeaderPath() const { return target_.GetTargetBuildDir() / - fmt::format("buildcc_pch{}", target_.GetConfig().pch_header_ext); + fmt::format("buildcc_pch{}", + target_.toolchain_.GetConfig().pch_header_ext); } fs::path CompilePch::ConstructCompilePath() const { return ConstructHeaderPath().replace_extension( - fmt::format("{}{}", target_.GetConfig().pch_header_ext, - target_.GetConfig().pch_compile_ext)); + fmt::format("{}{}", target_.toolchain_.GetConfig().pch_header_ext, + target_.toolchain_.GetConfig().pch_compile_ext)); } fs::path CompilePch::ConstructSourcePath(bool has_cpp) const { @@ -133,7 +134,7 @@ fs::path CompilePch::ConstructSourcePath(bool has_cpp) const { fs::path CompilePch::ConstructObjectPath() const { return ConstructHeaderPath().replace_extension( - fmt::format("{}", target_.GetConfig().obj_ext)); + fmt::format("{}", target_.toolchain_.GetConfig().obj_ext)); } std::string CompilePch::ConstructCompileCommand() const { @@ -141,14 +142,14 @@ std::string CompilePch::ConstructCompileCommand() const { ? target_.GetToolchain().GetCppCompiler() : target_.GetToolchain().GetCCompiler(); compiler = fmt::format("{}", fs::path(compiler)); - const TargetFileExt file_ext_type = - target_.GetState().contains_cpp ? TargetFileExt::Cpp : TargetFileExt::C; + const FileExt file_ext_type = + target_.GetState().contains_cpp ? FileExt::Cpp : FileExt::C; const std::string compile_flags = target_.SelectCompileFlags(file_ext_type).value_or(""); const std::string pch_compile_path = fmt::format("{}", compile_path_); const std::string pch_header_path = fmt::format("{}", header_path_); const std::string pch_source_path = fmt::format("{}", source_path_); - return target_.command_.Construct(target_.config_.pch_command, + return target_.command_.Construct(target_.GetConfig().pch_command, { {kCompiler, compiler}, {kCompileFlags, compile_flags}, diff --git a/buildcc/lib/target/src/target/friend/link_target.cpp b/buildcc/lib/target/src/target/friend/link_target.cpp index 2c6fd30e..49bc52b7 100644 --- a/buildcc/lib/target/src/target/friend/link_target.cpp +++ b/buildcc/lib/target/src/target/friend/link_target.cpp @@ -36,7 +36,7 @@ void LinkTarget::CacheLinkCommand() { const std::string output_target = fmt::format("{}", output_); const auto &target_user_schema = target_.user_; command_ = target_.command_.Construct( - target_.config_.link_command, + target_.GetConfig().link_command, { {kOutput, output_target}, {kCompiledSources, aggregated_compiled_sources}, diff --git a/buildcc/lib/target/src/target/target.cpp b/buildcc/lib/target/src/target/target.cpp index 571cd9a4..dd4aedbe 100644 --- a/buildcc/lib/target/src/target/target.cpp +++ b/buildcc/lib/target/src/target/target.cpp @@ -89,15 +89,15 @@ void Target::RecheckExternalLib( std::bind(&Target::ExternalLibChanged, this)); } -std::optional Target::SelectCompileFlags(TargetFileExt ext) const { +std::optional Target::SelectCompileFlags(FileExt ext) const { switch (ext) { - case TargetFileExt::Asm: + case FileExt::Asm: return internal::aggregate(GetAsmCompileFlags()); break; - case TargetFileExt::C: + case FileExt::C: return internal::aggregate(GetCCompileFlags()); break; - case TargetFileExt::Cpp: + case FileExt::Cpp: return internal::aggregate(GetCppCompileFlags()); break; default: @@ -106,15 +106,15 @@ std::optional Target::SelectCompileFlags(TargetFileExt ext) const { return {}; } -std::optional Target::SelectCompiler(TargetFileExt ext) const { +std::optional Target::SelectCompiler(FileExt ext) const { switch (ext) { - case TargetFileExt::Asm: + case FileExt::Asm: return GetToolchain().GetAsmCompiler(); break; - case TargetFileExt::C: + case FileExt::C: return GetToolchain().GetCCompiler(); break; - case TargetFileExt::Cpp: + case FileExt::Cpp: return GetToolchain().GetCppCompiler(); break; default: diff --git a/buildcc/lib/target/test/target/CMakeLists.txt b/buildcc/lib/target/test/target/CMakeLists.txt index 9b914b55..83d29bbe 100644 --- a/buildcc/lib/target/test/target/CMakeLists.txt +++ b/buildcc/lib/target/test/target/CMakeLists.txt @@ -25,17 +25,11 @@ add_test(NAME test_serialization_interface COMMAND test_serialization_interface ) # Common -add_executable(test_target_config - test_target_config.cpp -) -target_link_libraries(test_target_config PRIVATE target_interface) - add_executable(test_target_state test_target_state.cpp ) target_link_libraries(test_target_state PRIVATE target_interface) -add_test(NAME test_target_config COMMAND test_target_config) add_test(NAME test_target_state COMMAND test_target_state) # Generator diff --git a/buildcc/lib/target/test/target/test_target_config.cpp b/buildcc/lib/target/test/target/test_target_config.cpp deleted file mode 100644 index e0fcfcf0..00000000 --- a/buildcc/lib/target/test/target/test_target_config.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "target/common/target_config.h" - -// NOTE, Make sure all these includes are AFTER the system and header includes -#include "CppUTest/CommandLineTestRunner.h" -#include "CppUTest/MemoryLeakDetectorNewMacros.h" -#include "CppUTest/TestHarness.h" -#include "CppUTest/Utest.h" - -// clang-format off -TEST_GROUP(TargetConfigTestGroup) -{ -}; -// clang-format on - -TEST(TargetConfigTestGroup, GetFileExt) { - buildcc::TargetConfig target_config; - - buildcc::TargetFileExt ext; - - ext = target_config.GetFileExt("file.asm"); - CHECK(ext == buildcc::TargetFileExt::Asm); - - ext = target_config.GetFileExt("file.c"); - CHECK(ext == buildcc::TargetFileExt::C); - - ext = target_config.GetFileExt("file.cpp"); - CHECK(ext == buildcc::TargetFileExt::Cpp); - - ext = target_config.GetFileExt("file.h"); - CHECK(ext == buildcc::TargetFileExt::Header); - - ext = target_config.GetFileExt("file.invalid"); - CHECK(ext == buildcc::TargetFileExt::Invalid); - - ext = target_config.GetFileExt("random/directory"); - CHECK(ext == buildcc::TargetFileExt::Invalid); -} - -int main(int ac, char **av) { - return CommandLineTestRunner::RunAllTests(ac, av); -} diff --git a/buildcc/lib/target/test/target/test_target_state.cpp b/buildcc/lib/target/test/target/test_target_state.cpp index 33900732..f3af3363 100644 --- a/buildcc/lib/target/test/target/test_target_state.cpp +++ b/buildcc/lib/target/test/target/test_target_state.cpp @@ -1,5 +1,5 @@ -#include "target/common/target_file_ext.h" #include "target/common/target_state.h" +#include "toolchain/common/file_ext.h" // NOTE, Make sure all these includes are AFTER the system and header includes #include "CppUTest/CommandLineTestRunner.h" @@ -17,20 +17,20 @@ TEST(TargetStateTestGroup, SetSourceState) { buildcc::TargetState target_state; CHECK_FALSE(target_state.contains_c); - target_state.SetSourceState(buildcc::TargetFileExt::C); + target_state.SetSourceState(buildcc::FileExt::C); CHECK_TRUE(target_state.contains_c); CHECK_FALSE(target_state.contains_cpp); - target_state.SetSourceState(buildcc::TargetFileExt::Cpp); + target_state.SetSourceState(buildcc::FileExt::Cpp); CHECK_TRUE(target_state.contains_cpp); CHECK_FALSE(target_state.contains_asm); - target_state.SetSourceState(buildcc::TargetFileExt::Asm); + target_state.SetSourceState(buildcc::FileExt::Asm); CHECK_TRUE(target_state.contains_asm); // Ignored - target_state.SetSourceState(buildcc::TargetFileExt::Header); - target_state.SetSourceState(buildcc::TargetFileExt::Invalid); + target_state.SetSourceState(buildcc::FileExt::Header); + target_state.SetSourceState(buildcc::FileExt::Invalid); } int main(int ac, char **av) { diff --git a/buildcc/lib/toolchain/CMakeLists.txt b/buildcc/lib/toolchain/CMakeLists.txt index edb0cc09..712131ff 100644 --- a/buildcc/lib/toolchain/CMakeLists.txt +++ b/buildcc/lib/toolchain/CMakeLists.txt @@ -1,6 +1,12 @@ set(TOOLCHAIN_SRCS include/toolchain/toolchain.h + include/toolchain/common/file_ext.h + + src/common/toolchain_config.cpp + include/toolchain/common/toolchain_config.h + + # Features src/api/toolchain_verify.cpp include/toolchain/api/toolchain_verify.h ) @@ -14,7 +20,7 @@ if (${TESTING}) target_compile_options(mock_toolchain PUBLIC ${TEST_COMPILE_FLAGS} ${BUILD_COMPILE_FLAGS}) target_link_options(mock_toolchain PUBLIC ${TEST_LINK_FLAGS} ${BUILD_LINK_FLAGS}) target_link_libraries(mock_toolchain PUBLIC - mock_env + mock_schema CppUTest CppUTestExt @@ -28,9 +34,17 @@ if (${TESTING}) mock_toolchain ) + add_executable(test_toolchain_config + test/test_toolchain_config.cpp + ) + target_link_libraries(test_toolchain_config PRIVATE + mock_toolchain + ) + add_test(NAME test_toolchain_verify COMMAND test_toolchain_verify WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test ) + add_test(NAME test_toolchain_config COMMAND test_toolchain_config) endif() if(${BUILDCC_BUILD_AS_SINGLE_LIB}) @@ -53,7 +67,7 @@ if(${BUILDCC_BUILD_AS_INTERFACE}) $ ) target_link_libraries(toolchain PUBLIC - env + schema ) endif() diff --git a/buildcc/lib/target/include/target/common/target_file_ext.h b/buildcc/lib/toolchain/include/toolchain/common/file_ext.h similarity index 88% rename from buildcc/lib/target/include/target/common/target_file_ext.h rename to buildcc/lib/toolchain/include/toolchain/common/file_ext.h index bab96289..64a35660 100644 --- a/buildcc/lib/target/include/target/common/target_file_ext.h +++ b/buildcc/lib/toolchain/include/toolchain/common/file_ext.h @@ -14,12 +14,12 @@ * limitations under the License. */ -#ifndef TARGET_COMMON_TARGET_FILE_EXT_H_ -#define TARGET_COMMON_TARGET_FILE_EXT_H_ +#ifndef TOOLCHAIN_COMMON_FILE_EXT_H_ +#define TOOLCHAIN_COMMON_FILE_EXT_H_ namespace buildcc { -enum class TargetFileExt { +enum class FileExt { Asm, ///< Valid Assembly source extension C, ///< Valid C source extension Cpp, ///< Valid Cpp source extension diff --git a/buildcc/lib/toolchain/include/toolchain/common/toolchain_config.h b/buildcc/lib/toolchain/include/toolchain/common/toolchain_config.h new file mode 100644 index 00000000..8cdcce3b --- /dev/null +++ b/buildcc/lib/toolchain/include/toolchain/common/toolchain_config.h @@ -0,0 +1,101 @@ +/* + * 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 TOOLCHAIN_COMMON_TOOLCHAIN_CONFIG_H_ +#define TOOLCHAIN_COMMON_TOOLCHAIN_CONFIG_H_ + +#include +#include +#include + +#include "toolchain/common/file_ext.h" + +namespace fs = std::filesystem; + +namespace buildcc { + +struct ToolchainConfig { + ToolchainConfig() = default; + + /** + * @brief Get the valid file extension from a path + * + * See ToolchainConfig::valid_c_ext, ToolchainConfig::valid_cpp_ext, + * ToolchainConfig::valid_asm_ext, ToolchainConfig::valid_header_ext + * + * @param filepath Absolute / Relative path of the file + * @return FileExt File path detected as per Toolchain::valid_* + * variables + */ + FileExt GetFileExt(const fs::path &filepath) const; + + /** + * @brief Checks for C/C++ source file validity. + * + * See ToolchainConfig::valid_c_ext, ToolchainConfig::valid_cpp_ext, + * ToolchainConfig::valid_asm_ext + * + * @param filepath Absolute / Relative path of file + * @return true If file extension belongs to the above valid_* list + * @return false If file extension does not belong to the above valid_* list + */ + bool IsValidSource(const fs::path &filepath) const; + + /** + * @brief Checks for Header file validity + * + * See ToolchainConfig::valid_header_ext + * + * @param filepath Absolute / Relative path of file + * @return true If file extension belongs to above valid_* list + * @return false If file extension does not belong to above valid_* list + */ + bool IsValidHeader(const fs::path &filepath) const; + + /** + * @brief Expects Source file validity + * + * env::assert_fatal if not a valid source + * + * @param filepath Absolute / Relative path of file + */ + void ExpectsValidSource(const fs::path &filepath) const; + + /** + * @brief Expects header file validity + * + * env::assert_fatal if not a valid header + * + * @param filepath Absolute / Relative path of file + */ + void ExpectsValidHeader(const fs::path &filepath) const; + + std::string obj_ext{".o"}; + std::string pch_header_ext{".h"}; + std::string pch_compile_ext{".gch"}; + + std::string prefix_include_dir{"-I"}; + std::string prefix_lib_dir{"-L"}; + + std::unordered_set valid_c_ext{".c"}; + std::unordered_set valid_cpp_ext{".cpp", ".cxx", ".cc"}; + std::unordered_set valid_asm_ext{".s", ".S", ".asm"}; + std::unordered_set valid_header_ext{".h", ".hpp"}; +}; + +} // namespace buildcc + +#endif diff --git a/buildcc/lib/toolchain/include/toolchain/toolchain.h b/buildcc/lib/toolchain/include/toolchain/toolchain.h index f46c3d41..dec04968 100644 --- a/buildcc/lib/toolchain/include/toolchain/toolchain.h +++ b/buildcc/lib/toolchain/include/toolchain/toolchain.h @@ -21,7 +21,9 @@ #include #include -#include "api/toolchain_verify.h" +#include "toolchain/common/toolchain_config.h" + +#include "toolchain/api/toolchain_verify.h" namespace buildcc { @@ -41,10 +43,13 @@ class Toolchain : public ToolchainVerify { explicit Toolchain(Id id, std::string_view name, std::string_view asm_compiler, std::string_view c_compiler, std::string_view cpp_compiler, std::string_view archiver, - std::string_view linker) + std::string_view linker, + const ToolchainConfig &config = ToolchainConfig()) : id_(id), name_(name), asm_compiler_(asm_compiler), c_compiler_(c_compiler), cpp_compiler_(cpp_compiler), - archiver_(archiver), linker_(linker) {} + archiver_(archiver), linker_(linker), config_(config) { + UpdateConfig(config_); + } Toolchain(Toolchain &&toolchain) = default; Toolchain(const Toolchain &toolchain) = delete; @@ -58,6 +63,11 @@ class Toolchain : public ToolchainVerify { const std::string &GetArchiver() const { return archiver_; } const std::string &GetLinker() const { return linker_; } + const ToolchainConfig &GetConfig() const { return config_; } + +private: + virtual void UpdateConfig(ToolchainConfig &config) { (void)config; } + private: friend class ToolchainVerify; @@ -69,6 +79,8 @@ class Toolchain : public ToolchainVerify { std::string cpp_compiler_; std::string archiver_; std::string linker_; + + ToolchainConfig config_; }; typedef Toolchain::Id ToolchainId; diff --git a/buildcc/lib/toolchain/src/common/toolchain_config.cpp b/buildcc/lib/toolchain/src/common/toolchain_config.cpp new file mode 100644 index 00000000..55125dd4 --- /dev/null +++ b/buildcc/lib/toolchain/src/common/toolchain_config.cpp @@ -0,0 +1,88 @@ +/* + * Copyright 2021-2022 Niket Naidu. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "toolchain/common/toolchain_config.h" + +#include "env/assert_fatal.h" + +#include "schema/path.h" + +#include "fmt/format.h" + +namespace buildcc { + +FileExt ToolchainConfig::GetFileExt(const fs::path &filepath) const { + if (!filepath.has_extension()) { + return FileExt::Invalid; + } + + FileExt type = FileExt::Invalid; + const std::string ext = filepath.extension().string(); + + if (valid_c_ext.count(ext) == 1) { + type = FileExt::C; + } else if (valid_cpp_ext.count(ext) == 1) { + type = FileExt::Cpp; + } else if (valid_asm_ext.count(ext) == 1) { + type = FileExt::Asm; + } else if (valid_header_ext.count(ext) == 1) { + type = FileExt::Header; + } + + return type; +} + +bool ToolchainConfig::IsValidSource(const fs::path &filepath) const { + if (!filepath.has_extension()) { + return false; + } + + const std::string ext = filepath.extension().string(); + bool valid = false; + if ((valid_c_ext.find(ext) != valid_c_ext.end()) || + (valid_cpp_ext.find(ext) != valid_cpp_ext.end()) || + (valid_asm_ext.find(ext) != valid_asm_ext.end())) { + valid = true; + } + return valid; +} + +void ToolchainConfig::ExpectsValidSource(const fs::path &filepath) const { + env::assert_fatal( + IsValidSource(filepath), + fmt::format("{} does not have a valid source extension", filepath)); +} + +bool ToolchainConfig::IsValidHeader(const fs::path &filepath) const { + if (!filepath.has_extension()) { + return {}; + } + + const std::string ext = filepath.extension().string(); + bool valid = false; + if ((valid_header_ext.find(ext) != valid_header_ext.end())) { + valid = true; + } + return valid; +} + +void ToolchainConfig::ExpectsValidHeader(const fs::path &filepath) const { + env::assert_fatal( + IsValidHeader(filepath), + fmt::format("{} does not have a valid header extension", filepath)); +} + +} // namespace buildcc diff --git a/buildcc/lib/toolchain/test/test_toolchain_config.cpp b/buildcc/lib/toolchain/test/test_toolchain_config.cpp new file mode 100644 index 00000000..a0cfce24 --- /dev/null +++ b/buildcc/lib/toolchain/test/test_toolchain_config.cpp @@ -0,0 +1,41 @@ +#include "toolchain/common/toolchain_config.h" + +// NOTE, Make sure all these includes are AFTER the system and header includes +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/MemoryLeakDetectorNewMacros.h" +#include "CppUTest/TestHarness.h" +#include "CppUTest/Utest.h" + +// clang-format off +TEST_GROUP(ToolchainConfigTestGroup) +{ +}; +// clang-format on + +TEST(ToolchainConfigTestGroup, GetFileExt) { + buildcc::ToolchainConfig toolchain_config; + + buildcc::FileExt ext; + + ext = toolchain_config.GetFileExt("file.asm"); + CHECK(ext == buildcc::FileExt::Asm); + + ext = toolchain_config.GetFileExt("file.c"); + CHECK(ext == buildcc::FileExt::C); + + ext = toolchain_config.GetFileExt("file.cpp"); + CHECK(ext == buildcc::FileExt::Cpp); + + ext = toolchain_config.GetFileExt("file.h"); + CHECK(ext == buildcc::FileExt::Header); + + ext = toolchain_config.GetFileExt("file.invalid"); + CHECK(ext == buildcc::FileExt::Invalid); + + ext = toolchain_config.GetFileExt("random/directory"); + CHECK(ext == buildcc::FileExt::Invalid); +} + +int main(int ac, char **av) { + return CommandLineTestRunner::RunAllTests(ac, av); +} diff --git a/buildcc/schema/cmake/schema.cmake b/buildcc/schema/cmake/schema.cmake index 99d9949c..a3d21867 100644 --- a/buildcc/schema/cmake/schema.cmake +++ b/buildcc/schema/cmake/schema.cmake @@ -68,6 +68,9 @@ if(${BUILDCC_BUILD_AS_INTERFACE}) $ $ ) + target_link_libraries(schema PUBLIC + env + ) target_include_directories(schema PRIVATE ${SCHEMA_BUILD_DIR} ) @@ -75,7 +78,6 @@ if(${BUILDCC_BUILD_AS_INTERFACE}) target_link_options(schema PRIVATE ${BUILD_LINK_FLAGS}) target_link_libraries(schema PRIVATE flatbuffers_header_only - env ) add_dependencies(schema fbs_to_header) endif() diff --git a/buildcc/targets/include/targets/target_gcc.h b/buildcc/targets/include/targets/target_gcc.h index 60df007f..2e2dfb32 100644 --- a/buildcc/targets/include/targets/target_gcc.h +++ b/buildcc/targets/include/targets/target_gcc.h @@ -29,14 +29,6 @@ constexpr const char *const kGccExecutableExt = ""; constexpr const char *const kGccStaticLibExt = ".a"; constexpr const char *const kGccDynamicLibExt = ".so"; -constexpr const char *const kGccObjExt = ".o"; -constexpr const char *const kGccPchHeaderExt = ".h"; -constexpr const char *const kGccPchCompileExt = ".gch"; - -// GCC -constexpr const char *const kGccPrefixIncludeDir = "-I"; -constexpr const char *const kGccPrefixLibDir = "-L"; - constexpr const char *const kGccGenericPchCompileCommand = "{compiler} {preprocessor_flags} {include_dirs} {common_compile_flags} " "{pch_compile_flags} {compile_flags} -o {output} -c {input}"; @@ -72,11 +64,6 @@ class GccConfig : ConfigInterface { const std::string &link_command) { TargetConfig config; config.target_ext = target_ext; - config.obj_ext = kGccObjExt; - config.pch_header_ext = kGccPchHeaderExt; - config.pch_compile_ext = kGccPchCompileExt; - std::string prefix_include_dir = kGccPrefixIncludeDir; - std::string prefix_lib_dir = kGccPrefixLibDir; config.pch_command = kGccGenericPchCompileCommand; config.compile_command = compile_command; config.link_command = link_command; diff --git a/buildcc/targets/include/targets/target_mingw.h b/buildcc/targets/include/targets/target_mingw.h index 44f93720..abaeeb38 100644 --- a/buildcc/targets/include/targets/target_mingw.h +++ b/buildcc/targets/include/targets/target_mingw.h @@ -54,11 +54,6 @@ class MingwConfig : ConfigInterface { const std::string &link_command) { TargetConfig config; config.target_ext = target_ext; - config.obj_ext = kGccObjExt; - config.pch_header_ext = kGccPchHeaderExt; - config.pch_compile_ext = kGccPchCompileExt; - std::string prefix_include_dir = kGccPrefixIncludeDir; - std::string prefix_lib_dir = kGccPrefixLibDir; config.pch_command = kGccGenericPchCompileCommand; config.compile_command = compile_command; config.link_command = link_command; diff --git a/buildcc/targets/include/targets/target_msvc.h b/buildcc/targets/include/targets/target_msvc.h index 0d8e91ae..7baaae88 100644 --- a/buildcc/targets/include/targets/target_msvc.h +++ b/buildcc/targets/include/targets/target_msvc.h @@ -33,13 +33,6 @@ constexpr const char *const kMsvcStaticLibExt = ".lib"; // OUT .dll needs to be present in the executable folder during runtime constexpr const char *const kMsvcDynamicLibExt = ".lib"; -constexpr const char *const kMsvcObjExt = ".obj"; -constexpr const char *const kMsvcPchHeaderExt = ".h"; -constexpr const char *const kMsvcPchCompileExt = ".pch"; - -constexpr const char *const kMsvcPrefixIncludeDir = "/I"; -constexpr const char *const kMsvcPrefixLibDir = "/LIBPATH:"; - constexpr const char *const kMsvcPchCompileCommand = "{compiler} {preprocessor_flags} {include_dirs} {common_compile_flags} " "/Yc{input} /FI{input} /Fp{output} {pch_compile_flags} {compile_flags} " @@ -79,11 +72,6 @@ class MsvcConfig : ConfigInterface { const std::string &link_command) { TargetConfig config; config.target_ext = target_ext; - config.obj_ext = kMsvcObjExt; - config.pch_header_ext = kMsvcPchHeaderExt; - config.pch_compile_ext = kMsvcPchCompileExt; - config.prefix_include_dir = kMsvcPrefixIncludeDir; - config.prefix_lib_dir = kMsvcPrefixLibDir; config.pch_command = kMsvcPchCompileCommand; config.compile_command = compile_command; config.link_command = link_command; diff --git a/buildcc/toolchains/include/toolchains/toolchain_gcc.h b/buildcc/toolchains/include/toolchains/toolchain_gcc.h index b7c490fb..ebf4be40 100644 --- a/buildcc/toolchains/include/toolchains/toolchain_gcc.h +++ b/buildcc/toolchains/include/toolchains/toolchain_gcc.h @@ -21,6 +21,12 @@ namespace buildcc { +constexpr const char *const kGccObjExt = ".o"; +constexpr const char *const kGccPchHeaderExt = ".h"; +constexpr const char *const kGccPchCompileExt = ".gch"; +constexpr const char *const kGccPrefixIncludeDir = "-I"; +constexpr const char *const kGccPrefixLibDir = "-L"; + /** * @brief Generic GCC Toolchain
* id = ToolchainId::Gcc
@@ -36,6 +42,15 @@ class Toolchain_gcc : public Toolchain { Toolchain_gcc() : Toolchain(Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld") {} Toolchain_gcc(const Toolchain_gcc &gcc) = delete; + +private: + void UpdateConfig(ToolchainConfig &config) override { + config.obj_ext = kGccObjExt; + config.pch_header_ext = kGccPchHeaderExt; + config.pch_compile_ext = kGccPchCompileExt; + config.prefix_include_dir = kGccPrefixIncludeDir; + config.prefix_lib_dir = kGccPrefixLibDir; + } }; } // namespace buildcc diff --git a/buildcc/toolchains/include/toolchains/toolchain_mingw.h b/buildcc/toolchains/include/toolchains/toolchain_mingw.h index 44d4b09b..05bef7ca 100644 --- a/buildcc/toolchains/include/toolchains/toolchain_mingw.h +++ b/buildcc/toolchains/include/toolchains/toolchain_mingw.h @@ -21,6 +21,12 @@ namespace buildcc { +constexpr const char *const kMingwObjExt = ".o"; +constexpr const char *const kMingwPchHeaderExt = ".h"; +constexpr const char *const kMingwPchCompileExt = ".gch"; +constexpr const char *const kMingwPrefixIncludeDir = "-I"; +constexpr const char *const kMingwPrefixLibDir = "-L"; + /** * @brief Generic MinGW Toolchain
* id = ToolchainId::MinGW
@@ -36,6 +42,15 @@ class Toolchain_mingw : public BaseToolchain { Toolchain_mingw() : Toolchain(ToolchainId::MinGW, "gcc", "as", "gcc", "g++", "ar", "ld") {} Toolchain_mingw(const Toolchain_mingw &) = delete; + +private: + void UpdateConfig(ToolchainConfig &config) { + config.obj_ext = kMingwObjExt; + config.pch_header_ext = kMingwPchHeaderExt; + config.pch_compile_ext = kMingwPchCompileExt; + config.prefix_include_dir = kMingwPrefixIncludeDir; + config.prefix_lib_dir = kMingwPrefixLibDir; + } }; } // namespace buildcc diff --git a/buildcc/toolchains/include/toolchains/toolchain_msvc.h b/buildcc/toolchains/include/toolchains/toolchain_msvc.h index f74a479d..6a5a8ceb 100644 --- a/buildcc/toolchains/include/toolchains/toolchain_msvc.h +++ b/buildcc/toolchains/include/toolchains/toolchain_msvc.h @@ -21,6 +21,13 @@ namespace buildcc { +constexpr const char *const kMsvcObjExt = ".obj"; +constexpr const char *const kMsvcPchHeaderExt = ".h"; +constexpr const char *const kMsvcPchCompileExt = ".pch"; + +constexpr const char *const kMsvcPrefixIncludeDir = "/I"; +constexpr const char *const kMsvcPrefixLibDir = "/LIBPATH:"; + /** * @brief Generic GCC Toolchain
* id = ToolchainId::Msvc
@@ -37,6 +44,15 @@ class Toolchain_msvc : public Toolchain { : Toolchain(Toolchain::Id::Msvc, "msvc", "cl", "cl", "cl", "lib", "link") {} Toolchain_msvc(const Toolchain_msvc &gcc) = delete; + +private: + void UpdateConfig(ToolchainConfig &config) { + config.obj_ext = kMsvcObjExt; + config.pch_header_ext = kMsvcPchHeaderExt; + config.pch_compile_ext = kMsvcPchCompileExt; + config.prefix_include_dir = kMsvcPrefixIncludeDir; + config.prefix_lib_dir = kMsvcPrefixLibDir; + } }; } // namespace buildcc diff --git a/buildexe/src/build_env_setup.cpp b/buildexe/src/build_env_setup.cpp index 6884a1de..2bfcac96 100644 --- a/buildexe/src/build_env_setup.cpp +++ b/buildexe/src/build_env_setup.cpp @@ -194,31 +194,15 @@ struct BuildExeLibDir {{ } // 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 (user_target.GetConfig().IsValidSource(lib_build_file)) { - sources.insert(lib_build_file); + if (user_target.GetToolchain().GetConfig().IsValidSource(lib_build_file)) { + user_target.AddSourceAbsolute(lib_build_file); } - if (user_target.GetConfig().IsValidHeader(lib_build_file)) { - include_dirs.insert(lib_build_file.parent_path()); - headers.insert(lib_build_file); + if (user_target.GetToolchain().GetConfig().IsValidHeader(lib_build_file)) { + user_target.AddIncludeDirAbsolute(lib_build_file.parent_path(), false); + user_target.AddHeaderAbsolute(lib_build_file); } } - - // Add sources to user_target - for (const auto &s : sources) { - user_target.AddSourceAbsolute(s); - } - // Add include dirs to user_target - for (const auto &idir : include_dirs) { - user_target.AddIncludeDir(idir, false); - } - // Add headers to user_target - for (const auto &h : headers) { - user_target.AddHeaderAbsolute(h); - } } void BuildEnvSetup::UserTargetBuild() { diff --git a/doc/software_architecture/buildcc_interface_lib.PNG b/doc/software_architecture/buildcc_interface_lib.PNG index 729c9b08..e0ce861c 100644 Binary files a/doc/software_architecture/buildcc_interface_lib.PNG and b/doc/software_architecture/buildcc_interface_lib.PNG differ diff --git a/docs/source/arch/software_heirarchy.rst b/docs/source/arch/software_heirarchy.rst index 5dfa8e9f..20877103 100644 --- a/docs/source/arch/software_heirarchy.rst +++ b/docs/source/arch/software_heirarchy.rst @@ -66,13 +66,12 @@ BuildCC interface lib taskflow -up-> register flatbuffers .up.> schema - - env -up-> toolchain env -up-> schema - taskflow -up-> target - schema -up-> target + schema -up-> toolchain + toolchain -up-> target + taskflow -up-> target toolchain -up-> toolchain_specialized target -up-> target_specialized diff --git a/docs/source/user_api/target_utils.rst b/docs/source/user_api/target_utils.rst index b85fc251..4940883f 100644 --- a/docs/source/user_api/target_utils.rst +++ b/docs/source/user_api/target_utils.rst @@ -3,11 +3,6 @@ Target Utils Commonly used Utils (Classes / Structs) for **Generator**, **TargetInfo** and **Target** classes. -target_file_ext.h ------------------- - -.. doxygenenum:: buildcc::TargetFileExt - target_type.h -------------- diff --git a/docs/source/user_api/toc.rst b/docs/source/user_api/toc.rst index c149c8cd..c7c858d8 100644 --- a/docs/source/user_api/toc.rst +++ b/docs/source/user_api/toc.rst @@ -6,6 +6,7 @@ User API args register + toolchain_utils toolchain target_utils generator diff --git a/docs/source/user_api/toolchain_utils.rst b/docs/source/user_api/toolchain_utils.rst new file mode 100644 index 00000000..0e812633 --- /dev/null +++ b/docs/source/user_api/toolchain_utils.rst @@ -0,0 +1,14 @@ +Toolchain Utils +================ + +Commonly used Utils (Classes / Structs) for **Toolchain** + +file_ext.h +------------ + +.. doxygenenum:: buildcc::FileExt + +toolchain_config.h +-------------------- + +.. doxygenstruct:: buildcc::ToolchainConfig diff --git a/example/hybrid/target_info/build.cpp b/example/hybrid/target_info/build.cpp index 25aa1a4a..3fb2cf26 100644 --- a/example/hybrid/target_info/build.cpp +++ b/example/hybrid/target_info/build.cpp @@ -33,8 +33,10 @@ int main(int argc, char **argv) { Toolchain_msvc msvc; // TargetInfo - TargetInfo genericadd_ho("files"); - reg.Callback(genericadd_ho_cb, genericadd_ho); + TargetInfo gcc_genericadd_ho(gcc, "files"); + TargetInfo msvc_genericadd_ho(msvc, "files"); + reg.Callback(genericadd_ho_cb, gcc_genericadd_ho); + reg.Callback(genericadd_ho_cb, msvc_genericadd_ho); ExecutableTarget_gcc g_genericadd1("generic_add_1", gcc, "files"); ExecutableTarget_msvc m_genericadd1("generic_add_1", msvc, "files"); @@ -43,11 +45,15 @@ int main(int argc, char **argv) { ExecutableTarget_msvc m_genericadd2("generic_add_2", msvc, "files"); // Select your builds and tests using the .toml files - reg.Build(arg_gcc.state, genericadd1_build_cb, g_genericadd1, genericadd_ho); - reg.Build(arg_msvc.state, genericadd1_build_cb, m_genericadd1, genericadd_ho); - - reg.Build(arg_gcc.state, genericadd2_build_cb, g_genericadd2, genericadd_ho); - reg.Build(arg_msvc.state, genericadd2_build_cb, m_genericadd2, genericadd_ho); + reg.Build(arg_gcc.state, genericadd1_build_cb, g_genericadd1, + gcc_genericadd_ho); + reg.Build(arg_gcc.state, genericadd2_build_cb, g_genericadd2, + gcc_genericadd_ho); + + reg.Build(arg_msvc.state, genericadd1_build_cb, m_genericadd1, + msvc_genericadd_ho); + reg.Build(arg_msvc.state, genericadd2_build_cb, m_genericadd2, + msvc_genericadd_ho); // 5. Test steps // NOTE, For now they are just dummy callbacks