1010//
1111// ===----------------------------------------------------------------------===//
1212
13- #include " clang/Frontend/Utils.h"
1413#include " clang/Basic/FileManager.h"
1514#include " clang/Basic/SourceManager.h"
1615#include " clang/Frontend/DependencyOutputOptions.h"
1716#include " clang/Frontend/FrontendDiagnostic.h"
17+ #include " clang/Frontend/Utils.h"
1818#include " clang/Lex/DirectoryLookup.h"
1919#include " clang/Lex/ModuleMap.h"
2020#include " clang/Lex/PPCallbacks.h"
2323#include " llvm/ADT/StringSet.h"
2424#include " llvm/Support/FileSystem.h"
2525#include " llvm/Support/Path.h"
26+ #include " llvm/Support/VirtualFileSystem.h"
2627#include " llvm/Support/raw_ostream.h"
2728#include < optional>
29+ #include < system_error>
2830
2931using namespace clang ;
3032
@@ -236,6 +238,7 @@ void DependencyFileGenerator::attachToPreprocessor(Preprocessor &PP) {
236238 PP.SetSuppressIncludeNotFoundError (true );
237239
238240 DependencyCollector::attachToPreprocessor (PP);
241+ FS = PP.getFileManager ().getVirtualFileSystemPtr ();
239242}
240243
241244bool DependencyFileGenerator::sawDependency (StringRef Filename, bool FromModule,
@@ -312,11 +315,22 @@ void DependencyFileGenerator::finishedMainFile(DiagnosticsEngine &Diags) {
312315// / https://msdn.microsoft.com/en-us/library/dd9y37ha.aspx for NMake info,
313316// / https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
314317// / for Windows file-naming info.
315- static void PrintFilename (raw_ostream &OS, StringRef Filename,
318+ static void printFilename (raw_ostream &OS, llvm::vfs::FileSystem *FS,
319+ StringRef Filename,
316320 DependencyOutputFormat OutputFormat) {
317321 // Convert filename to platform native path
318322 llvm::SmallString<256 > NativePath;
319323 llvm::sys::path::native (Filename.str (), NativePath);
324+ // Resolve absolute path. Make and Ninja canonicalize paths
325+ // without checking for symbolic links in the path, for performance concerns.
326+ // If there is something like `/bin/../lib64` -> `/usr/lib64`
327+ // (where `/bin` links to `/usr/bin`), Make will see them as `/lib64`.
328+ if (FS != nullptr && llvm::sys::path::is_absolute (NativePath)) {
329+ llvm::SmallString<256 > NativePathTmp = NativePath;
330+ std::error_code EC = FS->getRealPath (NativePathTmp, NativePath);
331+ if (EC)
332+ NativePath = NativePathTmp;
333+ }
320334
321335 if (OutputFormat == DependencyOutputFormat::NMake) {
322336 // Add quotes if needed. These are the characters listed as "special" to
@@ -400,7 +414,7 @@ void DependencyFileGenerator::outputDependencyFile(llvm::raw_ostream &OS) {
400414 Columns = 2 ;
401415 }
402416 OS << ' ' ;
403- PrintFilename (OS, File, OutputFormat);
417+ printFilename (OS, FS. get () , File, OutputFormat);
404418 Columns += N + 1 ;
405419 }
406420 OS << ' \n ' ;
@@ -411,7 +425,7 @@ void DependencyFileGenerator::outputDependencyFile(llvm::raw_ostream &OS) {
411425 for (auto I = Files.begin (), E = Files.end (); I != E; ++I) {
412426 if (Index++ == InputFileIndex)
413427 continue ;
414- PrintFilename (OS, *I, OutputFormat);
428+ printFilename (OS, FS. get () , *I, OutputFormat);
415429 OS << " :\n " ;
416430 }
417431 }
0 commit comments