diff options
author | Sameer Arora <sameerarora101@fb.com> | 2020-07-20 16:10:07 -0700 |
---|---|---|
committer | Sameer Arora <sameerarora101@fb.com> | 2020-08-07 14:44:32 -0700 |
commit | 71a1f135e4ede2b03f5efb7e18dca1c3db7504ec (patch) | |
tree | e3c10db38ffc6398f868695758ca8e58d81a3da5 /llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp | |
parent | d9a9192984fafb6a81616aafcdcf388fba7b8e14 (diff) | |
download | llvm-71a1f135e4ede2b03f5efb7e18dca1c3db7504ec.zip llvm-71a1f135e4ede2b03f5efb7e18dca1c3db7504ec.tar.gz llvm-71a1f135e4ede2b03f5efb7e18dca1c3db7504ec.tar.bz2 |
[llvm-libtool-darwin] Add support for -D and -U options
Add support for `-D` and `-U` options for llvm-libtool-darwin. `-D`
allows for using zero for timestamps and UIDs/GIDs. `-U` allows for
using actual timestamps and UIDs/GIDs.
Reviewed by jhenderson, smeenai
Differential Revision: https://reviews.llvm.org/D84209
Diffstat (limited to 'llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp')
-rw-r--r-- | llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp | 76 |
1 files changed, 51 insertions, 25 deletions
diff --git a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp index d5eccaf..871a803 100644 --- a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp +++ b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp @@ -42,11 +42,23 @@ static cl::opt<Operation> LibraryOperation( "Produce a statically linked library from the input files")), cl::Required, cl::cat(LibtoolCategory)); +static cl::opt<bool> DeterministicOption( + "D", cl::desc("Use zero for timestamps and UIDs/GIDs (Default)"), + cl::init(false), cl::cat(LibtoolCategory)); + +static cl::opt<bool> + NonDeterministicOption("U", cl::desc("Use actual timestamps and UIDs/GIDs"), + cl::init(false), cl::cat(LibtoolCategory)); + static cl::opt<std::string> FileList("filelist", cl::desc("Pass in file containing a list of filenames"), cl::value_desc("listfile[,dirname]"), cl::cat(LibtoolCategory)); +struct Config { + bool Deterministic = true; // Updated by 'D' and 'U' modifiers. +}; + static Error processFileList() { StringRef FileName, DirName; std::tie(FileName, DirName) = StringRef(FileList).rsplit(","); @@ -99,9 +111,9 @@ static Error verifyMachOObject(const NewArchiveMember &Member) { } static Error addChildMember(std::vector<NewArchiveMember> &Members, - const object::Archive::Child &M) { + const object::Archive::Child &M, const Config &C) { Expected<NewArchiveMember> NMOrErr = - NewArchiveMember::getOldMember(M, /*Deterministic=*/true); + NewArchiveMember::getOldMember(M, C.Deterministic); if (!NMOrErr) return NMOrErr.takeError(); @@ -115,9 +127,10 @@ static Error addChildMember(std::vector<NewArchiveMember> &Members, static Error addMember(std::vector<NewArchiveMember> &Members, StringRef FileName, - std::vector<std::unique_ptr<MemoryBuffer>> &ArchiveBuffers) { + std::vector<std::unique_ptr<MemoryBuffer>> &ArchiveBuffers, + const Config &C) { Expected<NewArchiveMember> NMOrErr = - NewArchiveMember::getFile(FileName, /*Deterministic=*/true); + NewArchiveMember::getFile(FileName, C.Deterministic); if (!NMOrErr) return createFileError(FileName, NMOrErr.takeError()); @@ -135,7 +148,7 @@ addMember(std::vector<NewArchiveMember> &Members, StringRef FileName, Error Err = Error::success(); for (const object::Archive::Child &Child : Lib.children(Err)) - if (Error E = addChildMember(Members, Child)) + if (Error E = addChildMember(Members, Child, C)) return createFileError(FileName, std::move(E)); if (Err) return createFileError(FileName, std::move(Err)); @@ -154,43 +167,56 @@ addMember(std::vector<NewArchiveMember> &Members, StringRef FileName, return Error::success(); } -static Error createStaticLibrary() { +static Error createStaticLibrary(const Config &C) { std::vector<NewArchiveMember> NewMembers; std::vector<std::unique_ptr<MemoryBuffer>> ArchiveBuffers; for (StringRef Member : InputFiles) - if (Error E = addMember(NewMembers, Member, ArchiveBuffers)) + if (Error E = addMember(NewMembers, Member, ArchiveBuffers, C)) return E; - if (Error E = writeArchive(OutputFile, NewMembers, - /*WriteSymtab=*/true, - /*Kind=*/object::Archive::K_DARWIN, - /*Deterministic=*/true, - /*Thin=*/false)) + if (Error E = + writeArchive(OutputFile, NewMembers, + /*WriteSymtab=*/true, + /*Kind=*/object::Archive::K_DARWIN, C.Deterministic, + /*Thin=*/false)) return E; return Error::success(); } +static Expected<Config> parseCommandLine(int Argc, char **Argv) { + Config C; + cl::ParseCommandLineOptions(Argc, Argv, "llvm-libtool-darwin\n"); + + if (DeterministicOption && NonDeterministicOption) + return createStringError(std::errc::invalid_argument, + "cannot specify both -D and -U flags"); + else if (NonDeterministicOption) + C.Deterministic = false; + + if (!FileList.empty()) + if (Error E = processFileList()) + return std::move(E); + + if (InputFiles.empty()) + return createStringError(std::errc::invalid_argument, + "no input files specified"); + + return C; +} + int main(int Argc, char **Argv) { InitLLVM X(Argc, Argv); cl::HideUnrelatedOptions({&LibtoolCategory, &ColorCategory}); - cl::ParseCommandLineOptions(Argc, Argv, "llvm-libtool-darwin\n"); - if (!FileList.empty()) { - if (Error E = processFileList()) { - WithColor::defaultErrorHandler(std::move(E)); - return EXIT_FAILURE; - } - } - - if (InputFiles.empty()) { - Error E = createStringError(std::errc::invalid_argument, - "no input files specified"); - WithColor::defaultErrorHandler(std::move(E)); + Expected<Config> ConfigOrErr = parseCommandLine(Argc, Argv); + if (!ConfigOrErr) { + WithColor::defaultErrorHandler(ConfigOrErr.takeError()); return EXIT_FAILURE; } + Config C = *ConfigOrErr; switch (LibraryOperation) { case Operation::Static: - if (Error E = createStaticLibrary()) { + if (Error E = createStaticLibrary(C)) { WithColor::defaultErrorHandler(std::move(E)); return EXIT_FAILURE; } |