Skip to content

Commit 179271f

Browse files
committed
feat(nix): add android cross-compilation packages
This commit presents the rest of the work to provide android builds, the packaging and compiling is done trough nix for simplicity
1 parent 6e4d238 commit 179271f

1 file changed

Lines changed: 75 additions & 0 deletions

File tree

flake.nix

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,81 @@
7777
pkgs.gcc.cc.lib
7878
];
7979
};
80+
packages =
81+
# Android build infrastructure (unfree NDK + SDK).
82+
let
83+
androidPkgs = import nixpkgs {
84+
inherit system;
85+
config.android_sdk.accept_license = true;
86+
config.allowUnfree = true;
87+
};
88+
androidComposition = androidPkgs.androidenv.composeAndroidPackages {
89+
platformVersions = [ "34" ];
90+
ndkVersions = [ "27.2.12479018" ];
91+
includeNDK = true;
92+
};
93+
androidSdk = androidComposition.androidsdk;
94+
androidNdk = "${androidSdk}/libexec/android-sdk/ndk/27.2.12479018";
95+
96+
mkAndroidPackage =
97+
rustTarget:
98+
let
99+
rustTargetToolchain = fenix.packages.${system}.combine [
100+
rustToolchain.rustc
101+
rustToolchain.cargo
102+
rustToolchain.rust-src
103+
rustToolchain.rust-std
104+
(fenix.packages.${system}.targets.${rustTarget}.fromToolchainName {
105+
name = rustVersion;
106+
sha256 = "sha256-ks0nMEGGXKrHnfv4Fku+vhQ7gx76ruv6Ij4fKZR3l78=";
107+
}).rust-std
108+
];
109+
rustPlatform = androidPkgs.makeRustPlatform {
110+
cargo = rustTargetToolchain;
111+
rustc = rustTargetToolchain;
112+
};
113+
in
114+
rustPlatform.buildRustPackage {
115+
pname = "libbitcoinkernel-${rustTarget}";
116+
version = "0.2.0";
117+
src = ./.;
118+
cargoLock.lockFile = ./Cargo-minimal.lock;
119+
postPatch = ''
120+
cp ${./Cargo-minimal.lock} Cargo.lock
121+
'';
122+
nativeBuildInputs = [
123+
androidPkgs.cmake
124+
androidPkgs.boost.dev
125+
androidSdk
126+
];
127+
128+
LIBCLANG_PATH = "${androidPkgs.llvmPackages.clang-unwrapped.lib}/lib/";
129+
ANDROID_HOME = "${androidSdk}/libexec/android-sdk";
130+
ANDROID_NDK_HOME = androidNdk;
131+
ANDROID_NDK_ROOT = androidNdk;
132+
CMAKE_PREFIX_PATH = "${androidPkgs.boost.dev}";
133+
134+
# cargoBuildHook hardcodes the host --target at
135+
# derivation time, so we bypass it for cross builds.
136+
dontCargoBuild = true;
137+
doCheck = false;
138+
buildPhase = ''
139+
cargo build -p libbitcoinkernel-sys --target ${rustTarget} --offline --release
140+
'';
141+
installPhase = ''
142+
mkdir -p $out/lib $out/include
143+
find target/${rustTarget}/release -path "*/out/install/lib/*.a" \
144+
-exec cp {} $out/lib/ \;
145+
find target/${rustTarget}/release -path "*/out/install/include/*" \
146+
-exec cp {} $out/include/ \;
147+
'';
148+
};
149+
in
150+
{
151+
android-aarch64 = mkAndroidPackage "aarch64-linux-android";
152+
android-armv7 = mkAndroidPackage "armv7-linux-androideabi";
153+
android-x86_64 = mkAndroidPackage "x86_64-linux-android";
154+
};
80155
}
81156
);
82157
}

0 commit comments

Comments
 (0)