-
Notifications
You must be signed in to change notification settings - Fork 12.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[InstallAPI] Pick up input headers by directory traversal (#94508)
Match TAPI behavior and allow input headers to be resolved via a passed directory, which is expected to be a library sitting in a build directory.
- Loading branch information
1 parent
445fc51
commit feed66f
Showing
19 changed files
with
703 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
//===- InstallAPI/DirectoryScanner.h ----------------------------*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
/// | ||
/// The DirectoryScanner for collecting library files on the file system. | ||
/// | ||
//===----------------------------------------------------------------------===// | ||
#ifndef LLVM_CLANG_INSTALLAPI_DIRECTORYSCANNER_H | ||
#define LLVM_CLANG_INSTALLAPI_DIRECTORYSCANNER_H | ||
|
||
#include "clang/Basic/FileManager.h" | ||
#include "clang/InstallAPI/Library.h" | ||
|
||
namespace clang::installapi { | ||
|
||
enum ScanMode { | ||
/// Scanning Framework directory. | ||
ScanFrameworks, | ||
/// Scanning Dylib directory. | ||
ScanDylibs, | ||
}; | ||
|
||
class DirectoryScanner { | ||
public: | ||
DirectoryScanner(FileManager &FM, ScanMode Mode = ScanMode::ScanFrameworks) | ||
: FM(FM), Mode(Mode) {} | ||
|
||
/// Scan for all input files throughout directory. | ||
/// | ||
/// \param Directory Path of input directory. | ||
llvm::Error scan(StringRef Directory); | ||
|
||
/// Take over ownership of stored libraries. | ||
std::vector<Library> takeLibraries() { return std::move(Libraries); }; | ||
|
||
/// Get all the header files in libraries. | ||
/// | ||
/// \param Libraries Reference of collection of libraries. | ||
static HeaderSeq getHeaders(ArrayRef<Library> Libraries); | ||
|
||
private: | ||
/// Collect files for dylibs in usr/(local)/lib within directory. | ||
llvm::Error scanForUnwrappedLibraries(StringRef Directory); | ||
|
||
/// Collect files for any frameworks within directory. | ||
llvm::Error scanForFrameworks(StringRef Directory); | ||
|
||
/// Get a library from the libraries collection. | ||
Library &getOrCreateLibrary(StringRef Path, std::vector<Library> &Libs) const; | ||
|
||
/// Collect multiple frameworks from directory. | ||
llvm::Error scanMultipleFrameworks(StringRef Directory, | ||
std::vector<Library> &Libs) const; | ||
/// Collect files from nested frameworks. | ||
llvm::Error scanSubFrameworksDirectory(StringRef Directory, | ||
std::vector<Library> &Libs) const; | ||
|
||
/// Collect files from framework path. | ||
llvm::Error scanFrameworkDirectory(StringRef Path, Library &Framework) const; | ||
|
||
/// Collect header files from path. | ||
llvm::Error scanHeaders(StringRef Path, Library &Lib, HeaderType Type, | ||
StringRef BasePath, | ||
StringRef ParentPath = StringRef()) const; | ||
|
||
/// Collect files from Version directories inside Framework directories. | ||
llvm::Error scanFrameworkVersionsDirectory(StringRef Path, | ||
Library &Lib) const; | ||
FileManager &FM; | ||
ScanMode Mode; | ||
StringRef RootPath; | ||
std::vector<Library> Libraries; | ||
}; | ||
|
||
} // namespace clang::installapi | ||
|
||
#endif // LLVM_CLANG_INSTALLAPI_DIRECTORYSCANNER_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
//===- InstallAPI/Library.h -------------------------------------*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
/// | ||
/// Defines the content of a library, such as public and private | ||
/// header files, and whether it is a framework. | ||
/// | ||
//===----------------------------------------------------------------------===// | ||
#ifndef LLVM_CLANG_INSTALLAPI_LIBRARY_H | ||
#define LLVM_CLANG_INSTALLAPI_LIBRARY_H | ||
|
||
#include "clang/InstallAPI/HeaderFile.h" | ||
#include "clang/InstallAPI/MachO.h" | ||
|
||
namespace clang::installapi { | ||
|
||
class Library { | ||
public: | ||
Library(StringRef Directory) : BaseDirectory(Directory) {} | ||
|
||
/// Capture the name of the framework by the install name. | ||
/// | ||
/// \param InstallName The install name of the library encoded in a dynamic | ||
/// library. | ||
static StringRef getFrameworkNameFromInstallName(StringRef InstallName); | ||
|
||
/// Get name of library by the discovered file path. | ||
StringRef getName() const; | ||
|
||
/// Get discovered path of library. | ||
StringRef getPath() const { return BaseDirectory; } | ||
|
||
/// Add a header file that belongs to the library. | ||
/// | ||
/// \param FullPath Path to header file. | ||
/// \param Type Access level of header. | ||
/// \param IncludePath The way the header should be included. | ||
void addHeaderFile(StringRef FullPath, HeaderType Type, | ||
StringRef IncludePath = StringRef()) { | ||
Headers.emplace_back(FullPath, Type, IncludePath); | ||
} | ||
|
||
/// Determine if library is empty. | ||
bool empty() { | ||
return SubFrameworks.empty() && Headers.empty() && | ||
FrameworkVersions.empty(); | ||
} | ||
|
||
private: | ||
std::string BaseDirectory; | ||
HeaderSeq Headers; | ||
std::vector<Library> SubFrameworks; | ||
std::vector<Library> FrameworkVersions; | ||
bool IsUnwrappedDylib{false}; | ||
|
||
friend class DirectoryScanner; | ||
}; | ||
|
||
} // namespace clang::installapi | ||
|
||
#endif // LLVM_CLANG_INSTALLAPI_LIBRARY_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.