Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

xcframeworkにmodule.modulemapを同梱して欲しい #578

Closed
3 tasks
fuziki opened this issue Aug 17, 2023 · 6 comments · Fixed by #579
Closed
3 tasks

xcframeworkにmodule.modulemapを同梱して欲しい #578

fuziki opened this issue Aug 17, 2023 · 6 comments · Fixed by #579

Comments

@fuziki
Copy link
Contributor

fuziki commented Aug 17, 2023

内容

xcframework対応ありがとうございます!
とても嬉しいです!

ただ、0.15.0-preview.5のxcframeworkには、module.modulemapが同梱されておらず、SwiftからHeaderを見つけることができません。
そこで、xcframeworkにmodule.modulemapを同梱して頂けるとiOSで開発する上で大変助かります。

参考:https://medium.com/@kennethyoel/a-swiftly-oxidizing-tutorial-44b86e8d84f5

module.modulemapの例:

module VoicevoxCore {
  header "voicevox_core.h"
  export *
}

xcframeworkの構造:

voicevox_core-osx-arm64-cpu-0.15.0-preview.5.zip
voicevox_core.xcframework
├── Info.plist
├── ios-arm64
│   ├── Headers
│   └── libvoicevox_core.dylib
└── ios-arm64_x86_64-simulator
    ├── Headers
    └── libvoicevox_core.dylib

module.modulemap追加後
voicevox_core.xcframework
├── Info.plist
├── ios-arm64
│   ├── Headers
│   │   ├── voicevox_core.h
│   │   └── module.modulemap
│   └── libvoicevox_core.dylib
└── ios-arm64_x86_64-simulator
    ├── Headers
    │   ├── voicevox_core.h
    │   └── module.modulemap
    └── libvoicevox_core.dylib

Pros 良くなる点

  • iOSでvoicevox_coreを容易に利用できるようになります。
    • 具体的にはPackage Managerにzipのパスを入れるだけで、voicevox_coreに含まれる関数を利用できるようになります。
    targets: [
        .target(
            name: "MyApp",
            dependencies: [
                .target(name: "onnxruntime"),
                .target(name: "VoicevoxCore"),
            ]
        ),
        .binaryTarget(
            name: "onnxruntime",
            url: "https://github.com/VOICEVOX/onnxruntime-builder/releases/download/X.X.X/onnxruntime.xcframework.zip",
            checksum: "hash"),
        .binaryTarget(
            name: "VoicevoxCore",
            url: "https://github.com/VOICEVOX/voicevox_core/releases/download/X.X.X/voicevox_core.xcframework.zip",
            checksum: "hash"),
    ]

Cons 悪くなる点

  • module.modulemapの管理が必要になります。

実現方法

xcodebuild -create-xcframework-headers にヘッダファイルではなく、ヘッダファイルとmodule.modulemapが含まれるディレクトリを指定すると、modulemapが同梱され、Swiftからヘッダを見つけることができるようになります。

xcodebuild -create-xcframework \
-library "artifact/voicevox_core-sim/libvoicevox_core.dylib" \
-headers "artifact/voicevox_core-x86_64-apple-ios/voicevox_core.h" \
-library "artifact/voicevox_core-aarch64-apple-ios/libvoicevox_core.dylib" \
-headers "artifact/voicevox_core-aarch64-apple-ios/voicevox_core.h" \
-output "artifact/${{ env.ASSET_NAME }}/voicevox_core.xcframework"

VOICEVOXのバージョン

0.15.0-preview.5

OSの種類/ディストリ/バージョン

  • Windows
  • macOS
  • Linux

その他

@y-chan
Copy link
Member

y-chan commented Aug 17, 2023

Issueありがとうございます!
なるほど、modulemapというものがあるといいんですね...!
おそらく、modulemapを管理するコスト自体はそこまでかからないだろうなーと思っている(変更が加わることがまずないはずな)ので、追加すること自体は問題ないと思います!
置くとしたらどこがいいでしょうかね...crates/voicevox_core_c_api/include/とか...?

実現方法までわかっている状態だと思いますので、良ければプルリクエスト(PR)を作成してみませんか...?:eyes:
PRが取り込まれた際には、VOICEVOXの貢献者としてお名前を記載させていただきます...!

@fuziki
Copy link
Contributor Author

fuziki commented Aug 18, 2023

ありがとうございます!
ぜひPR作成までやらせてください

ただ、あまりrustのメジャーなディレクトリ構成に自信がないので、modulemapの配置場所をご相談できると助かります。
crates/voicevox_core_c_api/include/ にmodulemapを配置で良いでしょうか?

@Hiroshiba
Copy link
Member

なるほど、単純にファイルを置いてビルド時に指定したら良い感じなんですね!
僕もどこに置けば良さそうかいまいち自信がないです・・・。
./crates/voicevox_core_c_api/include/でも良さそうだし、./build_util/でも良さそうだし、./crates/voicevox_core_c_api/misc/とか作っても良さそうだし、.github/workflows/build_and_deploy.yml内でファイル生成やっちゃってもそこまで悪くなさそうだし・・・。

@qryxip さん的にどうでしょう 🙇

@qryxip
Copy link
Member

qryxip commented Aug 20, 2023

include/voicevox_core.hは #493 からコミットされるようになった自動生成(linguist-generated)のファイルです。"include"という名のディレクトリの下である必然性は特にありませんし、このディレクトリに何か別のものが混入しても今現在においては問題は起きないでしょう。

あとswift-bridgeによるvoicevox_core_swift_apiを誕生させるというアイデア(#550Javaは今レビュー段階)がありますが、今のところはvoicevox_core_c_api下に置いても問題無いと思います。

ただmodule.modulemapが"include"という名のディレクトリの下にあるべきかというと微妙な気もするので、/crates/voicevox_core_c_api/xcframework/Headers/module.modulemapみたいな位置に置いておいてbuild_and_deploy上でcpして組み立てる、というのがよいかもしれません。

@Hiroshiba
Copy link
Member

なるほどです、賛成です!!
追加の案でmodulemap内にコメントがかければそのファイルが何なのかを、無理であればそのディレクトリにREADMEを置いてファイルの説明があると追いやすそうかもと思いました!

@fuziki
Copy link
Contributor Author

fuziki commented Aug 21, 2023

みなさまありがとうございます!
PR作成したので、確認お願いいたします🙇
#579

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants