diff options
Diffstat (limited to 'pkgs/os-specific/darwin/apple-sdk-12.3/frameworks/default.nix')
-rw-r--r-- | pkgs/os-specific/darwin/apple-sdk-12.3/frameworks/default.nix | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/pkgs/os-specific/darwin/apple-sdk-12.3/frameworks/default.nix b/pkgs/os-specific/darwin/apple-sdk-12.3/frameworks/default.nix new file mode 100644 index 0000000000000..8ae0cd649c93c --- /dev/null +++ b/pkgs/os-specific/darwin/apple-sdk-12.3/frameworks/default.nix @@ -0,0 +1,146 @@ +{ + lib, + stdenvNoCC, + buildPackages, + # macOS things + callPackage, + darwin-stubs, +}: + +let + inherit (darwin-stubs) version; + fixup-frameworks = callPackage ./fixups.nix { }; + private-frameworks = callPackage ./private.nix { }; + public-frameworks = callPackage ./public.nix { }; + + mkDepsRewrites = + deps: + let + mergeRewrites = x: y: { + prefix = lib.mergeAttrs (x.prefix or { }) (y.prefix or { }); + const = lib.mergeAttrs (x.const or { }) (y.const or { }); + }; + + rewriteArgs = + { + prefix ? { }, + const ? { }, + }: + lib.concatLists ( + (lib.mapAttrsToList (from: to: [ + "-p" + "${from}:${to}" + ]) prefix) + ++ (lib.mapAttrsToList (from: to: [ + "-c" + "${from}:${to}" + ]) const) + ); + + rewrites = + depList: + lib.fold mergeRewrites { } ( + map (dep: dep.tbdRewrites) (lib.filter (dep: dep ? tbdRewrites) depList) + ); + in + lib.escapeShellArgs (rewriteArgs (rewrites (lib.attrValues deps))); + + mkFramework = + { + name, + deps, + private ? false, + }: + let + standardFrameworkPath = + name: private: + "/System/Library/${lib.optionalString private "Private"}Frameworks/${name}.framework"; + + self = stdenvNoCC.mkDerivation { + pname = "apple-${lib.optionalString private "private-"}framework-${name}"; + inherit (darwin-stubs) version; + + # because we copy files from the system + preferLocalBuild = true; + + dontUnpack = true; + dontBuild = true; + + disallowedRequisites = [ darwin-stubs ]; + + nativeBuildInputs = [ buildPackages.darwin.rewrite-tbd ]; + + installPhase = '' + mkdir -p $out/Library/Frameworks + + cp -r ${darwin-stubs}${standardFrameworkPath name private} $out/Library/Frameworks + + if [[ -d ${darwin-stubs}/usr/lib/swift/${name}.swiftmodule ]]; then + mkdir -p $out/lib/swift + cp -r -t $out/lib/swift \ + ${darwin-stubs}/usr/lib/swift/${name}.swiftmodule \ + ${darwin-stubs}/usr/lib/swift/libswift${name}.tbd + fi + + # Fix and check tbd re-export references + chmod u+w -R $out + find $out -name '*.tbd' -type f | while IFS=$'\n' read tbd; do + echo "Fixing re-exports in $tbd" + rewrite-tbd \ + -p ${standardFrameworkPath name private}/:$out/Library/Frameworks/${name}.framework/ \ + -p /usr/lib/swift/:$out/lib/swift/ \ + ${mkDepsRewrites deps} \ + -r ${builtins.storeDir} \ + "$tbd" + done + ''; + + propagatedBuildInputs = lib.attrValues deps; + + passthru.tbdRewrites.prefix."${standardFrameworkPath name private}/" = "${self}/Library/Frameworks/${name}.framework/"; + + meta = with lib; { + description = "Apple SDK framework ${name}"; + maintainers = [ ]; + platforms = platforms.darwin; + }; + }; + in + self; + + # Helper functions for creating framework derivations. + framework = + name: deps: + mkFramework { + inherit name deps; + private = false; + }; + + # Helper functions for creating private framework derivations. + privateFramework = + name: deps: + mkFramework { + inherit name deps; + private = true; + }; + + # Merge addToFrameworks into public-frameworks and remove elements of removeFromFrameworks. + deps = + let + inherit (fixup-frameworks) addToFrameworks removeFromFrameworks; + fixupDeps = + name: deps: + lib.pipe deps [ + # Add dependencies from addToFrameworks. + (deps: lib.recursiveUpdate deps (addToFrameworks.${name} or { })) + # Keep dependencies not in removeFromFrameworks. + (lib.filterAttrs (depName: _: !(removeFromFrameworks.${name}.${depName} or false))) + ]; + in + lib.mapAttrs fixupDeps public-frameworks; + + # Create derivations and add private frameworks. + bareFrameworks = + (lib.mapAttrs framework deps) // (lib.mapAttrs privateFramework private-frameworks); +in +bareFrameworks // fixup-frameworks.overrideFrameworks bareFrameworks |