Closed HyodaKazuaki closed 1 year ago
Issue 作成ありがとうございます!
多くのメッセージが表示されていますが、ほとんどは無視できそうでした。最後の方の bindgen のエラー(以下に記載)が原因のようでした。clang が cstdio を見つけられない、というもののようです。
thread 'main' panicked at 'Unable to generate bindings: ClangDiagnostic("/Users/user/work/open_jtalk-rs/target/x86_64-apple-ios/debug/build/open_jtalk-sys-3e2c4554572bab69/out/include/mecab.h:370:10: fatal error: 'cstdio' file not found\n")', crates/open_jtalk-sys/build.rs:82:10
私の環境でも再現しました。Apple Silicon Mac でも Intel Mac でも同じところで躓くようです(Intel Mac でも aarch64-apple-ios-sim 向けには bindings.rs の生成に成功し、 x86_64-apple-ios 向けには失敗する)。
色々試したところ、M1 MacBook Air では open_jtalk-sys
crate の build.rs
内の generate_bindings
関数において、clang_args
を以下のように書き換えると x86_64 向けの binding.rs
の生成に成功しました(C++ の標準ライブラリのインクルードパスを明示的に追加した。これはこちらの対応策を参考にしています。Intel Mac ではまだ検証していません)。
オリジナル:
書き換え後:
let target = env::var("TARGET").unwrap();
let mut clang_args = vec![format!("-I{}", include_dir.display())];
if target == "x86_64-apple-ios" {
clang_args.push(format!(
"-I{}/usr/include/c++/v1",
String::from_utf8_lossy(
&Command::new("xcrun")
.args(["--sdk", "iphonesimulator", "--show-sdk-path"])
.output()
.expect("failed to run xcrun command")
.stdout
)
.trim()
));
}
Intel Mac ではまだ検証していません
検証した結果、Intel Mac でもこの対応策が有効であることを確認しました。
めちゃくちゃ素人考えなのですが、x86_64-apple-ios
ではなくx86_64-apple-ios-sim
とかだったり・・・・?
めちゃくちゃ素人考えなのですが、
x86_64-apple-ios
ではなくx86_64-apple-ios-sim
とかだったり・・・・?
Rust の Platform Support の一覧を見ていただけるとわかると思うのですが、x86_64-apple-ios-sim
は存在しないんですよね……(これは私も最初に引っかかりました)。そもそも、iOS 端末のプロセッサが Intel CPU だったことはないので、x86_64-apple-ios
だけでシミュレータ向けだと分かる感じのようです。
一方、aarch64 の方のシミュレータ向けに-sim
がついている理由は、これがないと実機向けの aarch64-apple-ios
と名前が被ってしまうので、例外的に suffix をつけていると考えられます。
色々試したところ、M1 MacBook Air では
open_jtalk-sys
crate のbuild.rs
内のgenerate_bindings
関数において、clang_args
を以下のように書き換えると x86_64 向けのbinding.rs
の生成に成功しました(C++ の標準ライブラリのインクルードパスを明示的に追加した。これはこちらの対応策を参考にしています。Intel Mac ではまだ検証していません)。オリジナル:
書き換え後:
let target = env::var("TARGET").unwrap(); let mut clang_args = vec![format!("-I{}", include_dir.display())]; if target == "x86_64-apple-ios" { clang_args.push(format!( "-I{}/usr/include/c++/v1", String::from_utf8_lossy( &Command::new("xcrun") .args(["--sdk", "iphonesimulator", "--show-sdk-path"]) .output() .expect("failed to run xcrun command") .stdout ) .trim() )); }
解決策があっという間に見つかって驚きです! なるほど、iOS SDKもインクルード対象に追加しないといけないのですね。
ご提案いただいた修正方法ですが、xcrun
コマンドを2度呼び出すことになるので、この処理をmain
関数側で対応できると良さそうな感じがしました。
そこで、generate_bindings
関数の仮引数include_dir
をallow_dir
という名前を変えて、新たにinclude_dirs
という仮引数を追加して処理することを考えました。
fn generate_bindings(
allow_dir: impl AsRef<Path>,
include_dirs: impl Iterator<Item = impl AsRef<Path>>,
) {
let include_dir = allow_dir.as_ref();
let clang_arg = &[format!("-I{}", include_dir.display())];
let mut clang_args: Vec<String> = include_dirs
.map(|dir| format!("-I{}", dir.as_ref().display()))
.collect();
clang_args.extend(clang_arg.iter().cloned);
println!("cargo:rerun-if-changed=wrapper.hpp");
// 以下略 //
main
関数側では、include_dir
変数を次のように定義し、必要に応じて(今回のような場合など)追加するという形を取ります。
let mut include_dirs: Vec<PathBuf> = Vec::new();
以上の点はコミットしてありますので、よければ実際にcloneしてお試しいただけると幸いです。 https://github.com/VOICEVOX/open_jtalk-rs/pull/9/commits/6e2f8935bdf5b22e1e0b9e306fdd6b08ebe24f7c
ご提案いただいた修正方法ですが、
xcrun
コマンドを2度呼び出すことになるので、この処理をmain
関数側で対応できると良さそうな感じがしました。 そこで、generate_bindings
関数の仮引数include_dir
をallow_dir
という名前を変えて、新たにinclude_dirs
という仮引数を追加して処理することを考えました。
より良い実装方針だと思いました……! 後で確認してみます。続きのやり取りは #9 で行いたいと思います
VOICEVOX CoreはOpen JTalkに依存しています。 このリポジトリでは、VOICEVOX Coreが利用するOpen JTalkのビルドとRustのバインディングを提供しています。 しかし、iOS向けのビルドは提供されていません。
そこで、open_jtalk-rsをiOSに対応したいと思います。
関連PR
9
すでにarm64向け実機
arm64-apple-ios
とarm64(Apple Silicon)向けシミュレータarm64-apple-ios-sim
のビルドが可能であることが確認されています。問題
x86_64(Intel Mac)向けシミュレータ
x86_64-apple-ios
のビルドができていません。 ビルドができないコミットは https://github.com/VOICEVOX/open_jtalk-rs/pull/9/commits/7b4d9e4c02d9140e97ab5e7c5bd55573380696b1 です。エラーログ
実行環境
MacBook Air M2 2022 rustc 1.68.2 (9eb3afe9e 2023-03-27) cargo 1.68.2 (6feb7c9cf 2023-03-26) Apple clang version 14.0.3 (clang-1403.0.22.14.1) cmake version 3.26.1