summary refs log tree commit diff
path: root/pkgs/development/tools/misc/clojure-lsp
diff options
context:
space:
mode:
authorThiago Kenji Okada <thiagokokada@gmail.com>2021-02-05 11:13:00 -0300
committerThiago Kenji Okada <thiagokokada@gmail.com>2021-02-19 10:38:31 -0300
commit2c3ad4ef9c5715fd5b74b4a664b54f5ab8ac7a2c (patch)
tree60c07db3869cad66c36ae5108f87f5f290cfea81 /pkgs/development/tools/misc/clojure-lsp
parentcd98c0e4baafaa8c3abd6701c8468c26d6683e49 (diff)
clojure-lsp: build it from source
Nowadays we build it from the jar released from upstream, but this PRs
changes it to build it from source code.
Diffstat (limited to 'pkgs/development/tools/misc/clojure-lsp')
-rw-r--r--pkgs/development/tools/misc/clojure-lsp/default.nix81
-rw-r--r--pkgs/development/tools/misc/clojure-lsp/repository.nix40
2 files changed, 77 insertions, 44 deletions
diff --git a/pkgs/development/tools/misc/clojure-lsp/default.nix b/pkgs/development/tools/misc/clojure-lsp/default.nix
index e8f36596efad0..c0d4567fe0b77 100644
--- a/pkgs/development/tools/misc/clojure-lsp/default.nix
+++ b/pkgs/development/tools/misc/clojure-lsp/default.nix
@@ -1,66 +1,59 @@
-{ lib, stdenv, fetchurl, fetchFromGitHub, graalvm11-ce, babashka }:
+{ lib, stdenv, callPackage, fetchFromGitHub, leiningen, openjdk11
+, graalvm11-ce, babashka }:
 
-stdenv.mkDerivation rec {
+let
   pname = "clojure-lsp";
   version = "2021.02.14-19.46.47";
+  leiningen11 = leiningen.override ({ jdk = openjdk11; });
 
-  src = fetchurl {
-    url = "https://github.com/clojure-lsp/clojure-lsp/releases/download/${version}/${pname}.jar";
-    sha256 = "sha256-fLwubRwWa1fu37bdkaCr2uZK79z37wqPLToOb5BlegY=";
-  };
-
-  # For tests
-  ghSrc = fetchFromGitHub {
+  src = fetchFromGitHub {
     owner = pname;
     repo = pname;
     rev = version;
-    sha256 = "1ydf8bgwvjp77wyhjqwzn7crpn5hxmq701czlkhpm5ablnxcwhn7";
+    sha256 = "sha256-Zj7/8RcuxCy2xdd+5jeOb1GTsQsX0EVW32k32fA6uf4=";
+  };
+
+  repository = callPackage ./repository.nix {
+    inherit src pname version;
+    leiningen = leiningen11;
   };
+in stdenv.mkDerivation rec {
+  inherit src pname version;
+
+  postPatch = ''
+    # Hack to set maven cache in another directory since MAVEN_OPTS doesn't work
+    substituteInPlace project.clj \
+      --replace ":main" ":local-repo \"${repository}\" :main"
+  '';
 
-  dontUnpack = true;
+  GRAALVM_HOME = graalvm11-ce;
 
-  buildInputs = [ graalvm11-ce ];
+  buildInputs = [ graalvm11-ce leiningen11 repository ];
 
   buildPhase = with lib; ''
-    args=("-jar" "${src}"
-          "-H:Name=clojure-lsp"
-          ${optionalString stdenv.isDarwin ''"-H:-CheckToolchain"''}
-          "-J-Dclojure.compiler.direct-linking=true"
-          "-J-Dclojure.spec.skip-macros=true"
-          "-H:+ReportExceptionStackTraces"
-          "--enable-url-protocols=jar"
-          # TODO: Enable in GraalVM 21.0.0
-          # "-H:+InlineBeforeAnalysis"
-          "-H:Log=registerResource:"
-          "--verbose"
-          "-H:IncludeResources=\"CLOJURE_LSP_VERSION|db/.*|static/.*|templates/.*|.*.yml|.*.xml|.*/org/sqlite/.*|org/sqlite/.*|.*.properties\""
-          "-H:ConfigurationFileDirectories=graalvm"
-          "--initialize-at-build-time"
-          "--report-unsupported-elements-at-runtime"
-          "--no-server"
-          "--no-fallback"
-          "--native-image-info"
-          "--allow-incomplete-classpath"
-          "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileReader"
-          "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiFileReader"
-          "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.MixerProvider"
-          "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.FormatConversionProvider"
-          "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileWriter"
-          "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiDeviceProvider"
-          "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.SoundbankReader"
-          "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiFileWriter"
-          "-J-Xmx4g")
-
-    native-image "''${args[@]}"
+    runHook preBuild
+
+    export LEIN_HOME="$(mktemp -d)"
+    bash ./graalvm/native-unix-compile.sh
+
+    runHook postBuild
   '';
 
   installPhase = ''
-    install -Dm755 clojure-lsp $out/bin/clojure-lsp
+    runHook preInstall
+
+    install -Dm755 ./clojure-lsp $out/bin/clojure-lsp
+
+    runHook postInstall
   '';
 
   doCheck = true;
   checkPhase = ''
-    ${babashka}/bin/bb ${ghSrc}/integration-test/run-all.clj ./clojure-lsp
+    runHook preCheck
+
+    ${babashka}/bin/bb ./integration-test/run-all.clj ./clojure-lsp
+
+    runHook postCheck
   '';
 
   meta = with lib; {
diff --git a/pkgs/development/tools/misc/clojure-lsp/repository.nix b/pkgs/development/tools/misc/clojure-lsp/repository.nix
new file mode 100644
index 0000000000000..122096e9657ad
--- /dev/null
+++ b/pkgs/development/tools/misc/clojure-lsp/repository.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, src, pname, version, leiningen }:
+
+stdenv.mkDerivation {
+  inherit src;
+
+  name = "${pname}-${version}-repository";
+  buildInputs = [ leiningen ];
+
+  postPatch = ''
+    # Hack to set maven cache in another directory since MAVEN_OPTS doesn't work
+    substituteInPlace project.clj \
+      --replace ":main" ":local-repo \"$out\" :main"
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+
+    export LEIN_HOME="$(mktemp -d)"
+    lein with-profiles +native-image deps
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    find $out -type f \
+      -name \*.lastUpdated -or \
+      -name resolver-status.properties -or \
+      -name _remote.repositories \
+      -delete
+
+    runHook postInstall
+  '';
+
+  dontFixup = true;
+  outputHashAlgo = "sha256";
+  outputHashMode = "recursive";
+  outputHash = "sha256-aWZPsJF32ENyYNZCHf5amxVF9pb+5M73JqG/OITZlak=";
+}