-
Notifications
You must be signed in to change notification settings - Fork 14.2k
[InstallAPI] Pick up input headers by directory traversal #94508
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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 hidden or 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 hidden or 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 hidden or 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 hidden or 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 hidden or 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.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.