keycast 0.1.6

A convient wrapper around mdns_sd for local service discovery
Documentation
{
  description = "Build Rust crate for Android (arm64-v8a)";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils, ... }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs {
          inherit system;
          config.allowUnfree = true;
          config.android_sdk.accept_license = true;
        };
        pkgBuildInputs = with pkgs; [
          pkgs.glibc
          rust
          sdk
          ndk
          pkg-config
          cmake
        ];
        ndkVersion = "27.0.12077973";

        rust = pkgs.rustup;

        # Android SDK + NDK setup
        androidEnv = pkgs.androidenv.composeAndroidPackages {
          cmdLineToolsVersion = "12.0";
          platformToolsVersion = "34.0.5";
          buildToolsVersions = [ "34.0.0" ];
          platformVersions = [ "34" ];
          ndkVersion = ndkVersion;
          includeNDK = true;
        };

        ndk = androidEnv.ndk-bundle;
        sdk = androidEnv.androidsdk;

      in {
        packages.default = pkgs.stdenv.mkDerivation {
          pname = "libkeycast";
          version = "0.1.0";

          src = ./.;

          nativeBuildInputs = [
            rust
            ndk
          ];

          buildPhase = ''
            export NDK_HOME=${ndk}
            export SDK_NDK=${ndk}/libexec/android-sdk/ndk/${ndkVersion}
            export PATH=$SDK_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
            
            # Setup environment for Android target
            export CC_aarch64_linux_android=aarch64-linux-android24-clang
            export CXX_aarch64_linux_android=aarch64-linux-android24-clang++
            export AR_aarch64_linux_android=llvm-ar

            rustup target add aarch64-linux-android

            # Build Rust crate as shared library (.so)
            cargo build --release --target aarch64-linux-android
          '';

          installPhase = ''
            mkdir -p $out/lib
            cp target/aarch64-linux-android/release/*.so $out/lib/
          '';
        };

        devShells.default = pkgs.mkShell {
          name = "rust-android-devshell";
          buildInputs = pkgBuildInputs;

          shellHook = ''
            export NDK_HOME=${ndk}
            export SDK_NDK=${ndk}/libexec/android-sdk/ndk/${ndkVersion}
            export PATH=$SDK_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
            
            export CC_aarch64_linux_android=aarch64-linux-android24-clang
            export CXX_aarch64_linux_android=aarch64-linux-android24-clang++
            export AR_aarch64_linux_android=llvm-ar

            export GNU32="${pkgs.pkgsCross.gnu32.glibc.dev}";
            export C_INCLUDE_PATH="${pkgs.pkgsCross.gnu32.glibc.dev}/include";
            echo "✅ Android NDK ready for Rust cross-compilation"
            echo "You can now run: cargo build --target aarch64-linux-android --release"
          '';
        };
      });
}