about summary refs log tree commit diff
path: root/pkgs/applications/version-management
diff options
context:
space:
mode:
authorSandro <sandro.jaeckel@gmail.com>2022-10-17 14:15:07 +0200
committerGitHub <noreply@github.com>2022-10-17 14:15:07 +0200
commit8f271274b06c38d83e80d4e20e1e52d2de4ccc9d (patch)
tree5176ebb9b5a99cd05be64af937d6bd9912ccfab1 /pkgs/applications/version-management
parent176cfb2c1c084a5ac9eca4d7649a8cea5c2686a1 (diff)
parenta289e7feb19e9047dc091063b16c125aa99c6fc3 (diff)
Merge pull request #190073 from impl/refactor-p4v
Diffstat (limited to 'pkgs/applications/version-management')
-rw-r--r--pkgs/applications/version-management/p4v/darwin.nix24
-rw-r--r--pkgs/applications/version-management/p4v/default.nix92
-rw-r--r--pkgs/applications/version-management/p4v/linux.nix89
3 files changed, 136 insertions, 69 deletions
diff --git a/pkgs/applications/version-management/p4v/darwin.nix b/pkgs/applications/version-management/p4v/darwin.nix
new file mode 100644
index 0000000000000..d3d3568b9f2e2
--- /dev/null
+++ b/pkgs/applications/version-management/p4v/darwin.nix
@@ -0,0 +1,24 @@
+{ stdenv, undmg }:
+
+{ pname, version, src, meta }:
+stdenv.mkDerivation {
+  inherit pname version src meta;
+
+  nativeBuildInputs = [ undmg ];
+
+  sourceRoot = ".";
+
+  installPhase = ''
+    mkdir -p $out/Applications $out/bin
+
+    # Install Qt applications.
+    for f in p4admin.app p4merge.app p4v.app; do
+      mv $f $out/Applications
+    done
+
+    # Install p4vc separately (it's a tiny shell script).
+    mv p4vc $out/bin
+    substituteInPlace $out/bin/p4vc \
+      --replace /Applications $out/Applications
+  '';
+}
diff --git a/pkgs/applications/version-management/p4v/default.nix b/pkgs/applications/version-management/p4v/default.nix
index 9c804a7459b49..1004661499be2 100644
--- a/pkgs/applications/version-management/p4v/default.nix
+++ b/pkgs/applications/version-management/p4v/default.nix
@@ -1,84 +1,38 @@
 { stdenv
 , fetchurl
 , lib
-, qtbase
-, qtwebengine
-, qtdeclarative
-, qtwebchannel
-, syntax-highlighting
-, openssl
-, xkeyboard_config
-, patchelfUnstable
-, wrapQtAppsHook
-, writeText
+, callPackage
+, libsForQt5
 }:
