em2native: iOS(GLES) に対応する
すでに動いている
これちょっと課題が多いな。。
動く動かないで言えばまぁ動くしデバッグもできるけど。。
CMake でiOSプロジェクトをビルドする
十分に新しいCMakeであれば、直接iOSプロジェクトをビルドできる。
cmake -G Xcode -DCMAKE_SYSTEM_NAME=tvOS ~/repos/em2c
CMAKE_SYSTEM_NAME
変数に tvOS
とか watchOS
とかを渡せば、対応するプラットフォーム向けのプロジェクトが生成される。
- CMakeのドキュメント: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-ios-tvos-or-watchos
外部で開発されているtoolchainファイルもあるが、まぁ基本的に標準のもので事足りるはず。。
OBJECT
ライブラリを直接リンクする
こんな制約あったっけか。。XcodeではGenerator expressionが target_link_library
で使えないらしいので、通常のライブラリのように OBJECT
ライブラリをリンクすることにした。
CMake Error at CMakeLists.txt:151 (target_link_libraries):
Error evaluating generator expression:
$<TARGET_OBJECTS:yfrm>
The evaluation of the TARGET_OBJECTS generator expression is only suitable
for consumption by CMake (limited under Xcode with multiple architectures).
It is not suitable for writing out elsewhere.
バンドルの設定
iOSデバイスにバンドルをインストールするには、いくつかの属性を事前に設定する必要がある。
elseif(APPLE)
add_executable(em2app ${mainsrc})
set_target_properties(em2app
PROPERTIES
MACOSX_BUNDLE_BUNDLE_NAME em2app
MACOSX_BUNDLE_BUNDLE_VERSION 1.0
MACOSX_BUNDLE_SHORT_VERSION_STRING 1.0
MACOSX_BUNDLE_LONG_VERSION_STRING 1.0
MACOSX_BUNDLE_GUI_IDENTIFIER org.cltn.em2app
XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO"
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
)
XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED
と XCODE_ATTRIBUTE_ENABLE_BITCODE
は微妙に謎で、とりあえずシミュレータでは署名が不要なのでサボっている。この辺の設定をしないと ↓ のようなエラーになる。
error: Bundle identifier is missing. em2app doesn't have a bundle identifier.
Add a value for PRODUCT_BUNDLE_IDENTIFIER in the build settings editor.
(in target 'em2app' from project 'em2capp')
error: Signing for "em2app" requires a development team.
Select a development team in the Signing & Capabilities editor.
(in target 'em2app' from project 'em2capp')
ld: -undefined and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together
CMakeLists.txt
の修正
SDLの SDLのCMakeLists.txtは修正が必要になってしまった。 UWPの場合はワークアラウンドできた けど、残念ながらiOSは上手いワークアラウンドを思いつかなかった。
C言語へのOverrideをやめる
# !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
In my cross-build environment with cmake-2.8.12.1, cmake does not add
SDL_coreaudio.m to its makefiles and the result is a failure. The fix
is simple: set the language to C for it as it is done at other places
in CMakeLists.txt.
これはたぶん誤解で、 EDIT: なんと 3.16 が最低サポートバージョンだった 。。 https://cmake.org/cmake/help/latest/release/3.16.html#languagesenable_language
をし忘れていただけだろう。
これをやらないと、CMakeが挿入するオプション -x c
でObjCのソースコードが純粋なC言語コードとしてコンパイルされてしまうことになる。
System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:8:
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS14.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:492:1: error:
expected identifier or '('
@class NSString, Protocol;
^
CoreHapticsへの依存を追加する
最近のSDLはMFiなゲームパッドでのhaptics(今回の場合は単なる振動)をサポートしている。というわけでCoreHapticsに依存しているがCMake側にそれが反映されていない。
これはこのままupstreamできなくて、このままだと古いSDKでビルドできなくなってしまう。SDKのバージョンを何とかして検出する方法を考えないといけない。。
find_library
しない
Frameworkを
SDK標準フレームワークを find_library
してはいけない。 find_library
はリンク対象のライブラリファイルを見つけてきてしまうため、シミュレータで実行できなくなってしまう。
この辺は CMake公式のドキュメントでも言及されている 。
Use explicit
-framework
linker flag
Pull request 起票
とりあえずPR出す。