conanのすゝめ

486 Views

October 23, 24

スライド概要

visionOS勉強会#7@Apple Japan

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

conanのすゝめ visionOS勉強会#7 @Apple Japan @shiena 2024-10-23

2.

自己紹介 • KOGA Mitsuhiro a.k.a @shiena • 得意分野: Unity(VR系) • 上級VR技術者 • 趣味: ホロライブ

3.

Godot Engineの勉強会でVision Proアプリ開発手法を発表

4.

発表の流れ • conanとは? • 導入方法 • ビルド例 • xcframeworkを作る • まとめ

5.

conanとは • https://conan.io/ • C / C++ Package Manager • Windows / MacOS / Linux / Android / iOSなど複数プラット フォーム対応

6.

似たツールと比較 • vcpkg • Microsoftが開発 • Cons • Hunter • cpp-pmが開発 • Cons • VisionOS未対応 • VisionOS未対応 • ビルドフラグのカスタマイ • 対応ライブラリが少ない ズが少ない • 情報が少ない

7.

• • https://x.com/BenGeskin/status/1817549161937391748 クロスシミュレーションを真似したい!!!

8.

• https://github.com/jrouwe/JoltPhysics • Jolt Physicsは物理演算エンジンで既にゲームで採用されている • JS版のデモサイト https://jrouwe.github.io/JoltPhysics.js/

9.

# 作業フォルダ作成 導入方法 $ mkdir myproject $ cd myproject # venvで仮想環境を作成 $ python3 -m venv venv $ source ./venv/bin/activate # pipでインストール $ pip install conan # conanのデフォルトプロファイル作成 $ conan profile detect —force

10.

$ cat ~/.conan2/profiles/visionOS プロファイルを 追加する VisionOS向けのサンプル include(default) [settings] # visionOS実機をターゲットにする os=visionOS os.version=1.2 os.sdk=xros [conf] # conanfile.pyで対応していないcmakeの変数を設定する tools.cmake.cmaketoolchain:extra_variables={'JPH_NO_DEB UG':'YES'} # ビルドログを表示する tools.build:verbosity=verbose tools.compilation:verbosity=verbose

11.
[beta]
from conan import ConanFile
from conan.tools.files import copy
from conan.tools.layout import basic_layout
import os

ビルド定義例

class JoltPysicsRecipe(ConanFile):
settings = "os", "compiler", "build_type", "arch"
def requirements(self):
# ビルドオプションを設定する
options = {
"interprocedural_optimization": False,
"debug_renderer_in_debug_and_release": False,
"profiler_in_debug_and_release": False,
"use_asserts": True,
"enable_object_stream": True,
}
# ビルドするライブラリとバージョンを指定する
self.requires("joltphysics/5.1.0", options=options)

JoltPhysicsを例に
conan le.pyを作る

def layout(self):
basic_layout(self)
def generate(self):
# ビルドしたライブラリとヘッダーファイルをコピーする
# Apple Vision Pro実機向け: build-release/arm64-visionOS-xros
# VisionOSシミュレータ向け: build-release/arm64-visionOS-xrsimulator

fi

if 'sdk' in self.settings.os.fields:
spec = "{}-{}-{}".format(self.settings.arch, self.settings.os, self.settings.os.sdk)
else:
spec = "{}-{}".format(self.settings.arch, self.settings.os)
for dep in self.dependencies.values():
copy(self, "*", dep.cpp_info.includedirs[0], os.path.join(self.build_folder, spec, "include"))
copy(self, "*.a", dep.cpp_info.libdirs[0], os.path.join(self.build_folder, spec, "lib"))

12.

ビルドする # -prでプロファイル名を指定 # -s os.sdkでプロファイルの値を上書き # -s build_typeはデフォルトはDebugなのでReleaseへ変更 # -build=missingはビルドしていない依存ライブラリがあればビルドする # デバイス用ビルド $ conan install . -pr visionOS -s build_type=Release —build=missing # シミュレータ用ビルド $ conan install . -pr visionOS -s os.sdk=xrsimulator -s build_type=Release --build=missing

13.

ビルドしたライブラリからxcframeworkを作る $ xcodebuild -create-xcframework \ -library build-release/armv8-visionOS-xros/lib/libJolt.a \ -headers build-release/armv8-visionOS-xros/include \ -library build-release/armv8-visionOS-xrsimulator/lib/libJolt.a \ -headers build-release/armv8-visionOS-xrsimulator/include \ -output JoltPhysics.xcframework $ cat module.modulemap module JoltPhysics { // 公開するヘッダーのみをインクルードしたヘッダーファイル umbrella header "JoltPhysics.h" } $ cp module.modulemap JoltPhysics.xcframework/xros-arm64/Headers/ $ cp module.modulemap JoltPhysics.xcframework/xros-arm64-simulator/Headers/ $ cp JoltPhysics.h JoltPhysics.xcframework/xros-arm64/Headers/ $ cp JoltPhysics.h JoltPhysics.xcframework/xros-arm64-simulator/Headers/

14.

xcframeworkをSPMで配布する $ cat Package.swift import PackageDescription let package = Package( name: "JoltPhysics", platforms: [ .visionOS(.v1), ], products: [ .library( name: "JoltPhysics", targets: ["JoltPhysics"]), ], targets: [ .binaryTarget( name: "JoltPhysics", path: "JoltPhysics.xcframework"), ] )

15.

はまった所 • xcframework化するとC++20の moduleとして扱われる // Data.h enum class Data { #define DATA_TYPE(name) T_##name, #include "DataType.h" } • moduleでは動的なコードを扱 えない • →はNGなので手動で展開など のパッチが必要 // DataType.h DATA_TYPE(int) DATA_TYPE(float) DATA_TYPE(Vec3) #undef DATA_TYPE

16.

まとめ • conanはいいぞ • xcframework化すると後が楽 • でもC++20のmodule対応は面倒