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