Merge #98541 into staging-next

This commit is contained in:
Frederik Rietdijk 2020-11-14 09:19:31 +01:00
commit da6239dab3
27 changed files with 668 additions and 272 deletions

View File

@ -41,6 +41,11 @@ stdenv.mkDerivation rec {
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
] ++ stdenv.lib.optionals (bareMetal) [ ] ++ stdenv.lib.optionals (bareMetal) [
"-DCOMPILER_RT_OS_DIR=baremetal" "-DCOMPILER_RT_OS_DIR=baremetal"
] ++ stdenv.lib.optionals (stdenv.hostPlatform.isDarwin) [
# The compiler-rt build infrastructure sniffs supported platforms on Darwin
# and finds i386;x86_64;x86_64h. We only build for x86_64, so linking fails
# when it tries to use libc++ and libc++api for i386.
"-DDARWIN_osx_ARCHS=${stdenv.hostPlatform.parsed.cpu.name}"
]; ];
outputs = [ "out" "dev" ]; outputs = [ "out" "dev" ];

View File

@ -41,6 +41,11 @@ stdenv.mkDerivation {
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
] ++ stdenv.lib.optionals (bareMetal) [ ] ++ stdenv.lib.optionals (bareMetal) [
"-DCOMPILER_RT_OS_DIR=baremetal" "-DCOMPILER_RT_OS_DIR=baremetal"
] ++ stdenv.lib.optionals (stdenv.hostPlatform.isDarwin) [
# The compiler-rt build infrastructure sniffs supported platforms on Darwin
# and finds i386;x86_64;x86_64h. We only build for x86_64, so linking fails
# when it tries to use libc++ and libc++api for i386.
"-DDARWIN_osx_ARCHS=${stdenv.hostPlatform.parsed.cpu.name}"
]; ];
outputs = [ "out" "dev" ]; outputs = [ "out" "dev" ];

View File

@ -41,6 +41,11 @@ stdenv.mkDerivation {
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
] ++ stdenv.lib.optionals (bareMetal) [ ] ++ stdenv.lib.optionals (bareMetal) [
"-DCOMPILER_RT_OS_DIR=baremetal" "-DCOMPILER_RT_OS_DIR=baremetal"
] ++ stdenv.lib.optionals (stdenv.hostPlatform.isDarwin) [
# The compiler-rt build infrastructure sniffs supported platforms on Darwin
# and finds i386;x86_64;x86_64h. We only build for x86_64, so linking fails
# when it tries to use libc++ and libc++api for i386.
"-DDARWIN_osx_ARCHS=${stdenv.hostPlatform.parsed.cpu.name}"
]; ];
outputs = [ "out" "dev" ]; outputs = [ "out" "dev" ];

View File

@ -41,6 +41,11 @@ stdenv.mkDerivation {
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
] ++ stdenv.lib.optionals (bareMetal) [ ] ++ stdenv.lib.optionals (bareMetal) [
"-DCOMPILER_RT_OS_DIR=baremetal" "-DCOMPILER_RT_OS_DIR=baremetal"
] ++ stdenv.lib.optionals (stdenv.hostPlatform.isDarwin) [
# The compiler-rt build infrastructure sniffs supported platforms on Darwin
# and finds i386;x86_64;x86_64h. We only build for x86_64, so linking fails
# when it tries to use libc++ and libc++api for i386.
"-DDARWIN_osx_ARCHS=${stdenv.hostPlatform.parsed.cpu.name}"
]; ];
outputs = [ "out" "dev" ]; outputs = [ "out" "dev" ];

View File

@ -1,4 +1,5 @@
{ stdenv, cmake, fetch, libcxx, llvm, version { stdenv, cmake, fetch, libcxx, llvm, version
, standalone ? false
# on musl the shared objects don't build # on musl the shared objects don't build
, enableShared ? ! stdenv.hostPlatform.isMusl }: , enableShared ? ! stdenv.hostPlatform.isMusl }:
@ -20,7 +21,9 @@ stdenv.mkDerivation {
patch -p1 -d $(ls -d libcxx-*) -i ${../libcxx-0001-musl-hacks.patch} patch -p1 -d $(ls -d libcxx-*) -i ${../libcxx-0001-musl-hacks.patch}
''; '';
cmakeFlags = stdenv.lib.optional (!enableShared) "-DLIBCXXABI_ENABLE_SHARED=OFF"; cmakeFlags =
stdenv.lib.optional standalone "-DLLVM_ENABLE_LIBCXX=ON" ++
stdenv.lib.optional (!enableShared) "-DLIBCXXABI_ENABLE_SHARED=OFF";
installPhase = if stdenv.isDarwin installPhase = if stdenv.isDarwin
then '' then ''

View File

@ -41,6 +41,11 @@ stdenv.mkDerivation {
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
] ++ stdenv.lib.optionals (bareMetal) [ ] ++ stdenv.lib.optionals (bareMetal) [
"-DCOMPILER_RT_OS_DIR=baremetal" "-DCOMPILER_RT_OS_DIR=baremetal"
] ++ stdenv.lib.optionals (stdenv.hostPlatform.isDarwin) [
# The compiler-rt build infrastructure sniffs supported platforms on Darwin
# and finds i386;x86_64;x86_64h. We only build for x86_64, so linking fails
# when it tries to use libc++ and libc++api for i386.
"-DDARWIN_osx_ARCHS=${stdenv.hostPlatform.parsed.cpu.name}"
]; ];
outputs = [ "out" "dev" ]; outputs = [ "out" "dev" ];

View File

@ -41,6 +41,11 @@ stdenv.mkDerivation rec {
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
] ++ stdenv.lib.optionals (bareMetal) [ ] ++ stdenv.lib.optionals (bareMetal) [
"-DCOMPILER_RT_OS_DIR=baremetal" "-DCOMPILER_RT_OS_DIR=baremetal"
] ++ stdenv.lib.optionals (stdenv.hostPlatform.isDarwin) [
# The compiler-rt build infrastructure sniffs supported platforms on Darwin
# and finds i386;x86_64;x86_64h. We only build for x86_64, so linking fails
# when it tries to use libc++ and libc++api for i386.
"-DDARWIN_osx_ARCHS=${stdenv.hostPlatform.parsed.cpu.name}"
]; ];
outputs = [ "out" "dev" ]; outputs = [ "out" "dev" ];

