diff --git a/pkgs/development/libraries/qt-4.x/4.8/default.nix b/pkgs/development/libraries/qt-4.x/4.8/default.nix index f7ddf8ff780c..8715aaaa44d0 100644 --- a/pkgs/development/libraries/qt-4.x/4.8/default.nix +++ b/pkgs/development/libraries/qt-4.x/4.8/default.nix @@ -68,6 +68,7 @@ stdenv.mkDerivation rec { ./parallel-configure.patch ./clang-5-darwin.patch ./qt-4.8.7-unixmake-darwin.patch + ./kill-legacy-darwin-apis.patch (substituteAll { src = ./dlopen-absolute-paths.diff; cups = if cups != null then lib.getLib cups else null; diff --git a/pkgs/development/libraries/qt-4.x/4.8/kill-legacy-darwin-apis.patch b/pkgs/development/libraries/qt-4.x/4.8/kill-legacy-darwin-apis.patch new file mode 100644 index 000000000000..c1338e98d851 --- /dev/null +++ b/pkgs/development/libraries/qt-4.x/4.8/kill-legacy-darwin-apis.patch @@ -0,0 +1,330 @@ +diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp +index 4a9049b..c0ac9db 100644 +--- a/src/corelib/io/qfilesystemengine_unix.cpp ++++ b/src/corelib/io/qfilesystemengine_unix.cpp +@@ -242,9 +242,8 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry, + #else + char *ret = 0; + # if defined(Q_OS_MAC) && !defined(Q_OS_IOS) +- // When using -mmacosx-version-min=10.4, we get the legacy realpath implementation, +- // which does not work properly with the realpath(X,0) form. See QTBUG-28282. +- if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_6) { ++ // In Nix-on-Darwin, we don't support ancient macOS anyway, and the deleted branch relies on ++ // a symbol that's been deprecated for years and that our CF doesn't have + ret = (char*)malloc(PATH_MAX + 1); + if (ret && realpath(entry.nativeFilePath().constData(), (char*)ret) == 0) { + const int savedErrno = errno; // errno is checked below, and free() might change it +@@ -252,19 +251,6 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry, + errno = savedErrno; + ret = 0; + } +- } else { +- // on 10.5 we can use FSRef to resolve the file path. +- QString path = QDir::cleanPath(entry.filePath()); +- FSRef fsref; +- if (FSPathMakeRef((const UInt8 *)path.toUtf8().data(), &fsref, 0) == noErr) { +- CFURLRef urlref = CFURLCreateFromFSRef(NULL, &fsref); +- CFStringRef canonicalPath = CFURLCopyFileSystemPath(urlref, kCFURLPOSIXPathStyle); +- QString ret = QCFString::toQString(canonicalPath); +- CFRelease(canonicalPath); +- CFRelease(urlref); +- return QFileSystemEntry(ret); +- } +- } + # else + # if _POSIX_VERSION >= 200801L + ret = realpath(entry.nativeFilePath().constData(), (char*)0); +diff --git a/src/3rdparty/webkit/Source/WebCore/platform/mac/WebCoreNSStringExtras.h b/src/3rdparty/webkit/Source/WebCore/platform/mac/WebCoreNSStringExtras.h +index 3bf7342..b6bcfc0 100644 +--- a/src/3rdparty/webkit/Source/WebCore/platform/mac/WebCoreNSStringExtras.h ++++ b/src/3rdparty/webkit/Source/WebCore/platform/mac/WebCoreNSStringExtras.h +@@ -43,7 +43,6 @@ BOOL stringIsCaseInsensitiveEqualToString(NSString *first, NSString *second); + BOOL hasCaseInsensitiveSuffix(NSString *string, NSString *suffix); + BOOL hasCaseInsensitiveSubstring(NSString *string, NSString *substring); + NSString *filenameByFixingIllegalCharacters(NSString *string); +-CFStringEncoding stringEncodingForResource(Handle resource); + + #ifdef __cplusplus + } +diff --git a/src/3rdparty/webkit/Source/WebCore/platform/mac/WebCoreNSStringExtras.mm b/src/3rdparty/webkit/Source/WebCore/platform/mac/WebCoreNSStringExtras.mm +index d6c3f0c..c88ca76 100644 +--- a/src/3rdparty/webkit/Source/WebCore/platform/mac/WebCoreNSStringExtras.mm ++++ b/src/3rdparty/webkit/Source/WebCore/platform/mac/WebCoreNSStringExtras.mm +@@ -68,45 +68,4 @@ BOOL hasCaseInsensitiveSubstring(NSString *string, NSString *substring) + return filename; + } + +-CFStringEncoding stringEncodingForResource(Handle resource) +-{ +- short resRef = HomeResFile(resource); +- if (ResError() != noErr) +- return NSMacOSRomanStringEncoding; +- +- // Get the FSRef for the current resource file +- FSRef fref; +- OSStatus error = FSGetForkCBInfo(resRef, 0, NULL, NULL, NULL, &fref, NULL); +- if (error != noErr) +- return NSMacOSRomanStringEncoding; +- +- RetainPtr url(AdoptCF, CFURLCreateFromFSRef(NULL, &fref)); +- if (!url) +- return NSMacOSRomanStringEncoding; +- +- NSString *path = [(NSURL *)url.get() path]; +- +- // Get the lproj directory name +- path = [path stringByDeletingLastPathComponent]; +- if (!stringIsCaseInsensitiveEqualToString([path pathExtension], @"lproj")) +- return NSMacOSRomanStringEncoding; +- +- NSString *directoryName = [[path stringByDeletingPathExtension] lastPathComponent]; +- RetainPtr locale(AdoptCF, CFLocaleCreateCanonicalLocaleIdentifierFromString(NULL, (CFStringRef)directoryName)); +- if (!locale) +- return NSMacOSRomanStringEncoding; +- +- LangCode lang; +- RegionCode region; +- error = LocaleStringToLangAndRegionCodes([(NSString *)locale.get() UTF8String], &lang, ®ion); +- if (error != noErr) +- return NSMacOSRomanStringEncoding; +- +- TextEncoding encoding; +- error = UpgradeScriptInfoToTextEncoding(kTextScriptDontCare, lang, region, NULL, &encoding); +- if (error != noErr) +- return NSMacOSRomanStringEncoding; +- +- return encoding; +-} + +diff --git a/src/3rdparty/webkit/Source/WebCore/plugins/mac/PluginPackageMac.cpp b/src/3rdparty/webkit/Source/WebCore/plugins/mac/PluginPackageMac.cpp +index 865ea32..20bda8d 100644 +--- a/src/3rdparty/webkit/Source/WebCore/plugins/mac/PluginPackageMac.cpp ++++ b/src/3rdparty/webkit/Source/WebCore/plugins/mac/PluginPackageMac.cpp +@@ -101,33 +101,6 @@ static WTF::RetainPtr readPListFile(CFStringRef fileName, bool + return map; + } + +-static Vector stringListFromResourceId(SInt16 id) +-{ +- Vector list; +- +- Handle handle = Get1Resource('STR#', id); +- if (!handle) +- return list; +- +- CFStringEncoding encoding = stringEncodingForResource(handle); +- +- unsigned char* p = (unsigned char*)*handle; +- if (!p) +- return list; +- +- SInt16 count = *(SInt16*)p; +- p += sizeof(SInt16); +- +- for (SInt16 i = 0; i < count; ++i) { +- unsigned char length = *p; +- WTF::RetainPtr str = CFStringCreateWithPascalString(0, p, encoding); +- list.append(str.get()); +- p += 1 + length; +- } +- +- return list; +-} +- + bool PluginPackage::fetchInfo() + { + if (!load()) +@@ -202,36 +175,8 @@ bool PluginPackage::fetchInfo() + m_description = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(m_module, CFSTR("WebPluginDescription")); + + } else { +- int resFile = CFBundleOpenBundleResourceMap(m_module); +- +- UseResFile(resFile); +- +- Vector mimes = stringListFromResourceId(MIMEListStringStringNumber); +- +- if (mimes.size() % 2 != 0) +- return false; +- +- Vector descriptions = stringListFromResourceId(MIMEDescriptionStringNumber); +- if (descriptions.size() != mimes.size() / 2) +- return false; +- +- for (size_t i = 0; i < mimes.size(); i += 2) { +- String mime = mimes[i].lower(); +- Vector extensions; +- mimes[i + 1].lower().split(UChar(','), extensions); +- +- m_mimeToExtensions.set(mime, extensions); +- +- m_mimeToDescriptions.set(mime, descriptions[i / 2]); +- } +- +- Vector names = stringListFromResourceId(PluginNameOrDescriptionStringNumber); +- if (names.size() == 2) { +- m_description = names[0]; +- m_name = names[1]; +- } +- +- CFBundleCloseBundleResourceMap(m_module, resFile); ++ LOG(Plugins, "Nix removed ancient code that relies on long-deprecated functionality that we don't want to support!"); ++ return false; + } + + LOG(Plugins, "PluginPackage::fetchInfo(): Found plug-in '%s'", m_name.utf8().data()); +diff --git a/src/3rdparty/webkit/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm b/src/3rdparty/webkit/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm +index b206e48..669d442 100644 +--- a/src/3rdparty/webkit/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm ++++ b/src/3rdparty/webkit/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm +@@ -26,7 +26,6 @@ + #import "config.h" + #import "NetscapePluginModule.h" + +-#import + #import + + using namespace WebCore; +@@ -196,132 +195,6 @@ static bool getPluginInfoFromPropertyLists(CFBundleRef bundle, PluginInfo& plugi + return true; + } + +-class ResourceMap { +-public: +- explicit ResourceMap(CFBundleRef bundle) +- : m_bundle(bundle) +- , m_currentResourceFile(CurResFile()) +- , m_bundleResourceMap(CFBundleOpenBundleResourceMap(m_bundle)) +- { +- UseResFile(m_bundleResourceMap); +- } +- +- ~ResourceMap() +- { +- // Close the resource map. +- CFBundleCloseBundleResourceMap(m_bundle, m_bundleResourceMap); +- +- // And restore the old resource. +- UseResFile(m_currentResourceFile); +- } +- +- bool isValid() const { return m_bundleResourceMap != -1; } +- +-private: +- CFBundleRef m_bundle; +- ResFileRefNum m_currentResourceFile; +- ResFileRefNum m_bundleResourceMap; +-}; +- +-static bool getStringListResource(ResID resourceID, Vector& stringList) { +- Handle stringListHandle = Get1Resource('STR#', resourceID); +- if (!stringListHandle || !*stringListHandle) +- return false; +- +- // Get the string list size. +- Size stringListSize = GetHandleSize(stringListHandle); +- if (stringListSize < static_cast(sizeof(UInt16))) +- return false; +- +- CFStringEncoding stringEncoding = stringEncodingForResource(stringListHandle); +- +- unsigned char* ptr = reinterpret_cast(*stringListHandle); +- unsigned char* end = ptr + stringListSize; +- +- // Get the number of strings in the string list. +- UInt16 numStrings = *reinterpret_cast(ptr); +- ptr += sizeof(UInt16); +- +- for (UInt16 i = 0; i < numStrings; ++i) { +- // We're past the end of the string, bail. +- if (ptr >= end) +- return false; +- +- // Get the string length. +- unsigned char stringLength = *ptr++; +- +- RetainPtr cfString(AdoptCF, CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, ptr, stringLength, stringEncoding, false, kCFAllocatorNull)); +- if (!cfString.get()) +- return false; +- +- stringList.append(cfString.get()); +- ptr += stringLength; +- } +- +- if (ptr != end) +- return false; +- +- return true; +-} +- +-static const ResID PluginNameOrDescriptionStringNumber = 126; +-static const ResID MIMEDescriptionStringNumber = 127; +-static const ResID MIMEListStringStringNumber = 128; +- +-static bool getPluginInfoFromCarbonResources(CFBundleRef bundle, PluginInfo& pluginInfo) +-{ +- ResourceMap resourceMap(bundle); +- if (!resourceMap.isValid()) +- return false; +- +- // Get the description and name string list. +- Vector descriptionAndName; +- if (!getStringListResource(PluginNameOrDescriptionStringNumber, descriptionAndName)) +- return false; +- +- // Get the MIME types and extensions string list. This list needs to be a multiple of two. +- Vector mimeTypesAndExtensions; +- if (!getStringListResource(MIMEListStringStringNumber, mimeTypesAndExtensions)) +- return false; +- +- if (mimeTypesAndExtensions.size() % 2) +- return false; +- +- // Now get the MIME type descriptions string list. This string list needs to be the same length as the number of MIME types. +- Vector mimeTypeDescriptions; +- if (!getStringListResource(MIMEDescriptionStringNumber, mimeTypeDescriptions)) +- return false; +- +- // Add all MIME types. +- for (size_t i = 0; i < mimeTypesAndExtensions.size() / 2; ++i) { +- MimeClassInfo mimeClassInfo; +- +- const String& mimeType = mimeTypesAndExtensions[i * 2]; +- String description; +- if (i < mimeTypeDescriptions.size()) +- description = mimeTypeDescriptions[i]; +- +- mimeClassInfo.type = mimeType.lower(); +- mimeClassInfo.desc = description; +- +- Vector extensions; +- mimeTypesAndExtensions[i * 2 + 1].split(',', extensions); +- +- for (size_t i = 0; i < extensions.size(); ++i) +- mimeClassInfo.extensions.append(extensions[i].lower()); +- +- pluginInfo.mimes.append(mimeClassInfo); +- } +- +- // Set the description and name if they exist. +- if (descriptionAndName.size() > 0) +- pluginInfo.desc = descriptionAndName[0]; +- if (descriptionAndName.size() > 1) +- pluginInfo.name = descriptionAndName[1]; +- +- return true; +-} +- + bool NetscapePluginModule::getPluginInfo(const String& pluginPath, PluginInfoStore::Plugin& plugin) + { + RetainPtr bundlePath(AdoptCF, pluginPath.createCFString()); +@@ -344,8 +217,7 @@ static bool getPluginInfoFromCarbonResources(CFBundleRef bundle, PluginInfo& plu + return false; + + // Check that there's valid info for this plug-in. +- if (!getPluginInfoFromPropertyLists(bundle.get(), plugin.info) && +- !getPluginInfoFromCarbonResources(bundle.get(), plugin.info)) ++ if (!getPluginInfoFromPropertyLists(bundle.get(), plugin.info)) + return false; + + plugin.path = pluginPath;