From 78e359612104f7defc8328966666473079fe2bec Mon Sep 17 00:00:00 2001 From: midchildan Date: Fri, 26 Feb 2021 22:52:07 +0900 Subject: [PATCH] sourcetrail: fix darwin build (#112795) --- .../development/tools/sourcetrail/default.nix | 136 +++++++++++++----- pkgs/development/tools/sourcetrail/python.nix | 8 +- pkgs/top-level/all-packages.nix | 7 +- 3 files changed, 109 insertions(+), 42 deletions(-) diff --git a/pkgs/development/tools/sourcetrail/default.nix b/pkgs/development/tools/sourcetrail/default.nix index 46f097e5b60a..7b06e720caab 100644 --- a/pkgs/development/tools/sourcetrail/default.nix +++ b/pkgs/development/tools/sourcetrail/default.nix @@ -1,15 +1,28 @@ -{ lib, stdenv, fetchFromGitHub, callPackage, writeScript, cmake, wrapQtAppsHook -, boost, qt5, llvmPackages, gcc, jdk, pythonPackages, desktop-file-utils -, shared-mime-info, imagemagick, which, coreutils, maven, fetchpatch }: +{ lib, stdenv, fetchFromGitHub, callPackage, writeScript, fetchpatch, cmake +, wrapQtAppsHook, qt5, boost, llvmPackages, gcc, jdk, maven, pythonPackages +, coreutils, which, desktop-file-utils, shared-mime-info, imagemagick, libicns +}: let # TODO: remove when version incompatibility issue with python3Packages.jedi is # resolved - parso = pythonPackages.callPackage ./parso.nix {}; + parso = pythonPackages.callPackage ./parso.nix { }; jedi = pythonPackages.callPackage ./jedi.nix { inherit parso; }; - pythonIndexer = pythonPackages.callPackage ./python.nix { inherit jedi parso; }; - javaIndexer = callPackage ./java.nix {}; + pythonIndexer = + pythonPackages.callPackage ./python.nix { inherit jedi parso; }; + javaIndexer = callPackage ./java.nix { }; + + appPrefixDir = if stdenv.isDarwin then + "$out/Applications/Sourcetrail.app/Contents" + else + "$out/opt/sourcetrail"; + appBinDir = + if stdenv.isDarwin then "${appPrefixDir}/MacOS" else "${appPrefixDir}/bin"; + appResourceDir = if stdenv.isDarwin then + "${appPrefixDir}/Resources" + else + "${appPrefixDir}/share"; # Upstream script: # https://github.com/CoatiSoftware/Sourcetrail/blob/master/script/update_java_indexer.sh @@ -17,7 +30,7 @@ let #!${stdenv.shell} cd "$(dirname "$0")/.." - dst="$out/opt/sourcetrail/share/data/java/lib" + dst="${appResourceDir}/data/java/lib" mkdir -p "$dst" cp "${javaIndexer}/target/java-indexer-1.0.jar" "$dst/java-indexer.jar" @@ -29,12 +42,12 @@ let installPythonIndexer = writeScript "download_python_indexer.sh" '' #!${stdenv.shell} - mkdir -p $out/opt/sourcetrail/share/data - ln -s "${pythonIndexer}/bin" "$out/opt/sourcetrail/share/data/python" + mkdir -p ${appResourceDir}/data + ln -s "${pythonIndexer}/bin" "${appResourceDir}/data/python" ''; -in -stdenv.mkDerivation rec { +in stdenv.mkDerivation rec { pname = "sourcetrail"; + # NOTE: skip 2020.4.35 https://github.com/CoatiSoftware/Sourcetrail/pull/1136 version = "2020.2.43"; src = fetchFromGitHub { @@ -45,7 +58,8 @@ stdenv.mkDerivation rec { }; patches = let - url = commit: "https://github.com/CoatiSoftware/Sourcetrail/commit/${commit}.patch"; + url = commit: + "https://github.com/CoatiSoftware/Sourcetrail/commit/${commit}.patch"; in [ ./disable-updates.patch ./disable-failing-tests.patch # FIXME: 5 test cases failing due to sandbox @@ -69,21 +83,22 @@ stdenv.mkDerivation rec { desktop-file-utils imagemagick javaIndexer # the resulting jar file is copied by our install script - ] ++ lib.optionals doCheck testBinPath; - buildInputs = [ - boost pythonIndexer shared-mime-info - ] ++ (with qt5; [ qtbase qtsvg ]) - ++ (with llvmPackages; [ libclang llvm ]); + ] ++ lib.optional (stdenv.isDarwin) libicns + ++ lib.optionals doCheck testBinPath; + buildInputs = [ boost pythonIndexer shared-mime-info ] + ++ (with qt5; [ qtbase qtsvg ]) ++ (with llvmPackages; [ libclang llvm ]); binPath = [ gcc jdk.jre maven which ]; testBinPath = binPath ++ [ coreutils ]; cmakeFlags = [ "-DBoost_USE_STATIC_LIBS=OFF" "-DBUILD_CXX_LANGUAGE_PACKAGE=ON" - "-DCMAKE_PREFIX_PATH=${llvmPackages.clang-unwrapped}" "-DBUILD_JAVA_LANGUAGE_PACKAGE=ON" "-DBUILD_PYTHON_LANGUAGE_PACKAGE=ON" - ]; + ] ++ lib.optional stdenv.isLinux + "-DCMAKE_PREFIX_PATH=${llvmPackages.clang-unwrapped}" + ++ lib.optional stdenv.isDarwin + "-DClang_DIR=${llvmPackages.clang-unwrapped}"; postPatch = let major = lib.versions.major version; @@ -112,6 +127,8 @@ stdenv.mkDerivation rec { ln -sf ${installPythonIndexer} script/download_python_indexer.sh ''; + # Directory layout for Linux: + # # Sourcetrail doesn't use the usual cmake install() commands and instead uses # its own bash script for packaging. Since we're not able to reuse the script, # we'll have to roll our own in nixpkgs. @@ -141,7 +158,7 @@ stdenv.mkDerivation rec { # # nixpkgs # ├── bin/ - # │   └── sourcetrail* (wrapper for opt/sourcetrail/bin/sourcetrail) + # │   └── sourcetrail@ (symlink to opt/sourcetrail/bin/sourcetrail) # └── opt/sourcetrail/ # ├── bin/ # │   └── sourcetrail* @@ -151,35 +168,76 @@ stdenv.mkDerivation rec { # Upstream install script: # https://github.com/CoatiSoftware/Sourcetrail/blob/master/setup/Linux/createPackages.sh installPhase = '' - mkdir -p $out/opt/sourcetrail/bin - cp app/Sourcetrail $out/opt/sourcetrail/bin/sourcetrail - cp app/sourcetrail_indexer $out/opt/sourcetrail/bin/sourcetrail_indexer + runHook preInstall + + mkdir -p ${appResourceDir} + cp -R ../bin/app/data ${appResourceDir} + cp -R ../bin/app/user/projects ${appResourceDir}/data/fallback + rm -r ${appResourceDir}/data/install ${appResourceDir}/data/*_template.xml + + mkdir -p "${appBinDir}" + cp app/Sourcetrail ${appBinDir}/sourcetrail + cp app/sourcetrail_indexer ${appBinDir}/sourcetrail_indexer + wrapQtApp ${appBinDir}/sourcetrail \ + --prefix PATH : ${lib.makeBinPath binPath} + + mkdir -p $out/bin + '' + lib.optionalString (stdenv.isLinux) '' + ln -sf ${appBinDir}/sourcetrail $out/bin/sourcetrail desktop-file-install --dir=$out/share/applications \ - --set-key Exec --set-value $out/bin/sourcetrail \ + --set-key Exec --set-value ${appBinDir}/sourcetrail \ ../setup/Linux/data/sourcetrail.desktop mkdir -p $out/share/mime/packages cp ../setup/Linux/data/sourcetrail-mime.xml $out/share/mime/packages/ - mkdir -p $out/opt/sourcetrail/share - cp -R ../bin/app/data $out/opt/sourcetrail/share - cp -R ../bin/app/user/projects $out/opt/sourcetrail/share/data/fallback - rm $out/opt/sourcetrail/share/data/*_template.xml - rm -r $out/opt/sourcetrail/share/data/install - for size in 48 64 128 256 512; do mkdir -p $out/share/icons/hicolor/''${size}x''${size}/apps/ - convert app/data/gui/icon/logo_1024_1024.png -resize ''${size}x''${size} \ + convert ${appResourceDir}/data/gui/icon/logo_1024_1024.png \ + -resize ''${size}x''${size} \ $out/share/icons/hicolor/''${size}x''${size}/apps/sourcetrail.png done + '' + lib.optionalString (stdenv.isDarwin) '' + # change case (some people *might* choose a case sensitive Nix store) + mv ${appBinDir}/sourcetrail{,.tmp} + mv ${appBinDir}/{sourcetrail.tmp,Sourcetrail} + mv ${appBinDir}/sourcetrail_indexer ${appResourceDir}/Sourcetrail_indexer - mkdir -p $out/bin - makeQtWrapper $out/opt/sourcetrail/bin/sourcetrail $out/bin/sourcetrail \ - --prefix PATH : ${lib.makeBinPath binPath} + ln -sf ${appBinDir}/Sourcetrail $out/bin/sourcetrail + + cp app/bundle_info.plist ${appPrefixDir}/Info.plist + + mkdir -p ${appResourceDir}/icon.iconset + for size in 16 32 128 256 512; do + convert ${appResourceDir}/data/gui/icon/logo_1024_1024.png \ + -resize ''${size}x''${size} \ + ${appResourceDir}/icon.iconset/icon_''${size}x''${size}.png + convert ${appResourceDir}/data/gui/icon/logo_1024_1024.png \ + -resize $(( 2 * size ))x$(( 2 * size )) \ + ${appResourceDir}/icon.iconset/icon_''${size}x''${size}@2x.png + done + png2icns ${appResourceDir}/icon.icns \ + ${appResourceDir}/icon.iconset/icon_{16x16,32x32,128x128,256x256,512x512,512x512@2x}.png + + mkdir -p ${appResourceDir}/project.iconset + for size in 16 32 64 128 256 512; do + convert ${appResourceDir}/data/gui/icon/project_256_256.png \ + -resize ''${size}x''${size} \ + ${appResourceDir}/project.iconset/icon_''${size}x''${size}.png + convert ${appResourceDir}/data/gui/icon/project_256_256.png \ + -resize $(( 2 * size ))x$(( 2 * size )) \ + ${appResourceDir}/project.iconset/icon_''${size}x''${size}@2x.png + done + png2icns ${appResourceDir}/project.icns \ + ${appResourceDir}/project.iconset/icon_{16x16,32x32,128x128,256x256,512x512,512x512@2x}.png + '' + '' + runHook postInstall ''; checkPhase = '' + runHook preCheck + rm -rf ../bin/app/data/{python,java/lib} ln -s $out/opt/sourcetrail/share/data/python ../bin/app/data/python ln -s $out/opt/sourcetrail/share/data/java/lib ../bin/app/data/java/lib @@ -194,20 +252,24 @@ stdenv.mkDerivation rec { popd rm ../bin/app/data/{python,java/lib} + + runHook postCheck ''; # This has to be done manually in the installPhase because the actual binary # lives in $out/opt/sourcetrail/bin, which isn't covered by wrapQtAppsHook dontWrapQtApps = true; - # FIXME: some test cases are disabled in the patch phase - doCheck = true; + # FIXME: Some test cases are disabled in the patch phase. + # FIXME: Tests are disabled on some platforms because of faulty detection + # logic for libjvm.so. Should work with manual configuration. + doCheck = !stdenv.isDarwin && stdenv.isx86_64; meta = with lib; { homepage = "https://www.sourcetrail.com"; description = "A cross-platform source explorer for C/C++ and Java"; platforms = platforms.all; - license = licenses.gpl3; + license = licenses.gpl3Plus; maintainers = with maintainers; [ midchildan ]; }; } diff --git a/pkgs/development/tools/sourcetrail/python.nix b/pkgs/development/tools/sourcetrail/python.nix index 8ec9c9a2297f..f9ea96463207 100644 --- a/pkgs/development/tools/sourcetrail/python.nix +++ b/pkgs/development/tools/sourcetrail/python.nix @@ -29,6 +29,10 @@ stdenv.mkDerivation rec { make -j $NIX_BUILD_CORES popd popd + '' + lib.optionalString stdenv.isDarwin '' + pushd SourcetrailDB/build/bindings_python + cp _sourcetraildb.dylib _sourcetraildb.so + popd ''; checkPhase = '' @@ -52,7 +56,7 @@ stdenv.mkDerivation rec { pushd SourcetrailDB/build/bindings_python cp sourcetraildb.py $out/libexec - cp _sourcetraildb* $out/libexec/_sourcetraildb.so + cp _sourcetraildb.so $out/libexec/_sourcetraildb.so popd wrapPythonProgramsIn "$out/libexec" "$pythonPath" @@ -64,7 +68,5 @@ stdenv.mkDerivation rec { description = "Python indexer for Sourcetrail"; homepage = "https://github.com/CoatiSoftware/SourcetrailPythonIndexer"; license = licenses.gpl3; - broken = stdenv.isDarwin; - # https://github.com/NixOS/nixpkgs/pull/107533#issuecomment-751063675 }; } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index a1ee44f8c19f..913be0fd257b 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -25140,10 +25140,13 @@ in libspotify = callPackage ../development/libraries/libspotify (config.libspotify or {}); - sourcetrail = libsForQt5.callPackage ../development/tools/sourcetrail { - jdk = jdk8; + sourcetrail = let llvmPackages = llvmPackages_10; + in libsForQt5.callPackage ../development/tools/sourcetrail { + stdenv = if stdenv.cc.isClang then llvmPackages.stdenv else stdenv; + jdk = jdk8; pythonPackages = python3Packages; + inherit llvmPackages; }; spotifywm = callPackage ../applications/audio/spotifywm { };