diff --git a/.cargo/aarch64-unknown-linux-ohos-clang.sh b/.cargo/aarch64-unknown-linux-ohos-clang.sh new file mode 100755 index 00000000..5162f1ff --- /dev/null +++ b/.cargo/aarch64-unknown-linux-ohos-clang.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +exec ${OHOS_NDK_HOME}/native/llvm/bin/clang \ + -target aarch64-linux-ohos \ + --sysroot=${OHOS_NDK_HOME}/native/sysroot \ + -D__MUSL__ \ + "$@" diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 00000000..d2a1e3bf --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,3 @@ +[target.aarch64-unknown-linux-ohos] +ar = "${OHOS_NDK_HOME}/native/llvm/bin/llvm-ar" +linker = ".cargo/aarch64-unknown-linux-ohos-clang.sh" diff --git a/src/build.rs b/src/build.rs index eb577d62..9fb7fc52 100644 --- a/src/build.rs +++ b/src/build.rs @@ -57,6 +57,10 @@ const CMAKE_PARAMS_IOS: &[(&str, &[(&str, &str)])] = &[ ), ]; +/// Additional parameters for Ohos +const CMAKE_PARAMS_OHOS_NDK: &[(&str, &[(&str, &str)])] = + &[("aarch64", &[("OHOS_ARCH", "arm64-v8a")])]; + /// Create a cmake::Config for building BoringSSL. fn new_boringssl_cmake_config() -> cmake::Config { let target = std::env::var("TARGET").unwrap(); @@ -101,6 +105,26 @@ fn new_boringssl_cmake_config() -> cmake::Config { } } + "linux" => { + if target.ends_with("ohos") { + for (ohos_arch, params) in CMAKE_PARAMS_OHOS_NDK { + if *ohos_arch == arch { + for (name, value) in *params { + boringssl_cmake.define(name, value); + } + break; + } + } + + let ohos_ndk_home = std::env::var("OHOS_NDK_HOME") + .expect("Please set OHOS_NDK_HOME for Harmony build"); + let ohos_ndk_home = std::path::Path::new(&ohos_ndk_home); + let toolchain_file = ohos_ndk_home.join("native/build/cmake/ohos.toolchain.cmake"); + let toolchain_file = toolchain_file.to_str().unwrap(); + boringssl_cmake.define("CMAKE_TOOLCHAIN_FILE", toolchain_file); + } + } + _ => (), };