View File

@ -55,6 +55,10 @@ let
./qtbase.patch.d/0001-qtbase-mkspecs-mac.patch ./qtbase.patch.d/0001-qtbase-mkspecs-mac.patch
./qtbase.patch.d/0002-qtbase-mac.patch ./qtbase.patch.d/0002-qtbase-mac.patch
./qtbase.patch.d/0013-define-kiosurfacesuccess.patch ./qtbase.patch.d/0013-define-kiosurfacesuccess.patch
# Patch framework detection to support X.framework/X.tbd,
# extending the current support for X.framework/X.
./qtbase.patch.d/0015-qtbase-tbd-frameworks.patch
] ]
++ [ ++ [
./qtbase.patch.d/0003-qtbase-mkspecs.patch ./qtbase.patch.d/0003-qtbase-mkspecs.patch

View File

@ -0,0 +1,15 @@
diff --git a/src/gui/Qt5GuiConfigExtras.cmake.in b/src/gui/Qt5GuiConfigExtras.cmake.in
index 84dbbfebd4..615bfed124 100644
--- a/src/gui/Qt5GuiConfigExtras.cmake.in
+++ b/src/gui/Qt5GuiConfigExtras.cmake.in
@@ -119,6 +119,10 @@ macro(_qt5gui_find_extra_libs Name Libs LibDir IncDirs)
if (NOT EXISTS "${Qt5Gui_${_cmake_lib_name}_LIBRARY}")
set(Qt5Gui_${_cmake_lib_name}_LIBRARY)
endif()
+ set(Qt5Gui_${_cmake_lib_name}_LIBRARY "${Qt5Gui_${_cmake_lib_name}_LIBRARY}/${_lib}.tbd")
+ if (NOT EXISTS "${Qt5Gui_${_cmake_lib_name}_LIBRARY}")
+ set(Qt5Gui_${_cmake_lib_name}_LIBRARY)
+ endif()
!!ENDIF
if (NOT Qt5Gui_${_cmake_lib_name}_LIBRARY)
# The above find_library call doesn\'t work for finding

View File

@ -55,6 +55,10 @@ let
optionals stdenv.isDarwin [ optionals stdenv.isDarwin [
./qtbase.patch.d/0001-qtbase-mkspecs-mac.patch ./qtbase.patch.d/0001-qtbase-mkspecs-mac.patch
./qtbase.patch.d/0002-qtbase-mac.patch ./qtbase.patch.d/0002-qtbase-mac.patch
# Patch framework detection to support X.framework/X.tbd,
# extending the current support for X.framework/X.
./qtbase.patch.d/0012-qtbase-tbd-frameworks.patch
] ]
++ [ ++ [
./qtbase.patch.d/0003-qtbase-mkspecs.patch ./qtbase.patch.d/0003-qtbase-mkspecs.patch

View File

@ -0,0 +1,15 @@
diff --git a/src/gui/Qt5GuiConfigExtras.cmake.in b/src/gui/Qt5GuiConfigExtras.cmake.in
index 84dbbfebd4..615bfed124 100644
--- a/src/gui/Qt5GuiConfigExtras.cmake.in
+++ b/src/gui/Qt5GuiConfigExtras.cmake.in
@@ -119,6 +119,10 @@ macro(_qt5gui_find_extra_libs Name Libs LibDir IncDirs)
if (NOT EXISTS "${Qt5Gui_${_cmake_lib_name}_LIBRARY}")
set(Qt5Gui_${_cmake_lib_name}_LIBRARY)
endif()
+ set(Qt5Gui_${_cmake_lib_name}_LIBRARY "${Qt5Gui_${_cmake_lib_name}_LIBRARY}/${_lib}.tbd")
+ if (NOT EXISTS "${Qt5Gui_${_cmake_lib_name}_LIBRARY}")
+ set(Qt5Gui_${_cmake_lib_name}_LIBRARY)
+ endif()
!!ENDIF
if (NOT Qt5Gui_${_cmake_lib_name}_LIBRARY)
# The above find_library call doesn\'t work for finding

View File

@ -55,6 +55,10 @@ let
optionals stdenv.isDarwin [ optionals stdenv.isDarwin [
./qtbase.patch.d/0001-qtbase-mkspecs-mac.patch ./qtbase.patch.d/0001-qtbase-mkspecs-mac.patch
./qtbase.patch.d/0002-qtbase-mac.patch ./qtbase.patch.d/0002-qtbase-mac.patch
# Patch framework detection to support X.framework/X.tbd,
# extending the current support for X.framework/X.
./qtbase.patch.d/0012-qtbase-tbd-frameworks.patch
] ]
++ [ ++ [
./qtbase.patch.d/0003-qtbase-mkspecs.patch ./qtbase.patch.d/0003-qtbase-mkspecs.patch

View File

@ -0,0 +1,15 @@
diff --git a/src/gui/Qt5GuiConfigExtras.cmake.in b/src/gui/Qt5GuiConfigExtras.cmake.in
index 84dbbfebd4..615bfed124 100644
--- a/src/gui/Qt5GuiConfigExtras.cmake.in
+++ b/src/gui/Qt5GuiConfigExtras.cmake.in
@@ -119,6 +119,10 @@ macro(_qt5gui_find_extra_libs Name Libs LibDir IncDirs)
if (NOT EXISTS "${Qt5Gui_${_cmake_lib_name}_LIBRARY}")
set(Qt5Gui_${_cmake_lib_name}_LIBRARY)
endif()
+ set(Qt5Gui_${_cmake_lib_name}_LIBRARY "${Qt5Gui_${_cmake_lib_name}_LIBRARY}/${_lib}.tbd")
+ if (NOT EXISTS "${Qt5Gui_${_cmake_lib_name}_LIBRARY}")
+ set(Qt5Gui_${_cmake_lib_name}_LIBRARY)
+ endif()
!!ENDIF
if (NOT Qt5Gui_${_cmake_lib_name}_LIBRARY)
# The above find_library call doesn\'t work for finding

View File

@ -3,7 +3,7 @@ linkSystemCoreFoundationFramework() {
# gross! many symbols (such as _OBJC_CLASS_$_NSArray) are defined in system CF, but not # gross! many symbols (such as _OBJC_CLASS_$_NSArray) are defined in system CF, but not
# in the opensource release # in the opensource release
# if the package needs private headers, we assume they also want to link with system CF # 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) 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 let version = "10.12"; in
@ -42,7 +42,12 @@ let
rmdir System rmdir System
pushd lib 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 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 { framework = name: deps: stdenv.mkDerivation {
name = "apple-framework-${name}"; name = "apple-framework-${name}";
@ -63,11 +74,14 @@ let
disallowedRequisites = [ sdk ]; disallowedRequisites = [ sdk ];
nativeBuildInputs = [ print-reexports ];
extraTBDFiles = [];
installPhase = '' installPhase = ''
linkFramework() { linkFramework() {
local path="$1" local path="$1"
local nested_path="$1" local nested_path="$1"
local dest="$out/Library/Frameworks/$path"
if [ "$path" == "JavaNativeFoundation.framework" ]; then if [ "$path" == "JavaNativeFoundation.framework" ]; then
local nested_path="JavaVM.framework/Versions/A/Frameworks/JavaNativeFoundation.framework" local nested_path="JavaVM.framework/Versions/A/Frameworks/JavaNativeFoundation.framework"
fi fi
@ -80,21 +94,29 @@ let
current=A current=A
fi fi
mkdir -p "$dest" local dest="$out/Library/Frameworks/$path"
pushd "$dest" >/dev/null
# Keep track of if this is a child or a child rescue as with mkdir -p "$dest/Versions/$current"
# ApplicationServices in the 10.9 SDK pushd "$dest/Versions/$current" >/dev/null
local isChild=0
if [ -d "${sdk.out}/Library/Frameworks/$nested_path/Versions/$current/Headers" ]; then 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" . cp -R "${sdk.out}/Library/Frameworks/$nested_path/Versions/$current/Headers" .
elif [ -d "${sdk.out}/Library/Frameworks/$name.framework/Versions/$current/Headers" ]; then elif [ -d "${sdk.out}/Library/Frameworks/$name.framework/Versions/$current/Headers" ]; then
current="$(readlink "/System/Library/Frameworks/$name.framework/Versions/Current")" current="$(readlink "/System/Library/Frameworks/$name.framework/Versions/Current")"
cp -R "${sdk.out}/Library/Frameworks/$name.framework/Versions/$current/Headers" . cp -R "${sdk.out}/Library/Frameworks/$name.framework/Versions/$current/Headers" .
fi 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
# The Kernel.framework has headers but no actual library component.
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" ln -s -L "/System/Library/Frameworks/$nested_path/Versions/$current/Resources"
if [ -f "/System/Library/Frameworks/$nested_path/module.map" ]; then if [ -f "/System/Library/Frameworks/$nested_path/module.map" ]; then
@ -110,17 +132,45 @@ let
linkFramework "$childpath" linkFramework "$childpath"
done done
if [ -d "$dest/Versions/$current" ]; then pushd ../.. >/dev/null
mv $dest/Versions/$current/* . ln -s "$current" Versions/Current
fi ln -s Versions/Current/* .
popd >/dev/null
popd >/dev/null popd >/dev/null
} }
linkFramework "${name}.framework" 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 # don't use pure CF for dylibs that depend on frameworks
setupHook = ./framework-setup-hook.sh; setupHook = ./framework-setup-hook.sh;
@ -139,6 +189,17 @@ let
platforms = platforms.darwin; 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 { in rec {
libs = { libs = {
xpc = stdenv.mkDerivation { xpc = stdenv.mkDerivation {
@ -168,7 +229,8 @@ in rec {
installPhase = '' installPhase = ''
mkdir -p $out/include $out/lib mkdir -p $out/include $out/lib
ln -s "${lib.getDev sdk}/include/Xplugin.h" $out/include/Xplugin.h 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 +255,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: { CoreFoundation = stdenv.lib.overrideDerivation super.CoreFoundation (drv: {
setupHook = ./cf-setup-hook.sh; setupHook = ./cf-setup-hook.sh;
}); });
@ -210,6 +276,10 @@ in rec {
setupHook = ./private-frameworks-setup-hook.sh; 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: { Security = stdenv.lib.overrideDerivation super.Security (drv: {
setupHook = ./security-setup-hook.sh; setupHook = ./security-setup-hook.sh;
}); });
@ -228,7 +298,14 @@ in rec {
cp ${lib.getDev sdk}/include/simd/*.h $out/include/simd/ 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 { bareFrameworks = stdenv.lib.mapAttrs framework (import ./frameworks.nix {
inherit frameworks libs; inherit frameworks libs;

View File

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

View File

@ -0,0 +1,17 @@
{ stdenv, libyaml }:
stdenv.mkDerivation {
name = "print-reexports";
src = stdenv.lib.sourceFilesBySuffices ./. [".c"];
buildInputs = [ libyaml ];
buildPhase = ''
$CC -lyaml -o $name main.c
'';
installPhase = ''
mkdir -p $out/bin
mv $name $out/bin
'';
}

View File

@ -0,0 +1,148 @@
/**
* Display the list of re-exported libraries from a TAPI v2 .tbd file, one per
* line on stdout.
*
* TAPI files are the equivalent of library files for the purposes of linking.
* Like dylib files, they may re-export other libraries. In upstream usage
* these refer to the absolute paths of dylibs, and are resolved to .tbd files
* in combination with the syslibroot option. In nixpkgs, the .tbd files refer
* directly to other .tbd files without a syslibroot. Note that each .tbd file
* contains an install name, so the re-exported path does not affect the final
* result.
*
* In nixpkgs each framework is a distinct store path and some frameworks
* re-export other frameworks. The re-exported names are rewritten to refer to
* the store paths of dependencies via textual substitution. This utility is
* used to emit every file that is listed as a re-exported library, which
* allows the framework builder to verify their existence.
*/
#include <stdio.h>
#include <sys/errno.h>
#include <yaml.h>
static yaml_node_t *get_mapping_entry(yaml_document_t *document, yaml_node_t *mapping, const char *name) {
if (!mapping) {
fprintf(stderr, "get_mapping_entry: mapping is null\n");
return NULL;
}
for (
yaml_node_pair_t *pair = mapping->data.mapping.pairs.start;
pair < mapping->data.mapping.pairs.top;
++pair
) {
yaml_node_t *key = yaml_document_get_node(document, pair->key);
if (!key) {
fprintf(stderr, "get_mapping_entry: key (%i) is null\n", pair->key);
return NULL;
}
if (key->type != YAML_SCALAR_NODE) {
fprintf(stderr, "get_mapping_entry: key is not a scalar\n");
return NULL;
}
if (strncmp((const char *)key->data.scalar.value, name, key->data.scalar.length) != 0) {
continue;
}
return yaml_document_get_node(document, pair->value);
}
return NULL;
}
static int emit_reexports(yaml_document_t *document) {
yaml_node_t *root = yaml_document_get_root_node(document);
yaml_node_t *exports = get_mapping_entry(document, root, "exports");
if (!exports) {
fprintf(stderr, "emit_reexports: no exports found\n");
return 0;
}
if (exports->type != YAML_SEQUENCE_NODE) {
fprintf(stderr, "emit_reexports, value is not a sequence\n");
return 0;
}
for (
yaml_node_item_t *export = exports->data.sequence.items.start;
export < exports->data.sequence.items.top;
++export
) {
yaml_node_t *export_node = yaml_document_get_node(document, *export);
yaml_node_t *reexports = get_mapping_entry(document, export_node, "re-exports");
if (!reexports) {
continue;
}
for (
yaml_node_item_t *reexport = reexports->data.sequence.items.start;
reexport < reexports->data.sequence.items.top;
++reexport
) {
yaml_node_t *val = yaml_document_get_node(document, *reexport);
if (val->type != YAML_SCALAR_NODE) {
fprintf(stderr, "item is not a scalar\n");
return 0;
}
fwrite(val->data.scalar.value, val->data.scalar.length, 1, stdout);
putchar('\n');
}
}
return 1;
}
int main(int argc, char **argv) {
int result = 0;
if (argc != 2) {
fprintf(stderr, "Invalid usage\n");
result = 2;
goto done;
}
FILE *f = fopen(argv[1], "r");
if (!f) {
perror("opening input file");
result = errno;
goto done;
}
yaml_parser_t yaml_parser;
if (!yaml_parser_initialize(&yaml_parser)) {
fprintf(stderr, "Failed to initialize yaml parser\n");
result = 1;
goto err_file;
}
yaml_parser_set_input_file(&yaml_parser, f);
yaml_document_t yaml_document;
if(!yaml_parser_load(&yaml_parser, &yaml_document)) {
fprintf(stderr, "Failed to load yaml file\n");
result = 1;
goto err_yaml;
}
emit_reexports(&yaml_document);
err_yaml:
yaml_parser_delete(&yaml_parser);
err_file:
fclose(f);
done:
return result;
}

View File

@ -1,4 +1,4 @@
{ stdenv, appleDerivation, IOKitSrcs, xnu }: { stdenv, appleDerivation, IOKitSrcs, xnu, darwin-stubs }:
# Someday it'll make sense to split these out into their own packages, but today is not that day. # Someday it'll make sense to split these out into their own packages, but today is not that day.
appleDerivation { appleDerivation {
@ -14,12 +14,15 @@ appleDerivation {
]; ];
installPhase = '' installPhase = ''
###### IMPURITIES
mkdir -p $out/Library/Frameworks/IOKit.framework mkdir -p $out/Library/Frameworks/IOKit.framework
pushd $out/Library/Frameworks/IOKit.framework
ln -s /System/Library/Frameworks/IOKit.framework/IOKit ###### IMPURITIES
ln -s /System/Library/Frameworks/IOKit.framework/Resources ln -s /System/Library/Frameworks/IOKit.framework/Resources \
popd $out/Library/Frameworks/IOKit.framework
###### STUBS
cp ${darwin-stubs}/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit.tbd \
$out/Library/Frameworks/IOKit.framework
###### HEADERS ###### HEADERS

View File

@ -1,7 +1,7 @@
{ stdenv, appleDerivation, cpio, xnu, Libc, Libm, libdispatch, cctools, Libinfo { stdenv, appleDerivation, cpio, xnu, Libc, Libm, libdispatch, cctools, Libinfo
, dyld, Csu, architecture, libclosure, CarbonHeaders, ncurses, CommonCrypto , dyld, Csu, architecture, libclosure, CarbonHeaders, ncurses, CommonCrypto
, copyfile, removefile, libresolv, Libnotify, libplatform, libpthread , copyfile, removefile, libresolv, Libnotify, libplatform, libpthread
, mDNSResponder, launchd, libutil, hfs, darling }: , mDNSResponder, launchd, libutil, hfs, darling, darwin-stubs }:
appleDerivation { appleDerivation {
dontBuild = true; dontBuild = true;
@ -88,52 +88,18 @@ appleDerivation {
# The startup object files # The startup object files
cp ${Csu}/lib/* $out/lib cp ${Csu}/lib/* $out/lib
# We can't re-exported libsystem_c and libsystem_kernel directly, cp -vr \
# so we link against the central library here. ${darwin-stubs}/usr/lib/libSystem.B.tbd \
mkdir -p $out/lib/system ${darwin-stubs}/usr/lib/system \
ld -macosx_version_min 10.7 -arch x86_64 -dylib \ $out/lib
-o $out/lib/system/libsystem_c.dylib \
/usr/lib/libSystem.dylib \
-reexported_symbols_list ${./system_c_symbols}
ld -macosx_version_min 10.7 -arch x86_64 -dylib \ substituteInPlace $out/lib/libSystem.B.tbd \
-o $out/lib/system/libsystem_kernel.dylib \ --replace "/usr/lib/system/" "$out/lib/system/"
/usr/lib/libSystem.dylib \ ln -s libSystem.B.tbd $out/lib/libSystem.tbd
-reexported_symbols_list ${./system_kernel_symbols}
# The umbrella libSystem also exports some symbols,
# but we don't want to pull in everything from the other libraries.
ld -macosx_version_min 10.7 -arch x86_64 -dylib \
-o $out/lib/libSystem_internal.dylib \
/usr/lib/libSystem.dylib \
-reexported_symbols_list ${./system_symbols}
# We used to determine these impurely based on the host system, but then when we got some 10.12 Hydra boxes,
# one of them accidentally built this derivation, referenced libsystem_symptoms.dylib, which doesn't exist on
# 10.11, and then broke all subsequent builds on 10.11. By picking a 10.11 compatible subset of the libraries,
# we avoid scary impurity issues like that.
libs=$(cat ${./reexported_libraries} | grep -v '^#')
for i in $libs; do
if [ "$i" != "/usr/lib/system/libsystem_kernel.dylib" ] && [ "$i" != "/usr/lib/system/libsystem_c.dylib" ]; then
args="$args -reexport_library $i"
fi
done
ld -macosx_version_min 10.7 -arch x86_64 -dylib \
-o $out/lib/libSystem.B.dylib \
-compatibility_version 1.0 \
-current_version 1226.10.1 \
-reexport_library $out/lib/system/libsystem_c.dylib \
-reexport_library $out/lib/system/libsystem_kernel.dylib \
-reexport_library $out/lib/libSystem_internal.dylib \
$args
ln -s libSystem.B.dylib $out/lib/libSystem.dylib
# Set up links to pretend we work like a conventional unix (Apple's design, not mine!) # Set up links to pretend we work like a conventional unix (Apple's design, not mine!)
for name in c dbm dl info m mx poll proc pthread rpcsvc util gcc_s.10.4 gcc_s.10.5; do for name in c dbm dl info m mx poll proc pthread rpcsvc util gcc_s.10.4 gcc_s.10.5; do
ln -s libSystem.dylib $out/lib/lib$name.dylib ln -s libSystem.tbd $out/lib/lib$name.tbd
done done
# This probably doesn't belong here, but we want to stay similar to glibc, which includes resolv internally... # This probably doesn't belong here, but we want to stay similar to glibc, which includes resolv internally...
@ -144,13 +110,13 @@ appleDerivation {
chmod +w $out/lib/libresolv.9.dylib chmod +w $out/lib/libresolv.9.dylib
install_name_tool \ install_name_tool \
-id $out/lib/libresolv.9.dylib \ -id $out/lib/libresolv.9.dylib \
-change "$resolv_libSystem" $out/lib/libSystem.dylib \ -change "$resolv_libSystem" /usr/lib/libSystem.dylib \
$out/lib/libresolv.9.dylib $out/lib/libresolv.9.dylib
ln -s libresolv.9.dylib $out/lib/libresolv.dylib ln -s libresolv.9.dylib $out/lib/libresolv.dylib
''; '';
meta = with stdenv.lib; { meta = with stdenv.lib; {
description = "The Mac OS libc/libSystem (impure symlinks to binaries with pure headers)"; description = "The Mac OS libc/libSystem (tapi library with pure headers)";
maintainers = with maintainers; [ copumpkin gridaphobe ]; maintainers = with maintainers; [ copumpkin gridaphobe ];
platforms = platforms.darwin; platforms = platforms.darwin;
license = licenses.apsl20; license = licenses.apsl20;

View File

@ -1,4 +1,4 @@
{ appleDerivation }: { appleDerivation, darwin-stubs }:
appleDerivation { appleDerivation {
phases = [ "unpackPhase" "installPhase" ]; phases = [ "unpackPhase" "installPhase" ];
@ -12,14 +12,15 @@ appleDerivation {
]; ];
installPhase = '' installPhase = ''
###### IMPURITIES
mkdir -p $out/Library/Frameworks/Security.framework mkdir -p $out/Library/Frameworks/Security.framework
pushd $out/Library/Frameworks/Security.framework
ln -s /System/Library/Frameworks/Security.framework/Security ###### IMPURITIES
ln -s /System/Library/Frameworks/Security.framework/Resources ln -s /System/Library/Frameworks/Security.framework/{Resources,Plugins,XPCServices} \
ln -s /System/Library/Frameworks/Security.framework/PlugIns $out/Library/Frameworks/Security.framework
ln -s /System/Library/Frameworks/Security.framework/XPCServices
popd ###### STUBS
cp ${darwin-stubs}/System/Library/Frameworks/Security.framework/Versions/A/Security.tbd \
$out/Library/Frameworks/Security.framework
###### HEADERS ###### HEADERS

View File

@ -1,4 +1,4 @@
{ appleDerivation }: { appleDerivation, darwin-stubs }:
appleDerivation { appleDerivation {
phases = [ "unpackPhase" "installPhase" ]; phases = [ "unpackPhase" "installPhase" ];
@ -14,7 +14,8 @@ appleDerivation {
installPhase = '' installPhase = ''
mkdir -p $out/include/objc $out/lib mkdir -p $out/include/objc $out/lib
ln -s /usr/lib/libobjc.dylib $out/lib/libobjc.dylib cp ${darwin-stubs}/usr/lib/libobjc.A.tbd $out/lib/libobjc.A.tbd
ln -s libobjc.A.tbd $out/lib/libobjc.tbd
cp runtime/OldClasses.subproj/List.h $out/include/objc/List.h cp runtime/OldClasses.subproj/List.h $out/include/objc/List.h
cp runtime/NSObjCRuntime.h $out/include/objc/NSObjCRuntime.h cp runtime/NSObjCRuntime.h $out/include/objc/NSObjCRuntime.h
cp runtime/NSObject.h $out/include/objc/NSObject.h cp runtime/NSObject.h $out/include/objc/NSObject.h

View File

@ -0,0 +1,20 @@
{ stdenv, fetchFromGitHub }:
stdenv.mkDerivation {
pname = "darwin-stubs";
version = "10.12";
src = fetchFromGitHub {
owner = "NixOS";
repo = "darwin-stubs";
rev = "80b3d4a57d3454c975eefd984c804dbd76f04ef2";
sha256 = "0sslg4rmskms8ixixv1gvnrvvvmn723vbfjj6mcn24fj2ncg38y7";
};
dontBuild = true;
installPhase = ''
mkdir $out
cp -vr stubs/$version/* $out
'';
}

View File

@ -7,15 +7,15 @@
# Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools # Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools
, bootstrapFiles ? let , bootstrapFiles ? let
fetch = { file, sha256, executable ? true }: import <nix/fetchurl.nix> { fetch = { file, sha256, executable ? true }: import <nix/fetchurl.nix> {
url = "http://tarballs.nixos.org/stdenv-darwin/x86_64/d5bdfcbfe6346761a332918a267e82799ec954d2/${file}"; url = "http://tarballs.nixos.org/stdenv-darwin/x86_64/5ab5783e4f46c373c6de84deac9ad59b608bb2e6/${file}";
inherit (localSystem) system; inherit (localSystem) system;
inherit sha256 executable; inherit sha256 executable;
}; in { }; in {
sh = fetch { file = "sh"; sha256 = "07wm33f1yzfpcd3rh42f8g096k4cvv7g65p968j28agzmm2s7s8m"; }; sh = fetch { file = "sh"; sha256 = "sha256-nbb4XEk3go7ttiWrQyKQMLzPr+qUnwnHkWMtVCZsMCs="; };
bzip2 = fetch { file = "bzip2"; sha256 = "0y9ri2aprkrp2dkzm6229l0mw4rxr2jy7vvh3d8mxv2698v2kdbm"; }; bzip2 = fetch { file = "bzip2"; sha256 = "sha256-ybnA+JWrKhXSfn20+GVKXkHFTp2Zt79hat8hAVmsUOc="; };
mkdir = fetch { file = "mkdir"; sha256 = "0sb07xpy66ws6f2jfnpjibyimzb71al8n8c6y4nr8h50al3g90nr"; }; mkdir = fetch { file = "mkdir"; sha256 = "sha256-nmvMxmfcY41/60Z/E8L9u0vgePW5l30Dqw1z+Nr02Hk="; };
cpio = fetch { file = "cpio"; sha256 = "0r5c54hg678w7zydx27bzl9p3v9fs25y5ix6vdfi1ilqim7xh65n"; }; cpio = fetch { file = "cpio"; sha256 = "sha256-cB36rN3NLj19Tk37Kc5bodMFMO+mCpEQkKKo0AEMkaU="; };
tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "18hp5w6klr8g307ap4368r255qpzg9r0vwg9vqvj8f2zy1xilcjf"; executable = false; }; tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "sha256-kh2vKmjCr/HvR06czZbxUxV5KDRxSF27M6nN3cyofRI="; executable = false; };
} }
}: }:
@ -24,6 +24,8 @@ assert crossSystem == localSystem;
let let
inherit (localSystem) system platform; inherit (localSystem) system platform;
bootstrapClangVersion = "7.1.0";
commonImpureHostDeps = [ commonImpureHostDeps = [
"/bin/sh" "/bin/sh"
"/usr/lib/libSystem.B.dylib" "/usr/lib/libSystem.B.dylib"
@ -72,33 +74,48 @@ in rec {
inherit (last) stdenv; inherit (last) stdenv;
}; };
coreutils = { name = "${name}-coreutils"; outPath = bootstrapTools; }; mkExtraBuildCommands = cc: ''
gnugrep = { name = "${name}-gnugrep"; outPath = bootstrapTools; }; rsrc="$out/resource-root"
mkdir "$rsrc"
ln -s "${cc}/lib/clang/${cc.version}/include" "$rsrc"
ln -s "${last.pkgs.llvmPackages_7.compiler-rt.out}/lib" "$rsrc/lib"
echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
'';
bintools = import ../../build-support/bintools-wrapper { mkCC = overrides: import ../../build-support/cc-wrapper (
let args = {
inherit shell; inherit shell;
inherit (last) stdenvNoCC; inherit (last) stdenvNoCC;
nativeTools = false; nativeTools = false;
nativeLibc = false; nativeLibc = false;
inherit buildPackages coreutils gnugrep; inherit buildPackages libcxx;
libc = last.pkgs.darwin.Libsystem; inherit (last.pkgs) coreutils gnugrep;
bintools = { name = "${name}-binutils"; outPath = bootstrapTools; }; bintools = last.pkgs.darwin.binutils;
};
cc = if last == null then "/dev/null" else import ../../build-support/cc-wrapper {
inherit shell;
inherit (last) stdenvNoCC;
extraPackages = [];
nativeTools = false;
nativeLibc = false;
inherit buildPackages coreutils gnugrep bintools libcxx;
libc = last.pkgs.darwin.Libsystem; libc = last.pkgs.darwin.Libsystem;
isClang = true; isClang = true;
cc = { name = "${name}-clang"; outPath = bootstrapTools; }; cc = last.pkgs.llvmPackages_7.clang-unwrapped;
}; }; in args // (overrides args));
cc = if last == null then "/dev/null" else mkCC ({ cc, ... }: {
extraPackages = [
last.pkgs.llvmPackages_7.libcxxabi
last.pkgs.llvmPackages_7.compiler-rt
];
extraBuildCommands = mkExtraBuildCommands cc;
});
ccNoLibcxx = if last == null then "/dev/null" else mkCC ({ cc, ... }: {
libcxx = null;
extraPackages = [
last.pkgs.llvmPackages_7.compiler-rt
];
extraBuildCommands = ''
echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags
echo "-B${last.pkgs.llvmPackages_7.compiler-rt}/lib" >> $out/nix-support/cc-cflags
echo "-nostdlib++" >> $out/nix-support/cc-cflags
'' + mkExtraBuildCommands cc;
});
thisStdenv = import ../generic { thisStdenv = import ../generic {
name = "${name}-stdenv-darwin"; name = "${name}-stdenv-darwin";
@ -137,7 +154,10 @@ in rec {
extraAttrs = { extraAttrs = {
inherit macosVersionMin appleSdkVersion platform; inherit macosVersionMin appleSdkVersion platform;
}; };
overrides = self: super: (overrides self super) // { fetchurl = thisStdenv.fetchurlBoot; }; overrides = self: super: (overrides self super) // {
inherit ccNoLibcxx;
fetchurl = thisStdenv.fetchurlBoot;
};
}; };
in { in {
@ -147,6 +167,9 @@ in rec {
stage0 = stageFun 0 null { stage0 = stageFun 0 null {
overrides = self: super: with stage0; { overrides = self: super: with stage0; {
coreutils = { name = "bootstrap-stage0-coreutils"; outPath = bootstrapTools; };
gnugrep = { name = "bootstrap-stage0-gnugrep"; outPath = bootstrapTools; };
darwin = super.darwin // { darwin = super.darwin // {
Libsystem = stdenv.mkDerivation { Libsystem = stdenv.mkDerivation {
name = "bootstrap-stage0-Libsystem"; name = "bootstrap-stage0-Libsystem";
@ -157,9 +180,26 @@ in rec {
''; '';
}; };
dyld = bootstrapTools; dyld = bootstrapTools;
binutils = lib.makeOverridable (import ../../build-support/bintools-wrapper) {
shell = "${bootstrapTools}/bin/bash";
inherit (self) stdenvNoCC;
nativeTools = false;
nativeLibc = false;
inherit (self) buildPackages coreutils gnugrep;
libc = self.pkgs.darwin.Libsystem;
bintools = { name = "bootstrap-stage0-binutils"; outPath = bootstrapTools; };
};
}; };
llvmPackages_7 = { llvmPackages_7 = {
clang-unwrapped = {
name = "bootstrap-stage0-clang";
outPath = bootstrapTools;
version = bootstrapClangVersion;
};
libcxx = stdenv.mkDerivation { libcxx = stdenv.mkDerivation {
name = "bootstrap-stage0-libcxx"; name = "bootstrap-stage0-libcxx";
phases = [ "installPhase" "fixupPhase" ]; phases = [ "installPhase" "fixupPhase" ];
@ -180,6 +220,15 @@ in rec {
ln -s ${bootstrapTools}/lib/libc++abi.dylib $out/lib/libc++abi.dylib ln -s ${bootstrapTools}/lib/libc++abi.dylib $out/lib/libc++abi.dylib
''; '';
}; };
compiler-rt = stdenv.mkDerivation {
name = "bootstrap-stage0-compiler-rt";
buildCommand = ''
mkdir -p $out/lib
ln -s ${bootstrapTools}/lib/libclang_rt* $out/lib
ln -s ${bootstrapTools}/lib/darwin $out/lib/darwin
'';
};
}; };
}; };
@ -195,6 +244,21 @@ in rec {
python3 = super.python3Minimal; python3 = super.python3Minimal;
ninja = super.ninja.override { buildDocs = false; }; ninja = super.ninja.override { buildDocs = false; };
llvmPackages_7 = super.llvmPackages_7 // (let
tools = super.llvmPackages_7.tools.extend (_: _: {
inherit (llvmPackages_7) clang-unwrapped;
});
libraries = super.llvmPackages_7.libraries.extend (_: _: {
inherit (llvmPackages_7) compiler-rt libcxx libcxxabi;
});
in { inherit tools libraries; } // tools // libraries);
darwin = super.darwin // {
binutils = darwin.binutils.override {
libc = self.darwin.Libsystem;
};
};
}; };
in with prevStage; stageFun 1 prevStage { in with prevStage; stageFun 1 prevStage {
extraPreHook = "export NIX_CFLAGS_COMPILE+=\" -F${bootstrapTools}/Library/Frameworks\""; extraPreHook = "export NIX_CFLAGS_COMPILE+=\" -F${bootstrapTools}/Library/Frameworks\"";
@ -203,7 +267,9 @@ in rec {
libcxx = pkgs.libcxx; libcxx = pkgs.libcxx;
allowedRequisites = allowedRequisites =
[ bootstrapTools ] ++ (with pkgs; [ libcxx libcxxabi ]) ++ [ pkgs.darwin.Libsystem ]; [ bootstrapTools ] ++
(with pkgs; [ libcxx libcxxabi llvmPackages_7.compiler-rt ]) ++
(with pkgs.darwin; [ Libsystem ]);
overrides = persistent; overrides = persistent;
}; };
@ -217,9 +283,26 @@ in rec {
findfreetype libssh curl cmake autoconf automake libtool ed cpio coreutils findfreetype libssh curl cmake autoconf automake libtool ed cpio coreutils
libssh2 nghttp2 libkrb5 ninja; libssh2 nghttp2 libkrb5 ninja;
llvmPackages_7 = super.llvmPackages_7 // (let
tools = super.llvmPackages_7.tools.extend (_: _: {
inherit (llvmPackages_7) clang-unwrapped;
});
libraries = super.llvmPackages_7.libraries.extend (_: libSuper: {
inherit (llvmPackages_7) compiler-rt;
libcxx = libSuper.libcxx.override {
stdenv = overrideCC self.stdenv self.ccNoLibcxx;
};
libcxxabi = libSuper.libcxxabi.override {
stdenv = overrideCC self.stdenv self.ccNoLibcxx;
standalone = true;
};
});
in { inherit tools libraries; } // tools // libraries);
darwin = super.darwin // { darwin = super.darwin // {
inherit (darwin) inherit (darwin)
dyld Libsystem xnu configd ICU libdispatch libclosure launchd CF; binutils dyld Libsystem xnu configd ICU libdispatch libclosure
launchd CF darwin-stubs;
}; };
}; };
in with prevStage; stageFun 2 prevStage { in with prevStage; stageFun 2 prevStage {
@ -234,8 +317,9 @@ in rec {
allowedRequisites = allowedRequisites =
[ bootstrapTools ] ++ [ bootstrapTools ] ++
(with pkgs; [ (with pkgs; [
xz.bin xz.out libcxx libcxxabi zlib libxml2.out curl.out openssl.out libssh2.out xz.bin xz.out libcxx libcxxabi llvmPackages_7.compiler-rt
nghttp2.lib libkrb5 zlib libxml2.out curl.out openssl.out libssh2.out
nghttp2.lib libkrb5 coreutils gnugrep pcre.out gmp libiconv
]) ++ ]) ++
(with pkgs.darwin; [ dyld Libsystem CF ICU locale ]); (with pkgs.darwin; [ dyld Libsystem CF ICU locale ]);
@ -262,7 +346,8 @@ in rec {
darwin = super.darwin // { darwin = super.darwin // {
inherit (darwin) inherit (darwin)
dyld Libsystem xnu configd libdispatch libclosure launchd libiconv locale; dyld Libsystem xnu configd libdispatch libclosure launchd libiconv
locale darwin-stubs;
}; };
}; };
in with prevStage; stageFun 3 prevStage { in with prevStage; stageFun 3 prevStage {
@ -284,8 +369,9 @@ in rec {
allowedRequisites = allowedRequisites =
[ bootstrapTools ] ++ [ bootstrapTools ] ++
(with pkgs; [ (with pkgs; [
xz.bin xz.out bash libcxx libcxxabi zlib libxml2.out curl.out openssl.out libssh2.out xz.bin xz.out bash libcxx libcxxabi llvmPackages_7.compiler-rt
nghttp2.lib libkrb5 zlib libxml2.out curl.out openssl.out libssh2.out
nghttp2.lib libkrb5 coreutils gnugrep pcre.out gmp libiconv
]) ++ ]) ++
(with pkgs.darwin; [ dyld ICU Libsystem locale ]); (with pkgs.darwin; [ dyld ICU Libsystem locale ]);
@ -319,7 +405,7 @@ in rec {
in { inherit tools libraries; } // tools // libraries); in { inherit tools libraries; } // tools // libraries);
darwin = super.darwin // rec { darwin = super.darwin // rec {
inherit (darwin) dyld Libsystem libiconv locale; inherit (darwin) dyld Libsystem libiconv locale darwin-stubs;
CF = super.darwin.CF.override { CF = super.darwin.CF.override {
inherit libxml2; inherit libxml2;
@ -418,7 +504,7 @@ in rec {
inherit cc; inherit cc;
darwin = super.darwin // { darwin = super.darwin // {
inherit (prevStage.darwin) CF; inherit (prevStage.darwin) CF darwin-stubs;
xnu = super.darwin.xnu.override { inherit (prevStage) python3; }; xnu = super.darwin.xnu.override { inherit (prevStage) python3; };
}; };
}); });

View File

@ -28,11 +28,8 @@ in rec {
buildCommand = '' buildCommand = ''
mkdir -p $out/bin $out/lib $out/lib/system mkdir -p $out/bin $out/lib $out/lib/system
# We're not going to bundle the actual libSystem.dylib; instead we reconstruct it on # Copy libSystem's .o files for various low-level boot stuff.
# the other side. See the notes in stdenv/darwin/default.nix for more information.
# We also need the .o files for various low-level boot stuff.
cp -d ${darwin.Libsystem}/lib/*.o $out/lib cp -d ${darwin.Libsystem}/lib/*.o $out/lib
cp -d ${darwin.Libsystem}/lib/system/*.dylib $out/lib/system
# Resolv is actually a link to another package, so let's copy it properly # Resolv is actually a link to another package, so let's copy it properly
cp -L ${darwin.Libsystem}/lib/libresolv.9.dylib $out/lib cp -L ${darwin.Libsystem}/lib/libresolv.9.dylib $out/lib
@ -208,39 +205,6 @@ in rec {
fi fi
done done
install_name_tool \
-id $out/lib/system/libsystem_c.dylib \
$out/lib/system/libsystem_c.dylib
install_name_tool \
-id $out/lib/system/libsystem_kernel.dylib \
$out/lib/system/libsystem_kernel.dylib
# TODO: this logic basically duplicates similar logic in the Libsystem expression. Deduplicate them!
libs=$(cat $reexportedLibrariesFile | grep -v '^#')
for i in $libs; do
if [ "$i" != "/usr/lib/system/libsystem_kernel.dylib" ] && [ "$i" != "/usr/lib/system/libsystem_c.dylib" ]; then
args="$args -reexport_library $i"
fi
done
ld -macosx_version_min 10.7 \
-arch x86_64 \
-dylib \
-o $out/lib/libSystem.B.dylib \
-compatibility_version 1.0 \
-current_version 1226.10.1 \
-reexport_library $out/lib/system/libsystem_c.dylib \
-reexport_library $out/lib/system/libsystem_kernel.dylib \
$args
ln -s libSystem.B.dylib $out/lib/libSystem.dylib
for name in c dbm dl info m mx poll proc pthread rpcsvc util gcc_s.10.4 gcc_s.10.5; do
ln -s libSystem.dylib $out/lib/lib$name.dylib
done
ln -s libresolv.9.dylib $out/lib/libresolv.dylib ln -s libresolv.9.dylib $out/lib/libresolv.dylib
for i in $out/lib/*.dylib $out/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation; do for i in $out/lib/*.dylib $out/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation; do
@ -309,7 +273,20 @@ in rec {
${build}/on-server/sh -c 'echo Hello World' ${build}/on-server/sh -c 'echo Hello World'
export flags="-idirafter ${unpack}/include-Libsystem --sysroot=${unpack} -L${unpack}/lib" # This approximates a bootstrap version of libSystem can that be
# assembled via fetchurl. Adapted from main libSystem expression.
mkdir libSystem-boot
cp -vr \
${darwin.darwin-stubs}/usr/lib/libSystem.B.tbd \
${darwin.darwin-stubs}/usr/lib/system \
libSystem-boot
substituteInPlace libSystem-boot/libSystem.B.tbd \
--replace "/usr/lib/system/" "$PWD/libSystem-boot/system/"
ln -s libSystem.B.tbd libSystem-boot/libSystem.tbd
# End of bootstrap libSystem
export flags="-idirafter ${unpack}/include-Libsystem --sysroot=${unpack} -L${unpack}/lib -L$PWD/libSystem-boot"
export CPP="clang -E $flags" export CPP="clang -E $flags"
export CC="clang $flags -Wl,-rpath,${unpack}/lib -Wl,-v -Wl,-sdk_version,10.10" export CC="clang $flags -Wl,-rpath,${unpack}/lib -Wl,-v -Wl,-sdk_version,10.10"

View File

@ -16,8 +16,10 @@ python3Packages.buildPythonApplication rec {
(substituteAll { (substituteAll {
src = ./nix-paths.patch; src = ./nix-paths.patch;
df = "${coreutils}/bin/df"; df = "${coreutils}/bin/df";
libc = let ext = if stdenv.isDarwin then ".dylib" else ".so.6"; libc =
in "${stdenv.cc.libc}/lib/libc${ext}"; if stdenv.hostPlatform.isDarwin
then "/usr/lib/libSystem.dylib"
else "${stdenv.cc.libc}/lib/libc.so.6";
}) })
]; ];

View File

@ -14,7 +14,9 @@ in
extraBuildInputs = []; 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 { binutils-unwrapped = callPackage ../os-specific/darwin/binutils {
inherit (darwin) cctools; inherit (darwin) cctools;
@ -41,6 +43,10 @@ in
DarwinTools = callPackage ../os-specific/darwin/DarwinTools { }; DarwinTools = callPackage ../os-specific/darwin/DarwinTools { };
darwin-stubs = callPackage ../os-specific/darwin/darwin-stubs { };
print-reexports = callPackage ../os-specific/darwin/apple-sdk/print-reexports { };
maloader = callPackage ../os-specific/darwin/maloader { maloader = callPackage ../os-specific/darwin/maloader {
inherit (darwin) opencflite; inherit (darwin) opencflite;
}; };