summary refs log blame commit diff
path: root/pkgs/applications/networking/instant-messengers/linphone/default.nix
blob: 0d97fcbbf5110049f4c103702ab25824c8b67c82 (plain) (tree)



















































                        
  









                                                                                
 
                                
 



































                                                                                                              
                 

                                                                    

    












                                                                                
 
                                                                         
                

                                                          

     


                                                                              
                 




































                          
    
 
                       






               
    
 



                                                
    
 






































                                                                                    


                                                                        

     
                    
                                           
                                                                                      
                            
                                
                                                 

    
{ bcg729
, bctoolbox
, bcunit
, belcard
, belle-sip
, belr
, bzrtp
, cairo
, cmake
, cyrus_sasl
, fetchFromGitLab
, fetchurl
, ffmpeg
, gdk-pixbuf
, glib
, gnused
, graphviz
, gtk2
, intltool
, lib
, libexosip
, liblinphone
, libmatroska
, libnotify
, libosip
, libsoup
, libupnp
, libX11
, libxml2
, makeWrapper
, mbedtls
, mediastreamer
, mediastreamer-openh264
, mkDerivation
, openldap
, ortp
, pango
, pkgconfig
, python
, qtbase
, qtgraphicaleffects
, qtquickcontrols2
, qttranslations
, readline
, speex
, sqlite
, stdenv
, udev
, zlib
  # For Minizip 2.2.7:
, fetchFromGitHub
, libbsd
}:
let
  # Linphone Desktop requires Minizip 2.2.7. Nixpkgs contains a very old version
  # from the time when it was part of zlib. The most recent release of Minizip
  # is currently 2.9.2 but Linphone Desktop didn't work with that. So, even if
  # we added most recent Minizip version to nixpkgs, probably Minizip 2.2.7 is
  # only needed here and we shouldn't add this semi-old version to
  # all-packages.nix. Therefore, just define it here locally.
  minizip2 = stdenv.mkDerivation rec {
    pname = "minizip";
    version = "2.2.7";

    disabled = stdenv.isAarch32;

    src = fetchFromGitHub {
      owner = "nmoinvaz";
      repo = pname;
      rev = version;
      sha256 = "1a88v1gjlflsd17mlrgxh420rpa38q0d17yh9q8j1zzqfrd1azch";
    };

    nativeBuildInputs = [ cmake pkgconfig ];

    cmakeFlags = [
      "-DBUILD_SHARED_LIBS=YES"
    ];

    buildInputs = [
      zlib
      libbsd # required in 2.2.7 but not in 2.9.2?
    ];

    meta = with stdenv.lib; {
      description = "Compression library implementing the deflate compression method found in gzip and PKZIP";
      homepage = "https://github.com/nmoinvaz/minizip";
      license = licenses.zlib;
      platforms = platforms.unix;
    };
  };
in
mkDerivation rec {
  pname = "linphone-desktop";
  # Latest release is 4.1.1 old and doesn't build with the latest releases of
  # some of the dependencies so let's use the latest commit.
  version = "unstable-2020-03-06";

  src = fetchFromGitLab {
    domain = "gitlab.linphone.org";
    owner = "public";
    group = "BC";
    repo = pname;
    rev = "971997e162558d37051f89c9c34bbc240135f704";
    sha256 = "02ji4r8bpcm2kyisn9d3054m026l33g2574i1ag1cmb2dz2p8i1c";
  };

  # Without this patch, the build fails with:
  #
  #   No rule to make target
  #   'minizip_OUTPUT/nix/store/...linphone-desktop.../lib/libminizip.so',
  #
  # So, the makefile tries to use a full absolute path to the library but does
  # it incorrectly. As we have installed Minizip properly, it's sufficient to
  # just use "minizip" and the library is found automatically. If this patched
  # target_link_libraries line was removed entirely, the build would fail at the
  # very end when linking minizip.
  patches = [
    ./fix_minizip_linking.patch
  ];

  # See: https://gitlab.linphone.org/BC/public/linphone-desktop/issues/21
  postPatch = ''
    substituteInPlace src/app/AppController.cpp \
      --replace "LINPHONE_QT_GIT_VERSION" "\"${version}\""
  '';

  # TODO: After linphone-desktop and liblinphone split into separate packages,
  # there might be some build inputs here that aren't needed for
  # linphone-desktop.
  buildInputs = [
    bcg729
    bctoolbox
    belcard
    belle-sip
    belr
    bzrtp
    cairo
    cyrus_sasl
    ffmpeg
    gdk-pixbuf
    glib
    gtk2
    libX11
    libexosip
    liblinphone
    libmatroska
    libnotify
    libosip
    libsoup
    libupnp
    libxml2
    mbedtls
    mediastreamer
    mediastreamer-openh264
    minizip2
    openldap
    ortp
    pango
    qtbase
    qtgraphicaleffects
    qtquickcontrols2
    qttranslations
    readline
    speex
    sqlite
    udev
    zlib
  ];

  nativeBuildInputs = [
    bcunit
    cmake
    gnused
    graphviz
    intltool
    makeWrapper
    pkgconfig
  ];

  cmakeFlags = [
    "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
    "-DMINIZIP_INCLUDE_DIRS=${minizip2}/include"
    "-DMINIZIP_LIBRARIES=minizip"
  ];

  # The default install phase fails because the paths are somehow messed up in
  # the makefiles. The errors were like:
  #
  #   CMake Error at cmake_builder/linphone_package/cmake_install.cmake:49 (file):
  #     file INSTALL cannot find
  #     "/build/linphone-desktop-.../build/linphone-sdk/desktop//nix/store/.../bin":
  #     No such file or directory.
  #
  # If someone is able to figure out how to fix that, great. For now, just
  # trying to pick all the relevant files to the output.
  #
  # Also, the exec path in linphone.desktop file remains invalid, pointing to
  # the build directory, after the whole nix build process. So, let's use sed to
  # manually fix that path.
  #
  # In order to find mediastreamer plugins, mediastreamer package was patched to
  # support an environment variable pointing to the plugin directory. Set that
  # environment variable by wrapping the Linphone executable.
  #
  # Also, some grammar files needed to be copied too from some dependencies. I
  # suppose if one define a dependency in such a way that its share directory is
  # found, then this copying would be unnecessary. These missing grammar files
  # were discovered when linphone crashed at startup and it was run with
  # --verbose flag. Instead of actually copying these files, create symlinks.
  #
  # It is quite likely that there are some other files still missing and
  # Linphone will randomly crash when it tries to access those files. Then,
  # those just need to be copied manually below.
  installPhase = ''
    mkdir -p $out/bin
    cp linphone $out/bin/
    wrapProgram $out/bin/linphone \
      --set MEDIASTREAMER_PLUGINS_DIR \
            ${mediastreamer-openh264}/lib/mediastreamer/plugins
    mkdir -p $out/share/applications
    sed -i "s@/build/.*/OUTPUT/bin@$out/bin@" linphone.desktop
    cp linphone.desktop $out/share/applications/
    cp -r ../assets/icons $out/share/
    mkdir -p $out/share/belr/grammars
    ln -s ${liblinphone}/share/belr/grammars/* $out/share/belr/grammars/
    mkdir -p $out/share/linphone
    ln -s ${liblinphone}/share/linphone/* $out/share/linphone/
  '';

  meta = with lib; {
    homepage = "https://www.linphone.org/";
    description = "Open source SIP phone for voice/video calls and instant messaging";
    license = licenses.gpl3;
    platforms = platforms.linux;
    maintainers = with maintainers; [ jluttine ];
  };
}