Open5

Yuniframe: macOS/iOS移植 (ビルドチェック編)

okuokuokuoku

いろいろやってみたんだけど、CIをやろうとするとXcodeを直接使うのは複雑過ぎるということで、ビルドと"ビルドチェック"を分離して実装することにした。。

  • ビルド : Xcodeでアプリケーションを作って実機なりエミュレータなりで動作させること
  • ビルドチェック : SDKのツールチェインでC/C++部分をコンパイルすること

ビルドチェックはNinjaでできるし、 CMAKE_NINJA_OUTPUT_PATH_PREFIX を使えば、 subninja で複数のCMakeビルドツリーを纏めることも(多分)可能なのでイテレーションを短縮できるんではなかろうか。。

→ まとめるのはダメだった。 Order-only dependenciesにここで指定したprefixが付かないので、ターゲット名を被らせることができない。

ninja: error: Win64MSVC-SDL2-ANGLE-DirectX11-RelWithDebInfo/build.ninja:133: multiple rules generate cmake_object_order_depends_target_angle_static [-w dupbuild=err]
okuokuokuoku

macOSにはGLESは無い

/Users/okuoku/devel/yuniframe/build/sdl2/sdl2/include/SDL_egl.h:33:10: fatal error: 'EGL/egl.h' file not found
#include <EGL/egl.h>
         ^~~~~~~~~~~
1 error generated.

すっかり忘れてた。。いやまぁOpenGLに移植しても良いのかもしれないけど今さら過ぎる。。

これは通常のMetalビルドでも対策必要なのでとりあえず -DSDL_USE_BUILTIN_OPENGL_DEFINITIONS を入れてお茶を濁す。

https://github.com/okuoku/em2native-integ/commit/d522374f9ed1b627bd544eb646e92c640bd52510

okuokuokuoku

MACOSX_RPATH の警告

CMakeのconfigure時に警告が出る。

CMake Warning (dev):
  Policy CMP0042 is not set: MACOSX_RPATH is enabled by default.  Run "cmake
  --help-policy CMP0042" for policy details.  Use the cmake_policy command to
  set the policy and suppress this warning.

  MACOSX_RPATH is not specified for the following targets:

   SPIRV-Tools-shared

This warning is for project developers.  Use -Wno-dev to suppress it.

... そもそもSPIRV-Tools-sharedはビルドする必要がない。が、今のところ無効化する方法がない。

https://github.com/KhronosGroup/SPIRV-Tools/blob/e68fe9be4e6ca63097ac4305d7552ad29afd5004/source/CMakeLists.txt#L381-L382

まぁOnでかまわないので明示的にOnにしておく。

https://github.com/okuoku/em2native-integ/commit/9ce33c061510d60c015545179f0e48cd2ac8968d

(cmake_policy で設定するとsubdirectoryのminimum versionで挙動が上書きされてしまう。)

okuokuokuoku

何故かデフォルトのC++バージョンが低い

/Users/okuoku/devel/yuniframe/integ/ext/cwgl/glslang/glslang/MachineIndependent/localintermediate.h:249:49: warning: deleted function definitions are a C++11 extension [-Wc++11-extensions]
    TNumericFeatures(const TNumericFeatures&) = delete;
                                                ^

... 何で。。?とりあえずプリプロセスして確認してみると:

okuoku@prism build % touch dummy.cpp
okuoku@prism build % /Users/okuoku/devel/xcodes/install/Xcode-14.3.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -E -dM dummy.cpp

何も指定しない場合は:

#define __VERSION__ "Apple LLVM 14.0.3 (clang-1403.0.22.14.1)"
#define __cplusplus 199711L

C++11ですら無いってどういう事だよ。。とりあえず17に上げる。

https://github.com/okuoku/cwgl/commit/b54d12f330469c52b1c4e467cc172b3f3f6d4156

okuokuokuoku

Xcodeを使わずにビルドだけNinjaでやる

これが結構辛い。。細かいことは cmake-toolchains のman pageにある。

  • CMAKE_SYSTEM_NAMEiOS とか tvOS のように設定する。
  • CMAKE_OSX_SYSROOT は XCode以外では自動検出されないので手動で /Volumes/devel/xcodes/install/Xcode-14.3.1.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk みたいに設定する。
  • CMAKE_OSX_ARCHITECTURESarm64x86_64

CMAKE_OSX_SYSROOT に設定すべきパスのprefixは xcode-select -p コマンドで取得できる。