hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

Xcode 12 対応

Apple Silicon Macが登場し、今後はIntelからArmへの移行が思ったよりも早く進みそうである。主要なソフトは次々にユニバーサルアプリの対応を発表、あるいはリリースしている。

EBシリーズもユニバーサルアプリ化の準備として、まず開発環境をXcode12に移行することにした。

macOSアプリのユニバーサル化

基本的には、Xcode12でコンパイルするだけで、自動的にユニバーサルアプリになる。Architectures の選択が、デフォルトで次のようになっている。

Build settings → Architectures → Architectures → 

 Standard Architectures(Apple Silicon,Intel)

これで話は終わってしまうのだが、EBMacの場合、これまで対象OSの下限をmacOS X 10.5(Leopard)にしていた関係上、C++ Standard Library に、現在では非推奨の libstdc++ を使用していた。Xcode9以降はlibstdc++は入っていないため、Xcode8のlibstdc++を無理矢理コピーして、Xcode11まで使い続けていた。

libstdc++のarm用は提供されないので、ユニバーサルアプリにするためには libc++ に変更する必要がある。

変更箇所は:

Build Settings → Apple Clang-Language-C++ → C++ Standard Library    → libc++

これで晴れてユニバーサルアプリとしてコンパイルすることができるようになったが、対象OSは macOS X 10.9 (Mavericks)以降になってしまった。これは仕方が無い。

ユニバーサルアプリの確認方法

本当にユニバーサルアプリになったかどうかは、file コマンドで確認できる。

$ ls
EBMac.app
$ file EBMac.app/Contents/MacOS/EBMac
EBMac.app/Contents/MacOS/EBMac: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64]
EBMac.app/Contents/MacOS/EBMac (for architecture x86_64): Mach-O 64-bit executable x86_64
EBMac.app/Contents/MacOS/EBMac (for architecture arm64): Mach-O 64-bit executable arm64

iOSアプリのXcode12 対応 

次は、EBPocket for iOSの移行である。基本的にそのままコンパイルできるのだが、リリースモジュールは作れるのに、デバッグモードでシミュレータを使用しようとするとエラーになってビルドができない。

色々調べた結果、Xcode11以前に作成したプロジェクトファイルにはVALID_ARCHSの定義があり、これが非推奨になったことが原因らしい。

Build settingsのUser-DefinedからVALID_ARCHSをバッサリ削除すると、デバッグモードでのビルドができるようになり、シミュレータが起動するようになった。

なお、Xcode12でビルドする場合、target OSの下限は9.0になる。

 Apple Silicon Macについて

これでユニバーサルアプリが作れるようになったわけだが、やはり実機で検証する必要がある。だが第一世代機を購入するのはなかなか勇気が要る。

現在の私の開発環境は、

の2台だが、Apple Silicon Mac を入れると3台になって、どうも多すぎる。MacBook Proを置き換えた場合、Apple Silicon MacではVM Wareで仮想環境が使えないのが痛い。Surface Pro は持ち運び用に欠かせないし、Windows版の開発環境一式が載っている。

順当に考えると、Apple Silicon の Macbook Air あたりを買い足しするのがいいのだが、どうも時期尚早な気がする。

Apple Silicon MacVMWare が動くようになれば、一台に集約できるかもしれないが、もう少し様子見をして考えたい。