2019年08月18日

Mac OS 10.14 で wxWidgets 開発(その1)

 新 MacBookPro で、wxWidgets の開発環境を立ち上げた。目標は、「Mac OS 10.6 上で実行できる 64 bit アプリを作ること」および、「Windows の 32 bit, 64 bit アプリを両方作ること」。

1. 開発環境の整備

 先日の Alchemusica のビルドの時に済ませていたのだが、ここに書いておく。以前に書いた「wxWidgets のクロスコンパイル (PowerPC 編)」と同じく、XcodeLegacy を使う。

(1) Xcode 10 と Command Line Tool for Xcode 10 をインストールしておく。Mac App Store 経由ではなく、Apple Developer サイト https://developer.apple.com/ の Download → More で探してダウンロードするのがよい。(昔の Xcode をダウンロードするために、いずれこのサイトが必要になる)。ちなみに、Firefox (68.0.1) ではこのページの表示がおかしかった。Safari が必要かもしれない。

20190817-1.png

(2) XcodeLegacy をダウンロード・展開する。

(3) (1) のサイトから Xcode 3.2.6 のインストーラをダウンロードして、XcodeLegacy のフォルダに入れておく。

(4) 次のように実行。今回は、10.6 の SDK だけインストールしておく。

$ cd path/to/xcodelegacy-master
$ chmod +x Xcodelegacy.sh
$ ./Xcodelegacy.sh -osx106 buildpackages
$ sudo ./Xcodelegacy.sh -osx106 install
$ sudo mkdir /Developer
$ sudo ln -sf '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs' /Developer/SDKs

2. mingw-w64 クロスコンパイラ

 Windows アプリを Mac 上でビルドするため、mingw-w64 のクロスコンパイラを導入する。以前に「wxWidgets のクロスコンパイル」で書いた時は、Darwin 用にビルドされたバイナリを使った。しかし、これはかなり古くて、gcc が 4.9 である。最新の mingw-w64 では gcc8 なので、さすがに古すぎるでしょう。

 自前でクロスコンパイラをビルドしてみよう、としばらく頑張ったが、あちこちでつまづいた。結局あきらめて、Homebrew を使うことにした。mingw-w64 のダウンロードページでは MacPorts 版へのリンクが張ってあるが、Homebrew 版もある。ただし、普通に Homebrew を使うと、/usr/local がとっ散らかるので、イレギュラーだが /usr/local/homebrew にインストールすることにした。

ここは考え方が分かれるところ。Homebrew 公式では、「/usr/local にインストールする方がトラブルは少ないよ」と書かれていて、それは確かに一理ある。でも、自分としては、サードパーディのパッケージマネージャーに /usr/local をいじられるのにどうしても抵抗を感じる。結果として mingw-w64 は無事動いたので、当面はこの運用でいくつもり。

$ cd /usr/local
$ sudo mkdir homebrew
$ sudo chown $USER:staff homebrew
$ curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
$ export PATH=/usr/local/homebrew/bin:$PATH   # .bash_profile にも入れておく。
$ export HOMEBREW_CACHE=/usr/local/homebrew/cache   #  同上
$ brew install mingw-w64
...

 標準の /usr/local へのインストールだと、バイナリをロードしてくるだけなのだが、非標準のインストールだと、一からビルドするので時間がかかる。それでも1時間かからずに終わった。

 ついでに、ターミナルから Homebrew の使用/不使用を簡単に切り替えられるように、次の関数定義を .bash_profile に入れておいた。

