diff --git a/pkgs/build-support/build-maven.nix b/pkgs/build-support/build-maven.nix index f47e3ebc61c2..7ac8afdde225 100644 --- a/pkgs/build-support/build-maven.nix +++ b/pkgs/build-support/build-maven.nix @@ -1,52 +1,60 @@ -{ stdenv, maven, runCommand, writeText, fetchurl, lib, requireFile }: -/* Takes an info file generated by mvn2nix - * (https://github.com/NixOS/mvn2nix-maven-plugin) and builds the maven - * project with it. - * - * repo: A local maven repository with the project's dependencies. - * - * settings: A settings.xml to pass to maven to use the repo. - * - * build: A simple build derivation that uses mvn compile and package to build - * the project. - */ -infoFile: let +{ stdenv, maven, runCommand, writeText, fetchurl, lib, requireFile, linkFarm }: +# Takes an info file generated by mvn2nix +# (https://github.com/NixOS/mvn2nix-maven-plugin) and builds the maven +# project with it. +# +# repo: A local maven repository with the project's dependencies. +# +# settings: A settings.xml to pass to maven to use the repo. +# +# build: A simple build derivation that uses mvn compile and package to build +# the project. +# +# @example +# project = pkgs.buildMaven ./project-info.json +infoFile: +let info = lib.importJSON infoFile; - script = writeText "build-maven-repository.sh" '' - ${lib.concatStrings (map (dep: let + dependencies = lib.flatten (map (dep: + let inherit (dep) sha1 groupId artifactId version metadata repository-id; - versionDir = dep.unresolved-version or version; authenticated = dep.authenticated or false; url = dep.url or ""; - fetch = if (url != "") then ((if authenticated then requireFile else fetchurl) { - inherit url sha1; - }) else ""; + fetch = if (url != "") then + ((if authenticated then requireFile else fetchurl) { + inherit url sha1; + }) + else + ""; fetchMetadata = (if authenticated then requireFile else fetchurl) { inherit (metadata) url sha1; }; - in '' - dir=$out/$(echo ${groupId} | sed 's|\.|/|g')/${artifactId}/${versionDir} - mkdir -p $dir - ${lib.optionalString (fetch != "") '' - ln -sv ${fetch} $dir/${fetch.name} - ''} - ${lib.optionalString (dep ? metadata) '' - ln -svf ${fetchMetadata} $dir/maven-metadata-${repository-id}.xml - ${lib.optionalString (fetch != "") '' - ln -sv ${fetch} $dir/$(echo ${fetch.name} | sed 's|${version}|${dep.unresolved-version}|') - ''} - ''} - '') info.dependencies)} - ''; + layout = "${ + builtins.replaceStrings [ "." ] [ "/" ] groupId + }/${artifactId}/${versionDir}"; + in lib.optional (url != "") { + layout = "${layout}/${fetch.name}"; + drv = fetch; + } ++ lib.optionals (dep ? metadata) ([{ + layout = "${layout}/maven-metadata-${repository-id}.xml"; + drv = fetchMetadata; + }] ++ lib.optional (fetch != "") { + layout = "${layout}/${ + builtins.replaceStrings [ version ] [ dep.unresolved-version ] + fetch.name + }"; + drv = fetch; + })) info.dependencies); - repo = runCommand "maven-repository" {} '' - bash ${script} - ''; + repo = linkFarm "maven-repository" (lib.forEach dependencies (dependency: { + name = dependency.layout; + path = dependency.drv; + })); settings = writeText "settings.xml" ''