Open4

em2native: iOS(GLES) に対応する

okuokuokuoku

すでに動いている

これちょっと課題が多いな。。

動く動かないで言えばまぁ動くしデバッグもできるけど。。

okuokuokuoku

CMake でiOSプロジェクトをビルドする

https://github.com/okuoku/em2native-proto/commit/f59589f6fd560354d087af7a2eb6d0176cb96c33

十分に新しいCMakeであれば、直接iOSプロジェクトをビルドできる。

cmake -G Xcode -DCMAKE_SYSTEM_NAME=tvOS ~/repos/em2c

CMAKE_SYSTEM_NAME 変数に tvOS とか watchOS とかを渡せば、対応するプラットフォーム向けのプロジェクトが生成される。

外部で開発されているtoolchainファイルもあるが、まぁ基本的に標準のもので事足りるはず。。

OBJECT ライブラリを直接リンクする

https://github.com/okuoku/em2native-proto/commit/878909630c4cedb6793281858621f1067ae22bee

こんな制約あったっけか。。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_ALLOWEDXCODE_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
okuokuokuoku

SDLの CMakeLists.txt の修正

SDLのCMakeLists.txtは修正が必要になってしまった。 UWPの場合はワークアラウンドできた けど、残念ながらiOSは上手いワークアラウンドを思いつかなかった。

C言語へのOverrideをやめる

https://github.com/libsdl-org/SDL/commit/f658a737f66799de50a37cd77d02b6d56b6dcffd

    # !!! 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.

これはたぶん誤解で、 enable_language をし忘れていただけだろう。 EDIT: なんと 3.16 が最低サポートバージョンだった 。。 https://cmake.org/cmake/help/latest/release/3.16.html#languages

これをやらないと、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への依存を追加する

https://github.com/okuoku/SDL2/commit/35c8cfd822f9be4a9a755f11ba9f7727c6bb74cd

最近のSDLはMFiなゲームパッドでのhaptics(今回の場合は単なる振動)をサポートしている。というわけでCoreHapticsに依存しているがCMake側にそれが反映されていない。

これはこのままupstreamできなくて、このままだと古いSDKでビルドできなくなってしまう。SDKのバージョンを何とかして検出する方法を考えないといけない。。

Frameworkを find_library しない

https://github.com/okuoku/SDL2/commit/c92f3fe72439022a677b875356d9b25cf8517cb6

SDK標準フレームワークを find_library してはいけない。 find_library はリンク対象のライブラリファイルを見つけてきてしまうため、シミュレータで実行できなくなってしまう。

この辺は CMake公式のドキュメントでも言及されている

Use explicit -framework linker flag