enable_brew() { disable_brew(); export PATH=/usr/local/homebrew/bin:$PATH; }
disable_brew() { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "/usr/local/homebrew/bin"' | sed 's/:$//'`; }

3. 10.6 対応の gfortran のビルド

 普通の人は関係ないと思うけど、私には gfortran が必要なのです。これも、10.6 で動くバイナリが作れないといけない。ライブラリの依存とかが面倒なことになるので、-isysroot /Developer/SDKs/MacOSX10.6.sdk の条件で gfortran 自体をビルドすることにした。

 以前に gcc 4.7 を fortran 付きでビルドした。今回は、なるべく新しいものを、と思って、まずは gcc 9.1 をビルドしてみたのだが、途中でこんなエラーが出て沈没した。

../../../../gcc-9.1.0/libsanitizer/sanitizer_common/sanitizer_mac.cc: In function ‘bool __sanitizer::GetRandom(void*, __sanitizer::uptr, bool)’:
../../../../gcc-9.1.0/libsanitizer/sanitizer_common/sanitizer_mac.cc:1081:3: error: ‘arc4random_buf’ was not declared in this scope; did you mean ‘arc4random_stir’?
 1081 |   arc4random_buf(buffer, length);
      |   ^~~~~~~~~~~~~~
      |   arc4random_stir

 調べてみると、arc4random_buf() は Mac OS 10.7 以降でしか使えない。そこで、バージョンを1つ下げて gcc 8.3 に切り替えた。次のようにして、無事ビルドできた。

$ sudo mkdir /usr/local/gcc8
$ cd /Developer/SDKs/MacOSX10.6.sdk/usr/local; ln -s /usr/local/gcc8 gcc8
$ cd path/to/gcc8.3
  #  gcc8.3 ディレクトリの中に gmp-5.0.5, mpfr-3.1.2, mpc-1.1.0,
  #  isl-0.21, gcc-8.3.0 を展開してある
$ cd gmp-5.0.5
$ mkdir build; cd build
$ ../configure --prefix=/usr/local/gcc8 --disable-shared --enable-static --with-sysroot=/Developer/SDKs/MacOSX10.6.sdk CFLAGS=-fPIC CXXFLAGS=-fPIC | tee configure.log
$ make -j 2 2>&1 | tee make.log
$ make check | tee makecheck.log
$ sudo make install
$ cd ../../mpfr-3.1.2
$ mkdir build; cd build
$ ../configure --prefix=/usr/local/gcc8 --disable-shared --enable-static --disable-thread-safe --with-sysroot=/Developer/SDKs/MacOSX10.6.sdk CFLAGS=-fPIC CXXFLAGS=-fPIC --with-gmp=/usr/local/gcc8 | tee configure.log
  #  --disable-thread-safe 重要!
$ make -j 2 2>&1 | tee make.log
$ make check | tee makecheck.log
$ sudo make install
$ cd ../../mpc-1.1.0
  #  mpc-0.9 だと --with-sysroot がないので面倒
$ mkdir build; cd build
$ ../configure --prefix=/usr/local/gcc8 --disable-shared --enable-static  --with-sysroot=/Developer/SDKs/MacOSX10.6.sdk CFLAGS=-fPIC CXXFLAGS=-fPIC --with-gmp=/usr/local/gcc8 --with-mpfr=/usr/local/gcc8 | tee configure.log 
$ make -j 2 2>&1 | tee make.log
$ make check | tee makecheck.log
$ sudo make install
$ cd ../../isl-0.21
$ mkdir build; cd build
$ ../configure --prefix=/usr/local/gcc8 --disable-shared --enable-static --with-sysroot=/Developer/SDKs/MacOSX10.6.sdk --with-pic --with-gmp-prefix=/usr/local/gcc8 | tee configure.log 
$ make -j 2 2>&1 | tee make.log
$ make check | tee makecheck.log
$ sudo make install
$ cd ../..
$ mkdir build-gcc; cd build-gcc
$ ../gcc-8.3.0/configure --prefix=/usr/local/gcc8 --with-sysroot=/Developer/SDKs/MacOSX10.6.sdk --with-build-sysroot=/Developer/SDKs/MacOSX10.6.sdk --with-gmp=/usr/local/gcc8 --with-mpfr=/usr/local/gcc8 --with-mpc=/usr/local/gcc8 --disable-nls --disable-tls --disable-multilib --enable-languages=c,c++,fortran --with-pic | tee configure.log
  #  --disable-tls 重要!
$ (date 2>&1; make -j 4 2>&1; date 2>&1) | tee make.log
$ sudo make install

 gfortran のスタティックリンクのため、/usr/local/gcc8/lib/gfortran.spec を修正。

#*lib: -lquadmath -lm %(libgcc) %(liborig)
*lib: -lm %(libgcc) %(liborig)
  #  lquadmath を無条件にリンクするのをやめる

 リンク時には、-static-libgfortran -static-libgcc /usr/local/gcc8/lib/libquadmath.a を指定する。これで、libgfortran.dylib, libquadmath.dylib に依存しないバイナリができる。

 長くなったので、いったん切ります。次は Xcode プロジェクトの設定など。

タグ:Mac wxWidgets
Posted at 2019年08月18日 00:58:26
email.png