diff --git a/pkgs/development/compilers/llvm/10/compiler-rt.nix b/pkgs/development/compilers/llvm/10/compiler-rt.nix index 47bbe808ac20..e6882cbabb8b 100644 --- a/pkgs/development/compilers/llvm/10/compiler-rt.nix +++ b/pkgs/development/compilers/llvm/10/compiler-rt.nix @@ -41,6 +41,11 @@ stdenv.mkDerivation rec { "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" ] ++ stdenv.lib.optionals (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" ]; diff --git a/pkgs/development/compilers/llvm/5/compiler-rt.nix b/pkgs/development/compilers/llvm/5/compiler-rt.nix index 32d6dd3d4795..41f2b24b057e 100644 --- a/pkgs/development/compilers/llvm/5/compiler-rt.nix +++ b/pkgs/development/compilers/llvm/5/compiler-rt.nix @@ -41,6 +41,11 @@ stdenv.mkDerivation { "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" ] ++ stdenv.lib.optionals (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" ]; diff --git a/pkgs/development/compilers/llvm/6/compiler-rt.nix b/pkgs/development/compilers/llvm/6/compiler-rt.nix index 89f25cad2c54..8bd61f5d7f70 100644 --- a/pkgs/development/compilers/llvm/6/compiler-rt.nix +++ b/pkgs/development/compilers/llvm/6/compiler-rt.nix @@ -41,6 +41,11 @@ stdenv.mkDerivation { "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" ] ++ stdenv.lib.optionals (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" ]; diff --git a/pkgs/development/compilers/llvm/7/compiler-rt.nix b/pkgs/development/compilers/llvm/7/compiler-rt.nix index 97a5d73f3041..ec9b7e6e6ad4 100644 --- a/pkgs/development/compilers/llvm/7/compiler-rt.nix +++ b/pkgs/development/compilers/llvm/7/compiler-rt.nix @@ -41,6 +41,11 @@ stdenv.mkDerivation { "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" ] ++ stdenv.lib.optionals (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" ]; diff --git a/pkgs/development/compilers/llvm/7/libc++abi.nix b/pkgs/development/compilers/llvm/7/libc++abi.nix index 97141a0bd402..7f2ec528f3c1 100644 --- a/pkgs/development/compilers/llvm/7/libc++abi.nix +++ b/pkgs/development/compilers/llvm/7/libc++abi.nix @@ -1,4 +1,5 @@ { stdenv, cmake, fetch, libcxx, llvm, version +, standalone ? false # on musl the shared objects don't build , enableShared ? ! stdenv.hostPlatform.isMusl }: @@ -20,7 +21,9 @@ stdenv.mkDerivation { 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 then '' diff --git a/pkgs/development/compilers/llvm/8/compiler-rt.nix b/pkgs/development/compilers/llvm/8/compiler-rt.nix index a907d4086550..3c6265c4fca0 100644 --- a/pkgs/development/compilers/llvm/8/compiler-rt.nix +++ b/pkgs/development/compilers/llvm/8/compiler-rt.nix @@ -41,6 +41,11 @@ stdenv.mkDerivation { "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" ] ++ stdenv.lib.optionals (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" ]; diff --git a/pkgs/development/compilers/llvm/9/compiler-rt.nix b/pkgs/development/compilers/llvm/9/compiler-rt.nix index 394f66ff7f1a..13b0b522771f 100644 --- a/pkgs/development/compilers/llvm/9/compiler-rt.nix +++ b/pkgs/development/compilers/llvm/9/compiler-rt.nix @@ -41,6 +41,11 @@ stdenv.mkDerivation rec { "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" ] ++ stdenv.lib.optionals (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" ]; diff --git a/pkgs/development/libraries/qt-5/5.12/default.nix b/pkgs/development/libraries/qt-5/5.12/default.nix index fcceb6d6cf2b..95da38206e47 100644 --- a/pkgs/development/libraries/qt-5/5.12/default.nix +++ b/pkgs/development/libraries/qt-5/5.12/default.nix @@ -55,6 +55,10 @@ let ./qtbase.patch.d/0001-qtbase-mkspecs-mac.patch ./qtbase.patch.d/0002-qtbase-mac.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 diff --git a/pkgs/development/libraries/qt-5/5.12/qtbase.patch.d/0015-qtbase-tbd-frameworks.patch b/pkgs/development/libraries/qt-5/5.12/qtbase.patch.d/0015-qtbase-tbd-frameworks.patch new file mode 100644 index 000000000000..8a5939978a6b --- /dev/null +++ b/pkgs/development/libraries/qt-5/5.12/qtbase.patch.d/0015-qtbase-tbd-frameworks.patch @@ -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 diff --git a/pkgs/development/libraries/qt-5/5.14/default.nix b/pkgs/development/libraries/qt-5/5.14/default.nix index 469157a5f727..7bc9b5f19bd6 100644 --- a/pkgs/development/libraries/qt-5/5.14/default.nix +++ b/pkgs/development/libraries/qt-5/5.14/default.nix @@ -55,6 +55,10 @@ let optionals stdenv.isDarwin [ ./qtbase.patch.d/0001-qtbase-mkspecs-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 diff --git a/pkgs/development/libraries/qt-5/5.14/qtbase.patch.d/0012-qtbase-tbd-frameworks.patch b/pkgs/development/libraries/qt-5/5.14/qtbase.patch.d/0012-qtbase-tbd-frameworks.patch new file mode 100644 index 000000000000..8a5939978a6b --- /dev/null +++ b/pkgs/development/libraries/qt-5/5.14/qtbase.patch.d/0012-qtbase-tbd-frameworks.patch @@ -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 diff --git a/pkgs/development/libraries/qt-5/5.15/default.nix b/pkgs/development/libraries/qt-5/5.15/default.nix index 1a90c610a5b5..22fb9392d6d7 100644 --- a/pkgs/development/libraries/qt-5/5.15/default.nix +++ b/pkgs/development/libraries/qt-5/5.15/default.nix @@ -55,6 +55,10 @@ let optionals stdenv.isDarwin [ ./qtbase.patch.d/0001-qtbase-mkspecs-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 diff --git a/pkgs/development/libraries/qt-5/5.15/qtbase.patch.d/0012-qtbase-tbd-frameworks.patch b/pkgs/development/libraries/qt-5/5.15/qtbase.patch.d/0012-qtbase-tbd-frameworks.patch new file mode 100644 index 000000000000..8a5939978a6b --- /dev/null +++ b/pkgs/development/libraries/qt-5/5.15/qtbase.patch.d/0012-qtbase-tbd-frameworks.patch @@ -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 diff --git a/pkgs/os-specific/darwin/apple-sdk/cf-setup-hook.sh b/pkgs/os-specific/darwin/apple-sdk/cf-setup-hook.sh index 86c241cd0f56..bbf9625e6557 100644 --- a/pkgs/os-specific/darwin/apple-sdk/cf-setup-hook.sh +++ b/pkgs/os-specific/darwin/apple-sdk/cf-setup-hook.sh @@ -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) diff --git a/pkgs/os-specific/darwin/apple-sdk/default.nix b/pkgs/os-specific/darwin/apple-sdk/default.nix index 89c13d0b92d7..97523cf15a8d 100644 --- a/pkgs/os-specific/darwin/apple-sdk/default.nix +++ b/pkgs/os-specific/darwin/apple-sdk/default.nix @@ -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,29 @@ 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 + # 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" if [ -f "/System/Library/Frameworks/$nested_path/module.map" ]; then @@ -110,17 +132,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 +189,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 +229,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 +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: { setupHook = ./cf-setup-hook.sh; }); @@ -210,6 +276,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 +298,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; diff --git a/pkgs/os-specific/darwin/apple-sdk/frameworks.nix b/pkgs/os-specific/darwin/apple-sdk/frameworks.nix index 02e2421f3472..bf0b134773d5 100644 --- a/pkgs/os-specific/darwin/apple-sdk/frameworks.nix +++ b/pkgs/os-specific/darwin/apple-sdk/frameworks.nix @@ -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 = {}; } diff --git a/pkgs/os-specific/darwin/apple-sdk/print-reexports/default.nix b/pkgs/os-specific/darwin/apple-sdk/print-reexports/default.nix new file mode 100644 index 000000000000..85e11096f06a --- /dev/null +++ b/pkgs/os-specific/darwin/apple-sdk/print-reexports/default.nix @@ -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 + ''; +} diff --git a/pkgs/os-specific/darwin/apple-sdk/print-reexports/main.c b/pkgs/os-specific/darwin/apple-sdk/print-reexports/main.c new file mode 100644 index 000000000000..df46e3f18e89 --- /dev/null +++ b/pkgs/os-specific/darwin/apple-sdk/print-reexports/main.c @@ -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 +#include +#include + +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; +} diff --git a/pkgs/os-specific/darwin/apple-source-releases/IOKit/default.nix b/pkgs/os-specific/darwin/apple-source-releases/IOKit/default.nix index 4b82209f176c..a945409ed7a0 100644 --- a/pkgs/os-specific/darwin/apple-source-releases/IOKit/default.nix +++ b/pkgs/os-specific/darwin/apple-source-releases/IOKit/default.nix @@ -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. appleDerivation { @@ -14,12 +14,15 @@ appleDerivation { ]; installPhase = '' - ###### IMPURITIES mkdir -p $out/Library/Frameworks/IOKit.framework - pushd $out/Library/Frameworks/IOKit.framework - ln -s /System/Library/Frameworks/IOKit.framework/IOKit - ln -s /System/Library/Frameworks/IOKit.framework/Resources - popd + + ###### IMPURITIES + ln -s /System/Library/Frameworks/IOKit.framework/Resources \ + $out/Library/Frameworks/IOKit.framework + + ###### STUBS + cp ${darwin-stubs}/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit.tbd \ + $out/Library/Frameworks/IOKit.framework ###### HEADERS diff --git a/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix b/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix index 99d670028032..24526f05f062 100644 --- a/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix +++ b/pkgs/os-specific/darwin/apple-source-releases/Libsystem/default.nix @@ -1,7 +1,7 @@ { stdenv, appleDerivation, cpio, xnu, Libc, Libm, libdispatch, cctools, Libinfo , dyld, Csu, architecture, libclosure, CarbonHeaders, ncurses, CommonCrypto , copyfile, removefile, libresolv, Libnotify, libplatform, libpthread -, mDNSResponder, launchd, libutil, hfs, darling }: +, mDNSResponder, launchd, libutil, hfs, darling, darwin-stubs }: appleDerivation { dontBuild = true; @@ -88,52 +88,18 @@ appleDerivation { # The startup object files cp ${Csu}/lib/* $out/lib - # We can't re-exported libsystem_c and libsystem_kernel directly, - # so we link against the central library here. - mkdir -p $out/lib/system - ld -macosx_version_min 10.7 -arch x86_64 -dylib \ - -o $out/lib/system/libsystem_c.dylib \ - /usr/lib/libSystem.dylib \ - -reexported_symbols_list ${./system_c_symbols} + cp -vr \ + ${darwin-stubs}/usr/lib/libSystem.B.tbd \ + ${darwin-stubs}/usr/lib/system \ + $out/lib - ld -macosx_version_min 10.7 -arch x86_64 -dylib \ - -o $out/lib/system/libsystem_kernel.dylib \ - /usr/lib/libSystem.dylib \ - -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 + substituteInPlace $out/lib/libSystem.B.tbd \ + --replace "/usr/lib/system/" "$out/lib/system/" + ln -s libSystem.B.tbd $out/lib/libSystem.tbd # 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 - ln -s libSystem.dylib $out/lib/lib$name.dylib + ln -s libSystem.tbd $out/lib/lib$name.tbd done # 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 install_name_tool \ -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 ln -s libresolv.9.dylib $out/lib/libresolv.dylib ''; 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 ]; platforms = platforms.darwin; license = licenses.apsl20; diff --git a/pkgs/os-specific/darwin/apple-source-releases/Security/boot.nix b/pkgs/os-specific/darwin/apple-source-releases/Security/boot.nix index e04142b8b11e..b819057f0c1a 100644 --- a/pkgs/os-specific/darwin/apple-source-releases/Security/boot.nix +++ b/pkgs/os-specific/darwin/apple-source-releases/Security/boot.nix @@ -1,4 +1,4 @@ -{ appleDerivation }: +{ appleDerivation, darwin-stubs }: appleDerivation { phases = [ "unpackPhase" "installPhase" ]; @@ -12,14 +12,15 @@ appleDerivation { ]; installPhase = '' - ###### IMPURITIES mkdir -p $out/Library/Frameworks/Security.framework - pushd $out/Library/Frameworks/Security.framework - ln -s /System/Library/Frameworks/Security.framework/Security - ln -s /System/Library/Frameworks/Security.framework/Resources - ln -s /System/Library/Frameworks/Security.framework/PlugIns - ln -s /System/Library/Frameworks/Security.framework/XPCServices - popd + + ###### IMPURITIES + ln -s /System/Library/Frameworks/Security.framework/{Resources,Plugins,XPCServices} \ + $out/Library/Frameworks/Security.framework + + ###### STUBS + cp ${darwin-stubs}/System/Library/Frameworks/Security.framework/Versions/A/Security.tbd \ + $out/Library/Frameworks/Security.framework ###### HEADERS diff --git a/pkgs/os-specific/darwin/apple-source-releases/objc4/default.nix b/pkgs/os-specific/darwin/apple-source-releases/objc4/default.nix index a7cedaaea114..2fc4afa77d9f 100644 --- a/pkgs/os-specific/darwin/apple-source-releases/objc4/default.nix +++ b/pkgs/os-specific/darwin/apple-source-releases/objc4/default.nix @@ -1,4 +1,4 @@ -{ appleDerivation }: +{ appleDerivation, darwin-stubs }: appleDerivation { phases = [ "unpackPhase" "installPhase" ]; @@ -14,7 +14,8 @@ appleDerivation { installPhase = '' 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/NSObjCRuntime.h $out/include/objc/NSObjCRuntime.h cp runtime/NSObject.h $out/include/objc/NSObject.h diff --git a/pkgs/os-specific/darwin/darwin-stubs/default.nix b/pkgs/os-specific/darwin/darwin-stubs/default.nix new file mode 100644 index 000000000000..f7f083e32f43 --- /dev/null +++ b/pkgs/os-specific/darwin/darwin-stubs/default.nix @@ -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 + ''; +} diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 58da8b71b650..f07b1ee73b87 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -7,15 +7,15 @@ # Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools , bootstrapFiles ? let fetch = { file, sha256, executable ? true }: import { - 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 sha256 executable; }; in { - sh = fetch { file = "sh"; sha256 = "07wm33f1yzfpcd3rh42f8g096k4cvv7g65p968j28agzmm2s7s8m"; }; - bzip2 = fetch { file = "bzip2"; sha256 = "0y9ri2aprkrp2dkzm6229l0mw4rxr2jy7vvh3d8mxv2698v2kdbm"; }; - mkdir = fetch { file = "mkdir"; sha256 = "0sb07xpy66ws6f2jfnpjibyimzb71al8n8c6y4nr8h50al3g90nr"; }; - cpio = fetch { file = "cpio"; sha256 = "0r5c54hg678w7zydx27bzl9p3v9fs25y5ix6vdfi1ilqim7xh65n"; }; - tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "18hp5w6klr8g307ap4368r255qpzg9r0vwg9vqvj8f2zy1xilcjf"; executable = false; }; + sh = fetch { file = "sh"; sha256 = "sha256-nbb4XEk3go7ttiWrQyKQMLzPr+qUnwnHkWMtVCZsMCs="; }; + bzip2 = fetch { file = "bzip2"; sha256 = "sha256-ybnA+JWrKhXSfn20+GVKXkHFTp2Zt79hat8hAVmsUOc="; }; + mkdir = fetch { file = "mkdir"; sha256 = "sha256-nmvMxmfcY41/60Z/E8L9u0vgePW5l30Dqw1z+Nr02Hk="; }; + cpio = fetch { file = "cpio"; sha256 = "sha256-cB36rN3NLj19Tk37Kc5bodMFMO+mCpEQkKKo0AEMkaU="; }; + tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "sha256-kh2vKmjCr/HvR06czZbxUxV5KDRxSF27M6nN3cyofRI="; executable = false; }; } }: @@ -24,6 +24,8 @@ assert crossSystem == localSystem; let inherit (localSystem) system platform; + bootstrapClangVersion = "7.1.0"; + commonImpureHostDeps = [ "/bin/sh" "/usr/lib/libSystem.B.dylib" @@ -72,33 +74,48 @@ in rec { inherit (last) stdenv; }; - coreutils = { name = "${name}-coreutils"; outPath = bootstrapTools; }; - gnugrep = { name = "${name}-gnugrep"; outPath = bootstrapTools; }; + mkExtraBuildCommands = cc: '' + 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 { - inherit shell; - inherit (last) stdenvNoCC; + mkCC = overrides: import ../../build-support/cc-wrapper ( + let args = { + inherit shell; + inherit (last) stdenvNoCC; - nativeTools = false; - nativeLibc = false; - inherit buildPackages coreutils gnugrep; - libc = last.pkgs.darwin.Libsystem; - bintools = { name = "${name}-binutils"; outPath = bootstrapTools; }; - }; + nativeTools = false; + nativeLibc = false; + inherit buildPackages libcxx; + inherit (last.pkgs) coreutils gnugrep; + bintools = last.pkgs.darwin.binutils; + libc = last.pkgs.darwin.Libsystem; + isClang = true; + cc = last.pkgs.llvmPackages_7.clang-unwrapped; + }; in args // (overrides args)); - cc = if last == null then "/dev/null" else import ../../build-support/cc-wrapper { - inherit shell; - inherit (last) stdenvNoCC; + 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; + }); - extraPackages = []; - - nativeTools = false; - nativeLibc = false; - inherit buildPackages coreutils gnugrep bintools libcxx; - libc = last.pkgs.darwin.Libsystem; - isClang = true; - cc = { name = "${name}-clang"; outPath = bootstrapTools; }; - }; + 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 { name = "${name}-stdenv-darwin"; @@ -137,7 +154,10 @@ in rec { extraAttrs = { 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 { @@ -147,6 +167,9 @@ in rec { stage0 = stageFun 0 null { overrides = self: super: with stage0; { + coreutils = { name = "bootstrap-stage0-coreutils"; outPath = bootstrapTools; }; + gnugrep = { name = "bootstrap-stage0-gnugrep"; outPath = bootstrapTools; }; + darwin = super.darwin // { Libsystem = stdenv.mkDerivation { name = "bootstrap-stage0-Libsystem"; @@ -157,9 +180,26 @@ in rec { ''; }; 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 = { + clang-unwrapped = { + name = "bootstrap-stage0-clang"; + outPath = bootstrapTools; + version = bootstrapClangVersion; + }; + libcxx = stdenv.mkDerivation { name = "bootstrap-stage0-libcxx"; phases = [ "installPhase" "fixupPhase" ]; @@ -180,6 +220,15 @@ in rec { 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; 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 { extraPreHook = "export NIX_CFLAGS_COMPILE+=\" -F${bootstrapTools}/Library/Frameworks\""; @@ -203,7 +267,9 @@ in rec { libcxx = pkgs.libcxx; allowedRequisites = - [ bootstrapTools ] ++ (with pkgs; [ libcxx libcxxabi ]) ++ [ pkgs.darwin.Libsystem ]; + [ bootstrapTools ] ++ + (with pkgs; [ libcxx libcxxabi llvmPackages_7.compiler-rt ]) ++ + (with pkgs.darwin; [ Libsystem ]); overrides = persistent; }; @@ -217,9 +283,26 @@ in rec { findfreetype libssh curl cmake autoconf automake libtool ed cpio coreutils 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 // { 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 { @@ -234,8 +317,9 @@ in rec { allowedRequisites = [ bootstrapTools ] ++ (with pkgs; [ - xz.bin xz.out libcxx libcxxabi zlib libxml2.out curl.out openssl.out libssh2.out - nghttp2.lib libkrb5 + xz.bin xz.out libcxx libcxxabi llvmPackages_7.compiler-rt + 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 ]); @@ -262,7 +346,8 @@ in rec { darwin = super.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 { @@ -284,8 +369,9 @@ in rec { allowedRequisites = [ bootstrapTools ] ++ (with pkgs; [ - xz.bin xz.out bash libcxx libcxxabi zlib libxml2.out curl.out openssl.out libssh2.out - nghttp2.lib libkrb5 + xz.bin xz.out bash libcxx libcxxabi llvmPackages_7.compiler-rt + 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 ]); @@ -319,7 +405,7 @@ in rec { in { inherit tools libraries; } // tools // libraries); darwin = super.darwin // rec { - inherit (darwin) dyld Libsystem libiconv locale; + inherit (darwin) dyld Libsystem libiconv locale darwin-stubs; CF = super.darwin.CF.override { inherit libxml2; @@ -418,7 +504,7 @@ in rec { inherit cc; darwin = super.darwin // { - inherit (prevStage.darwin) CF; + inherit (prevStage.darwin) CF darwin-stubs; xnu = super.darwin.xnu.override { inherit (prevStage) python3; }; }; }); diff --git a/pkgs/stdenv/darwin/make-bootstrap-tools.nix b/pkgs/stdenv/darwin/make-bootstrap-tools.nix index 31e129639376..1243b96e5051 100644 --- a/pkgs/stdenv/darwin/make-bootstrap-tools.nix +++ b/pkgs/stdenv/darwin/make-bootstrap-tools.nix @@ -28,11 +28,8 @@ in rec { buildCommand = '' mkdir -p $out/bin $out/lib $out/lib/system - # We're not going to bundle the actual libSystem.dylib; instead we reconstruct it on - # 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. + # Copy libSystem's .o files for various low-level boot stuff. 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 cp -L ${darwin.Libsystem}/lib/libresolv.9.dylib $out/lib @@ -208,39 +205,6 @@ in rec { fi 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 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' - 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 CC="clang $flags -Wl,-rpath,${unpack}/lib -Wl,-v -Wl,-sdk_version,10.10" diff --git a/pkgs/tools/misc/trash-cli/default.nix b/pkgs/tools/misc/trash-cli/default.nix index 141cceff24d3..33c8792d4184 100644 --- a/pkgs/tools/misc/trash-cli/default.nix +++ b/pkgs/tools/misc/trash-cli/default.nix @@ -16,8 +16,10 @@ python3Packages.buildPythonApplication rec { (substituteAll { src = ./nix-paths.patch; df = "${coreutils}/bin/df"; - libc = let ext = if stdenv.isDarwin then ".dylib" else ".so.6"; - in "${stdenv.cc.libc}/lib/libc${ext}"; + libc = + if stdenv.hostPlatform.isDarwin + then "/usr/lib/libSystem.dylib" + else "${stdenv.cc.libc}/lib/libc.so.6"; }) # Fix build on Python 3.6. diff --git a/pkgs/top-level/darwin-packages.nix b/pkgs/top-level/darwin-packages.nix index affb4ae92c19..6fafe09438cd 100644 --- a/pkgs/top-level/darwin-packages.nix +++ b/pkgs/top-level/darwin-packages.nix @@ -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; @@ -41,6 +43,10 @@ in 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 { inherit (darwin) opencflite; };