cmGccDepfileReader.cxx 1.4 KB

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