@@ -42,11 +42,23 @@ static cl::opt<Operation> LibraryOperation(
42
42
" Produce a statically linked library from the input files" )),
43
43
cl::Required, cl::cat(LibtoolCategory));
44
44
45
+ static cl::opt<bool > DeterministicOption (
46
+ " D" , cl::desc(" Use zero for timestamps and UIDs/GIDs (Default)" ),
47
+ cl::init(false ), cl::cat(LibtoolCategory));
48
+
49
+ static cl::opt<bool >
50
+ NonDeterministicOption (" U" , cl::desc(" Use actual timestamps and UIDs/GIDs" ),
51
+ cl::init(false ), cl::cat(LibtoolCategory));
52
+
45
53
static cl::opt<std::string>
46
54
FileList (" filelist" ,
47
55
cl::desc (" Pass in file containing a list of filenames" ),
48
56
cl::value_desc(" listfile[,dirname]" ), cl::cat(LibtoolCategory));
49
57
58
+ struct Config {
59
+ bool Deterministic = true ; // Updated by 'D' and 'U' modifiers.
60
+ };
61
+
50
62
static Error processFileList () {
51
63
StringRef FileName, DirName;
52
64
std::tie (FileName, DirName) = StringRef (FileList).rsplit (" ," );
@@ -99,9 +111,9 @@ static Error verifyMachOObject(const NewArchiveMember &Member) {
99
111
}
100
112
101
113
static Error addChildMember (std::vector<NewArchiveMember> &Members,
102
- const object::Archive::Child &M) {
114
+ const object::Archive::Child &M, const Config &C ) {
103
115
Expected<NewArchiveMember> NMOrErr =
104
- NewArchiveMember::getOldMember (M, /* Deterministic= */ true );
116
+ NewArchiveMember::getOldMember (M, C. Deterministic );
105
117
if (!NMOrErr)
106
118
return NMOrErr.takeError ();
107
119
@@ -115,9 +127,10 @@ static Error addChildMember(std::vector<NewArchiveMember> &Members,
115
127
116
128
static Error
117
129
addMember (std::vector<NewArchiveMember> &Members, StringRef FileName,
118
- std::vector<std::unique_ptr<MemoryBuffer>> &ArchiveBuffers) {
130
+ std::vector<std::unique_ptr<MemoryBuffer>> &ArchiveBuffers,
131
+ const Config &C) {
119
132
Expected<NewArchiveMember> NMOrErr =
120
- NewArchiveMember::getFile (FileName, /* Deterministic= */ true );
133
+ NewArchiveMember::getFile (FileName, C. Deterministic );
121
134
if (!NMOrErr)
122
135
return createFileError (FileName, NMOrErr.takeError ());
123
136
@@ -135,7 +148,7 @@ addMember(std::vector<NewArchiveMember> &Members, StringRef FileName,
135
148
136
149
Error Err = Error::success ();
137
150
for (const object::Archive::Child &Child : Lib.children (Err))
138
- if (Error E = addChildMember (Members, Child))
151
+ if (Error E = addChildMember (Members, Child, C ))
139
152
return createFileError (FileName, std::move (E));
140
153
if (Err)
141
154
return createFileError (FileName, std::move (Err));
@@ -154,43 +167,56 @@ addMember(std::vector<NewArchiveMember> &Members, StringRef FileName,
154
167
return Error::success ();
155
168
}
156
169
157
- static Error createStaticLibrary () {
170
+ static Error createStaticLibrary (const Config &C ) {
158
171
std::vector<NewArchiveMember> NewMembers;
159
172
std::vector<std::unique_ptr<MemoryBuffer>> ArchiveBuffers;
160
173
for (StringRef Member : InputFiles)
161
- if (Error E = addMember (NewMembers, Member, ArchiveBuffers))
174
+ if (Error E = addMember (NewMembers, Member, ArchiveBuffers, C ))
162
175
return E;
163
176
164
- if (Error E = writeArchive (OutputFile, NewMembers,
165
- /* WriteSymtab= */ true ,
166
- /* Kind =*/ object::Archive::K_DARWIN ,
167
- /* Deterministic =*/ true ,
168
- /* Thin=*/ false ))
177
+ if (Error E =
178
+ writeArchive (OutputFile, NewMembers ,
179
+ /* WriteSymtab =*/ true ,
180
+ /* Kind =*/ object::Archive::K_DARWIN, C. Deterministic ,
181
+ /* Thin=*/ false ))
169
182
return E;
170
183
return Error::success ();
171
184
}
172
185
186
+ static Expected<Config> parseCommandLine (int Argc, char **Argv) {
187
+ Config C;
188
+ cl::ParseCommandLineOptions (Argc, Argv, " llvm-libtool-darwin\n " );
189
+
190
+ if (DeterministicOption && NonDeterministicOption)
191
+ return createStringError (std::errc::invalid_argument,
192
+ " cannot specify both -D and -U flags" );
193
+ else if (NonDeterministicOption)
194
+ C.Deterministic = false ;
195
+
196
+ if (!FileList.empty ())
197
+ if (Error E = processFileList ())
198
+ return std::move (E);
199
+
200
+ if (InputFiles.empty ())
201
+ return createStringError (std::errc::invalid_argument,
202
+ " no input files specified" );
203
+
204
+ return C;
205
+ }
206
+
173
207
int main (int Argc, char **Argv) {
174
208
InitLLVM X (Argc, Argv);
175
209
cl::HideUnrelatedOptions ({&LibtoolCategory, &ColorCategory});
176
- cl::ParseCommandLineOptions (Argc, Argv, " llvm-libtool-darwin\n " );
177
- if (!FileList.empty ()) {
178
- if (Error E = processFileList ()) {
179
- WithColor::defaultErrorHandler (std::move (E));
180
- return EXIT_FAILURE;
181
- }
182
- }
183
-
184
- if (InputFiles.empty ()) {
185
- Error E = createStringError (std::errc::invalid_argument,
186
- " no input files specified" );
187
- WithColor::defaultErrorHandler (std::move (E));
210
+ Expected<Config> ConfigOrErr = parseCommandLine (Argc, Argv);
211
+ if (!ConfigOrErr) {
212
+ WithColor::defaultErrorHandler (ConfigOrErr.takeError ());
188
213
return EXIT_FAILURE;
189
214
}
190
215
216
+ Config C = *ConfigOrErr;
191
217
switch (LibraryOperation) {
192
218
case Operation::Static:
193
- if (Error E = createStaticLibrary ()) {
219
+ if (Error E = createStaticLibrary (C )) {
194
220
WithColor::defaultErrorHandler (std::move (E));
195
221
return EXIT_FAILURE;
196
222
}
0 commit comments