| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
- #include "cmTransformDepfile.h"
- #include <string>
- #include <type_traits>
- #include <utility>
- #include <vector>
- #include <cm/optional>
- #include "cmsys/FStream.hxx"
- #include "cmGccDepfileReader.h"
- #include "cmGccDepfileReaderTypes.h"
- #include "cmSystemTools.h"
- namespace {
- void WriteFilenameGcc(cmsys::ofstream& fout, const std::string& filename)
- {
- for (auto c : filename) {
- switch (c) {
- case ' ':
- fout << "\\ ";
- break;
- case '\\':
- fout << "\\\\";
- break;
- default:
- fout << c;
- break;
- }
- }
- }
- void WriteGccDepfile(cmsys::ofstream& fout, const cmGccDepfileContent& content)
- {
- for (auto const& dep : content) {
- bool first = true;
- for (auto const& rule : dep.rules) {
- if (!first) {
- fout << " \\\n ";
- }
- first = false;
- WriteFilenameGcc(fout, rule);
- }
- fout << ':';
- for (auto const& path : dep.paths) {
- fout << " \\\n ";
- WriteFilenameGcc(fout, path);
- }
- fout << '\n';
- }
- }
- void WriteVsTlog(cmsys::ofstream& fout, const cmGccDepfileContent& content)
- {
- for (auto const& dep : content) {
- fout << '^';
- bool first = true;
- for (auto const& rule : dep.rules) {
- if (!first) {
- fout << '|';
- }
- first = false;
- fout << cmSystemTools::ConvertToOutputPath(rule);
- }
- fout << "\r\n";
- for (auto const& path : dep.paths) {
- fout << cmSystemTools::ConvertToOutputPath(path) << "\r\n";
- }
- }
- }
- }
- bool cmTransformDepfile(cmDepfileFormat format, const std::string& prefix,
- const std::string& infile, const std::string& outfile)
- {
- cmGccDepfileContent content;
- if (cmSystemTools::FileExists(infile)) {
- auto result = cmReadGccDepfile(infile.c_str(), prefix);
- if (!result) {
- return false;
- }
- content = *std::move(result);
- }
- cmsys::ofstream fout(outfile.c_str());
- if (!fout) {
- return false;
- }
- switch (format) {
- case cmDepfileFormat::GccDepfile:
- WriteGccDepfile(fout, content);
- break;
- case cmDepfileFormat::VsTlog:
- WriteVsTlog(fout, content);
- break;
- }
- return true;
- }
|