Skip to content

Commit a082ce5

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 a082ce5

1 file changed

Lines changed: 77 additions & 1 deletion

File tree

flake.nix

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

0 commit comments

Comments
 (0)