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/Base.hs b/src/Base.hs index d4a8e2bc..a36e0659 100644 --- a/src/Base.hs +++ b/src/Base.hs @@ -110,6 +110,7 @@ data AndroidEnv = AndroidEnv ndkRoot :: FilePath, sdkCMakeVersion :: String, platform :: Int, + rustVersion :: String, abi :: String } deriving stock (Eq, Show, Typeable, Generic) @@ -141,6 +142,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 @@ -174,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 5b189b14..57f5db64 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -19,17 +19,18 @@ 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 +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,13 @@ 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 +211,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..33078e64 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", "android-rust-targets"] buildWithAndroidEnv buildLibchewing LibChewing diff --git a/src/Rules/RustToolchain.hs b/src/Rules/RustToolchain.hs new file mode 100644 index 00000000..c268513a --- /dev/null +++ b/src/Rules/RustToolchain.hs @@ -0,0 +1,27 @@ +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 + "android-rust-targets" ~> do + need ["host-rust-toolchain"] + androidEnv <- getAndroidEnv + forM_ (getABIList androidEnv) $ \a -> do + let target = case a of + "armeabi-v7a" -> "armv7-linux-androideabi" + "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