diff --git a/pkgs/applications/version-management/p4v/darwin.nix b/pkgs/applications/version-management/p4v/darwin.nix new file mode 100644 index 000000000000..d3d3568b9f2e --- /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 9c804a7459b4..1004661499be 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 - 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"; + # 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 ]; + mkDerivation = + if stdenv.isDarwin then callPackage ./darwin.nix { } + else libsForQt5.callPackage ./linux.nix { }; +in mkDerivation { + pname = "p4v"; + version = "2022.2.2336701"; - 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 - ''; - - 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 000000000000..6a9d6ba6aad4 --- /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; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index dce53cf1e09d..d756f73ba656 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -30354,7 +30354,7 @@ with pkgs; openssl = openssl_1_1; }; p4d = callPackage ../applications/version-management/p4d { }; - p4v = libsForQt515.callPackage ../applications/version-management/p4v { }; + p4v = callPackage ../applications/version-management/p4v { }; partio = callPackage ../development/libraries/partio {};