From 9d9f73aed5e3ad5ac64707dd50f529d21578d1bc Mon Sep 17 00:00:00 2001 From: Rocka Date: Wed, 29 Jul 2026 00:09:11 +0800 Subject: [PATCH 1/5] Extract rust toolchain rule --- src/Base.hs | 13 +++++++++++++ src/Main.hs | 6 ++++-- src/Rules/LibChewing.hs | 16 ++-------------- src/Rules/RustToolchain.hs | 21 +++++++++++++++++++++ 4 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 src/Rules/RustToolchain.hs diff --git a/src/Base.hs b/src/Base.hs index d4a8e2bc..c0a8d1a7 100644 --- a/src/Base.hs +++ b/src/Base.hs @@ -22,6 +22,7 @@ module Base getABIList, getCMakeToolchain, getNdkStrip, + getRustTargetTriples, withAndroidEnv, getAndroidEnv, WithAndroidEnv (..), @@ -110,6 +111,7 @@ data AndroidEnv = AndroidEnv ndkRoot :: FilePath, sdkCMakeVersion :: String, platform :: Int, + rustVersion :: String, abi :: String } deriving stock (Eq, Show, Typeable, Generic) @@ -130,6 +132,16 @@ getCMakeToolchain AndroidEnv {..} = ndkRoot "build" "cmake" "android getNdkStrip :: AndroidEnv -> FilePath getNdkStrip AndroidEnv {..} = ndkRoot "toolchains" "llvm" "prebuilt" "linux-x86_64" "bin" "llvm-strip" +getRustTargetTriples :: AndroidEnv -> [String] +getRustTargetTriples = map abiToRustTarget . getABIList + where + abiToRustTarget abi = case abi of + "armeabi-v7a" -> "armv7-linux-androideabi" + "arm64-v8a" -> "aarch64-linux-android" + "x86" -> "i686-linux-android" + "x86_64" -> "x86_64-linux-android" + _ -> error $ "Unknown Android ABI: " <> abi + withAndroidEnv :: AndroidEnv -> (FilePath -> FilePath -> FilePath -> FilePath -> [String] -> Action a) -> Action a withAndroidEnv env f = f (getSdkCMake env) (getCMakeToolchain env) (getSdkNinja env) (getNdkStrip env) (getABIList env) @@ -141,6 +153,7 @@ getAndroidEnv = do ndkRoot <- env "ANDROID_NDK_ROOT" sdkCMakeVersion <- env "CMAKE_VERSION" platform <- read <$> env "ANDROID_PLATFORM" + rustVersion <- env "RUST_VERSION" abi <- env "ABI" pure AndroidEnv {..} where diff --git a/src/Main.hs b/src/Main.hs index 5b189b14..7d0114c3 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -30,6 +30,7 @@ import Rules.LibThai import Rules.Lua import Rules.Marisa import Rules.OpenCC +import Rules.RustToolchain import Rules.YAMLCpp import Rules.ZSTD @@ -73,6 +74,8 @@ main = do libthaiRule libiconvRule anthyDictRule + hostRustToolchainRule + androidRustTargetsRule isInGitHubActionRule getOutputDirRule "everything" ~> do @@ -194,7 +197,7 @@ instance A.ToJSON ToolchainVersions where getToolchainVersions :: Action ToolchainVersions getToolchainVersions = do StdoutTrim prebuilderRev <- cmd "git" "rev-parse" "HEAD" - AndroidEnv {sdkCMakeVersion = cmakeVersion, platform = platformVersion, ..} <- getAndroidEnv + AndroidEnv {sdkCMakeVersion = cmakeVersion, platform = platformVersion, rustVersion = rustVersion, ..} <- getAndroidEnv properties <- readFileLines $ ndkRoot "source.properties" ndkVersion <- case find ("Pkg.Revision" `isPrefixOf`) properties of Just line @@ -202,5 +205,4 @@ getToolchainVersions = do pure $ dropWhileEnd (== ' ') ndkVersion | otherwise -> fail "Failed to parse Pkg.Revision" Nothing -> fail "Pkg.Revision not found in source.properties" - rustVersion <- fromMaybeM (fail "RUST_VERSION not set") (getEnv "RUST_VERSION") pure ToolchainVersions {..} diff --git a/src/Rules/LibChewing.hs b/src/Rules/LibChewing.hs index cb206bb5..3efec1fb 100644 --- a/src/Rules/LibChewing.hs +++ b/src/Rules/LibChewing.hs @@ -23,21 +23,10 @@ libchewingRule = do useCMake $ (cmakeBuilder "libchewing") { preBuild = BuildAction $ \_ src -> do - -- install rust toolchain - cmd_ Shell "rustup toolchain install $RUST_VERSION" -- CMakeLists.txt changed in last build cmd_ (Cwd src) Shell "git checkout ." -- disable data/doc, remove absolute path, optimize library size cmd_ (Cwd src) "git apply ../patches/libchewing.patch", - preBuildEachABI = BuildActionABI $ \_ env -> do - -- install rust target for this abi - let targetName = case (buildEnvABI env) of - "armeabi-v7a" -> "armv7-linux-androideabi" - "arm64-v8a" -> "aarch64-linux-android" - "x86" -> "i686-linux-android" - "x86_64" -> "x86_64-linux-android" - _ -> fail "Unknown Android ABI" - cmd_ "rustup" "target" "add" targetName, cmakeFlags = const [ "-DBUILD_SHARED_LIBS=OFF", @@ -49,8 +38,7 @@ libchewingRule = do } "chewing-dict" ~> do - -- install rust - cmd_ Shell "rustup toolchain install $RUST_VERSION" + need ["host-rust-toolchain"] let libchewingBuildHost = outputDir "libchewing-build-host" dictSrcDir = libchewingBuildHost "data" cmd_ (Cwd libchewingSrc) Shell "git checkout ." @@ -79,5 +67,5 @@ libchewingRule = do copyFile' (dictSrcDir "misc" "symbols.dat") (dictOutputDir "symbols.dat") "libchewing" ~> do - need ["chewing-dict"] + need ["chewing-dict", "rust-android-targets"] buildWithAndroidEnv buildLibchewing LibChewing diff --git a/src/Rules/RustToolchain.hs b/src/Rules/RustToolchain.hs new file mode 100644 index 00000000..7b9c9bb2 --- /dev/null +++ b/src/Rules/RustToolchain.hs @@ -0,0 +1,21 @@ +module Rules.RustToolchain + ( hostRustToolchainRule, + androidRustTargetsRule, + ) +where + +import Base + +hostRustToolchainRule :: Rules () +hostRustToolchainRule = do + "host-rust-toolchain" ~> do + androidEnv <- getAndroidEnv + cmd_ "rustup" "toolchain" "install" (rustVersion androidEnv) + +androidRustTargetsRule :: Rules () +androidRustTargetsRule = do + "rust-android-targets" ~> do + need ["host-rust-toolchain"] + androidEnv <- getAndroidEnv + forM_ (getRustTargetTriples androidEnv) $ \target -> + cmd_ "rustup" "target" "add" target From 79c75ba450a046d0e3b85244287ac0562503c470 Mon Sep 17 00:00:00 2001 From: Rocka Date: Wed, 29 Jul 2026 00:33:25 +0800 Subject: [PATCH 2/5] fixup --- prebuilder.cabal | 1 + src/Rules/LibChewing.hs | 2 +- src/Rules/RustToolchain.hs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/prebuilder.cabal b/prebuilder.cabal index d59137a7..e763d14f 100644 --- a/prebuilder.cabal +++ b/prebuilder.cabal @@ -39,5 +39,6 @@ executable prebuilder Rules.Lua Rules.Marisa Rules.OpenCC + Rules.RustToolchain Rules.YAMLCpp Rules.ZSTD diff --git a/src/Rules/LibChewing.hs b/src/Rules/LibChewing.hs index 3efec1fb..33078e64 100644 --- a/src/Rules/LibChewing.hs +++ b/src/Rules/LibChewing.hs @@ -67,5 +67,5 @@ libchewingRule = do copyFile' (dictSrcDir "misc" "symbols.dat") (dictOutputDir "symbols.dat") "libchewing" ~> do - need ["chewing-dict", "rust-android-targets"] + need ["chewing-dict", "android-rust-targets"] buildWithAndroidEnv buildLibchewing LibChewing diff --git a/src/Rules/RustToolchain.hs b/src/Rules/RustToolchain.hs index 7b9c9bb2..bd0d17d5 100644 --- a/src/Rules/RustToolchain.hs +++ b/src/Rules/RustToolchain.hs @@ -14,7 +14,7 @@ hostRustToolchainRule = do androidRustTargetsRule :: Rules () androidRustTargetsRule = do - "rust-android-targets" ~> do + "android-rust-targets" ~> do need ["host-rust-toolchain"] androidEnv <- getAndroidEnv forM_ (getRustTargetTriples androidEnv) $ \target -> From d0a200ab9eb207db65437cecc105c38051a4e98f Mon Sep 17 00:00:00 2001 From: Rocka Date: Wed, 29 Jul 2026 20:04:32 +0800 Subject: [PATCH 3/5] simplify --- src/Base.hs | 11 ----------- src/Rules/RustToolchain.hs | 8 +++++++- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Base.hs b/src/Base.hs index c0a8d1a7..f96d5297 100644 --- a/src/Base.hs +++ b/src/Base.hs @@ -22,7 +22,6 @@ module Base getABIList, getCMakeToolchain, getNdkStrip, - getRustTargetTriples, withAndroidEnv, getAndroidEnv, WithAndroidEnv (..), @@ -132,16 +131,6 @@ getCMakeToolchain AndroidEnv {..} = ndkRoot "build" "cmake" "android getNdkStrip :: AndroidEnv -> FilePath getNdkStrip AndroidEnv {..} = ndkRoot "toolchains" "llvm" "prebuilt" "linux-x86_64" "bin" "llvm-strip" -getRustTargetTriples :: AndroidEnv -> [String] -getRustTargetTriples = map abiToRustTarget . getABIList - where - abiToRustTarget abi = case abi of - "armeabi-v7a" -> "armv7-linux-androideabi" - "arm64-v8a" -> "aarch64-linux-android" - "x86" -> "i686-linux-android" - "x86_64" -> "x86_64-linux-android" - _ -> error $ "Unknown Android ABI: " <> abi - withAndroidEnv :: AndroidEnv -> (FilePath -> FilePath -> FilePath -> FilePath -> [String] -> Action a) -> Action a withAndroidEnv env f = f (getSdkCMake env) (getCMakeToolchain env) (getSdkNinja env) (getNdkStrip env) (getABIList env) diff --git a/src/Rules/RustToolchain.hs b/src/Rules/RustToolchain.hs index bd0d17d5..d1b7c540 100644 --- a/src/Rules/RustToolchain.hs +++ b/src/Rules/RustToolchain.hs @@ -17,5 +17,11 @@ androidRustTargetsRule = do "android-rust-targets" ~> do need ["host-rust-toolchain"] androidEnv <- getAndroidEnv - forM_ (getRustTargetTriples androidEnv) $ \target -> + forM_ (getABIList androidEnv) $ \a -> do + let target = case a of + "armeabi-v7a" -> "armv7-linux-androideabi" + "arm64-v8a" -> "aarch64-linux-android" + "x86" -> "i686-linux-android" + "x86_64" -> "x86_64-linux-android" + _ -> error $ "Unknown Android ABI: " <> a cmd_ "rustup" "target" "add" target From dd98af7157e5dbf850f8237e73da28634bb1501b Mon Sep 17 00:00:00 2001 From: Rocka Date: Wed, 29 Jul 2026 22:36:43 +0800 Subject: [PATCH 4/5] format --- src/Rules/RustToolchain.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Rules/RustToolchain.hs b/src/Rules/RustToolchain.hs index d1b7c540..9c960562 100644 --- a/src/Rules/RustToolchain.hs +++ b/src/Rules/RustToolchain.hs @@ -18,7 +18,7 @@ androidRustTargetsRule = do need ["host-rust-toolchain"] androidEnv <- getAndroidEnv forM_ (getABIList androidEnv) $ \a -> do - let target = case a of + let target = case a of "armeabi-v7a" -> "armv7-linux-androideabi" "arm64-v8a" -> "aarch64-linux-android" "x86" -> "i686-linux-android" From 955b5dc29fff0dd6a3a8f7f56820c6518b702670 Mon Sep 17 00:00:00 2001 From: Rocka Date: Wed, 29 Jul 2026 23:36:41 +0800 Subject: [PATCH 5/5] format --- src/Base.hs | 2 +- src/Main.hs | 12 +++++++++--- src/Rules/RustToolchain.hs | 8 ++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Base.hs b/src/Base.hs index f96d5297..a36e0659 100644 --- a/src/Base.hs +++ b/src/Base.hs @@ -176,7 +176,7 @@ execute tool = cmdArguments ( CmdArgument [ Right (outputDir "host" "bin" tool), - Left (AddEnv "LD_LIBRARY_PATH" (outputDir "host" "lib")) + Left (AddEnv "LD_LIBRARY_PATH" (outputDir "host" "lib")) ] ) diff --git a/src/Main.hs b/src/Main.hs index 7d0114c3..57f5db64 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -19,14 +19,14 @@ import Rules.Fcitx5 import Rules.GLog import Rules.LevelDB import Rules.LibChewing -import Rules.LibUV -import Rules.LibIconv import Rules.LibHangul import Rules.LibIME import Rules.LibIMEJyutping +import Rules.LibIconv import Rules.LibIntlLite import Rules.LibRime import Rules.LibThai +import Rules.LibUV import Rules.Lua import Rules.Marisa import Rules.OpenCC @@ -197,7 +197,13 @@ instance A.ToJSON ToolchainVersions where getToolchainVersions :: Action ToolchainVersions getToolchainVersions = do StdoutTrim prebuilderRev <- cmd "git" "rev-parse" "HEAD" - AndroidEnv {sdkCMakeVersion = cmakeVersion, platform = platformVersion, rustVersion = rustVersion, ..} <- getAndroidEnv + AndroidEnv + { sdkCMakeVersion = cmakeVersion, + platform = platformVersion, + rustVersion = rustVersion, + .. + } <- + getAndroidEnv properties <- readFileLines $ ndkRoot "source.properties" ndkVersion <- case find ("Pkg.Revision" `isPrefixOf`) properties of Just line diff --git a/src/Rules/RustToolchain.hs b/src/Rules/RustToolchain.hs index 9c960562..c268513a 100644 --- a/src/Rules/RustToolchain.hs +++ b/src/Rules/RustToolchain.hs @@ -20,8 +20,8 @@ androidRustTargetsRule = do forM_ (getABIList androidEnv) $ \a -> do let target = case a of "armeabi-v7a" -> "armv7-linux-androideabi" - "arm64-v8a" -> "aarch64-linux-android" - "x86" -> "i686-linux-android" - "x86_64" -> "x86_64-linux-android" - _ -> error $ "Unknown Android ABI: " <> a + "arm64-v8a" -> "aarch64-linux-android" + "x86_64" -> "x86_64-linux-android" + "x86" -> "i686-linux-android" + _ -> error $ "Unknown Android ABI: " <> a cmd_ "rustup" "target" "add" target