nixpkgs/pkgs/os-specific/darwin/swift-corelibs/corefoundation.nix
Randy Eckenrode 6b62554356
darwin.swift-corelibs-foundation: avoid infinite recursion
Drop ninja and use a minimal Python to avoid an infinite recursion due
to dependencies that depend on configd, which also depends on this.
2023-11-02 17:45:59 -04:00

91 lines
4 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ lib, stdenv, fetchFromGitHub, fetchurl, makeSetupHook, cmake, pkg-config, launchd, libdispatch, python3Minimal, libxml2, objc4, icu }:
let
# 10.12 adds a new sysdir.h that our version of CF in the main derivation depends on, but
# isn't available publicly, so instead we grab an older version of the same file that did
# not use sysdir.h, but provided the same functionality. Luckily it's simple :) hack hack
sysdir-free-system-directories = fetchurl {
url = "https://raw.githubusercontent.com/apple/swift-corelibs-foundation/9a5d8420f7793e63a8d5ec1ede516c4ebec939f0/CoreFoundation/Base.subproj/CFSystemDirectories.c";
sha256 = "0krfyghj4f096arvvpf884ra5czqlmbrgf8yyc0b3avqmb613pcc";
};
in
stdenv.mkDerivation {
pname = "swift-corefoundation";
version = "unstable-2018-09-14";
src = fetchFromGitHub {
owner = "apple";
repo = "swift-corelibs-foundation";
rev = "71aaba20e1450a82c516af1342fe23268e15de0a";
sha256 = "17kpql0f27xxz4jjw84vpas5f5sn4vdqwv10g151rc3rswbwln1z";
};
nativeBuildInputs = [ cmake pkg-config python3Minimal ];
buildInputs = [ (lib.getDev launchd) libdispatch libxml2 objc4 icu ];
patches = [
./0001-Add-missing-TARGET_OS_-defines.patch
# CFMessagePort.h uses `bootstrap_check_in` without declaring it, which is defined in the launchd headers.
./0002-Add-missing-launchd-header.patch
# CFURLComponents fails to build with clang 16 due to an invalid pointer conversion. This is fixed upstream.
./0003-Fix-incompatible-pointer-conversion.patch
# Fix `CMakeLists.txt` to allow it to be used instead of `build.py` to build on Darwin.
./0004-Fix-Darwin-cmake-build.patch
# Install CF framework in `$out/Library/Frameworks` instead of `$out/System/Frameworks`.
./0005-Fix-framework-installation-path.patch
# Build a framework that matches the contents of the system CoreFoundation. This patch adds
# versioning and drops the prefix and suffix, so the dynamic library is named `CoreFoundation`
# instead of `libCoreFoundation.dylib`.
./0006-System-CF-framework-compatibility.patch
# Link against the nixpkgs ICU instead of using Apples vendored version.
./0007-Use-nixpkgs-icu.patch
# Dont link against libcurl. This breaks a cycle between CF and curl, which depends on CF and
# uses the SystemConfiguration framework to support NAT64.
# This is safe because the symbols provided in CFURLSessionInterface are not provided by the
# system CoreFoundation. They are meant to be used by the implementation of `NSURLSession` in
# swift-corelibs-foundation, which is not built because it is not fully compatible with the
# system Foundation used on Darwin.
./0008-Dont-link-libcurl.patch
];
postPatch = ''
cd CoreFoundation
cp ${sysdir-free-system-directories} Base.subproj/CFSystemDirectories.c
# Includes xpc for some initialization routine that they don't define anyway, so no harm here
substituteInPlace PlugIn.subproj/CFBundlePriv.h \
--replace '#if (TARGET_OS_MAC' '#if (0'
# Why do we define __GNU__? Is that normal?
substituteInPlace Base.subproj/CFAsmMacros.h \
--replace '#if defined(__GNU__) ||' '#if 0 &&'
# The MIN macro doesn't seem to be defined sensibly for us. Not sure if our stdenv or their bug
substituteInPlace Base.subproj/CoreFoundation_Prefix.h \
--replace '#if DEPLOYMENT_TARGET_WINDOWS || DEPLOYMENT_TARGET_LINUX' '#if 1'
'';
env.NIX_CFLAGS_COMPILE = toString [
# Silence warnings regarding other targets
"-Wno-error=undef-prefix"
# Avoid redefinitions when including objc headers
"-DINCLUDE_OBJC=1"
];
cmakeFlags = [
"-DBUILD_SHARED_LIBS=ON"
"-DCF_ENABLE_LIBDISPATCH=OFF"
];
enableParallelBuilding = true;
postInstall = ''
install_name_tool -id '@rpath/CoreFoundation.framework/Versions/A/CoreFoundation' \
"$out/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation"
mkdir -p "$out/nix-support"
substituteAll ${./pure-corefoundation-hook.sh} "$out/nix-support/setup-hook"
'';
}