darwin/apple-sdk: use darwin stubs

This commit is contained in:
Andrew Childs 2020-09-18 17:12:43 +09:00
parent 8e6d830423
commit 3456ef6f30
4 changed files with 211 additions and 131 deletions

View file

@ -3,7 +3,7 @@ linkSystemCoreFoundationFramework() {
# gross! many symbols (such as _OBJC_CLASS_$_NSArray) are defined in system CF, but not
# in the opensource release
# if the package needs private headers, we assume they also want to link with system CF
NIX_LDFLAGS+=" /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation"
NIX_LDFLAGS+=" @out@/Library/Frameworks/CoreFoundation.framework/CoreFoundation"
}
preConfigureHooks+=(linkSystemCoreFoundationFramework)

View file

@ -1,4 +1,4 @@
{ stdenv, fetchurl, xar, cpio, pkgs, python3, pbzx, lib }:
{ stdenv, fetchurl, xar, cpio, pkgs, python3, pbzx, lib, darwin-stubs, print-reexports }:
let version = "10.12"; in
@ -42,7 +42,12 @@ let
rmdir System
pushd lib
ln -s -L /usr/lib/libcups*.dylib .
cp ${darwin-stubs}/usr/lib/libcups*.tbd .
ln -s libcups.2.tbd libcups.tbd
ln -s libcupscgi.1.tbd libcupscgi.tbd
ln -s libcupsimage.2.tbd libcupsimage.tbd
ln -s libcupsmime.1.tbd libcupsmime.tbd
ln -s libcupsppdc.1.tbd libcupsppdc.tbd
popd
'';
@ -53,6 +58,12 @@ let
};
};
mkFrameworkSubs = name: deps:
let
deps' = deps // { "${name}" = placeholder "out"; };
substArgs = lib.concatMap (x: [ "--subst-var-by" x deps'."${x}" ]) (lib.attrNames deps');
in lib.escapeShellArgs substArgs;
framework = name: deps: stdenv.mkDerivation {
name = "apple-framework-${name}";
@ -63,11 +74,14 @@ let
disallowedRequisites = [ sdk ];
nativeBuildInputs = [ print-reexports ];
extraTBDFiles = [];
installPhase = ''
linkFramework() {
local path="$1"
local nested_path="$1"
local dest="$out/Library/Frameworks/$path"
if [ "$path" == "JavaNativeFoundation.framework" ]; then
local nested_path="JavaVM.framework/Versions/A/Frameworks/JavaNativeFoundation.framework"
fi
@ -80,21 +94,28 @@ let
current=A
fi
mkdir -p "$dest"
pushd "$dest" >/dev/null
local dest="$out/Library/Frameworks/$path"
# Keep track of if this is a child or a child rescue as with
# ApplicationServices in the 10.9 SDK
local isChild=0
mkdir -p "$dest/Versions/$current"
pushd "$dest/Versions/$current" >/dev/null
if [ -d "${sdk.out}/Library/Frameworks/$nested_path/Versions/$current/Headers" ]; then
isChild=1
cp -R "${sdk.out}/Library/Frameworks/$nested_path/Versions/$current/Headers" .
elif [ -d "${sdk.out}/Library/Frameworks/$name.framework/Versions/$current/Headers" ]; then
current="$(readlink "/System/Library/Frameworks/$name.framework/Versions/Current")"
cp -R "${sdk.out}/Library/Frameworks/$name.framework/Versions/$current/Headers" .
fi
ln -s -L "/System/Library/Frameworks/$nested_path/Versions/$current/$name"
local tbd_source=${darwin-stubs}/System/Library/Frameworks/$nested_path/Versions/$current
if [ "${name}" != "Kernel" ]; then
cp -v $tbd_source/*.tbd .
fi
if [ -d "$tbd_source/Libraries" ]; then
mkdir Libraries
cp -v $tbd_source/Libraries/*.tbd Libraries/
fi
ln -s -L "/System/Library/Frameworks/$nested_path/Versions/$current/Resources"
if [ -f "/System/Library/Frameworks/$nested_path/module.map" ]; then
@ -110,17 +131,45 @@ let
linkFramework "$childpath"
done
if [ -d "$dest/Versions/$current" ]; then
mv $dest/Versions/$current/* .
fi
pushd ../.. >/dev/null
ln -s "$current" Versions/Current
ln -s Versions/Current/* .
popd >/dev/null
popd >/dev/null
}
linkFramework "${name}.framework"
# linkFramework is recursive, the rest of the processing is not.
local tbd_source=${darwin-stubs}/System/Library/Frameworks/${name}.framework
for tbd in $extraTBDFiles; do
local tbd_dest_dir=$out/Library/Frameworks/${name}.framework/$(dirname "$tbd")
mkdir -p "$tbd_dest_dir"
cp -v "$tbd_source/$tbd" "$tbd_dest_dir"
done
# Fix and check tbd re-export references
find $out -name '*.tbd' | while read tbd; do
echo "Fixing re-exports in $tbd"
substituteInPlace "$tbd" ${mkFrameworkSubs name deps}
echo "Checking re-exports in $tbd"
print-reexports "$tbd" | while read target; do
local expected="''${target%.dylib}.tbd"
if ! [ -e "$expected" ]; then
echo -e "Re-export missing:\n\t$target\n\t(expected $expected)"
echo -e "While processing\n\t$tbd"
exit 1
else
echo "Re-exported target $target ok"
fi
done
done
'';
propagatedBuildInputs = deps;
propagatedBuildInputs = builtins.attrValues deps;
# don't use pure CF for dylibs that depend on frameworks
setupHook = ./framework-setup-hook.sh;
@ -139,6 +188,17 @@ let
platforms = platforms.darwin;
};
};
tbdOnlyFramework = name: { private ? true }: stdenv.mkDerivation {
name = "apple-framework-${name}";
dontUnpack = true;
installPhase = ''
mkdir -p $out/Library/Frameworks/
cp -r ${darwin-stubs}/System/Library/${lib.optionalString private "Private"}Frameworks/${name}.framework \
$out/Library/Frameworks
# NOTE there's no re-export checking here, this is probably wrong
'';
};
in rec {
libs = {
xpc = stdenv.mkDerivation {
@ -168,7 +228,8 @@ in rec {
installPhase = ''
mkdir -p $out/include $out/lib
ln -s "${lib.getDev sdk}/include/Xplugin.h" $out/include/Xplugin.h
ln -s "/usr/lib/libXplugin.1.dylib" $out/lib/libXplugin.dylib
cp ${darwin-stubs}/usr/lib/libXplugin.1.tbd $out/lib
ln -s libXplugin.1.tbd $out/lib/libXplugin.tbd
'';
};
@ -193,6 +254,10 @@ in rec {
];
});
Carbon = stdenv.lib.overrideDerivation super.Carbon (drv: {
extraTBDFiles = [ "Versions/A/Frameworks/HTMLRendering.framework/Versions/A/HTMLRendering.tbd" ];
});
CoreFoundation = stdenv.lib.overrideDerivation super.CoreFoundation (drv: {
setupHook = ./cf-setup-hook.sh;
});
@ -210,6 +275,10 @@ in rec {
setupHook = ./private-frameworks-setup-hook.sh;
});
IMServicePlugIn = stdenv.lib.overrideDerivation super.IMServicePlugIn (drv: {
extraTBDFiles = [ "Versions/A/Frameworks/IMServicePlugInSupport.framework/Versions/A/IMServicePlugInSupport.tbd" ];
});
Security = stdenv.lib.overrideDerivation super.Security (drv: {
setupHook = ./security-setup-hook.sh;
});
@ -228,7 +297,14 @@ in rec {
cp ${lib.getDev sdk}/include/simd/*.h $out/include/simd/
'';
});
};
WebKit = stdenv.lib.overrideDerivation super.WebKit (drv: {
extraTBDFiles = [
"Versions/A/Frameworks/WebCore.framework/Versions/A/WebCore.tbd"
"Versions/A/Frameworks/WebKitLegacy.framework/Versions/A/WebKitLegacy.tbd"
];
});
} // lib.genAttrs [ "ContactsPersistence" "UIFoundation" "GameCenter" ] (x: tbdOnlyFramework x {});
bareFrameworks = stdenv.lib.mapAttrs framework (import ./frameworks.nix {
inherit frameworks libs;

View file

@ -5,123 +5,125 @@
{ frameworks, libs, libobjc, }:
with frameworks; with libs; {
AGL = [ Carbon OpenGL ];
AVFoundation = [ ApplicationServices CoreGraphics ];
AVKit = [];
Accounts = [];
AddressBook = [ Carbon ];
AppKit = [ AudioToolbox AudioUnit Foundation QuartzCore ];
AppKitScripting = [];
AppleScriptKit = [];
AppleScriptObjC = [];
AudioToolbox = [ CoreAudio CoreMIDI ];
AudioUnit = [ AudioToolbox Carbon CoreAudio ];
AudioVideoBridging = [ Foundation ];
Automator = [];
CFNetwork = [];
CalendarStore = [];
Cocoa = [ AppKit ];
Collaboration = [];
AGL = { inherit Carbon OpenGL; };
AVFoundation = { inherit ApplicationServices CoreGraphics; };
AVKit = {};
Accounts = {};
AddressBook = { inherit libobjc Carbon ContactsPersistence; };
AppKit = { inherit ApplicationServices AudioToolbox AudioUnit Foundation QuartzCore UIFoundation; };
AppKitScripting = {};
AppleScriptKit = {};
AppleScriptObjC = {};
AudioToolbox = { inherit CoreAudio CoreMIDI; };
AudioUnit = { inherit AudioToolbox Carbon CoreAudio; };
AudioVideoBridging = { inherit Foundation; };
Automator = {};
CFNetwork = {};
CalendarStore = {};
Cocoa = { inherit AppKit CoreData; };
Collaboration = {};
# Impure version of CoreFoundation, this should not be used unless another
# framework includes headers that are not available in the pure version.
CoreFoundation = [];
CoreAudio = [ IOKit ];
CoreAudioKit = [ AudioUnit ];
CoreData = [];
CoreGraphics = [ Accelerate IOKit IOSurface SystemConfiguration ];
CoreImage = [];
CoreLocation = [];
CoreMIDI = [];
CoreMIDIServer = [];
CoreMedia = [ ApplicationServices AudioToolbox AudioUnit CoreAudio CoreGraphics CoreVideo ];
CoreMediaIO = [ CoreMedia ];
CoreText = [ CoreGraphics ];
CoreVideo = [ ApplicationServices CoreGraphics IOSurface OpenGL ];
CoreWLAN = [ SecurityFoundation ];
DVDPlayback = [];
DirectoryService = [];
DiscRecording = [ CoreServices IOKit ];
DiscRecordingUI = [];
DiskArbitration = [ IOKit ];
EventKit = [];
ExceptionHandling = [];
FWAUserLib = [];
ForceFeedback = [ IOKit ];
Foundation = [ libobjc CoreFoundation Security ApplicationServices SystemConfiguration ];
GLKit = [];
GLUT = [ OpenGL ];
GSS = [];
GameController = [];
GameKit = [ Foundation ];
Hypervisor = [];
ICADevices = [ Carbon IOBluetooth ];
IMServicePlugIn = [];
IOBluetoothUI = [ IOBluetooth ];
IOKit = [];
IOSurface = [ IOKit xpc ];
ImageCaptureCore = [];
ImageIO = [ CoreGraphics ];
InputMethodKit = [ Carbon ];
InstallerPlugins = [];
InstantMessage = [];
JavaFrameEmbedding = [];
JavaNativeFoundation = [];
JavaRuntimeSupport = [];
JavaScriptCore = [];
Kerberos = [];
Kernel = [ IOKit ];
LDAP = [];
LatentSemanticMapping = [ Carbon ];
LocalAuthentication = [];
MapKit = [];
MediaAccessibility = [ CoreGraphics CoreText QuartzCore ];
MediaPlayer = [];
MediaToolbox = [ AudioToolbox AudioUnit CoreMedia ];
Metal = [];
MetalKit = [ ModelIO Metal ];
ModelIO = [ ];
NetFS = [];
OSAKit = [ Carbon ];
OpenAL = [];
OpenCL = [ IOSurface OpenGL ];
OpenGL = [];
PCSC = [ CoreData ];
PreferencePanes = [];
PubSub = [];
QTKit = [ CoreMediaIO CoreMedia MediaToolbox QuickTime VideoToolbox ];
QuickLook = [ ApplicationServices ];
SceneKit = [];
ScreenSaver = [];
Scripting = [];
ScriptingBridge = [];
Security = [ IOKit ];
SecurityFoundation = [];
SecurityInterface = [ Security ];
ServiceManagement = [ Security ];
Social = [];
SpriteKit = [];
StoreKit = [];
SyncServices = [];
SystemConfiguration = [ Security ];
TWAIN = [ Carbon ];
Tcl = [];
VideoDecodeAcceleration = [ CoreVideo ];
VideoToolbox = [ CoreMedia CoreVideo ];
WebKit = [ ApplicationServices Carbon JavaScriptCore OpenGL ];
CoreFoundation = {};
CoreAudio = { inherit IOKit; };
CoreAudioKit = { inherit AudioUnit; };
CoreData = {};
CoreGraphics = { inherit Accelerate IOKit IOSurface SystemConfiguration; };
CoreImage = {};
CoreLocation = {};
CoreMIDI = {};
CoreMIDIServer = { inherit CoreMIDI; };
CoreMedia = { inherit ApplicationServices AudioToolbox AudioUnit CoreAudio CoreGraphics CoreVideo; };
CoreMediaIO = { inherit CoreMedia; };
CoreText = { inherit CoreGraphics; };
CoreVideo = { inherit ApplicationServices CoreGraphics IOSurface OpenGL; };
CoreWLAN = { inherit SecurityFoundation; };
DVDPlayback = {};
DirectoryService = {};
DiscRecording = { inherit libobjc CoreServices IOKit; };
DiscRecordingUI = {};
DiskArbitration = { inherit IOKit; };
EventKit = {};
ExceptionHandling = {};
FWAUserLib = {};
ForceFeedback = { inherit IOKit; };
Foundation = { inherit libobjc CoreFoundation Security ApplicationServices SystemConfiguration; };
GLKit = {};
GLUT = { inherit OpenGL; };
GSS = {};
GameCenter = {};
GameController = {};
GameKit = { inherit Cocoa Foundation GameCenter GameController GameplayKit Metal MetalKit ModelIO SceneKit SpriteKit; };
GameplayKit = {};
Hypervisor = {};
ICADevices = { inherit libobjc Carbon IOBluetooth; };
IMServicePlugIn = {};
IOBluetoothUI = { inherit IOBluetooth; };
IOKit = {};
IOSurface = { inherit IOKit xpc; };
ImageCaptureCore = {};
ImageIO = { inherit CoreGraphics; };
InputMethodKit = { inherit Carbon; };
InstallerPlugins = {};
InstantMessage = {};
JavaFrameEmbedding = {};
JavaNativeFoundation = {};
JavaRuntimeSupport = {};
JavaScriptCore = { inherit libobjc; };
Kerberos = {};
Kernel = { inherit IOKit; };
LDAP = {};
LatentSemanticMapping = { inherit Carbon; };
LocalAuthentication = {};
MapKit = {};
MediaAccessibility = { inherit CoreGraphics CoreText QuartzCore; };
MediaPlayer = {};
MediaToolbox = { inherit AudioToolbox AudioUnit CoreMedia; };
Metal = {};
MetalKit = { inherit ModelIO Metal; };
ModelIO = {};
NetFS = {};
OSAKit = { inherit Carbon; };
OpenAL = {};
OpenCL = { inherit IOSurface OpenGL; };
OpenGL = {};
PCSC = { inherit CoreData; };
PreferencePanes = {};
PubSub = {};
QTKit = { inherit CoreMediaIO CoreMedia MediaToolbox QuickTime VideoToolbox; };
QuickLook = { inherit ApplicationServices; };
SceneKit = {};
ScreenSaver = {};
Scripting = {};
ScriptingBridge = {};
Security = { inherit IOKit; };
SecurityFoundation = {};
SecurityInterface = { inherit Security SecurityFoundation; };
ServiceManagement = { inherit Security; };
Social = {};
SpriteKit = {};
StoreKit = {};
SyncServices = {};
SystemConfiguration = { inherit Security; };
TWAIN = { inherit Carbon; };
Tcl = {};
VideoDecodeAcceleration = { inherit CoreVideo; };
VideoToolbox = { inherit CoreMedia CoreVideo; };
WebKit = { inherit libobjc ApplicationServices Carbon JavaScriptCore OpenGL; };
# Umbrellas
Accelerate = [ CoreWLAN IOBluetooth ];
ApplicationServices = [ CoreServices CoreText ImageIO ];
Carbon = [ ApplicationServices CoreServices Foundation IOKit Security QuartzCore ];
CoreBluetooth = [];
Accelerate = { inherit CoreWLAN IOBluetooth; };
ApplicationServices = { inherit CoreGraphics CoreServices CoreText ImageIO; };
Carbon = { inherit libobjc ApplicationServices CoreServices Foundation IOKit Security QuartzCore; };
CoreBluetooth = {};
# TODO: figure out which part of the umbrella depends on CoreFoundation and move it there.
CoreServices = [ CFNetwork CoreFoundation CoreAudio CoreData DiskArbitration Security NetFS OpenDirectory ServiceManagement ];
IOBluetooth = [ IOKit ];
JavaVM = [];
OpenDirectory = [];
Quartz = [ QuickLook QTKit ];
QuartzCore = [ ApplicationServices CoreVideo OpenCL CoreImage Metal ];
QuickTime = [ ApplicationServices AudioUnit Carbon CoreAudio CoreServices OpenGL QuartzCore ];
CoreServices = { inherit CFNetwork CoreFoundation CoreAudio CoreData DiskArbitration Security NetFS OpenDirectory ServiceManagement; };
IOBluetooth = { inherit CoreBluetooth IOKit; };
JavaVM = {};
OpenDirectory = {};
Quartz = { inherit QuartzCore QuickLook QTKit; };
QuartzCore = { inherit libobjc ApplicationServices CoreVideo OpenCL CoreImage Metal; };
QuickTime = { inherit ApplicationServices AudioUnit Carbon CoreAudio CoreServices OpenGL QuartzCore; };
vmnet = [];
vmnet = {};
}

View file

@ -14,7 +14,9 @@ in
extraBuildInputs = [];
};
apple_sdk = callPackage ../os-specific/darwin/apple-sdk { };
apple_sdk = callPackage ../os-specific/darwin/apple-sdk {
inherit (darwin) darwin-stubs print-reexports;
};
binutils-unwrapped = callPackage ../os-specific/darwin/binutils {
inherit (darwin) cctools;