Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add script to build the rust sdk locally and from different repo / branch #1582

Merged
merged 3 commits into from
Oct 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 4 additions & 9 deletions docs/_developer_onboarding.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ You can also have access to the aars through the [release](https://github.com/ma

#### Build the SDK locally

Easiest way: run the script [./tools/sdk/build_rust_sdk.sh](./tools/sdk/build_rust_sdk.sh) and just answer the questions.

Legacy way:

If you need to locally build the sdk-android you can use
the [build](https://github.com/matrix-org/matrix-rust-components-kotlin/blob/main/scripts/build.sh) script.

Expand Down Expand Up @@ -147,15 +151,6 @@ Troubleshooting:
- If you get the error `thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', .cargo/registry/src/index.crates.io-6f17d22bba15001f/cargo-ndk-2.11.0/src/cli.rs:345:18` try updating your Cargo NDK version. In this case, 2.11.0 is too old so `cargo install cargo-ndk` to install a newer version.
- If you get the error `Unsupported class file major version 64` try changing your JVM version. In this case, Java 20 is not supported in Gradle yet, so downgrade to an earlier version (Java 17 worked in this case).

Finally let the `matrix/impl` module use this aar by changing the dependencies from `libs.matrix.sdk` to `projects.libraries.rustsdk`:

```groovy
dependencies {
api(projects.libraries.rustsdk) // <- use the local version of the sdk. Uncomment this line.
//implementation(libs.matrix.sdk) // <- use the released version. Comment this line.
}
```

You are good to test your local rust development now!

### The Android project
Expand Down
9 changes: 7 additions & 2 deletions libraries/matrix/impl/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,13 @@ anvil {
}

dependencies {
// implementation(projects.libraries.rustsdk)
implementation(libs.matrix.sdk)
releaseImplementation(libs.matrix.sdk)
if (file("${rootDir.path}/libraries/rustsdk/matrix-rust-sdk.aar").exists()) {

Choose a reason for hiding this comment

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

Just for safety, could we make it so that this if works only for debug builds? (i.e. release builds will always use implementation(libs.matrix.sdk) no matter what?)

Copy link
Member Author

Choose a reason for hiding this comment

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

Good point. It's not possible to commit the sdk: *.aar file are git ignored, so I think it's fine. The idea is to avoid editing this file (and so committing it by mistake)

Choose a reason for hiding this comment

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

Yeah but adding a releaseImplementation() and haveing the if using only debugImplementation could be an additional layer of safety

Copy link
Member Author

Choose a reason for hiding this comment

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

You mean having something like:

    releaseImplementation(libs.matrix.sdk)
    if (file("${rootDir.path}/libraries/rustsdk/matrix-rust-sdk.aar").exists()) {
        println("\nNote: Using local binary of the Rust SDK.\n")
        debugImplementation(projects.libraries.rustsdk)
    } else {
        debugImplementation(libs.matrix.sdk)
    }

?

I am wondering now if we may want to test the release build with a local SDK :)

Copy link

@julioromano julioromano Oct 17, 2023

Choose a reason for hiding this comment

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

Yes. That's what I had in mind. In the rare case we'd like to test a release build with a local sdk we'll have to manually change the gradle file.
This seems to me an added level of safety. But if you feel I'm being paranoid don't be afraid to say it, sometimes I am.

Copy link
Member Author

Choose a reason for hiding this comment

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

Works for me. Better safe than sorry!

println("\nNote: Using local binary of the Rust SDK.\n")
debugImplementation(projects.libraries.rustsdk)
} else {
debugImplementation(libs.matrix.sdk)
}
implementation(projects.libraries.di)
implementation(projects.libraries.androidutils)
implementation(projects.libraries.network)
Expand Down
80 changes: 80 additions & 0 deletions tools/sdk/build_rust_sdk.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#!/usr/bin/env bash

# Exit on error
set -e

# Ask to build from local source or to clone the repository
read -p "Do you want to build the Rust SDK from local source (yes/no) default to yes? " buildLocal
buildLocal=${buildLocal:-yes}

date=$(gdate +%Y%m%d%H%M%S)

# Ask for the Rust SDK local source path
# if folder rustSdk/ exists, use it as default
if [ ${buildLocal} == "yes" ]; then
read -p "Please enter the path to the Rust SDK local source, default to ../matrix-rust-sdk" rustSdkPath
rustSdkPath=${rustSdkPath:-../matrix-rust-sdk/}
if [ ! -d "${rustSdkPath}" ]; then
printf "\nFolder ${rustSdkPath} does not exist. Please clone the matrix-rust-sdk repository in the folder ../matrix-rust-sdk.\n\n"
exit 0
fi
else
read -p "Please enter the Rust SDK repository url, default to https://github.com/matrix-org/matrix-rust-sdk.git " rustSdkUrl
rustSdkUrl=${rustSdkUrl:-https://github.com/matrix-org/matrix-rust-sdk.git}
read -p "Please enter the Rust SDK branch, default to main " rustSdkBranch
rustSdkBranch=${rustSdkBranch:-main}
cd ..
git clone ${rustSdkUrl} matrix-rust-sdk-$date
cd matrix-rust-sdk-$date
git checkout ${rustSdkBranch}
rustSdkPath=$(pwd)
cd ../element-x-android
fi


cd ${rustSdkPath}
git status

read -p "Will build with this version of the Rust SDK ^. Is it correct (yes/no) default to yes? " sdkCorrect
sdkCorrect=${sdkCorrect:-yes}

if [ ${sdkCorrect} != "yes" ]; then
exit 0
fi

# Ask if the user wants to build the app after
read -p "Do you want to build the app after (yes/no) default to yes? " buildApp
buildApp=${buildApp:-yes}

# If folder ../matrix-rust-components-kotlin does not exist, clone the repo
if [ ! -d "../matrix-rust-components-kotlin" ]; then
printf "\nFolder ../matrix-rust-components-kotlin does not exist. Cloning the repository into ../matrix-rust-components-kotlin.\n\n"
git clone https://github.com/matrix-org/matrix-rust-components-kotlin.git ../matrix-rust-components-kotlin
fi

printf "\nResetting matrix-rust-components-kotlin to the latest main branch...\n\n"
cd ../matrix-rust-components-kotlin
git reset --hard
git checkout main
git pull

printf "\nBuilding the SDK for aarch64-linux-android...\n\n"
./scripts/build.sh -p ${rustSdkPath} -m sdk -t aarch64-linux-android -o ../element-x-android/libraries/rustsdk
Copy link
Member

Choose a reason for hiding this comment

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

Won't this only work for ARM64 emulators/devices? Maybe the user who builds this wants to use an x86-64 emulator in Linux/Windows.

Copy link
Member Author

Choose a reason for hiding this comment

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

Yes, I'll take this as a limitation of the script, but i will update the message so that it will be clearer.

Choose a reason for hiding this comment

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

You could use uname -m to get the architecture and invoke the correct option.
We could reasonably assume, being this for local use, crosscompilation is not a goal.

So if uname -m is x86_64 we build the x86_64 version.
If uname -m is amd64 we build the aarch64 version.

Choose a reason for hiding this comment

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


cd ../element-x-android
mv ./libraries/rustsdk/sdk-android-debug.aar ./libraries/rustsdk/matrix-rust-sdk.aar
mkdir -p ./libraries/rustsdk/sdks
cp ./libraries/rustsdk/matrix-rust-sdk.aar ./libraries/rustsdk/matrix-rust-sdk-${date}.aar


if [ ${buildApp} == "yes" ]; then
printf "\nBuilding the application...\n\n"
./gradlew assembleDebug
fi

if [ ${buildLocal} == "no" ]; then
printf "\nCleaning up...\n\n"
rm -rf ../matrix-rust-sdk-$date
fi

printf "\nDone!\n"