From 2c3ad4ef9c5715fd5b74b4a664b54f5ab8ac7a2c Mon Sep 17 00:00:00 2001 From: Thiago Kenji Okada Date: Fri, 5 Feb 2021 11:13:00 -0300 Subject: [PATCH] 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. --- .../tools/misc/clojure-lsp/default.nix | 79 +++++++++---------- .../tools/misc/clojure-lsp/repository.nix | 40 ++++++++++ 2 files changed, 76 insertions(+), 43 deletions(-) create mode 100644 pkgs/development/tools/misc/clojure-lsp/repository.nix diff --git a/pkgs/development/tools/misc/clojure-lsp/default.nix b/pkgs/development/tools/misc/clojure-lsp/default.nix index e8f36596efa..c0d4567fe0b 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="; }; - dontUnpack = true; + repository = callPackage ./repository.nix { + inherit src pname version; + leiningen = leiningen11; + }; +in stdenv.mkDerivation rec { + inherit src pname version; - buildInputs = [ graalvm11-ce ]; + postPatch = '' + # Hack to set maven cache in another directory since MAVEN_OPTS doesn't work + substituteInPlace project.clj \ + --replace ":main" ":local-repo \"${repository}\" :main" + ''; + + GRAALVM_HOME = 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") + runHook preBuild - native-image "''${args[@]}" + 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 00000000000..122096e9657 --- /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="; +}