mirror of
https://github.com/tadfisher/gradle2nix.git
synced 2026-01-12 07:50:53 -05:00
Fix self-hosting
This commit is contained in:
154
app/src/dist/share/gradle-env.nix
vendored
154
app/src/dist/share/gradle-env.nix
vendored
@@ -1,54 +1,130 @@
|
||||
# This file is generated by gradle2nix.
|
||||
#
|
||||
# Example usage (e.g. in default.nix):
|
||||
#
|
||||
# with (import <nixpkgs> {});
|
||||
# let
|
||||
# buildGradle = callPackage ./gradleEnv.nix {};
|
||||
# in
|
||||
# buildGradle {
|
||||
# envSpec = ./gradle-env.json;
|
||||
#
|
||||
# src = ./.;
|
||||
#
|
||||
# gradleFlags = [ "installDist" ];
|
||||
#
|
||||
# installPhase = ''
|
||||
# mkdir -p $out
|
||||
# cp -r app/build/install/myproject $out
|
||||
# '';
|
||||
# }
|
||||
|
||||
{ stdenvNoCC, lib, buildEnv, fetchurl }:
|
||||
{ stdenv, lib, buildEnv, fetchurl, gradleGen, writeText }:
|
||||
|
||||
{ name, repositories, dependencies }:
|
||||
{ envSpec
|
||||
, pname ? null
|
||||
, version ? null
|
||||
, enableParallelBuilding ? true
|
||||
, gradleFlags ? [ "build" ]
|
||||
, gradlePackage ? null
|
||||
, ... } @ args:
|
||||
|
||||
let
|
||||
mkPath = artifact: with artifact; lib.concatStringsSep "/" [
|
||||
(lib.replaceChars ["."] ["/"] artifact.groupId)
|
||||
artifact.artifactId
|
||||
artifact.version
|
||||
];
|
||||
|
||||
mkFilename = artifact: with artifact;
|
||||
"${artifactId}-${version}${lib.optionalString (classifier != "") "-${classifier}"}.${extension}";
|
||||
|
||||
mkMavenUrls = repo: artifact:
|
||||
|
||||
|
||||
mkArtifactUrl = base: artifact:
|
||||
"${lib.removeSuffix "/" base}/${mkPath artifact}/${mkFilename artifact}";
|
||||
|
||||
fetchArtifact = artifact:
|
||||
let
|
||||
artifactPath = mkPath artifact;
|
||||
artifactName = mkFilename artifact;
|
||||
in stdenvNoCC.mkDerivation rec {
|
||||
name = with artifact; lib.concatStrings [
|
||||
(lib.replaceChars ["."] ["_"] groupId) "-"
|
||||
(lib.replaceChars ["."] ["_"] artifactId) "-"
|
||||
version
|
||||
(lib.optionalString (classifier != "") "-${classifier}")
|
||||
"-" type
|
||||
];
|
||||
mkDep = depSpec: stdenv.mkDerivation {
|
||||
inherit (depSpec) name;
|
||||
|
||||
src = fetchurl {
|
||||
name = mkFilename artifact;
|
||||
urls = map (url: mkArtifactUrl url artifact) repositories;
|
||||
inherit (artifact) sha256;
|
||||
inherit (depSpec) urls sha256;
|
||||
};
|
||||
|
||||
phases = "installPhase fixupPhase";
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/${artifactPath}
|
||||
ln -s ${src} $out/${artifactPath}/${artifactName}
|
||||
mkdir -p $out/${depSpec.path}
|
||||
ln -s $src $out/${depSpec.path}/${depSpec.filename}
|
||||
'';
|
||||
};
|
||||
|
||||
in
|
||||
buildEnv {
|
||||
inherit name;
|
||||
paths = map fetchArtifact dependencies;
|
||||
}
|
||||
mkRepo = project: type: deps: buildEnv {
|
||||
name = "${project}-gradle-${type}-env";
|
||||
paths = map mkDep deps;
|
||||
};
|
||||
|
||||
mkInitScript = projectSpec:
|
||||
let
|
||||
repos = builtins.mapAttrs (mkRepo projectSpec.name) projectSpec.dependencies;
|
||||
in
|
||||
writeText "init.gradle" ''
|
||||
gradle.settingsEvaluated {
|
||||
it.pluginManagement.repositories {
|
||||
clear()
|
||||
maven { url = uri("${repos.plugin}") }
|
||||
}
|
||||
}
|
||||
|
||||
gradle.projectsLoaded {
|
||||
allprojects {
|
||||
buildscript {
|
||||
repositories {
|
||||
clear()
|
||||
maven { url = uri("${repos.buildscript}") }
|
||||
}
|
||||
}
|
||||
repositories {
|
||||
clear()
|
||||
maven { url = uri("${repos.project}") }
|
||||
}
|
||||
}
|
||||
}
|
||||
'';
|
||||
|
||||
mkGradle = gradleSpec:
|
||||
gradleGen.gradleGen {
|
||||
inherit (gradleSpec) nativeVersion;
|
||||
|
||||
name = "gradle-${gradleSpec.version}-${gradleSpec.type}";
|
||||
|
||||
src = fetchurl {
|
||||
inherit (gradleSpec) url sha256;
|
||||
};
|
||||
};
|
||||
|
||||
mkProjectEnv = projectSpec: {
|
||||
inherit (projectSpec) name version;
|
||||
initScript = mkInitScript projectSpec;
|
||||
gradle = args.gradlePackage or mkGradle projectSpec.gradle;
|
||||
};
|
||||
|
||||
gradleEnv = builtins.mapAttrs
|
||||
(_: p: mkProjectEnv p)
|
||||
(builtins.fromJSON (builtins.readFile envSpec));
|
||||
|
||||
projectEnv = gradleEnv."";
|
||||
pname = args.pname or projectEnv.name;
|
||||
version = args.version or projectEnv.version;
|
||||
|
||||
in stdenv.mkDerivation (args // {
|
||||
|
||||
inherit pname version;
|
||||
|
||||
nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ projectEnv.gradle ];
|
||||
|
||||
buildPhase = args.buildPhase or ''
|
||||
runHook preBuild
|
||||
|
||||
(
|
||||
set -x
|
||||
env \
|
||||
"GRADLE_USER_HOME=$(mktemp -d)" \
|
||||
gradle --offline --no-daemon --no-build-cache \
|
||||
--info --full-stacktrace --warning-mode=all \
|
||||
${lib.optionalString enableParallelBuilding "--parallel"} \
|
||||
--init-script ${projectEnv.initScript} \
|
||||
${builtins.concatStringsSep " " gradleFlags}
|
||||
)
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
dontStrip = true;
|
||||
})
|
||||
|
||||
@@ -4,9 +4,11 @@ import com.squareup.moshi.JsonClass
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class NixGradleEnv(
|
||||
val project: String,
|
||||
val pluginRepo: List<Dependency>,
|
||||
val projectRepos: Map<String, List<Dependency>>
|
||||
val name: String,
|
||||
val version: String,
|
||||
val path: String,
|
||||
val gradle: DefaultGradle,
|
||||
val dependencies: Map<String, List<Dependency>>
|
||||
)
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
@@ -21,12 +23,18 @@ data class Dependency(
|
||||
fun buildEnv(builds: Map<String, DefaultBuild>): Map<String, NixGradleEnv> =
|
||||
builds.mapValues { (path, build) ->
|
||||
NixGradleEnv(
|
||||
project = path,
|
||||
pluginRepo = buildRepo(build.pluginDependencies).values.toList(),
|
||||
projectRepos = mapOf(
|
||||
"buildscript" to build.rootProject.collectDependencies(DefaultProject::buildscriptDependencies).values.toList(),
|
||||
"project" to build.rootProject.collectDependencies(DefaultProject::projectDependencies).values.toList()
|
||||
))
|
||||
name = build.rootProject.name,
|
||||
version = build.rootProject.version,
|
||||
path = path,
|
||||
gradle = build.gradle,
|
||||
dependencies = mapOf(
|
||||
"plugin" to buildRepo(build.pluginDependencies).values.toList(),
|
||||
"buildscript" to build.rootProject.collectDependencies(DefaultProject::buildscriptDependencies)
|
||||
.values.toList(),
|
||||
"project" to build.rootProject.collectDependencies(DefaultProject::projectDependencies)
|
||||
.values.toList()
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun DefaultProject.collectDependencies(chooser: DefaultProject.() -> DefaultDependencies): Map<DefaultArtifact, Dependency> {
|
||||
|
||||
@@ -33,20 +33,20 @@ data class Config(
|
||||
class Main : CliktCommand(
|
||||
name = "gradle2nix"
|
||||
) {
|
||||
val wrapper: Boolean by option("--gradle-wrapper", "-w",
|
||||
private val wrapper: Boolean by option("--gradle-wrapper", "-w",
|
||||
help = "Use the project's gradle wrapper for building")
|
||||
.flag()
|
||||
|
||||
val gradleVersion: String? by option("--gradle-version", "-g",
|
||||
private val gradleVersion: String? by option("--gradle-version", "-g",
|
||||
metavar = "VERSION",
|
||||
help = "Use a specific Gradle version")
|
||||
|
||||
val configurations: List<String> by option("--configuration", "-c",
|
||||
private val configurations: List<String> by option("--configuration", "-c",
|
||||
metavar = "NAME",
|
||||
help = "Add a configuration to resolve (default: all configurations)")
|
||||
.multiple()
|
||||
|
||||
val includes: List<File> by option("--include", "-i",
|
||||
private val includes: List<File> by option("--include", "-i",
|
||||
metavar = "DIR",
|
||||
help = "Add an additional project to include")
|
||||
.file(exists = true, fileOkay = false, folderOkay = true, readable = true)
|
||||
@@ -60,23 +60,23 @@ class Main : CliktCommand(
|
||||
}
|
||||
}
|
||||
|
||||
val outDir: File? by option("--out-dir", "-o",
|
||||
private val outDir: File? by option("--out-dir", "-o",
|
||||
metavar = "DIR",
|
||||
help = "Path to write generated files (default: PROJECT-DIR)")
|
||||
.file(fileOkay = false, folderOkay = true)
|
||||
|
||||
val envFile: String by option("--env", "-e",
|
||||
private val envFile: String by option("--env", "-e",
|
||||
metavar = "FILENAME",
|
||||
help = "Name of the environment file")
|
||||
.default("gradle-env.json")
|
||||
help = "Prefix for environment files (.json and .nix)")
|
||||
.default("gradle-env")
|
||||
|
||||
val buildSrc: Boolean by option("--build-src", "-b", help = "Include buildSrc project (default: true)")
|
||||
private val buildSrc: Boolean by option("--build-src", "-b", help = "Include buildSrc project (default: true)")
|
||||
.flag("--no-build-src", "-nb", default = true)
|
||||
|
||||
val quiet: Boolean by option("--quiet", "-q", help = "Disable logging")
|
||||
private val quiet: Boolean by option("--quiet", "-q", help = "Disable logging")
|
||||
.flag(default = false)
|
||||
|
||||
val projectDir: File by argument("PROJECT-DIR", help = "Path to the project root (default: .)")
|
||||
private val projectDir: File by argument("PROJECT-DIR", help = "Path to the project root (default: .)")
|
||||
.projectDir()
|
||||
.default(File("."))
|
||||
|
||||
@@ -105,10 +105,11 @@ class Main : CliktCommand(
|
||||
val nixGradleEnv = buildEnv(models)
|
||||
|
||||
val outDir = outDir ?: projectDir
|
||||
val envFile = outDir.resolve(envFile)
|
||||
log("Writing environment to $envFile")
|
||||
|
||||
envFile.sink().buffer().use { out ->
|
||||
val json = outDir.resolve("$envFile.json")
|
||||
log("Writing environment to $json")
|
||||
|
||||
json.sink().buffer().use { out ->
|
||||
Moshi.Builder().build()
|
||||
.adapter<Map<String, NixGradleEnv>>(
|
||||
Types.newParameterizedType(Map::class.java, String::class.java, NixGradleEnv::class.java)
|
||||
@@ -117,6 +118,11 @@ class Main : CliktCommand(
|
||||
.toJson(out, nixGradleEnv)
|
||||
out.flush()
|
||||
}
|
||||
|
||||
val nix = outDir.resolve("$envFile.nix")
|
||||
log("Writing Nix script to $nix")
|
||||
|
||||
File(shareDir).resolve("gradle-env.nix").copyTo(nix, overwrite = true)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user