From 2576bb2c1831aa22f7dfaf8c5ca3aed5e1619995 Mon Sep 17 00:00:00 2001 From: Noah Fontes Date: Tue, 6 Sep 2022 23:50:31 -0700 Subject: p4: 2021.2.2201121 -> 2022.1.2305383, build from source The actual p4 command is open-source software released under the 2-clause BSD license, so we can build it here (for pretty much every architecture we support!) and include it in the cache. This change removes the server-side commands from this package, but they are now available as part of a separate p4d package instead. (The server package remains unfree.) As an added bonus, we can also include the libraries and headers for the C/C++ API, which will allow us to package any software that uses Perforce as a library in the future. --- .../applications/version-management/p4/default.nix | 114 ++++++++++++++++++--- 1 file changed, 99 insertions(+), 15 deletions(-) (limited to 'pkgs/applications/version-management') diff --git a/pkgs/applications/version-management/p4/default.nix b/pkgs/applications/version-management/p4/default.nix index 4f61be6669aa1..8a54d4eb77bf2 100644 --- a/pkgs/applications/version-management/p4/default.nix +++ b/pkgs/applications/version-management/p4/default.nix @@ -1,31 +1,115 @@ -{ stdenv, fetchurl, lib, autoPatchelfHook }: +{ stdenv +, fetchurl +, fetchzip +, lib +, emptyDirectory +, linkFarm +, symlinkJoin +, jam +, libcxx +, libcxxabi +, openssl +, xcbuild +, CoreServices +, Foundation +, Security +}: +let + opensslStatic = openssl.override { + static = true; + }; + androidZlibContrib = + let + src = fetchzip { + url = "https://android.googlesource.com/platform/external/zlib/+archive/61174f4fd262c6075f88768465f308aae95a2f04.tar.gz"; + sha256 = "sha256-EMzKAHcEWOUugcHKH2Fj3ZaIHC9UlgO4ULKe3RvgxvI="; + stripRoot = false; + }; + in + linkFarm "android-zlib-contrib" [ + # We only want to keep the contrib directory as the other files conflict + # with p4's own zlib files. (For the same reason, we can't use the + # cone-based Git sparse checkout, either.) + { name = "contrib"; path = "${src}/contrib"; } + ]; + libcxxUnified = symlinkJoin { + inherit (libcxx) name; + paths = [ libcxx libcxxabi ]; + }; +in stdenv.mkDerivation rec { pname = "p4"; - version = "2021.2.2201121"; + version = "2022.1.2305383"; src = fetchurl { - # actually https://cdist2.perforce.com/perforce/r21.2/bin.linux26x86_64/helix-core-server.tgz but upstream deletes releases - url = "https://web.archive.org/web/20211118024943/https://cdist2.perforce.com/perforce/r21.2/bin.linux26x86_64/helix-core-server.tgz"; - sha256 = "sha256-SrfI2ZD7KDyttCd8+fo8g4UZKljYYO/SbzqrS9tAcC8="; + # Upstream replaces minor versions, so use archived URL. + url = "https://web.archive.org/web/20220901184735id_/https://ftp.perforce.com/perforce/r22.1/bin.tools/p4source.tgz"; + sha256 = "27ab3ddd7b178b05cf0b710e941650dac0688d294110ebafda9027732c0944c6"; }; - sourceRoot = "."; + nativeBuildInputs = [ jam ]; + + buildInputs = lib.optionals stdenv.isDarwin [ CoreServices Foundation Security ]; + + outputs = [ "out" "bin" "dev" ]; - dontBuild = true; + hardeningDisable = lib.optionals stdenv.isDarwin [ "strictoverflow" ]; - nativeBuildInputs = [ autoPatchelfHook ]; + jamFlags = + [ + "-sEXEC=bin.unix" + "-sCROSS_COMPILE=${stdenv.cc.targetPrefix}" + "-sMALLOC_OVERRIDE=no" + "-sSSLINCDIR=${lib.getDev opensslStatic}/include" + "-sSSLLIBDIR=${lib.getLib opensslStatic}/lib" + ] + ++ lib.optionals stdenv.cc.isClang [ "-sOSCOMP=clang" "-sCLANGVER=${stdenv.cc.cc.version}" ] + ++ lib.optionals stdenv.cc.isGNU [ "-sOSCOMP=gcc" "-sGCCVER=${stdenv.cc.cc.version}" ] + ++ lib.optionals stdenv.isLinux [ "-sOSVER=26" ] + ++ lib.optionals stdenv.isDarwin [ + "-sOSVER=1013" + "-sMACOSX_SDK=${emptyDirectory}" + "-sLIBC++DIR=${libcxxUnified}/lib" + ]; + + CCFLAGS = + # The file contrib/optimizations/slide_hash_neon.h is missing from the + # upstream distribution. It comes from the Android/Chromium sources. + lib.optionals stdenv.isAarch64 [ "-I${androidZlibContrib}" ]; + + "C++FLAGS" = + # Avoid a compilation error that only occurs for 4-byte longs. + lib.optionals stdenv.isi686 [ "-Wno-narrowing" ] + # See the "Header dependency changes" section of + # https://www.gnu.org/software/gcc/gcc-11/porting_to.html for more + # information on why we need to include these. + ++ lib.optionals + (stdenv.cc.isClang || (stdenv.cc.isGNU && lib.versionAtLeast stdenv.cc.cc.version "11.0.0")) + [ "-include" "limits" "-include" "thread" ]; + + buildPhase = '' + runHook preBuild + jam $jamFlags -j$NIX_BUILD_CORES p4 + jam $jamFlags -j$NIX_BUILD_CORES -sPRODUCTION=yes p4api.tar + runHook postBuild + ''; installPhase = '' - install -D --target $out/bin p4 p4broker p4d p4p + runHook preInstall + mkdir -p $bin/bin $dev $out + cp bin.unix/p4 $bin/bin + cp -r bin.unix/p4api-${version}/include $dev + cp -r bin.unix/p4api-${version}/lib $out + runHook postInstall ''; - meta = { - description = "Perforce Command-Line Client"; + meta = with lib; { + description = "Perforce Helix Core command-line client and APIs"; homepage = "https://www.perforce.com"; - sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; - license = lib.licenses.unfree; - platforms = [ "x86_64-linux" ]; - maintainers = with lib.maintainers; [ corngood ]; + license = licenses.bsd2; + mainProgram = "p4"; + platforms = platforms.unix; + maintainers = with maintainers; [ corngood impl ]; }; } -- cgit 1.4.1 From 453192aa4ba3c76e3071531132417d45cf214485 Mon Sep 17 00:00:00 2001 From: Noah Fontes Date: Wed, 7 Sep 2022 22:33:26 -0700 Subject: p4d: add corngood to maintainers --- pkgs/applications/version-management/p4d/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'pkgs/applications/version-management') diff --git a/pkgs/applications/version-management/p4d/default.nix b/pkgs/applications/version-management/p4d/default.nix index 5b98131303d3b..e2cf8e1013c3d 100644 --- a/pkgs/applications/version-management/p4d/default.nix +++ b/pkgs/applications/version-management/p4d/default.nix @@ -47,6 +47,6 @@ stdenv.mkDerivation { license = licenses.unfree; mainProgram = "p4d"; platforms = builtins.attrNames srcs; - maintainers = with maintainers; [ impl ]; + maintainers = with maintainers; [ corngood impl ]; }; } -- cgit 1.4.1