/src/CMake/Source/cmGccDepfileReader.cxx
Line | Count | Source |
1 | | /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
2 | | file LICENSE.rst or https://cmake.org/licensing for details. */ |
3 | | #include "cmGccDepfileReader.h" |
4 | | |
5 | | #include <utility> |
6 | | #include <vector> |
7 | | |
8 | | #include <cm/optional> |
9 | | |
10 | | #include "cmGccDepfileLexerHelper.h" |
11 | | #include "cmStringAlgorithms.h" |
12 | | #include "cmSystemTools.h" |
13 | | |
14 | | cm::optional<cmGccDepfileContent> cmReadGccDepfile( |
15 | | char const* filePath, std::string const& prefix, |
16 | | GccDepfilePrependPaths prependPaths) |
17 | 5.44k | { |
18 | 5.44k | cmGccDepfileLexerHelper helper; |
19 | 5.44k | if (!helper.readFile(filePath)) { |
20 | 74 | return cm::nullopt; |
21 | 74 | } |
22 | 5.37k | auto deps = cm::make_optional(std::move(helper).extractContent()); |
23 | | |
24 | 50.3k | for (auto& dep : *deps) { |
25 | 83.0k | for (auto& rule : dep.rules) { |
26 | 83.0k | if (prependPaths == GccDepfilePrependPaths::All && !prefix.empty() && |
27 | 0 | !cmSystemTools::FileIsFullPath(rule)) { |
28 | 0 | rule = cmStrCat(prefix, '/', rule); |
29 | 0 | } |
30 | 83.0k | if (cmSystemTools::FileIsFullPath(rule)) { |
31 | 43.0k | rule = cmSystemTools::CollapseFullPath(rule); |
32 | 43.0k | } |
33 | 83.0k | cmSystemTools::ConvertToLongPath(rule); |
34 | 83.0k | } |
35 | 94.8k | for (auto& path : dep.paths) { |
36 | 94.8k | if (!prefix.empty() && !cmSystemTools::FileIsFullPath(path)) { |
37 | 0 | path = cmStrCat(prefix, '/', path); |
38 | 0 | } |
39 | 94.8k | if (cmSystemTools::FileIsFullPath(path)) { |
40 | 6.21k | path = cmSystemTools::CollapseFullPath(path); |
41 | 6.21k | } |
42 | 94.8k | cmSystemTools::ConvertToLongPath(path); |
43 | 94.8k | } |
44 | 50.3k | } |
45 | | |
46 | 5.37k | return deps; |
47 | 5.44k | } |