{ stdenv , jdk17 , gradle_7 , lib , fetchFromGitHub , jre , perl , git , util-linux }: let pname = "pkl"; version = "0.25.1"; src = fetchFromGitHub { owner = "apple"; repo = "pkl"; rev = "0.25.1"; sha256 = "sha256-/I1dxGXYVUClEQXXtSqEyopClNTqseeWpAiyeaPrIGo="; }; # fake build to pre-download deps into fixed-output derivation deps = stdenv.mkDerivation { pname = "${pname}-deps"; inherit src version; nativeBuildInputs = [ git gradle_7 jdk17 perl ]; # Here we download dependencies for both the server and the client so # we only have to specify one hash for 'deps'. Deps can be garbage # collected after the build, so this is not really an issue. buildPhase = '' export GRADLE_USER_HOME=$(mktemp -d) # https://github.com/apple/pkl/issues/66 gradle --no-daemon \ bench:dependencies \ docs:dependencies \ pkl-cli:dependencies \ pkl-codegen-java:dependencies \ pkl-codegen-kotlin:dependencies \ pkl-commons:dependencies \ pkl-commons-cli:dependencies \ pkl-commons-test:dependencies \ pkl-config-java:dependencies \ pkl-config-kotlin:dependencies \ pkl-core:dependencies \ pkl-doc:dependencies \ pkl-executor:dependencies \ pkl-gradle:dependencies \ pkl-server:dependencies \ pkl-tools:dependencies \ stdlib:dependencies \ bench:spotlessJava ''; # Taken from Mindustry derivation # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar) installPhase = '' find $GRADLE_USER_HOME/caches/modules-2 -type f -regex '.*\.\(jar\|pom\)' \ | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \ | sh # For some reason, some of the jars, but not all, had the unexpected # string "-gradle70" before its extension. This snippet removes it find "$out" -type f -iname "*-gradle70.jar" -exec ${util-linux}/bin/rename -- "-gradle70" "" {} \; ''; outputHashMode = "recursive"; outputHash = "sha256-iLC2WI9UJWOQ14U6Rd+B+8OPD/ji+aTsjUT+YMbJuv0="; }; in stdenv.mkDerivation rec { inherit pname version src deps; nativeBuildInputs = [ git gradle_7 jdk17 ]; buildInputs = [ jre ]; buildPhase = '' export GRADLE_USER_HOME=$(mktemp -d) sed -ie "s#repositories {#repositories { maven { url = uri(\"${deps}\") }#g" settings.gradle.kts sed -ie "s#repositories {#repositories { maven { url = uri(\"${deps}\") }#g" ./buildSrc/src/main/kotlin/pklAllProjects.gradle.kts sed -ie "s#repositories {#repositories { maven { url = uri(\"${deps}\") }#g" ./pkl-gradle/src/test/kotlin/org/pkl/gradle/JavaCodeGeneratorsTest.kt sed -ie "s#repositories {#repositories { maven { url = uri(\"${deps}\") }#g" ./pkl-gradle/src/test/kotlin/org/pkl/gradle/KotlinCodeGeneratorsTest.kt sed -ie "s#repositories {#repositories { maven { url = uri(\"${deps}\") }#g" ./buildSrc/settings.gradle.kts gradle --no-daemon --offline --info --stacktrace build ''; installPhase = '' mkdir -p "$out/bin" install -Dm755 "./pkl-cli/build/executable/jpkl" "$out/bin/pkl" ''; meta = with lib; { description = "A configuration as code language with rich validation and tooling. "; homepage = "https://pkl-lang.org/main/current/index.html"; licence = licenses.asl20; platforms = platforms.all; maintainers = with maintainers; [ rafaelrc ]; mainProgram = "pkl"; }; }