Skip to content

Conversation

grendello
Copy link
Contributor

@grendello grendello commented Dec 6, 2024

Tracking issue: #111491

Builds that work (linux and OSX):

  • arm64
  • x64

Builds that don't (blocked by #111665)

  • arm
  • x86

Build commands that can be used:

CoreCLR itself

./build.sh -Subset clr.runtime+clr.alljits+clr.corelib+clr.nativecorelib+clr.tools+clr.packages+libs -c Debug|Release -os android -arch <arm64|arm|x64|x86>

No subset (CoreCLR+Mono)

./build.sh -arch <arm64|arm|x64|x86> -os android -c Debug|Release

@dotnet-policy-service dotnet-policy-service bot added the community-contribution Indicates that the PR has been added by a community member label Dec 6, 2024
Copy link
Contributor

Tagging subscribers to 'arch-android': @vitek-karas, @simonrozsival, @steveisok, @akoeplinger
See info in area-owners.md if you want to be subscribed.

@grendello grendello force-pushed the dev/grendel/android-build-with-ndk branch from c25fbd9 to 3d9da10 Compare December 6, 2024 20:43
…stem.Security.Cryptography.Native.Android. It will incorrectly try to install in the coreclr build
@steveisok
Copy link
Member

steveisok commented Jan 23, 2025

ok, I think this is ready for another review.

@kotlarmilos can you do another official build pass to make sure we don't break / regress?

Comment on lines 98 to 100
<PropertyGroup>
<CrossBuild Condition="'$(CrossBuild)' == '' and '$(TargetsAndroid)' == 'true'">true</CrossBuild>
</PropertyGroup>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the expected way to invoke build.sh for android? Do we need to pass -cross? If we do need to pass -cross this property should already be set by that.

And if we don't pass -cross: does the code path added in eng/build.sh in this PR kick in? (It seems to be conditioned on -cross being passed to build.sh.)

(So far we have not been passing -cross when building for Android, there is a discussion about that at #56622).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me, locally, this change breaks the build (and so does passing -cross):

$ ./build.sh clr+libs --os android --arch arm64 -c release --restore --build
...
Commencing CoreCLR Repo build
  Error: rootfsDir has been passed, but the location is not valid.

@steveisok are you absolutely sure it's necessary to enable cross build? Using the NDK cmake toolchain definition automatically makes the build a cross one, using the sysroot from the NDK and the appropriate target API+platform libraries and headers.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.
But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.

This is what #56622 discusses - the existing Android builds (Mono Android/Bionic, native AOT Bionic) do not pass -cross. The build infrastructure doesn't think it's a cross build (it's not considered as a cross build in libs build or in runtime build). It gets away with it because including the Android toolchain definition will make things happen.

The issue discusses switching Android build to the -cross plan but that didn't happen. I don't know if we even have Android build machines that would have the correct ROOTFS_DIR set up. We never built Android as -cross except for the community CoreCLR Android port attempt long time ago (none of the things that actually shipped and created official build specified -cross).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though. But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

No, I have not - to what should I point it? The NDK's toolchains/llvm/prebuilt/${OS}/sysroot directory?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we've historically never built Android/iOS/Browser with -cross since they all bring a toolchain with custom cmake and rootfs handling, we've only used -cross for "linux" builds. I'm not sure how hard it will be to untangle that.

That's what I mean by not being convinced we need to explicitly set ROOTFS_DIR in the coreclr build. Only passing the toolchain as a cmake argument will do.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

I'm asking because -cross does a lot more than that and passing both -cross and setting up Android cmake toolchain file will cause many things to be set twice. It feels like it will cause maintenance pain.

We could make it so proper crossgen gets picked for Android even without -cross and clean that up when/if the build gets switched to the real -cross plan.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

As far as I can tell, we only need it for crossgen. On osx (and presumably windows), the crossgen/ilcompiler builds will fail because it'll try to link against libjitinterface_arm64.so instead of libjitinterface_arm64.dylib.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I validated we don't need -cross when building from linux hosts. I pushed a commit to only enable that when on osx for now so that we can move the PR forward.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like _BuildAnyCrossArch is the property we need with a HostOS != TargetOS condition addition.

@ivanpovazan
Copy link
Member

ivanpovazan commented Jan 23, 2025

Please add in the description of the PR which host->target builds have been successfully verified, and what build command was used

Copy link
Member

@ivanpovazan ivanpovazan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

Thanks everyone for your contributions!

@steveisok
Copy link
Member

steveisok commented Jan 24, 2025

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

They are already excluded by this:

<!-- Android 32-bit builds blocked by https://github.com/dotnet/runtime/issues/111665 -->
    <_CoreCLRSupportedOS Condition="'$(TargetsAndroid)' == 'true' and '$(TargetArchitecture)' != 'arm' and '$(TargetArchitecture)' != 'x86'">true</_CoreCLRSupportedOS>

@steveisok steveisok merged commit ee46066 into dotnet:main Jan 24, 2025
156 of 159 checks passed
@grendello grendello deleted the dev/grendel/android-build-with-ndk branch January 27, 2025 07:47
grendello added a commit to grendello/runtime that referenced this pull request Jan 27, 2025
* main: (22 commits)
  Clean up Stopwatch a bit (dotnet#111834)
  JIT: Fix embedded broadcast simd size (dotnet#111638)
  Revert potential UB due to aliasing + more WB removals (dotnet#111733)
  re-enable acceleration of Vector512<long>.op_Multiply (dotnet#111832)
  Handle OSSL 3.4 change to SAN:othername formatting
  JIT: Fix stack allocated arrays for NativeAOT (dotnet#111827)
  JIT: enhance RBO inference for similar compares to constants (dotnet#111766)
  JIT: Don't run optSetBlockWeights when we have PGO data (dotnet#111764)
  [Android] Make sure RuntimeFlavor=CoreCLR when clr subset is specified (dotnet#111821)
  Change empty subject test certificate to include a critical SAN.
  Fix reversed code offsets in GcInfo (dotnet#111792)
  Swap some libraries areas between leads (dotnet#111816)
  Add left-handed spherical and cylindrical billboards (dotnet#109605)
  JIT: revise `optRelopImpliesRelop` to always set `reverseSense` (dotnet#111803)
  Fix Zip64ExtraField handling (dotnet#111802)
  Add build support for Android+CoreCLR (dotnet#110471)
  arm64: Add bic(s) compact encoding (dotnet#111452)
  JIT: Ensure `BBF_PROF_WEIGHT` flag is set when we have PGO data (dotnet#111780)
  Add support for AVX10.2, Add AVX10.2 API surface and template tests (dotnet#111209)
  JIT: Preliminary for enabling inlining late devirted calls (dotnet#111782)
  ...
@github-actions github-actions bot locked and limited conversation to collaborators Feb 26, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.