From: Joel Rosdahl Date: Sat, 15 Nov 2025 11:49:11 +0000 (+0100) Subject: refactor: Move clang/msvc code to src/ccache/compiler X-Git-Tag: v4.13~70 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=909b5936e64d5a1284fa4e0f78c8681493be0601;p=thirdparty%2Fccache.git refactor: Move clang/msvc code to src/ccache/compiler --- diff --git a/src/ccache/CMakeLists.txt b/src/ccache/CMakeLists.txt index 14017331..34c1e56a 100644 --- a/src/ccache/CMakeLists.txt +++ b/src/ccache/CMakeLists.txt @@ -79,6 +79,7 @@ endif() add_executable(test-lockfile test_lockfile.cpp) target_link_libraries(test-lockfile PRIVATE standard_settings standard_warnings ccache_framework) +add_subdirectory(compiler) add_subdirectory(core) add_subdirectory(storage) add_subdirectory(util) diff --git a/src/ccache/ccache.cpp b/src/ccache/ccache.cpp index 8450def1..1dfc96d5 100644 --- a/src/ccache/ccache.cpp +++ b/src/ccache/ccache.cpp @@ -21,6 +21,8 @@ #include #include +#include +#include #include #include #include @@ -28,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -46,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -790,7 +790,8 @@ struct DoExecuteResult static tl::expected result_key_from_includes(Context& ctx, Hash& hash, std::string_view stdout_data) { - for (std::string_view include : core::MsvcShowIncludesOutput::get_includes( + for (std::string_view include : + compiler::get_includes_from_msvc_show_includes( stdout_data, ctx.config.msvc_dep_prefix())) { const fs::path path = core::make_relative_path(ctx, include); TRY(remember_include_file(ctx, path, hash, false, &hash)); @@ -1255,7 +1256,7 @@ to_cache(Context& ctx, ctx, util::to_string_view(result->stderr_data), STDERR_FILENO); core::send_to_console( ctx, - util::to_string_view(core::MsvcShowIncludesOutput::strip_includes( + util::to_string_view(compiler::strip_includes_from_msvc_show_includes( ctx, std::move(result->stdout_data))), STDOUT_FILENO); @@ -1326,7 +1327,7 @@ to_cache(Context& ctx, // Send stdout after stderr, it makes the output clearer with MSVC. core::send_to_console( ctx, - util::to_string_view(core::MsvcShowIncludesOutput::strip_includes( + util::to_string_view(compiler::strip_includes_from_msvc_show_includes( ctx, std::move(result->stdout_data))), STDOUT_FILENO); @@ -1468,7 +1469,7 @@ get_result_key_from_cpp(Context& ctx, util::Args& args, Hash& hash) return tl::unexpected(Statistic::internal_error); } auto chunks = - util::split_preprocessed_file_from_clang_cuda(preprocessed_path); + compiler::split_preprocessed_file_from_clang_cuda(preprocessed_path); for (size_t i = 0; i < chunks.size(); ++i) { TRY(process_cuda_chunk(ctx, hash, chunks[i], i)); } diff --git a/src/ccache/compiler/CMakeLists.txt b/src/ccache/compiler/CMakeLists.txt new file mode 100644 index 00000000..ddefb18f --- /dev/null +++ b/src/ccache/compiler/CMakeLists.txt @@ -0,0 +1,10 @@ +set( + sources + clang.cpp + msvc.cpp +) + +file(GLOB headers *.hpp) +list(APPEND sources ${headers}) + +target_sources(ccache_framework PRIVATE ${sources}) diff --git a/src/ccache/util/clang.cpp b/src/ccache/compiler/clang.cpp similarity index 97% rename from src/ccache/util/clang.cpp rename to src/ccache/compiler/clang.cpp index 3eb4caee..63cb05fb 100644 --- a/src/ccache/util/clang.cpp +++ b/src/ccache/compiler/clang.cpp @@ -28,7 +28,7 @@ namespace fs = util::filesystem; -namespace util { +namespace compiler { std::vector split_preprocessed_file_from_clang_cuda(const fs::path& path) @@ -65,4 +65,4 @@ split_preprocessed_file_from_clang_cuda(const fs::path& path) return chunks; } -} // namespace util +} // namespace compiler diff --git a/src/ccache/util/clang.hpp b/src/ccache/compiler/clang.hpp similarity index 95% rename from src/ccache/util/clang.hpp rename to src/ccache/compiler/clang.hpp index d05c3ff6..e9654ef2 100644 --- a/src/ccache/util/clang.hpp +++ b/src/ccache/compiler/clang.hpp @@ -22,9 +22,9 @@ #include #include -namespace util { +namespace compiler { std::vector split_preprocessed_file_from_clang_cuda(const std::filesystem::path& path); -} // namespace util +} // namespace compiler diff --git a/src/ccache/core/msvcshowincludesoutput.cpp b/src/ccache/compiler/msvc.cpp similarity index 88% rename from src/ccache/core/msvcshowincludesoutput.cpp rename to src/ccache/compiler/msvc.cpp index 66d5518f..05eec4c2 100644 --- a/src/ccache/core/msvcshowincludesoutput.cpp +++ b/src/ccache/compiler/msvc.cpp @@ -16,15 +16,16 @@ // this program; if not, write to the Free Software Foundation, Inc., 51 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include "msvcshowincludesoutput.hpp" +#include "msvc.hpp" #include #include -namespace core::MsvcShowIncludesOutput { +namespace compiler { std::vector -get_includes(std::string_view file_content, std::string_view prefix) +get_includes_from_msvc_show_includes(std::string_view file_content, + std::string_view prefix) { // /showIncludes output is written to stdout together with other messages. // Every line of it is " " where the prefix is "Note: @@ -49,7 +50,8 @@ get_includes(std::string_view file_content, std::string_view prefix) } util::Bytes -strip_includes(const Context& ctx, util::Bytes&& stdout_data) +strip_includes_from_msvc_show_includes(const Context& ctx, + util::Bytes&& stdout_data) { using util::Tokenizer; using Mode = Tokenizer::Mode; @@ -72,4 +74,4 @@ strip_includes(const Context& ctx, util::Bytes&& stdout_data) return new_stdout_data; } -} // namespace core::MsvcShowIncludesOutput +} // namespace compiler diff --git a/src/ccache/core/msvcshowincludesoutput.hpp b/src/ccache/compiler/msvc.hpp similarity index 68% rename from src/ccache/core/msvcshowincludesoutput.hpp rename to src/ccache/compiler/msvc.hpp index db703f03..34da6fd8 100644 --- a/src/ccache/core/msvcshowincludesoutput.hpp +++ b/src/ccache/compiler/msvc.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2022-2024 Joel Rosdahl and other contributors +// Copyright (C) 2022-2025 Joel Rosdahl and other contributors // // See doc/authors.adoc for a complete list of contributors. // @@ -25,11 +25,13 @@ class Context; -namespace core::MsvcShowIncludesOutput { +namespace compiler { -std::vector get_includes(std::string_view file_content, - std::string_view prefix); +std::vector +get_includes_from_msvc_show_includes(std::string_view file_content, + std::string_view prefix); -util::Bytes strip_includes(const Context& ctx, util::Bytes&& stdout_data); +util::Bytes strip_includes_from_msvc_show_includes(const Context& ctx, + util::Bytes&& stdout_data); -} // namespace core::MsvcShowIncludesOutput +} // namespace compiler diff --git a/src/ccache/core/CMakeLists.txt b/src/ccache/core/CMakeLists.txt index 70c9ed9a..3673c2fd 100644 --- a/src/ccache/core/CMakeLists.txt +++ b/src/ccache/core/CMakeLists.txt @@ -6,7 +6,6 @@ set( filerecompressor.cpp mainoptions.cpp manifest.cpp - msvcshowincludesoutput.cpp result.cpp resultextractor.cpp resultinspector.cpp diff --git a/src/ccache/core/resultretriever.cpp b/src/ccache/core/resultretriever.cpp index ab0edd18..8451d602 100644 --- a/src/ccache/core/resultretriever.cpp +++ b/src/ccache/core/resultretriever.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -70,7 +69,8 @@ ResultRetriever::on_embedded_file(uint8_t file_number, if (file_type == FileType::stdout_output) { core::send_to_console( m_ctx, - util::to_string_view(MsvcShowIncludesOutput::strip_includes(m_ctx, data)), + util::to_string_view( + compiler::strip_includes_from_msvc_show_includes(m_ctx, data)), STDOUT_FILENO); } else if (file_type == FileType::stderr_output) { core::send_to_console(m_ctx, util::to_string_view(data), STDERR_FILENO); diff --git a/src/ccache/util/CMakeLists.txt b/src/ccache/util/CMakeLists.txt index 494457be..5c9314e1 100644 --- a/src/ccache/util/CMakeLists.txt +++ b/src/ccache/util/CMakeLists.txt @@ -3,7 +3,6 @@ set( args.cpp assertions.cpp bytes.cpp - clang.cpp configreader.cpp cpu.cpp direntry.cpp diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 84dbe706..1e64b85b 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -3,12 +3,13 @@ set( main.cpp test_argprocessing.cpp test_ccache.cpp + test_compiler_clang.cpp + test_compiler_msvc.cpp test_compopt.cpp test_compression_types.cpp test_config.cpp test_core_atomicfile.cpp test_core_common.cpp - test_core_msvcshowincludesoutput.cpp test_core_statistics.cpp test_core_statisticscounters.cpp test_core_statslog.cpp @@ -20,7 +21,6 @@ set( test_util_args.cpp test_util_bitset.cpp test_util_bytes.cpp - test_util_clang.cpp test_util_configreader.cpp test_util_conversion.cpp test_util_direntry.cpp diff --git a/unittest/test_util_clang.cpp b/unittest/test_compiler_clang.cpp similarity index 83% rename from unittest/test_util_clang.cpp rename to unittest/test_compiler_clang.cpp index d78f200d..b29b88d0 100644 --- a/unittest/test_util_clang.cpp +++ b/unittest/test_compiler_clang.cpp @@ -18,7 +18,7 @@ #include "testutil.hpp" -#include +#include #include #include @@ -30,9 +30,9 @@ namespace fs = util::filesystem; using TestUtil::TestContext; -TEST_SUITE_BEGIN("util"); +TEST_SUITE_BEGIN("clang"); -TEST_CASE("util::split_preprocessed_file_from_clang_cuda") +TEST_CASE("compiler::split_preprocessed_file_from_clang_cuda") { TestContext test_context; @@ -50,7 +50,7 @@ void caller() { # 1 "" 3 )")); - auto result = util::split_preprocessed_file_from_clang_cuda(filename); + auto result = compiler::split_preprocessed_file_from_clang_cuda(filename); REQUIRE(result.size() == 2); CHECK(result[0] == R"(# 1 "test_cuda.cu" @@ -69,7 +69,7 @@ void caller() { SUBCASE("non-existent file") { fs::path filename = "nonexistent_file.txt"; - CHECK(util::split_preprocessed_file_from_clang_cuda(filename).empty()); + CHECK(compiler::split_preprocessed_file_from_clang_cuda(filename).empty()); } SUBCASE("empty file") @@ -77,7 +77,7 @@ void caller() { fs::path filename = "test_empty.txt"; REQUIRE(util::write_file(filename, "")); - CHECK(util::split_preprocessed_file_from_clang_cuda(filename).empty()); + CHECK(compiler::split_preprocessed_file_from_clang_cuda(filename).empty()); } } diff --git a/unittest/test_core_msvcshowincludesoutput.cpp b/unittest/test_compiler_msvc.cpp similarity index 78% rename from unittest/test_core_msvcshowincludesoutput.cpp rename to unittest/test_compiler_msvc.cpp index 654621c9..74c2241f 100644 --- a/unittest/test_core_msvcshowincludesoutput.cpp +++ b/unittest/test_compiler_msvc.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2020-2024 Joel Rosdahl and other contributors +// Copyright (C) 2020-2025 Joel Rosdahl and other contributors // // See doc/authors.adoc for a complete list of contributors. // @@ -18,23 +18,23 @@ #include "testutil.hpp" +#include #include -#include #include #include static const std::string defaultPrefix = "Note: including file:"; -TEST_SUITE_BEGIN("MsvcShowIncludesOutput"); +TEST_SUITE_BEGIN("msvc"); -TEST_CASE("MsvcShowIncludesOutput::get_includes") +TEST_CASE("get_includes_from_msvc_show_includes") { SUBCASE("Parse empty output") { std::string contents; const auto result = - core::MsvcShowIncludesOutput::get_includes(contents, defaultPrefix); + compiler::get_includes_from_msvc_show_includes(contents, defaultPrefix); CHECK(result.size() == 0); } @@ -48,7 +48,7 @@ Note: including file: F:\Projects\ccache\src\NonCopyable.hpp Note: including file: C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\deque )"; const auto result = - core::MsvcShowIncludesOutput::get_includes(contents, defaultPrefix); + compiler::get_includes_from_msvc_show_includes(contents, defaultPrefix); REQUIRE(result.size() == 5); CHECK(result[0] == "F:/Projects/ccache/build-msvc/config.h"); CHECK(result[1] == R"(F:\Projects\ccache\unittest\../src/Context.hpp)"); @@ -65,7 +65,7 @@ Note: including file: C:\Program Files\Microsoft Visual Studio\2022\Community\ "Note: including file: foo\r\n" "Note: including file: bar\r\n"; const auto result = - core::MsvcShowIncludesOutput::get_includes(contents, defaultPrefix); + compiler::get_includes_from_msvc_show_includes(contents, defaultPrefix); REQUIRE(result.size() == 2); CHECK(result[0] == "foo"); CHECK(result[1] == "bar"); @@ -78,7 +78,7 @@ Note: including file: C:\Program Files\Microsoft Visual Studio\2022\Community\ "Note: including file: \n" "Note: including file: bar\n"; const auto result = - core::MsvcShowIncludesOutput::get_includes(contents, defaultPrefix); + compiler::get_includes_from_msvc_show_includes(contents, defaultPrefix); REQUIRE(result.size() == 2); CHECK(result[0] == "foo"); CHECK(result[1] == "bar"); @@ -90,14 +90,14 @@ Note: including file: C:\Program Files\Microsoft Visual Studio\2022\Community\ custom bar Just a line with custom in the middle)"; const auto result = - core::MsvcShowIncludesOutput::get_includes(contents, "custom"); + compiler::get_includes_from_msvc_show_includes(contents, "custom"); REQUIRE(result.size() == 2); CHECK(result[0] == "foo"); CHECK(result[1] == "bar"); } } -TEST_CASE("MsvcShowIncludesOutput::strip_includes") +TEST_CASE("strip_includes_from_msvc_show_includes") { Context ctx; const util::Bytes input = util::to_span( @@ -108,14 +108,14 @@ TEST_CASE("MsvcShowIncludesOutput::strip_includes") SUBCASE("Empty output") { const util::Bytes result = - core::MsvcShowIncludesOutput::strip_includes(ctx, {}); + compiler::strip_includes_from_msvc_show_includes(ctx, {}); CHECK(result.size() == 0); } SUBCASE("Feature disabled") { const util::Bytes result = - core::MsvcShowIncludesOutput::strip_includes(ctx, util::Bytes(input)); + compiler::strip_includes_from_msvc_show_includes(ctx, util::Bytes(input)); CHECK(result == input); } @@ -124,7 +124,7 @@ TEST_CASE("MsvcShowIncludesOutput::strip_includes") SUBCASE("Wrong compiler") { const util::Bytes result = - core::MsvcShowIncludesOutput::strip_includes(ctx, util::Bytes(input)); + compiler::strip_includes_from_msvc_show_includes(ctx, util::Bytes(input)); CHECK(result == input); } @@ -133,13 +133,13 @@ TEST_CASE("MsvcShowIncludesOutput::strip_includes") SUBCASE("Simple output") { const util::Bytes result = - core::MsvcShowIncludesOutput::strip_includes(ctx, util::Bytes(input)); + compiler::strip_includes_from_msvc_show_includes(ctx, util::Bytes(input)); CHECK(result == util::to_span("First\nSecond\n")); } SUBCASE("Empty lines") { - const util::Bytes result = core::MsvcShowIncludesOutput::strip_includes( + const util::Bytes result = compiler::strip_includes_from_msvc_show_includes( ctx, util::to_span("First\n" "\n" @@ -152,7 +152,7 @@ TEST_CASE("MsvcShowIncludesOutput::strip_includes") SUBCASE("CRLF") { - const util::Bytes result = core::MsvcShowIncludesOutput::strip_includes( + const util::Bytes result = compiler::strip_includes_from_msvc_show_includes( ctx, util::to_span("First\r\n" "Note: including file: foo\r\n" @@ -163,7 +163,7 @@ TEST_CASE("MsvcShowIncludesOutput::strip_includes") SUBCASE("Custom prefix") { ctx.config.set_msvc_dep_prefix("custom"); - const util::Bytes result = core::MsvcShowIncludesOutput::strip_includes( + const util::Bytes result = compiler::strip_includes_from_msvc_show_includes( ctx, util::to_span("First\n" "custom: including file: foo\n"