Android development for accentor

This commit is contained in:
Charlotte Van Petegem 2020-03-19 17:32:01 +01:00
parent f0853adde2
commit 16cf2672c1
6 changed files with 2783 additions and 2 deletions

View file

@ -0,0 +1,18 @@
{ pkgs ? import <nixpkgs> {} }:
with pkgs;
let
buildGradle = callPackage ./gradle-env.nix {};
in
buildGradle {
envSpec = ./gradle-env.json;
src = fetchTarball {
url = "https://github.com/fwcd/kotlin-language-server/archive/master.tar.gz";
sha256 = "0spcxrk6gyxrrwnffsmr2f5y8zs0nq1fq2pkscih56zxz0v3dm50";
};
gradleFlags = [ "server:installDist" ];
installPhase = ''
mkdir -p $out
cp -r server/build/install/server/* $out/
'';
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,283 @@
# 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
# '';
# }
{ stdenv, buildEnv, fetchurl, gradleGen, writeText, writeTextDir }:
{ envSpec
, pname ? null
, version ? null
, enableParallelBuilding ? true
, gradleFlags ? [ "build" ]
, gradlePackage ? null
, enableDebug ? false
, ...
} @ args:
let
inherit (builtins)
filter sort replaceStrings attrValues match fromJSON
concatStringsSep
;
inherit (stdenv.lib)
versionOlder unique mapAttrs last concatMapStringsSep removeSuffix
optionalString groupBy' readFile hasSuffix
;
mkDep = depSpec: stdenv.mkDerivation {
inherit (depSpec) name;
src = fetchurl {
inherit (depSpec) urls sha256;
};
phases = "installPhase";
installPhase = ''
mkdir -p $out/${depSpec.path}
ln -s $src $out/${depSpec.path}/${depSpec.name}
'';
};
mkModuleMetadata = deps:
let
ids = filter
(id: id.type == "pom")
(map (dep: dep.id) deps);
modules = groupBy'
(
meta: id:
let
isNewer = versionOlder meta.latest id.version;
isNewerRelease =
!(hasSuffix "-SNAPSHOT" id.version)
&& versionOlder meta.release id.version;
in {
groupId = id.group;
artifactId = id.name;
latest = if isNewer then id.version else meta.latest;
release = if isNewerRelease then id.version else meta.release;
versions = meta.versions ++ [ id.version ];
}
)
{
latest = "";
release = "";
versions = [];
}
(id: "${replaceStrings [ "." ] [ "/" ] id.group}/${id.name}/maven-metadata.xml")
ids;
in
attrValues (
mapAttrs (
path: meta:
let
versions' = sort versionOlder (unique meta.versions);
in
with meta; writeTextDir path ''
<?xml version="1.0" encoding="UTF-8"?>
<metadata modelVersion="1.1">
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<versioning>
${optionalString (latest != "") "<latest>${latest}</latest>"}
${optionalString (release != "") "<release>${release}</release>"}
<versions>
${concatMapStringsSep "\n " (v: "<version>${v}</version>") versions'}
</versions>
</versioning>
</metadata>
''
) modules
);
mkSnapshotMetadata = deps:
let
snapshotDeps = filter (dep: dep ? build && dep ? timestamp) deps;
modules = groupBy'
(
meta: dep:
let
id = dep.id;
isNewer = dep.build > meta.buildNumber;
# Timestamp values can be bogus, e.g. jitpack.io
updated = if (match "[0-9]{8}\.[0-9]{6}" dep.timestamp) != null
then replaceStrings [ "." ] [ "" ] dep.timestamp
else "";
in {
groupId = id.group;
artifactId = id.name;
version = id.version;
timestamp = if isNewer then dep.timestamp else meta.timestamp;
buildNumber = if isNewer then dep.build else meta.buildNumber;
lastUpdated = if isNewer then updated else meta.lastUpdated;
versions = meta.versions or [] ++ [
{
classifier = id.classifier or "";
extension = id.extension;
value = "${removeSuffix "-SNAPSHOT" id.version}-${dep.timestamp}-${toString dep.build}";
updated = updated;
}
];
}
)
{
timestamp = "";
buildNumber = -1;
lastUpdated = "";
}
(dep: "${replaceStrings [ "." ] [ "/" ] dep.id.group}/${dep.id.name}/${dep.id.version}/maven-metadata.xml")
snapshotDeps;
mkSnapshotVersion = version: ''
<snapshotVersion>
${optionalString (version.classifier != "") "<classifier>${version.classifier}</classifier>"}
<extension>${version.extension}</extension>
<value>${version.value}</value>
${optionalString (version.updated != "") "<updated>${version.updated}</updated>"}
</snapshotVersion>
'';
in
attrValues (
mapAttrs (
path: meta:
with meta; writeTextDir path ''
<?xml version="1.0" encoding="UTF-8"?>
<metadata modelVersion="1.1">
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
<versioning>
<snapshot>
${optionalString (timestamp != "") "<timestamp>${timestamp}</timestamp>"}
${optionalString (buildNumber != -1) "<buildNumber>${toString buildNumber}</buildNumber>"}
</snapshot>
${optionalString (lastUpdated != "") "<lastUpdated>${lastUpdated}</lastUpdated>"}
<snapshotVersions>
${concatMapStringsSep "\n " mkSnapshotVersion versions}
</snapshotVersions>
</versioning>
</metadata>
''
) modules
);
mkRepo = project: type: deps: buildEnv {
name = "${project}-gradle-${type}-env";
paths = map mkDep deps ++ mkModuleMetadata deps ++ mkSnapshotMetadata deps;
};
mkInitScript = projectSpec:
let
repos = mapAttrs (mkRepo projectSpec.name) projectSpec.dependencies;
in
writeText "init.gradle" ''
static def offlineRepo(RepositoryHandler repositories, String env, String path) {
repositories.clear()
repositories.maven {
name "Nix''${env.capitalize()}MavenOffline"
url path
metadataSources {
it.gradleMetadata()
it.mavenPom()
it.artifact()
}
}
repositories.ivy {
name "Nix''${env.capitalize()}IvyOffline"
url path
layout "maven"
metadataSources {
it.gradleMetadata()
it.ivyDescriptor()
it.artifact()
}
}
}
gradle.settingsEvaluated {
offlineRepo(it.pluginManagement.repositories, "plugin", "${repos.plugin}")
}
gradle.projectsLoaded {
allprojects {
buildscript {
offlineRepo(repositories, "buildscript", "${repos.buildscript}")
}
offlineRepo(repositories, "project", "${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 = mapAttrs
(_: p: mkProjectEnv p)
(fromJSON (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 \
${optionalString enableParallelBuilding "--parallel"} \
${optionalString enableDebug "-Dorg.gradle.debug=true"} \
--init-script ${projectEnv.initScript} \
${concatStringsSep " " gradleFlags}
)
runHook postBuild
'';
dontStrip = true;
}
)

View file

@ -51,11 +51,20 @@
virtualisation.docker.enable = true;
users.users.charlotte.extraGroups = [ "docker" "video" "input" "networkmanager" ];
users.users.charlotte.extraGroups = [
"adbusers"
"docker"
"input"
"networkmanager"
"video"
];
environment.systemPackages = with pkgs; [ eid-mw ];
programs.gnupg.package = pkgs.gnupg.override { guiSupport = true; };
programs = {
gnupg.package = pkgs.gnupg.override { guiSupport = true; };
adb.enable = true;
};
home-manager.users.charlotte = { pkgs, ... }: {
nixpkgs.config.allowUnfree = true;

View file

@ -13,6 +13,12 @@ windows:
panes:
- nvim
- git status
- android:
root: "/home/charlotte/repos/accentor/android"
layout: main-vertical
panes:
- nvim
- git status
- desktop:
root: "/home/charlotte/repos/accentor/desktop"
layout: main-vertical

69
shells/android.nix Normal file
View file

@ -0,0 +1,69 @@
let
pkgs = import <nixpkgs> { config.android_sdk.accept_license = true; };
baseVimConfig = import ../programs/neovim/base.nix { inherit pkgs; };
jdtls = import ../packages/jdtls/default.nix { inherit pkgs; stdenv = pkgs.stdenv; };
kotlinls = import ../packages/kotlin-language-server/default.nix { inherit pkgs; };
composed = pkgs.androidenv.composeAndroidPackages {
toolsVersion = "26.1.1";
platformToolsVersion = "28.0.1";
buildToolsVersions = [ "28.0.3" ];
# includeEmulator = false;
# emulatorVersion = "27.2.0";
platformVersions = [ "29" ];
includeSources = false;
includeDocs = false;
# includeSystemImages = false;
# systemImageTypes = [ "default" ];
# abiVersions = [ "armeabi-v7a" ];
# lldbVersions = [ "2.0.2558144" ];
# cmakeVersions = [ "3.6.4111459" ];
# includeNDK = false;
# ndkVersion = "16.1.4479499";
# useGoogleAPIs = false;
# useGoogleTVAddOns = false;
# includeExtras = [ "extras;google;gcm" ];
};
customPlugins.kotlin-vim = pkgs.vimUtils.buildVimPlugin {
name = "kotlin-vim";
src = pkgs.fetchFromGitHub {
owner = "udalov";
repo = "kotlin-vim";
rev = "b9fa728701a0aa0b9a2ffe92f10880348fc27a8f";
sha256 = "1yqzxabhpc4jbdlzhsysp0vi1ayqg0vnpysvx4ynd9961q2fk3sz";
};
};
in
pkgs.mkShell {
buildInputs = with pkgs; [
jdk11
jdtls
(
neovim.override {
configure = {
customRC = baseVimConfig.customRC + ''
" Required for operations modifying multiple buffers like rename
set hidden
let g:LanguageClient_serverCommands = {
\ 'java': ['${jdtls}/bin/jdtls'],
\ 'kotlin': ['${kotlinls}/bin/kotlin-language-server']
\ }
'';
vam.knownPlugins = baseVimConfig.vam.knownPlugins // customPlugins;
vam.pluginDictionaries = (baseVimConfig.vam.pluginDictionaries or []) ++ [
{
names = [
"kotlin-vim"
"LanguageClient-neovim"
];
}
];
};
}
)
];
shellHook = ''
export ANDROID_SDK_ROOT="${composed.androidsdk}/libexec/android-sdk/"
'';
}