nixpkgs/pkgs/os-specific/darwin/cctools/ld-tbd-v2.patch
Matthew Bauer 0e78f2bd10 Revert "cctools: bump to latest commit"
This reverts commit ac682e362c.

This broke iOS building on master. Even Xcode 8.2 comes with TAPI
librarises. We need these patches to support those .tbd files.
Eventually we will move to using libtapi directly, but I have not
finished work on this right now.

Unfortunately, this will not have my changes for building cctools with
manpages. We will have to do this update at some later time.
2019-02-18 20:44:19 -05:00

99 lines
2.6 KiB
Diff

diff --git a/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp b/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp
index 09c0e12..ac6b085 100644
--- a/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp
+++ b/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp
@@ -187,6 +187,7 @@ struct DynamicLibrary {
ld::File::ObjcConstraint _objcConstraint;
Options::Platform _platform;
std::vector<Token> _allowedClients;
+ std::vector<Token> _allowableClients;
std::vector<Token> _reexportedLibraries;
std::vector<Token> _symbols;
std::vector<Token> _classes;
@@ -246,6 +247,14 @@ class TBDFile {
});
}
+ void parseAllowableClients(DynamicLibrary& lib) {
+ if ( !hasOptionalToken("allowable-clients") )
+ return;
+ parseFlowSequence([&](Token name) {
+ lib._allowableClients.emplace_back(name);
+ });
+ }
+
void parseReexportedDylibs(DynamicLibrary& lib) {
if ( !hasOptionalToken("re-exports") )
return;
@@ -306,6 +315,21 @@ class TBDFile {
return false;
}
+ void skipUUIDs(DynamicLibrary& lib) {
+ expectToken("uuids");
+ while ( true ) {
+ auto token = next();
+ if ( token == "]" )
+ break;
+ }
+ }
+
+ void skipParentUmbrella(DynamicLibrary& lib) {
+ if (!hasOptionalToken("parent-umbrella"))
+ return;
+ next();
+ }
+
void parsePlatform(DynamicLibrary& lib) {
expectToken("platform");
@@ -410,6 +434,7 @@ class TBDFile {
}
parseAllowedClients(lib);
+ parseAllowableClients(lib);
parseReexportedDylibs(lib);
parseSymbols(lib);
if ( !hasOptionalToken("-") )
@@ -455,17 +480,21 @@ class TBDFile {
return result.front();
}
- void parseDocument(DynamicLibrary& lib, std::string &requestedArchName) {
+ void parseDocument(DynamicLibrary& lib, std::string &requestedArchName, bool isTbdV2) {
auto selectedArchName = parseAndSelectArchitecture(requestedArchName);
if (selectedArchName.empty())
throwf("invalid arch");
+ if(isTbdV2)
+ skipUUIDs(lib);
parsePlatform(lib);
parseInstallName(lib);
parseCurrentVersion(lib);
parseCompatibilityVersion(lib);
parseSwiftVersion(lib);
parseObjCConstraint(lib);
+ if(isTbdV2)
+ skipParentUmbrella(lib);
parseExportsBlock(lib, selectedArchName);
}
@@ -476,7 +505,8 @@ public:
_tokenizer.reset();
DynamicLibrary lib;
expectToken("---");
- parseDocument(lib, requestedArchName);
+ auto isTbdV2 = hasOptionalToken("!tapi-tbd-v2");
+ parseDocument(lib, requestedArchName, isTbdV2);
expectToken("...");
return lib;
}
@@ -486,6 +516,7 @@ public:
auto token = next();
if ( token != "---" )
return false;
+ hasOptionalToken("!tapi-tbd-v2");
return !parseAndSelectArchitecture(requestedArchName).empty();
}