From 27e8a2b86c0f0e7e47a951ea53696a3e166e9cd8 Mon Sep 17 00:00:00 2001 From: Bob van der Linden Date: Sun, 19 Mar 2023 23:41:47 +0100 Subject: [PATCH] pjsip: add darwin support (#220884) Co-authored-by: Sandro --- .../applications/networking/pjsip/default.nix | 46 +++++++++++++++++-- pkgs/top-level/all-packages.nix | 4 +- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/pkgs/applications/networking/pjsip/default.nix b/pkgs/applications/networking/pjsip/default.nix index 33747e2d669b..db76d3f58611 100644 --- a/pkgs/applications/networking/pjsip/default.nix +++ b/pkgs/applications/networking/pjsip/default.nix @@ -7,10 +7,13 @@ , swig , alsa-lib , AppKit +, CoreFoundation +, Security , python3 , pythonSupport ? true +, pjsip +, runCommand }: - stdenv.mkDerivation rec { pname = "pjsip"; version = "2.13"; @@ -41,21 +44,23 @@ stdenv.mkDerivation rec { buildInputs = [ openssl libsamplerate ] ++ lib.optional stdenv.isLinux alsa-lib - ++ lib.optional stdenv.isDarwin AppKit; + ++ lib.optionals stdenv.isDarwin [ AppKit CoreFoundation Security ]; preConfigure = '' export LD=$CC ''; + NIX_CFLAGS_LINK = lib.optionalString stdenv.isDarwin "-headerpad_max_install_names"; + postBuild = lib.optionalString pythonSupport '' make -C pjsip-apps/src/swig/python ''; + configureFlags = [ "--enable-shared" ]; + outputs = [ "out" ] ++ lib.optional pythonSupport "py"; - configureFlags = [ "--enable-shared" ]; - postInstall = '' mkdir -p $out/bin cp pjsip-apps/bin/pjsua-* $out/bin/pjsua @@ -65,13 +70,44 @@ stdenv.mkDerivation rec { (cd pjsip-apps/src/swig/python && \ python setup.py install --prefix=$py ) + '' + lib.optionalString stdenv.isDarwin '' + # On MacOS relative paths are used to refer to libraries. All libraries use + # a relative path like ../lib/*.dylib or ../../lib/*.dylib. We need to + # rewrite these to use absolute ones. + + # First, find all libraries (and their symlinks) in our outputs to define + # the install_name_tool -change arguments we should pass. + readarray -t libraries < <( + for outputName in $(getAllOutputNames); do + find "''${!outputName}" \( -name '*.dylib*' -o -name '*.so*' \) + done + ) + + # Determine the install_name_tool -change arguments that are going to be + # applied to all libraries. + change_args=() + for lib in "''${libraries[@]}"; do + lib_name="$(basename $lib)" + change_args+=(-change ../lib/$lib_name $lib) + change_args+=(-change ../../lib/$lib_name $lib) + done + + # Rewrite id and library refences for all non-symlinked libraries. + for lib in "''${libraries[@]}"; do + if [ -f "$lib" ]; then + install_name_tool -id $lib "''${change_args[@]}" $lib + fi + done ''; # We need the libgcc_s.so.1 loadable (for pthread_cancel to work) dontPatchELF = true; + passthru.tests.python-pjsua2 = runCommand "python-pjsua2" { } '' + ${(python3.withPackages (pkgs: [ pkgs.pjsua2 ])).interpreter} -c "import pjsua2" > $out + ''; + meta = with lib; { - broken = stdenv.isDarwin; description = "A multimedia communication library written in C, implementing standard based protocols such as SIP, SDP, RTP, STUN, TURN, and ICE"; homepage = "https://pjsip.org/"; license = licenses.gpl2Plus; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 88129dc070b4..f1c9e8adbf92 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -38568,8 +38568,8 @@ with pkgs; physlock = callPackage ../misc/screensavers/physlock { }; - pjsip = callPackage ../applications/networking/pjsip { - inherit (darwin.apple_sdk.frameworks) AppKit; + pjsip = darwin.apple_sdk_11_0.callPackage ../applications/networking/pjsip { + inherit (darwin.apple_sdk_11_0.frameworks) AppKit CoreFoundation Security; }; pounce = callPackage ../servers/pounce { };