about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/tools/sourcetrail/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/tools/sourcetrail/default.nix')
-rw-r--r--nixpkgs/pkgs/development/tools/sourcetrail/default.nix136
1 files changed, 99 insertions, 37 deletions
diff --git a/nixpkgs/pkgs/development/tools/sourcetrail/default.nix b/nixpkgs/pkgs/development/tools/sourcetrail/default.nix
index 46f097e5b60a..7b06e720caab 100644
--- a/nixpkgs/pkgs/development/tools/sourcetrail/default.nix
+++ b/nixpkgs/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 ];
   };
 }