about summary refs log tree commit diff
path: root/pkgs/os-specific/darwin/apple-sdk-12.3/libSystem.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/os-specific/darwin/apple-sdk-12.3/libSystem.nix')
-rw-r--r--pkgs/os-specific/darwin/apple-sdk-12.3/libSystem.nix96
1 files changed, 96 insertions, 0 deletions
diff --git a/pkgs/os-specific/darwin/apple-sdk-12.3/libSystem.nix b/pkgs/os-specific/darwin/apple-sdk-12.3/libSystem.nix
new file mode 100644
index 0000000000000..5d57038a46573
--- /dev/null
+++ b/pkgs/os-specific/darwin/apple-sdk-12.3/libSystem.nix
@@ -0,0 +1,96 @@
+{
+  stdenvNoCC,
+  buildPackages,
+  darwin-stubs,
+}:
+
+stdenvNoCC.mkDerivation {
+  pname = "libSystem";
+  inherit (darwin-stubs) version;
+
+  nativeBuildInputs = [ buildPackages.darwin.rewrite-tbd ];
+
+  csu = [
+    "bundle1.o"
+    "crt0.o"
+    "crt1.10.5.o"
+    "crt1.10.6.o"
+    "crt1.o"
+    "dylib1.10.5.o"
+    "dylib1.o"
+    "gcrt1.o"
+    "lazydylib1.o"
+  ];
+
+  buildCommand =
+    ''
+      mkdir -p $out/{include,lib/swift}
+    ''
+    # Copy each directory in ${darwin-stubs}/usr/include into $out/include
+    + ''
+      for dir in $(ls -d ${darwin-stubs}/usr/include/*/); do
+        cp -dr $dir $out/include
+      done
+    ''
+    # Copy each header and modulemap file in ${darwin-stubs}/usr/include into $out/include
+    + ''
+      cp -d \
+        ${darwin-stubs}/usr/include/*.h \
+        ${darwin-stubs}/usr/include/*.modulemap \
+        $out/include
+    ''
+    # Remove curses.h, ncurses.h, ncurses_dll.h, and unctrl.h which conflict with ncurses.
+    # Then, remove the module map for ncurses.
+    # NOTE: The sed expression expects the module map to use consistent indentation across
+    #   releases. If this changes, the sed expression will need to be updated.
+    #
+    #   For example, right now we assume that there is one leading space before the
+    #   "explicit" keyword and that the closing brace is on its own line (also with one
+    #   leading space).
+    + ''
+      rm $out/include/{curses,ncurses,ncurses_dll,unctrl}.h
+      sed -i -e '/^ explicit module ncurses {/,/^ }$/d' $out/include/module.modulemap
+    ''
+    + ''
+      rm $out/include/tk*.h $out/include/tcl*.h
+
+      cp -dr \
+        ${darwin-stubs}/usr/lib/libSystem.* \
+        ${darwin-stubs}/usr/lib/system \
+        $out/lib
+
+      # Extra libraries
+      for name in c dbm dl info m mx poll proc pthread rpcsvc util gcc_s.1 resolv; do
+        cp -d \
+          ${darwin-stubs}/usr/lib/lib$name.tbd \
+          ${darwin-stubs}/usr/lib/lib$name.*.tbd \
+          $out/lib
+      done
+
+      for name in os Dispatch; do
+        cp -dr \
+          ${darwin-stubs}/usr/lib/swift/$name.swiftmodule \
+          ${darwin-stubs}/usr/lib/swift/libswift$name.tbd \
+          $out/lib/swift
+      done
+
+      for f in $csu; do
+        from=${darwin-stubs}/usr/lib/$f
+        if [ -e "$from" ]; then
+          cp -d $from $out/lib
+        else
+          echo "Csu file '$from' doesn't exist: skipping"
+        fi
+      done
+
+      chmod u+w -R $out/lib
+      find $out -name '*.tbd' -type f | while read tbd; do
+        rewrite-tbd \
+          -c /usr/lib/libsystem.dylib:$out/lib/libsystem.dylib \
+          -p /usr/lib/system/:$out/lib/system/ \
+          -p /usr/lib/swift/:$out/lib/swift/ \
+          -r ${builtins.storeDir} \
+          "$tbd"
+      done
+    '';
+}