diff --git a/flake.lock b/flake.lock index edae4af9b..4e76e590a 100644 --- a/flake.lock +++ b/flake.lock @@ -1,8 +1,50 @@ { "nodes": { + "android": { + "inputs": { + "devshell": "devshell", + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1710633978, + "narHash": "sha256-yemnwSvW7cdWtXGpivFA5jDO35rGPs6fqxlQ4l6ODXs=", + "owner": "tadfisher", + "repo": "android-nixpkgs", + "rev": "e91fb3d8517538e5ad9b422c9a4f604b56008a9e", + "type": "github" + }, + "original": { + "owner": "tadfisher", + "repo": "android-nixpkgs", + "type": "github" + } + }, + "devshell": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": [ + "android", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1708939976, + "narHash": "sha256-O5+nFozxz2Vubpdl1YZtPrilcIXPcRAjqNdNE8oCRoA=", + "owner": "numtide", + "repo": "devshell", + "rev": "5ddecd67edbd568ebe0a55905273e56cc82aabe3", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, "fenix": { "inputs": { - "nixpkgs": "nixpkgs", + "nixpkgs": "nixpkgs_2", "rust-analyzer-src": "rust-analyzer-src" }, "locked": { @@ -23,6 +65,42 @@ "inputs": { "systems": "systems" }, + "locked": { + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1709126324, + "narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "d465f4819400de7c8d874d50b982301f28a84605", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "inputs": { + "systems": "systems_3" + }, "locked": { "lastModified": 1710146030, "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", @@ -39,7 +117,7 @@ }, "naersk": { "inputs": { - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_3" }, "locked": { "lastModified": 1698420672, @@ -71,6 +149,22 @@ } }, "nixpkgs": { + "locked": { + "lastModified": 1709237383, + "narHash": "sha256-cy6ArO4k5qTx+l5o+0mL9f5fa86tYUX3ozE1S+Txlds=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1536926ef5621b09bba54035ae2bb6d806d72ac8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { "locked": { "lastModified": 1710631334, "narHash": "sha256-rL5LSYd85kplL5othxK5lmAtjyMOBg390sGBTb3LRMM=", @@ -86,7 +180,7 @@ "type": "github" } }, - "nixpkgs_2": { + "nixpkgs_3": { "locked": { "lastModified": 1710765496, "narHash": "sha256-p7ryWEeQfMwTB6E0wIUd5V2cFTgq+DRRBz2hYGnJZyA=", @@ -100,7 +194,7 @@ "type": "indirect" } }, - "nixpkgs_3": { + "nixpkgs_4": { "locked": { "lastModified": 1710631334, "narHash": "sha256-rL5LSYd85kplL5othxK5lmAtjyMOBg390sGBTb3LRMM=", @@ -118,11 +212,12 @@ }, "root": { "inputs": { + "android": "android", "fenix": "fenix", - "flake-utils": "flake-utils", + "flake-utils": "flake-utils_3", "naersk": "naersk", "nix-filter": "nix-filter", - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs_4" } }, "rust-analyzer-src": { @@ -156,6 +251,36 @@ "repo": "default", "type": "github" } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 9920bf914..a4cdffd54 100644 --- a/flake.nix +++ b/flake.nix @@ -6,8 +6,9 @@ naersk.url = "github:nix-community/naersk"; nix-filter.url = "github:numtide/nix-filter"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + android.url = "github:tadfisher/android-nixpkgs"; }; - outputs = { self, nixpkgs, flake-utils, nix-filter, naersk, fenix }: + outputs = { self, nixpkgs, flake-utils, nix-filter, naersk, fenix, android }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; @@ -15,6 +16,11 @@ fenixPkgs = fenix.packages.${system}; naersk' = pkgs.callPackage naersk { }; manifest = (pkgs.lib.importTOML ./Cargo.toml).package; + androidSdk = android.sdk.${system} (sdkPkgs: + builtins.attrValues { + inherit (sdkPkgs) ndk-24-0-8215888 cmdline-tools-latest; + }); + androidNdkRoot = "${androidSdk}/share/android-sdk/ndk/24.0.8215888"; rustSrc = nix-filter.lib { root = ./.; @@ -251,6 +257,71 @@ LD = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc"; }; + androidAttrs = { + armeabi-v7a = { + cc = "armv7a-linux-androideabi19-clang"; + rustTarget = "armv7-linux-androideabi"; + }; + arm64-v8a = { + cc = "aarch64-linux-android21-clang"; + rustTarget = "aarch64-linux-android"; + }; + x86 = { + cc = "i686-linux-android19-clang"; + rustTarget = "i686-linux-android"; + }; + x86_64 = { + cc = "x86_64-linux-android21-clang"; + rustTarget = "x86_64-linux-android"; + }; + }; + + mkAndroidRustPackage = arch: packageName: + let + rustTarget = androidAttrs.${arch}.rustTarget; + in + let + toolchain = fenixPkgs.combine [ + fenixPkgs.stable.rustc + fenixPkgs.stable.cargo + fenixPkgs.targets.${rustTarget}.stable.rust-std + ]; + naersk-lib = pkgs.callPackage naersk { + cargo = toolchain; + rustc = toolchain; + }; + targetToolchain = "${androidNdkRoot}/toolchains/llvm/prebuilt/linux-x86_64"; + targetCcName = androidAttrs.${arch}.cc; + targetCc = "${targetToolchain}/bin/${targetCcName}"; + in + naersk-lib.buildPackage rec { + pname = packageName; + cargoBuildOptions = x: x ++ [ "--package" packageName ]; + version = manifest.version; + strictDeps = true; + src = rustSrc; + nativeBuildInputs = [ + pkgs.perl # Needed to build vendored OpenSSL. + ]; + auditable = false; # Avoid cargo-auditable failures. + doCheck = false; # Disable test as it requires network access. + + CARGO_BUILD_TARGET = rustTarget; + TARGET_CC = "${targetCc}"; + CARGO_BUILD_RUSTFLAGS = [ + "-C" + "linker=${TARGET_CC}" + ]; + + CC = "${targetCc}"; + LD = "${targetCc}"; + }; + + mkAndroidPackages = arch: { + "deltachat-rpc-server-${arch}-android" = mkAndroidRustPackage arch "deltachat-rpc-server"; + "deltachat-repl-${arch}-android" = mkAndroidRustPackage arch "deltachat-repl"; + }; + mkRustPackages = arch: let rpc-server = mkCrossRustPackage arch "deltachat-rpc-server"; @@ -295,7 +366,11 @@ mkRustPackages "i686-linux" // mkRustPackages "x86_64-linux" // mkRustPackages "armv7l-linux" // - mkRustPackages "armv6l-linux" // rec { + mkRustPackages "armv6l-linux" // + mkAndroidPackages "armeabi-v7a" // + mkAndroidPackages "arm64-v8a" // + mkAndroidPackages "x86" // + mkAndroidPackages "x86_64" // rec { # Run with `nix run .#deltachat-repl foo.db`. deltachat-repl = mkRustPackage "deltachat-repl"; deltachat-rpc-server = mkRustPackage "deltachat-rpc-server";