Newer
Older
{
description = "The PrivateStorage Mobile application";
inputs = {
nixpkgs = {
url = "github:NixOS/nixpkgs?ref=nixos-22.05";
};
flake-utils.url = "github:numtide/flake-utils";
pypi-deps-db = {
flake = false;
url = "github:DavHau/pypi-deps-db";
};
mach-nix-flake = {
flake = true;
url = "github:DavHau/mach-nix";
inputs = {
nixpkgs.follows = "nixpkgs";
flake-utils.follows = "flake-utils";
pypi-deps-db.follows = "pypi-deps-db";
};
};
buildozerSrc = {
flake = false;
url = "github:PrivateStorageio/buildozer?ref=build-without-installing";
};
pythonForAndroidSrc = {
flake = false;
url = "github:PrivateStorageio/python-for-android?ref=work-on-nixos";
};
};
outputs = { self, nixpkgs, flake-utils, mach-nix-flake, buildozerSrc, pythonForAndroidSrc, ... }:
flake-utils.lib.eachSystem [
"x86_64-linux"
] (system: let
mach-nix = mach-nix-flake.lib.${system};
config = {
allowUnfree = true;
android_sdk.accept_license = true;
};
lib = pkgs.lib;
python-for-android = mach-nix.buildPythonPackage {
src = pythonForAndroidSrc;
requirementsExtra = ''
sh>=1.10
'';
};
buildozer = mach-nix.buildPythonPackage {
src = buildozerSrc;
packagesExtra = [ ];
};
kivy-env = mach-nix.mkPython {
python = "python39";
requirements = ''
kivy
Pillow
cython
'';
packagesExtra = [ python-for-android buildozer ];
};
# THESE MUST AGREE WITH app/app/build.gradle
#
# If they do not you will get failures that look something like:
# FAILURE: Build failed with an exception.
#
# * What went wrong:
# Could not determine the dependencies of task ':app:compileReleaseJavaWithJavac'.
# > Failed to install the following SDK components:
# platforms;android-32 Android SDK Platform 32
# The SDK directory is not writable (/nix/store/46214a16f22rd7q8vkrhsa907ra0405l-androidsdk/libexec/android-sdk)
cmakeVersion = "3.10.2";
# Check out pkgs/development/mobile/androidenv/repo.json for
# nixpkgs-supported versions.
ndkVersion = "23.0.7123448-rc1";
# Also includes ndk
androidComposition = pkgs.callPackage ./android.nix {
inherit cmakeVersion buildToolsVersion platformVersion ndkVersion;
getBuildInputs = getInputs: xs: builtins.foldl' (accum: drv: (getInputs drv) ++ accum) [] xs;
# Make sure gradle uses the aapt2 from our Android SDK. Otherwise it
# downloads one from the internet that doesn't work because it
# specifies an interpreter (ld.so) that nothing has ensured will
# exist.
#
# Without this you get a stack of build errors that look a bit like:
#
# Execution failed for task ':app:processDebugResources'.
# > Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
# > Failed to transform appcompat-1.3.0.aar (androidx.appcompat:appcompat:1.3.0) to match attributes {artifactType=android-compiled-dependencies-resources, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.libraryelements=aar, org.gradle.status=release, org.gradle.usage=java-runtime}.
# > Execution failed for AarResourcesCompilerTransform: /home/exarkun/.gradle/caches/transforms-3/f5908003b5fc10a9cf0fd543db10ae32/transformed/appcompat-1.3.0.
# > AAPT2 aapt2-7.2.1-7984345-linux Daemon #1: Daemon startup failed
# This should not happen under normal circumstances, please file an issue if it does.
ANDROIDSDK = "${androidComposition.androidsdk}/libexec/android-sdk";
gradle-wrapper = pkgs.writeShellApplication {
name = "gradle";
text = ''
${pkgs.gradle}/bin/gradle -Pandroid.aapt2FromMavenOverride=${ANDROIDSDK}/build-tools/${buildToolsVersion}/aapt2 "$@"
in {
packages.apk = pkgs.androidenv.buildApp {
name = "PrivateStorage Mobile";
src = ./app;
release = false;
platformVersions = [ platformVersion ];
includeNDK = false;
};
type = "app";
program = let
emulator = pkgs.androidenv.emulateApp {
name = "PrivateStorage Mobile";
inherit platformVersion;
abiVersion = "x86_64";
systemImageType = "default";
Jean-Paul Calderone
committed
app = self.packages.${system}.apk;
package = "MyApp";
activity = "MainActivity";
};
in
"${emulator}/bin/run-test-emulator";
};
devShells.gradle = pkgs.mkShell rec {
name = "nix-native";
version = "2022.11.09";
ANDROIDNDK = "${ANDROIDSDK}/ndk-bundle";
ANDROID_SDK_ROOT = ANDROIDSDK;
ANDROID_NDK_ROOT = ANDROIDNDK;
# Deprecated but ... :shrug:
ANDROID_HOME = ANDROIDSDK;
ANDROID_PLATFORM_VERSION = "${platformVersion}";
# https://nix.dev/tutorials/cross-compilation
buildInputs = with pkgs; [
ant
android-studio
android-tools
(python310.withPackages (ps: with ps; [ build ]))
shellHook = ''
# Tell the tools a third time where the SDK and NDK are to be found.
cat >app/local.properties <<EOF
# THIS FILE IS AUTOMATICALLY GENERATED
# DO NOT EDIT
# YOUR CHANGES WILL BE DESTROYED
sdk.dir=${ANDROIDSDK}
};
devShells.default = self.devShells.${system}.gradle;
# https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/android.section.md
# is a good reference for this stuff.
devShells.kivy = pkgs.mkShell rec {
name = "ps-mobile";
version = "2022.10.21";
# The docs talk about ANDROID_SDK_ROOT but apparently it has been
# renamed yet again.
ANDROIDSDK = "${androidComposition.androidsdk}/libexec/android-sdk";
ANDROIDNDK = "${ANDROIDSDK}/ndk-bundle";
shellHook = ''
export PATH="$(echo "$ANDROIDSDK/cmake/${cmakeVersion}".*/bin):$PATH"
'';
buildInputs = with pkgs; [
android-studio
kivy-env
# https://github.com/kivy/python-for-android/blob/v2020.04.29/doc/source/troubleshooting.rst#errors-related-to-java-version
openjdk8
Jean-Paul Calderone
committed
# python-for-android recipes all want to download and unpack their
# own sources! aaaaaa
unzip
] ++
# Also we need build dependencies for all of the things it is going to
# build!
(getBuildInputs (drv: drv.buildInputs) [ openssl libffi python39 ]);
nativeBuildInputs =
with pkgs; getBuildInputs (drv: drv.nativeBuildInputs) [ openssl libffi python39 ];
};
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
} // {
packages.aarch64-android.host-python310 = (pkgs.pkgsCross.aarch64-android.python310.override {
# Turn off all the things. Each one might be broken for
# cross-compilation and even if not we don't need them for this build
# Python. We just need it to report the right platform info.
mimetypesSupport = false;
x11Support = false;
bluezSupport = false;
sqlite = null;
openssl = null;
tzdata = null;
readline = null;
}).overrideAttrs (old: {
# Turn off even more things which aren't parameters to the Python
# expression.
# These drag in an aarch64-android bash which fails to build.
preFixup = null;
postPatch = null;
# This drags in a -lcrypt dependency which isn't satisfied by Google
# Android Bionic.
LIBS = null;
});
# packages.aarch64-android.zfec = self.packages.aarch64-android.host-python310.buildPythonPackage;
# let
# build-python = pkgs.pkgsCross.${system}.python310;
# host-python = pkgs.pkgsCross.aarch64-android.python310;
# build-pyenv = build-python.withPackages (ps: [ (ps.callPackage ./crossenv.nix) ]);
# in
# pkgs.mkDerivation {
# name = "python3.10-zfec";
# version = "2.3.4"; # XXX
# src = fetchPypi
# };