cmGccDepfileReader.cxx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. #include <utility>
  5. #include <vector>
  6. #include <cm/optional>
  7. #include "cmGccDepfileLexerHelper.h"
  8. #include "cmStringAlgorithms.h"
  9. #include "cmSystemTools.h"
  10. cm::optional<cmGccDepfileContent> cmReadGccDepfile(
  11. char const* filePath, std::string const& prefix,
  12. GccDepfilePrependPaths prependPaths)
  13. {
  14. cmGccDepfileLexerHelper helper;
  15. if (!helper.readFile(filePath)) {
  16. return cm::nullopt;
  17. }
  18. auto deps = cm::make_optional(std::move(helper).extractContent());
  19. for (auto& dep : *deps) {
  20. for (auto& rule : dep.rules) {
  21. if (prependPaths == GccDepfilePrependPaths::All && !prefix.empty() &&
  22. !cmSystemTools::FileIsFullPath(rule)) {
  23. rule = cmStrCat(prefix, '/', rule);
  24. }
  25. if (cmSystemTools::FileIsFullPath(rule)) {
  26. rule = cmSystemTools::CollapseFullPath(rule);
  27. }
  28. cmSystemTools::ConvertToLongPath(rule);
  29. }
  30. for (auto& path : dep.paths) {
  31. if (!prefix.empty() && !cmSystemTools::FileIsFullPath(path)) {
  32. path = cmStrCat(prefix, '/', path);
  33. }
  34. if (cmSystemTools::FileIsFullPath(path)) {
  35. path = cmSystemTools::CollapseFullPath(path);
  36. }
  37. cmSystemTools::ConvertToLongPath(path);
  38. }
  39. }
  40. return deps;
  41. }