From ff5c3749770c67860fba7aa071061d570613300f Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Thu, 22 Jun 2023 17:21:24 +1000 Subject: [PATCH] Port build script to Rust [WIP] This will allow the code to be shared between Unix and Windows builds. --- .cargo/config.toml | 4 +- .github/workflows/build-all.yml | 28 +--- .github/workflows/build.yml | 58 +------- Cargo.lock | 19 +++ Cargo.toml | 1 + README.md | 22 +-- anki | 2 +- build-aar.bat | 3 - build-robo.bat | 6 - build.bat | 1 + build.sh | 122 +---------------- build_rust/Cargo.toml | 14 ++ build_rust/src/main.rs | 231 ++++++++++++++++++++++++++++++++ gradle.properties | 2 +- rsdroid/build.gradle | 7 +- rslib-bridge/Cargo.toml | 1 + rslib-bridge/fluent.rs | 3 +- 17 files changed, 290 insertions(+), 234 deletions(-) delete mode 100755 build-aar.bat delete mode 100755 build-robo.bat create mode 100755 build.bat create mode 100644 build_rust/Cargo.toml create mode 100644 build_rust/src/main.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index 6f4c9ceb2..255b63bac 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -3,7 +3,7 @@ target-dir = "target" [env] -STRINGS_JSON = { value = "anki/out/strings.json", relative = true } -DESCRIPTORS_BIN = { value = "anki/out/descriptors.bin", relative = true } +DESCRIPTORS_BIN = { value = "anki/out/rslib/proto/descriptors.bin", relative = true } +STRINGS_JSON_ANKIDROID = { value = "anki/out/strings.json", relative = true } PROTOC = { value = "anki/out/extracted/protoc/bin/protoc", relative = true } GENERATED_BACKEND_DIR = { value = "rsdroid/build/generated/source/backend", relative = true } diff --git a/.github/workflows/build-all.yml b/.github/workflows/build-all.yml index 410a9dc2f..fe931eba0 100644 --- a/.github/workflows/build-all.yml +++ b/.github/workflows/build-all.yml @@ -1,4 +1,4 @@ -name: Build AAR and Robo (all platforms) +name: Build release (from macOS) on: workflow_dispatch: inputs: @@ -44,9 +44,6 @@ jobs: distribution: "adopt" java-version: "11" # minimum for Android API31 - - name: Install Android Command Line Tools - uses: android-actions/setup-android@v2 - - name: Install Windows cross compiler run: brew install mingw-w64 && x86_64-w64-mingw32-gcc -v @@ -56,8 +53,6 @@ jobs: brew install x86_64-unknown-linux-gnu x86_64-unknown-linux-gnu-gcc -v - - name: Install NDK - run: .github/scripts/install_ndk.sh 25.2.9519653 - name: Rust Cache uses: actions/cache@v3 @@ -66,28 +61,15 @@ jobs: ~/.cargo/registry ~/.cargo/git target + anki/out/rust + anki/out/extracted key: ${{ runner.os }}-rust-release-v5-${{ hashFiles('Cargo.lock') }} restore-keys: | ${{ runner.os }}-rust-release-v5 ${{ runner.os }}-rust-release - - name: Anki cache - uses: actions/cache@v3 - with: - path: | - anki/out/node_modules - anki/out/rust - anki/out/extracted - key: ${{ runner.os }}-anki-v5-${{ hashFiles('Cargo.lock', 'anki/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-anki-v5 - ${{ runner.os }}-anki - - - name: Build Android/All - run: ./build-aar.sh - - - name: Build Robolectric/All - run: ./build-robo.sh + - name: Build all + run: ./build.sh - name: Check Compiled Libraries run: > diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 059eee0b3..10bddb48c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: Build AAR and Robo (single platform) +name: Build quick (each platform) on: workflow_dispatch: push: @@ -42,20 +42,6 @@ jobs: distribution: "adopt" java-version: "11" # minimum for Android API31 - - name: Install Android Command Line Tools - uses: android-actions/setup-android@v2 - - - name: Install NDK - if: matrix.os != 'windows-latest' - run: .github/scripts/install_ndk.sh 25.2.9519653 - - - name: Install NDK (Windows) - if: matrix.os == 'windows-latest' - run: | - Write-Host "NDK Install Started" - (. sdkmanager.bat --install "ndk;25.2.9519653" --sdk_root="$Env:ANDROID_SDK_ROOT") | out-null - Write-Host "NDK Install Completed" - - name: Rust Cache uses: actions/cache@v3 with: @@ -63,43 +49,15 @@ jobs: ~/.cargo/registry ~/.cargo/git target + anki/out/rust + anki/out/extracted key: ${{ runner.os }}-rust-debug-v5-${{ hashFiles('Cargo.lock') }} restore-keys: | ${{ runner.os }}-rust-debug-v5 ${{ runner.os }}-rust-debug - - name: Anki cache (Unix) - uses: actions/cache@v3 - if: matrix.os != 'windows-latest' - with: - path: | - anki/out/node_modules - anki/out/rust - anki/out/extracted - key: ${{ runner.os }}-anki-v6-${{ hashFiles('Cargo.lock', 'anki/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-anki-v6 - ${{ runner.os }}-anki - - - name: Anki cache (Windows) - uses: actions/cache@v3 - if: matrix.os == 'windows-latest' - with: - path: | - anki/out/rust - anki/out/extracted - key: ${{ runner.os }}-anki-v6-${{ hashFiles('Cargo.lock', 'anki/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-anki-v6 - ${{ runner.os }}-anki - - name: Build Android/X86_64 - if: matrix.os != 'windows-latest' - run: ./build-aar.sh - - - name: Build Android/X86_64 (Win) - if: matrix.os == 'windows-latest' - run: ./build-aar.bat + run: cargo run -p build_rust - name: Check Rust (Linux) if: matrix.os == 'ubuntu-latest' @@ -116,14 +74,6 @@ jobs: profile: Nexus 6 script: ./check-droid.sh - - name: Build Robolectric/X86_64 - if: matrix.os != 'windows-latest' - run: ./build-robo.sh - - - name: Build Robolectric/X86_64 (Win) - if: matrix.os == 'windows-latest' - run: ./build-robo.bat - - name: Upload rsdroid AAR as artifact uses: actions/upload-artifact@v2 with: diff --git a/Cargo.lock b/Cargo.lock index caad7cfeb..45a2ffbaa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -565,6 +565,18 @@ dependencies = [ "serde", ] +[[package]] +name = "build_rust" +version = "0.1.0" +dependencies = [ + "anki_io", + "anki_process", + "anyhow", + "camino", + "glob", + "which", +] + [[package]] name = "bumpalo" version = "3.13.0" @@ -604,6 +616,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "camino" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" + [[package]] name = "cast" version = "0.3.0" @@ -2750,6 +2768,7 @@ version = "0.1.0" dependencies = [ "android_logger", "anki", + "anki_i18n", "anki_io", "anki_process", "anki_proto", diff --git a/Cargo.toml b/Cargo.toml index 64791951d..6d7d04ea5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ edition = "2021" members = [ "rslib-bridge", "anki/rslib", + "build_rust" ] exclude = [] resolver = "2" diff --git a/README.md b/README.md index 6127f5d2a..f14741e69 100644 --- a/README.md +++ b/README.md @@ -88,12 +88,14 @@ eg on Linux: ``` export ANDROID_SDK_ROOT=$HOME/Android/Sdk +export ANDROID_NDK_HOME=$HOME/Android/Sdk/ndk/25.2.9519653 ``` Or macOS: ``` export ANDROID_SDK_ROOT=$HOME/Library/Android/sdk +export ANDROID_NDK_HOME=$HOME/Library/Android/sdk/ndk/25.2.9519653 ``` If you don't have Java installed, you may be able to use the version bundled @@ -109,24 +111,10 @@ or Windows: set JAVA_HOME=C:\Program Files\Android\Android Studio\jre ``` -Now build the .aar: +Now build with `./build.sh` or `build.bat`. -``` -./build-aar.sh -``` - -If you have 'python3' on your system but not 'python', you can specify -the name: - -``` -RUST_ANDROID_GRADLE_PYTHON_COMMAND=python3 ./build-aar.sh -``` - -Assuming success, then build the .jar file: - -``` -./build-robo.sh -``` +After you've confirmed building works, you may want to build again with the env +var RELEASE=1 defined, to build a faster version. ## Modify AnkiDroid to use built library diff --git a/anki b/anki index 1ae60a3bb..a96d5a920 160000 --- a/anki +++ b/anki @@ -1 +1 @@ -Subproject commit 1ae60a3bb097a5a87cca7092cd78ac34a31b30aa +Subproject commit a96d5a920b628609513e8ad83346ceb154eb38f5 diff --git a/build-aar.bat b/build-aar.bat deleted file mode 100755 index 160bb82c9..000000000 --- a/build-aar.bat +++ /dev/null @@ -1,3 +0,0 @@ -rustup target add x86_64-linux-android || exit /b 1 -set PATH=anki\out\extracted\python;%PATH% -gradlew assembleRelease || exit /b 1 diff --git a/build-robo.bat b/build-robo.bat deleted file mode 100755 index 27aa953e2..000000000 --- a/build-robo.bat +++ /dev/null @@ -1,6 +0,0 @@ -REM On Windows, linking fails with "library limit of 65535 objects exceeded" -REM when building in debug mode, so build is locked to release. - -cargo build -p rsdroid --release || exit /b 1 -cp target\release\rsdroid.dll rsdroid-testing\assets || exit /b 1 -gradlew rsdroid-testing:build || exit /b 1 diff --git a/build.bat b/build.bat new file mode 100755 index 000000000..b38e1e678 --- /dev/null +++ b/build.bat @@ -0,0 +1 @@ +cargo run -p build_rust diff --git a/build.sh b/build.sh index 00419bbfd..206bd9b39 100755 --- a/build.sh +++ b/build.sh @@ -1,121 +1,3 @@ #!/bin/bash -# -# Builds: -# - desktop web components -# - Android JNI library and auto-generated Kotlin interface -# - Robolectric JNI library. -# -# The first two will be bundled into an .aar by gradle, and the last -# is bundled into a .jar by gradle. Gradle will be automatically invoked -# if this script is run from the command line. -# -# By default, only the library for the current architecture is built -# (eg X86_64, or Arm64 on Apple M1+). -# -# Define ALL_ARCHS=1 to build a multi-platform bundle, which takes about 4x -# longer to download and build. -# -# Define RELEASE=1 to compile the Rust in release mode, which builds slower -# but runs faster. -# - -set -e - -if [ "$RUNNING_FROM_BUILD_SCRIPT" = "1" ]; then - # this script invoked gradle which invoked this script; nothing left to do - exit 0; -fi - -# Android code built into target/, so we don't clobber robolectric cache -export CARGO_TARGET_DIR=target -ARTIFACTS_DIR=rsdroid/build/generated/anki_artifacts -JNI_DIR=rsdroid/build/generated/jniLibs - -echo "*** Building desktop web components" -mkdir -p $ARTIFACTS_DIR/web -(cd anki && ./ninja extract:protoc ts:reviewer:reviewer_extras_bundle.js qt:aqt:data:web:pages) -cp anki/out/qt/_aqt/data/web/pages/* anki/out/ts/reviewer/reviewer_extras_bundle.js $ARTIFACTS_DIR/web/ -cp anki/cargo/licenses.json $ARTIFACTS_DIR/web/licenses-cargo.json -cp anki/ts/licenses.json $ARTIFACTS_DIR/web/licenses-ts.json -chmod -R a+w $ARTIFACTS_DIR - -# determine android target archs -if [ "$ALL_ARCHS" = "1" ]; then - rustup target add armv7-linux-androideabi # arm - rustup target add i686-linux-android # x86 - rustup target add aarch64-linux-android # arm64 - rustup target add x86_64-linux-android # x86_64 - targets="-t armv7 -t i686 -t aarch64 -t x86_64" -else - if [[ "$OSTYPE" == "darwin"* && $(arch) == "arm64" ]]; then - rustup target add aarch64-linux-android - targets="-t aarch64" - else - rustup target add x86_64-linux-android - targets="-t x86_64" - fi -fi - -if [ "$RELEASE" = "1" ]; then - release="--release" - release_dir="release" -else - release="" - release_dir="debug" -fi - -echo -echo "*** Building Android JNI library + backend interface" -rm -rf $JNI_DIR -cargo install cargo-ndk@3.2.0 -cargo ndk -o $JNI_DIR $targets build -p rsdroid $release - -echo -echo "*** Building Robolectric JNI library" -# Robolectric build cache can be shared with desktop, as it's the same arch -export CARGO_TARGET_DIR=anki/out/rust -if [ "$ALL_ARCHS" = "1" ]; then - if [[ "$OSTYPE" != "darwin"* ]]; then - echo "Must be on macOS to do a multi-arch build." - exit 1 - fi - - # Mac - for target in \ - x86_64-apple-darwin \ - aarch64-apple-darwin - do - rustup target add $target - cargo build -p rsdroid $release --target $target - done - lipo -create target/x86_64-apple-darwin/$release_dir/librsdroid.dylib \ - target/aarch64-apple-darwin/$release_dir/librsdroid.dylib \ - -output rsdroid-testing/assets/librsdroid.dylib - - # Linux - target=x86_64-unknown-linux-gnu - rustup target add $target - CC=x86_64-unknown-linux-gnu-gcc \ - CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=x86_64-unknown-linux-gnu-gcc \ - cargo build -p rsdroid $release --target $target - cp -v target/$target/$release_dir/librsdroid.so rsdroid-testing/assets - - - # Windows - target=x86_64-pc-windows-gnu - rustup target add $target - cargo build -p rsdroid $release --target $target - cp -v target/$target/$release_dir/rsdroid.dll rsdroid-testing/assets -else - # Just build for current architecture - cargo build -p rsdroid $release - for file in target/$release_dir/librsdroid.{dylib,so}; do - test -f $file && cp -v $file rsdroid-testing/assets/ - done -fi - -export RUNNING_FROM_BUILD_SCRIPT=1 -if [ "$RUNNING_FROM_GRADLE" != "1" ]; then - # run gradle if invoked from command line - ./gradlew assembleRelease rsdroid-testing:build -fi +# Just a shortcut +cargo run -p build_rust diff --git a/build_rust/Cargo.toml b/build_rust/Cargo.toml new file mode 100644 index 000000000..4ded1d286 --- /dev/null +++ b/build_rust/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "build_rust" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anki_io = { version = "0.0.0", path = "../anki/rslib/io" } +anki_process = { version = "0.0.0", path = "../anki/rslib/process" } +anyhow = "1.0.71" +camino = "1.1.4" +glob = "0.3.1" +which = "4.4.0" diff --git a/build_rust/src/main.rs b/build_rust/src/main.rs new file mode 100644 index 000000000..f068c5990 --- /dev/null +++ b/build_rust/src/main.rs @@ -0,0 +1,231 @@ +use anki_io::{copy_file, create_dir_all, read_dir_files}; +use anki_process::CommandExt; +use anyhow::Result; +use camino::Utf8Path; +use std::env; +use std::path::Path; +use std::process::Command; + +fn main() -> Result<()> { + if env::var("RUNNING_FROM_BUILD_SCRIPT").is_ok() { + return Ok(()); + } + + build_web_artifacts()?; + build_android_jni()?; + build_robolectric_jni()?; + run_gradle()?; + + println!(); + println!("*** Build complete."); + + Ok(()) +} + +fn run_gradle() -> Result<()> { + if env::var("RUNNING_FROM_GRADLE").is_err() { + println!("*** Running gradle"); + let mut cmd = if cfg!(windows) { + let mut cmd = Command::new("cmd"); + cmd.args(["/c", "gradlew.bat"]); + cmd + } else { + Command::new("./gradlew") + }; + cmd.env("RUNNING_FROM_BUILD_SCRIPT", "1") + .args(["assembleRelease", "rsdroid-testing:build"]) + .ensure_success()?; + } + Ok(()) +} + +fn build_web_artifacts() -> Result<()> { + println!("*** Building desktop web components"); + let artifacts_dir = Path::new("rsdroid/build/generated/anki_artifacts"); + let mut cmd = if cfg!(windows) { + let mut cmd = Command::new("cmd"); + cmd.args(["/c", "tools\\ninja.bat"]); + cmd + } else { + Command::new("./ninja") + }; + + cmd.current_dir("anki") + .args([ + "extract:protoc", + "ts:reviewer:reviewer_extras_bundle.js", + "qt:aqt:data:web:pages", + ]) + .ensure_success()?; + + create_dir_all(artifacts_dir.join("web"))?; + + for file in read_dir_files("anki/out/qt/_aqt/data/web/pages")? { + let file = file?; + let path = file.path(); + copy_file( + &path, + artifacts_dir.join(path.file_name().unwrap().to_str().unwrap()), + )?; + } + copy_file( + "anki/cargo/licenses.json", + artifacts_dir.join("web/licenses-cargo.json"), + )?; + copy_file( + "anki/ts/licenses.json", + artifacts_dir.join("web/licenses-ts.json"), + )?; + Ok(()) +} + +fn build_android_jni() -> Result<()> { + println!("*** Building Android JNI library + backend interface"); + let jni_dir = Path::new("rsdroid/build/generated/jniLibs"); + if jni_dir.exists() { + std::fs::remove_dir_all(jni_dir)?; + } + let all_archs = env::var("ALL_ARCHS").is_ok(); + let ndk_targets = add_android_rust_targets(all_archs)?; + let (is_release, _release_dir) = check_release(); + + Command::run(["cargo", "install", "cargo-ndk@3.2.0"])?; + + let mut command = Command::new("cargo"); + command + // build products go into separate folder so they don't trigger recompile + // of robolectric/desktop code + .env("CARGO_TARGET_DIR", "target") + .env("STRINGS_JSON", env!("STRINGS_JSON_ANKIDROID")) + .arg("ndk") + .arg("-o") + .arg(jni_dir) + .args(ndk_targets) + .args(["build", "-p", "rsdroid"]); + if is_release { + command.arg("--release"); + } + command.ensure_success()?; + + Ok(()) +} + +// is_release, release/debug dir +// windows is forced to release, as debug builds fail with an error +fn check_release() -> (bool, &'static str) { + if env::var("RELEASE").is_ok() || cfg!(windows) { + (true, "release") + } else { + (false, "debug") + } +} + +/// Returns target list to pass to cargo ndk +fn add_android_rust_targets(all_archs: bool) -> Result<&'static [&'static str]> { + Ok(if all_archs { + add_rust_targets(&[ + "armv7-linux-androideabi", + "i686-linux-android", + "aarch64-linux-android", + "x86_64-linux-android", + ])?; + &[ + "-t", + "armv7-linux-androideabi", + "-t", + "i686-linux-android", + "-t", + "aarch64-linux-android", + "-t", + "x86_64-linux-android", + ] + } else if cfg!(all(target_os = "macos", arch = "aarch64")) { + add_rust_targets(&["aarch64-linux-android"])?; + &["-t", "aarch64"] + } else { + add_rust_targets(&["x86_64-linux-android"])?; + &["-t", "x86_64"] + }) +} + +fn add_rust_targets(targets: &[&str]) -> Result<()> { + Command::new("rustup") + .args(["target", "add"]) + .args(targets) + .ensure_success()?; + Ok(()) +} + +fn build_robolectric_jni() -> Result<()> { + println!("*** Building Robolectric JNI library"); + + let all_archs = env::var("ALL_ARCHS").is_ok(); + let (is_release, release_dir) = check_release(); + let target_root = Utf8Path::new("anki/out/rust"); + let file_in_target = + |platform: &str, fname: &str| target_root.join(platform).join(release_dir).join(fname); + + if all_archs { + if cfg!(not(target_os = "macos")) { + panic!("Must be on macOS to do a multi-arch build."); + } + + let mac_targets = &["x86_64-apple-darwin", "aarch64-apple-darwin"]; + add_rust_targets(mac_targets)?; + for target in mac_targets { + build_rsdroid(is_release, target, target_root)?; + } + Command::new("lipo") + .arg("-create") + .args(&[ + file_in_target("x86_64-apple-darwin", "librsdroid.dylib"), + file_in_target("aarch64-apple-darwin", "librsdroid.dylib"), + ]) + .args(["-output", "rsdroid-testing/assets/librsdroid.dylib"]) + .ensure_success()?; + + let linux_targets = &["x86_64-unknown-linux-gnu"]; + add_rust_targets(linux_targets)?; + build_rsdroid(is_release, linux_targets[0], target_root)?; + copy_file( + file_in_target(linux_targets[0], "librsdroid.so"), + "rsdroid-testing/assets/librsdroid.so", + )?; + + let windows_targets = &["x86_64-pc-windows-gnu"]; + add_rust_targets(windows_targets)?; + build_rsdroid(is_release, windows_targets[0], target_root)?; + copy_file( + file_in_target(windows_targets[0], "rsdroid.dll"), + "rsdroid-testing/assets/rsdroid.dll", + )?; + } else { + // Just build for current architecture + build_rsdroid(is_release, "", target_root)?; + for fname in ["librsdroid.so", "librsdroid.dylib"] { + let file = target_root.join(release_dir).join(fname); + if Path::new(&file).exists() { + copy_file(&file, Path::new("rsdroid-testing/assets").join(fname))?; + } + } + } + + Ok(()) +} + +fn build_rsdroid(is_release: bool, target_arch: &str, target_dir: &Utf8Path) -> Result<()> { + let mut command = Command::new("cargo"); + command + // Robolectric build cache can be shared with desktop, as it's the same arch + .env("CARGO_TARGET_DIR", target_dir) + .env("STRINGS_JSON", env!("STRINGS_JSON_ANKIDROID")) + .args(["build", "-p", "rsdroid"]); + if is_release { + command.arg("--release"); + } + if !target_arch.is_empty() { + command.args(["--target", target_arch]); + } + command.ensure_success()?; + Ok(()) +} diff --git a/gradle.properties b/gradle.properties index d1f4128eb..340ad210e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ android.useAndroidX=true android.enableJetifier=false GROUP=io.github.david-allison-1 -VERSION_NAME=0.1.21-anki2.1.61 +VERSION_NAME=0.1.22-anki2.1.66 POM_INCEPTION_YEAR=2020 diff --git a/rsdroid/build.gradle b/rsdroid/build.gradle index 349580e4f..14063a9a8 100644 --- a/rsdroid/build.gradle +++ b/rsdroid/build.gradle @@ -95,12 +95,7 @@ task buildRust(type: Exec) { environment 'ANDROID_NDK_HOME', ndkPath } workingDir "$rootDir" - String toolPath = System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows') ? 'build-aar.bat' : './build-aar.sh' - if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) { - commandLine toolPath - } else { - commandLine 'sh', '-c', toolPath - } + commandLine "cargo", "run", "-p", "build_rust" } signing { diff --git a/rslib-bridge/Cargo.toml b/rslib-bridge/Cargo.toml index 5bc535c2c..82d4646c9 100644 --- a/rslib-bridge/Cargo.toml +++ b/rslib-bridge/Cargo.toml @@ -23,6 +23,7 @@ tracing = { version = "0.1.37", features = ["max_level_trace", "release_max_leve anki_io = { version = "0.0.0", path = "../anki/rslib/io" } anki_process = { version = "0.0.0", path = "../anki/rslib/process" } anki_proto_gen = { version = "0.0.0", path = "../anki/rslib/proto_gen" } +anki_i18n = { version = "0.0.0", path = "../anki/rslib/i18n" } anyhow = "1.0.71" glob = "0.3.1" diff --git a/rslib-bridge/fluent.rs b/rslib-bridge/fluent.rs index af6960139..82cebf9af 100644 --- a/rslib-bridge/fluent.rs +++ b/rslib-bridge/fluent.rs @@ -1,5 +1,6 @@ use std::{fs, path::Path}; +use anki_io::read_to_string; use inflections::Inflect; use serde::Deserialize; @@ -24,7 +25,7 @@ struct Module { } fn get_strings() -> Vec { - let data = fs::read_to_string(env!("STRINGS_JSON")).unwrap(); + let data = read_to_string(std::env::var("STRINGS_JSON_ANKIDROID").unwrap()).unwrap(); serde_json::from_str(&data).unwrap() }