-let
-  # This abomination exists because p4v calls CRYPTO_set_mem_functions and
-  # expects it to succeed. The function will fail if CRYPTO_malloc has already
-  # been called, which happens at init time via qtwebengine -> ... -> libssh. I
-  # suspect it was meant to work with a version of Qt where openssl is
-  # statically linked or some other library is used.
-  crypto-hack = writeText "crypto-hack.c" ''
-      #include <stddef.h>
-      int CRYPTO_set_mem_functions(
-            void *(*m)(size_t, const char *, int),
-            void *(*r)(void *, size_t, const char *, int),
-            void (*f)(void *, const char *, int)) { return 1; }
-    '';
-
-in stdenv.mkDerivation rec {
-  pname = "p4v";
-  version = "2021.3.2186916";
 
-  src = fetchurl {
-    url = "http://web.archive.org/web/20211118024745/https://cdist2.perforce.com/perforce/r21.3/bin.linux26x86_64/p4v.tgz";
-    sha256 = "1zldg21xq4srww9pcfbv3p8320ghjnh333pz5r70z1gwbq4vf3jq";
+let
+  # Upstream replaces minor versions, so use archived URLs.
+  srcs = {
+    "x86_64-linux" = fetchurl {
+      url = "https://web.archive.org/web/20220902181457id_/https://ftp.perforce.com/perforce/r22.2/bin.linux26x86_64/p4v.tgz";
+      sha256 = "8fdade4aafe25f568a61cfd80823aa90599c2a404b7c6b4a0862c84b07a9f8d2";
+    };
+    "x86_64-darwin" = fetchurl {
+      url = "https://web.archive.org/web/20220902194716id_/https://ftp.perforce.com/perforce/r22.2/bin.macosx1015x86_64/P4V.dmg";
+      sha256 = "c4a9460c0f849be193c68496c500f8a785c740f5bea5b5e7f617969c20be3cd7";
+    };
   };
 
-  dontBuild = true;
-  nativeBuildInputs = [ patchelfUnstable wrapQtAppsHook ];
-
-  ldLibraryPath = lib.makeLibraryPath [
-      stdenv.cc.cc.lib
-      qtbase
-      qtwebengine
-      qtdeclarative
-      qtwebchannel
-      syntax-highlighting
-      openssl
-  ];
-
-  dontWrapQtApps = true;
-  installPhase = ''
-    mkdir $out
-    cp -r bin $out
-    mkdir -p $out/lib
-    cp -r lib/P4VResources $out/lib
-    $CC -fPIC -shared -o $out/lib/libcrypto-hack.so ${crypto-hack}
-
-    for f in $out/bin/*.bin ; do
-      patchelf --set-rpath $ldLibraryPath --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $f
-      # combining this with above breaks rpath (patchelf bug?)
-      patchelf --add-needed libstdc++.so \
-               --add-needed $out/lib/libcrypto-hack.so \
-               --clear-symbol-version _ZNSt20bad_array_new_lengthD1Ev \
-               --clear-symbol-version _ZTVSt20bad_array_new_length \
-               --clear-symbol-version _ZTISt20bad_array_new_length \
-               --clear-symbol-version _ZdlPvm \
-               $f
-      wrapQtApp $f \
-        --suffix QT_XKB_CONFIG_ROOT : ${xkeyboard_config}/share/X11/xkb
-    done
-  '';
+  mkDerivation =
+    if stdenv.isDarwin then callPackage ./darwin.nix { }
+    else libsForQt5.callPackage ./linux.nix { };
+in mkDerivation {
+  pname = "p4v";
+  version = "2022.2.2336701";
 
-  dontFixup = true;
+  src = srcs.${stdenv.hostPlatform.system} or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
 
   meta = {
-    description = "Perforce Visual Client";
+    description = "Perforce Helix Visual Client";
     homepage = "https://www.perforce.com";
     sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
     license = lib.licenses.unfreeRedistributable;
-    platforms = [ "x86_64-linux" ];
-    maintainers = with lib.maintainers; [ nathyong nioncode ];
+    platforms = builtins.attrNames srcs;
+    maintainers = with lib.maintainers; [ impl nathyong nioncode ];
   };
 }
diff --git a/pkgs/applications/version-management/p4v/linux.nix b/pkgs/applications/version-management/p4v/linux.nix
new file mode 100644
index 0000000000000..6a9d6ba6aad4b
--- /dev/null
+++ b/pkgs/applications/version-management/p4v/linux.nix
@@ -0,0 +1,89 @@
+{ stdenv
+, autoPatchelfHook
+, cups
+, dbus
+, fontconfig
+, gccForLibs
+, libX11
+, libXcomposite
+, libXcursor
+, libXdamage
+, libXext
+, libXi
+, libXrandr
+, libXrender
+, libXtst
+, libinput
+, libxcb
+, libxkbcommon
+, nss
+, qttools
+, qtwebengine
+, xcbutilimage
+, xcbutilkeysyms
+, xcbutilrenderutil
+, xcbutilwm
+}:
+
+{ pname, version, src, meta }:
+let
+  unwrapped = stdenv.mkDerivation {
+    pname = "${pname}-unwrapped";
+    inherit version src meta;
+
+    nativeBuildInputs = [ autoPatchelfHook ];
+    buildInputs = [
+      cups
+      dbus
+      fontconfig
+      gccForLibs
+      libX11
+      libXcomposite
+      libXcursor
+      libXdamage
+      libXext
+      libXi
+      libXrandr
+      libXrender
+      libXtst
+      libinput
+      libxcb
+      libxkbcommon
+      nss
+      qttools
+      qtwebengine
+      xcbutilimage
+      xcbutilkeysyms
+      xcbutilrenderutil
+      xcbutilwm
+    ];
+
+    dontBuild = true;
+
+    # Don't wrap the Qt apps; upstream has its own wrapper scripts.
+    dontWrapQtApps = true;
+
+    installPhase = ''
+      mkdir -p $out
+      cp -r bin lib $out
+      addAutoPatchelfSearchPath $out/lib
+    '';
+  };
+in
+stdenv.mkDerivation {
+  inherit pname version;
+
+  # Build a "clean" version of the package so that we don't add extra ".bin" or
+  # configuration files to users' PATHs. We can't easily put the unwrapped
+  # package files in libexec (where they belong, probably) because the upstream
+  # wrapper scripts have the bin directory hardcoded.
+  buildCommand = ''
+    mkdir -p $out/bin
+    for f in p4admin p4merge p4v p4vc; do
+      ln -s ${unwrapped}/bin/$f $out/bin
+    done
+  '';
+  preferLocalBuild = true;
+
+  inherit (unwrapped) meta passthru;
+}