1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-15 20:46:37 +08:00

cmGccDepfileReader: Add new function ensuring paths are valid

And cmTransformDepfile now rely on this new function.
This commit is contained in:
Marc Chevrier
2020-12-15 10:13:41 +01:00
parent 8c9c338e5e
commit a526f71266
3 changed files with 43 additions and 15 deletions

View File

@@ -4,10 +4,13 @@
#include <type_traits>
#include <utility>
#include <vector>
#include <cm/optional>
#include "cmGccDepfileLexerHelper.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
cm::optional<cmGccDepfileContent> cmReadGccDepfile(const char* filePath)
{
@@ -17,3 +20,34 @@ cm::optional<cmGccDepfileContent> cmReadGccDepfile(const char* filePath)
}
return cm::nullopt;
}
cm::optional<cmGccDepfileContent> cmReadGccDepfile(const char* filePath,
const std::string& prefix)
{
auto deps = cmReadGccDepfile(filePath);
if (prefix.empty() || !deps) {
return deps;
}
for (auto& dep : *deps) {
for (auto& rule : dep.rules) {
if (!cmSystemTools::FileIsFullPath(rule)) {
rule = cmStrCat(prefix, rule);
}
if (cmSystemTools::FileIsFullPath(rule)) {
rule = cmSystemTools::CollapseFullPath(rule);
}
}
for (auto& path : dep.paths) {
if (!cmSystemTools::FileIsFullPath(path)) {
path = cmStrCat(prefix, path);
}
if (cmSystemTools::FileIsFullPath(path)) {
path = cmSystemTools::CollapseFullPath(path);
}
}
}
return deps;
}

View File

@@ -2,8 +2,16 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#pragma once
#include <string>
#include <cm/optional>
#include "cmGccDepfileReaderTypes.h"
cm::optional<cmGccDepfileContent> cmReadGccDepfile(const char* filePath);
/*
* Read dependencies file and append prefix to all relative paths
*/
cm::optional<cmGccDepfileContent> cmReadGccDepfile(const char* filePath,
const std::string& prefix);

View File

@@ -13,7 +13,6 @@
#include "cmGccDepfileReader.h"
#include "cmGccDepfileReaderTypes.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
namespace {
@@ -79,26 +78,13 @@ bool cmTransformDepfile(cmDepfileFormat format, const std::string& prefix,
{
cmGccDepfileContent content;
if (cmSystemTools::FileExists(infile)) {
auto result = cmReadGccDepfile(infile.c_str());
auto result = cmReadGccDepfile(infile.c_str(), prefix);
if (!result) {
return false;
}
content = *std::move(result);
}
for (auto& dep : content) {
for (auto& rule : dep.rules) {
if (!cmSystemTools::FileIsFullPath(rule)) {
rule = cmStrCat(prefix, rule);
}
}
for (auto& path : dep.paths) {
if (!cmSystemTools::FileIsFullPath(path)) {
path = cmStrCat(prefix, path);
}
}
}
cmsys::ofstream fout(outfile.c_str());
if (!fout) {
return false;