インストール: BlueGriffon 3.1 M1 macOS Big Sur

HTMLエディターのBlueGriffonをM1 Macでビルドしたので手順を記す。

なお、ビルドはできたものの、実行するとクラッシュしてしまった。そのほか、パッケージングも失敗した。何か別の問題が残っているようだ。他の人のための参考情報として記す。

概要

macOS Big SurのBlueGriffonでのダイアログ白紙の調査 – Kenchant」に投稿した通り、macOS Big SurでBluGriffonのダイアログが白紙になるという問題があり、このバグに対応するには、ソースコードを自分でビルドする必要があって取り組んだ。

macOS Big Sur v11.6.7のMacBook Air (M1, 2020) で試みた。公式リポジトリ―「therealglazou/bluegriffon: BlueGriffon, the Web editor」から、README.mdの手順に従ってビルドする。

使用するマシンのCPUがARM (Apple Silicon)かIntelかで若干手順が異なる。ARMネイティブのビルドは失敗しており、どちらにしてもIntel向けビルドになる。

M1 MacでARMとIntelのターミナルを切り替えて使う (Homebrew 3以降の場合) – Qiita」を参考に、Intel用のターミナル・homebrewでのビルドを念頭に置き、ARMマシンでのビルド時の注意点を最後に補足説明する。

現時点のBlueGriffon最新コミットである2019-12-18の7abbf5822d1076356c0389f1e32b1657e424805fでのビルドを行う。修正など注意点が多いので、段階別にビルド手順を分けて記す。

ソースコードの取得

まず、リポジトリ―からソースコードを取得して、基本的なパッチを適用する。

## Get repository
[ -e bluegriffon-source ] || git clone ――depth 1 https://github.com/mozilla/gecko-dev bluegriffon-source
cd bluegriffon-source

[ -e bluegriffon ] || git clone --depth 1 https://github.com/therealglazou/bluegriffon
cd bluegriffon
git fetch --depth 1 origin 7abbf5822d1076356c0389f1e32b1657e424805f
git checkout -f 7abbf5822d1076356c0389f1e32b1657e424805f
cd ..

git fetch --depth 1 origin 042b84af6020b1f2d8029a0dc36ac5955b7f325f # $(cat bluegriffon/config/gecko_dev_revision.txt)
git reset --hard `cat bluegriffon/config/gecko_dev_revision.txt`
patch -Np 1 <bluegriffon/config/gecko_dev_content.patch patch -Np 1 <bluegriffon/config/gecko_dev_idl.patch

2回目以降のパッチの重複適用を無視するために-Nオプションを指定している。

ビルド設定の変更

サンプルのビルド設ファイルをコピーして、修正する。

## Fix .mozconfig
case $OSTYPE in darwin*) \cp -f bluegriffon/config/mozconfig.macosx .mozconfig esac
patch -Np 1 <<-'EOT'
diff --git a/.mozconfig b/.mozconfig index de7ca57..0cd376e 100644 --- a/.mozconfig +++ b/.mozconfig @@ -30,8 +30,8 @@ mk_add_options MOZ_MAKE_FLAGS="-j8" # BlueGriffon is currently built against 10.10 SDK. # See https://github.com/phracker/MacOSX-SDKs/ if you miss a given SDK ############################## -ac_add_options --with-macos-sdk=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -ac_add_options --enable-macos-target=10.10 +ac_add_options --with-macos-sdk=/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk +ac_add_options --enable-macos-target=11.6
EOT

元々サンプルで用意されていたMac用の.mozconfigはSDKのバージョンなどが古いので、これを現在のOSのものに差し替える。

Rustコンパイラーのインストール

この状態で./mach buildを実行すると、以下のようなrustコンパイラー不足のエラーが出る。

 0:04.43 ERROR: Rust compiler not found.
 0:04.43 To compile rust language sources, you must have 'rustc' in your path.
 0:04.43 See https://www.rust-lang.org/ for more information.
 0:04.43 
 0:04.43 You can install rust by running './mach bootstrap'
 0:04.43 or by directly running the installer from https://rustup.rs/

そのほか、最新のrustcをインストールしてビルドすると、コンパイラーのバージョンの違いに由来する以下のようなエラーが発生した。

 0:14.68    Compiling core-text v4.0.0
 0:14.72 error[E0713]: borrow may still be in use when destructor runs
 0:14.72    --> /Users/senooken/.local/src/bluegriffon-source/third_party/rust/url/src/form_urlencoded.rs:246:40
 0:14.72     |
 0:14.72 244 | impl<'a> Target for ::UrlQuery<'a> {
 0:14.72     |      -- lifetime `'a` defined here
 0:14.72 245 |     fn as_mut_string(&mut self) -> &mut String { &mut self.url.serialization }
 0:14.73 246 |     fn finish(self) -> &'a mut ::Url { self.url }
 0:14.73     |                                        ^^^^^^^^ - here, drop of `self` needs exclusive access to `*self.url`, because the type `UrlQuery<'_>` implements the `Drop` trait
 0:14.73     |                                        |
 0:14.73     |                                        returning this value requires that `*self.url` is borrowed for `'a`

./mach bootstrapではバージョンを指定したRustコンパイラーをインストールできない。

そのため、BlueGriffonの最新コミット (2019-12-18) と同じ時期のバージョンのRustコンパイラー1.39.0 (2019-11-07) をインストールする。なお、BlueGrifon 3.1 (2017-12-04) の場合、Rustは1.17.0 (2017-04-27) となる。

Homebrewではバージョンを指定してインストールできないので、brewでrustupをインストールして、指定したバージョンをインストールする (参考: macOSでRustのローカル開発環境を整えるための手順2022 – Qiita)。

brew install rustup-init
echo 1 | rustup-init

これで~/.cargoに一式がインストールされ、~/.profile~/.bashrc~/.zshenvに. "$HOME/.cargo/env"が追記される。元に戻す時は以下のコマンドを実行する。

rustup self uninstall

以下のコマンドで現在のシェルに設定を反映させておく。

source $HOME/.cargo/env

続いて以下のコマンドで1.39.0のRustコンパイラーをインストールする。

rustup install 1.39.0

これでRustコンパイラーのインストールは完了となる。

ビルドツールのインストール

続いて、Rust以外のビルドツールを以下のコマンドでインストールする。

./mach bootstrap <<-EOT
2
1
2
EOT

実行すると以下の設問が順番に表示される。

Please choose the version of Firefox you want to build:
1. Firefox for Desktop Artifact Mode
2. Firefox for Desktop
3. Firefox for Android Artifact Mode
4. Firefox for Android

ArtifactモードはC++のコードを編集しない人向けのモードなので2を選ぶ。

Please choose a package manager you'd like:
1. Homebrew
2. MacPorts (Does not yet support bootstrapping Firefox for Android.)

ビルドツールのインストールに使用するパッケージマネージャーを選ぶ。今回はHomebrewなので1を選ぶ。

The Firefox build system and related tools store shared, persistent state
in a common directory on the filesystem. On this machine, that directory
is:

  /Users/senooken/.mozbuild

If you would like to use a different directory, hit CTRL+c and set the
MOZBUILD_STATE_PATH environment variable to the directory you'd like to
use and re-run the bootstrapper.

Would you like to create this directory?

  1. Yes
  2. No

最後に~/.mozbuildディレクトリーを作るか聞かれる。2のNoを選ぶ。

インストール中に、以下の警告が表示されることがある。

Your environment's PATH variable lists a system path directory (/usr/bin)
before the path to your package manager's binaries (/opt/homebrew/bin).
This means that the package manager's binaries likely won't be
detected properly.

This means that the package manager's binaries likely won't be
detected properly.

Modify your shell's configuration (e.g. ~/.profile or
~/.bash_profile) to have /opt/homebrew/bin appear in $PATH before /usr/bin. e.g.

    export PATH=/opt/homebrew/bin:$PATH

Once this is done, start a new shell (likely Command+T) and run
this bootstrap again.

表示されている通り、PATH変数の前のほうにHomebrewのPATHが来るようにしておく。

ここまでで基本的なビルドの準備が整った。手順通りであればあとは以下のコマンドでビルドするだけとなる。

./mach build

しかし、いくつものエラーが発生するので事前にその対策を施す。

opt/_virtualenv/bin/python is not functioning

以下のようなvirtualenvでインストールされるpythonコマンドが機能していないとのエラーが表示される。

 0:00.35 /usr/bin/make -f client.mk MOZ_PARALLEL_BUILD=8 -s configure
 0:01.37 cd /Users/senooken/.local/src/bluegriffon-source/opt
 0:01.37 /Users/senooken/.local/src/bluegriffon-source/configure
 0:01.56 Creating Python environment
 0:01.64 New python executable in /Users/senooken/.local/src/bluegriffon-source/opt/_virtualenv/bin/python
 0:01.64 ERROR: The executable /Users/senooken/.local/src/bluegriffon-source/opt/_virtualenv/bin/python is not functioning
 0:01.64 ERROR: It thinks sys.prefix is u'/Users/senooken/.local/src/bluegriffon-source/opt' (should be u'/Users/senooken/.local/src/bluegriffon-source/opt/_virtualenv')
 0:01.64 ERROR: virtualenv is not compatible with this system or executable
 0:01.64 Traceback (most recent call last):
 0:01.64   File "/Users/senooken/.local/src/bluegriffon-source/configure.py", line 124, in <module>
 0:01.64     sys.exit(main(sys.argv))

調べたところ、python/virtualenv/virtualenv.pyinstall_pythonでコマンドをインストールしている。

Virtualenv does not work correctly on python 2.7 from python.org and new macOS 12 Monterey · Issue #2284 · pypa/virtualenv」のissueが内容としては近いので参考までに掲載しておくが、若干違う。

既存実装では、virtualenvでインストールするpythonコマンドに/System/Library/Frameworks/Python.framework/Pythonを使っているのだが、このバイナリーが元々実行できないものだった。プログラム内では、py_executable変数にsys.executable=/System/Library/Frameworks/Python.framework/Resources/Python.app/Contents/MacOS/Pythonの実行可能バイナリーのパスが設定されている。しかし、mach_o_change関数でこれを実行できないものに差し替えられてしまっているのが問題のようだ。Mac特有の差し替え処理で詳細を理解できていない。

ひとまず、mach_o_changeを実行しなければ何も問題なかったので、以下のコマンドでこれをコメントアウトする。

patch -Np 1 <<-'EOT'
diff --git a/python/virtualenv/virtualenv.py b/python/virtualenv/virtualenv.py index e363021cc13b..27e8fa1f1c13 100755 --- a/python/virtualenv/virtualenv.py +++ b/python/virtualenv/virtualenv.py @@ -1321,9 +1321,7 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, sy # And then change the install_name of the copied python executable try: - mach_o_change(py_executable, - os.path.join(prefix, 'Python'), - '@executable_path/../.Python') + pass except: EOT

なお、macOS標準のPythonにはAppleの独自のカスタマイズが入っている (Support Python 2.7 framework-style distributions on macOS 12 by nickhutchinson · Pull Request #2325 · pypa/virtualenv) ようだ。

Exception: No 10.6+ SDK found

 0:44.35 Creating config.status
 0:44.47 Reticulating splines...
 0:45.17 Traceback (most recent call last):
 0:45.17   File "../../webrtc/trunk/build/mac/find_sdk.py", line 83, in <module>
 0:45.17     print main()
 0:45.17   File "../../webrtc/trunk/build/mac/find_sdk.py", line 60, in main
 0:45.17     raise Exception('No %s+ SDK found' % min_sdk_version)
 0:45.17 Exception: No 10.6+ SDK found

該当ソースコードのMacのSDKの正規表現が10系しか想定できていなかったので、10系以上を想定できるように修正する。

patch -Np 1 <<-'EOT'
diff --git a/media/webrtc/trunk/build/mac/find_sdk.py b/media/webrtc/trunk/build/mac/find_sdk.py
index ca58284eacd9..985283df4be2 100755
--- a/media/webrtc/trunk/build/mac/find_sdk.py
+++ b/media/webrtc/trunk/build/mac/find_sdk.py
@@ -52,7 +52,7 @@ def main():
       sdk_dir = xcode43_sdk_path
     else:
       sdk_dir = os.path.join(out.rstrip(), 'SDKs')
-    sdks = [re.findall('^MacOSX(10\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)]
+    sdks = [re.findall('^MacOSX(1\d\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)]
sdks = [s[0] for s in sdks if s] # [['10.5'], ['10.6']] => ['10.5', '10.6']
EOT

Intl.cpp:3662:43: error: reference to ‘PluralRules’ is ambiguous

 8:03.32 In file included from /Users/senooken/.local/src/bluegriffon-source/opt/js/src/Unified_cpp_js_src0.cpp:29:
 8:03.32 /Users/senooken/.local/src/bluegriffon-source/js/src/builtin/Intl.cpp:3662:43: error: reference to 'PluralRules' is ambiguous
 8:03.32     ctor = global->createConstructor(cx, &PluralRules, cx->names().PluralRules, 0);
 8:03.32                                           ^
 8:03.33 /Users/senooken/.local/src/bluegriffon-source/js/src/builtin/Intl.cpp:3
609:1: note: candidate found by name lookup is 'PluralRules'
 8:03.33 PluralRules(JSContext* cx, unsigned argc, Value* vp)
 8:03.33 ^
 8:03.33 /Users/senooken/.local/src/bluegriffon-source/opt/dist/include/unicode/
plurrule.h:194:18: note: candidate found by name lookup is 'icu_58::PluralRules'
 8:03.33 class U_I18N_API PluralRules : public UObject {
 8:03.34                  ^

名前空間が衝突していて名前解決できていないので、名前空間を明示する。

patch -Np 1 <<-'EOT'
diff --git a/js/src/builtin/Intl.cpp b/js/src/builtin/Intl.cpp index 60795cc6e6e6..7249fb8cef6b 100644 --- a/js/src/builtin/Intl.cpp +++ b/js/src/builtin/Intl.cpp @@ -3659,7 +3659,7 @@ static JSObject* CreatePluralRulesPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObject*> global) { RootedFunction ctor(cx); - ctor = global->createConstructor(cx, &PluralRules, cx->names().PluralRules, 0); + ctor = global->createConstructor(cx, &::PluralRules, cx->names().PluralRules, 0); if (!ctor)
EOT

XPCShellEnvironment.cpp:58:13: error: reference to ‘Handle’ is ambiguous

 0:15.66 /Users/senooken/.local/src/bluegriffon-source/ipc/testshell/XPCShellEnvironment.cpp:58:13: error: reference to 'Handle' is ambiguous
 0:15.66 Environment(Handle<JSObject*> global)
0:15.66 Environment(Handle<JSObject*> global) 0:15.66 ^ 0:15.66 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/usr/include/MacTypes.h:249:41: note: candidate found by name lookup is 'Handle' 0:15.66 typedef Ptr * Handle; 0:15.66 ^ 0:15.67 /Users/senooken/.local/src/bluegriffon-source/opt/dist/include/js/RootingAPI.h:464:25: note: candidate found by name lookup is 'JS::Handle' 0:15.67 class MOZ_NONHEAP_CLASS Handle : public js::HandleBase<T, Handle<T>>

また名前空間の衝突によるコンパイルエラーが起きているので、名前空間を明示する。

patch -Np 1 <<-'EOT'
diff --git a/ipc/testshell/XPCShellEnvironment.cpp b/ipc/testshell/XPCShellEnvironment.cpp
index fbc9238fcdaf..cdd34920a98e 100644
--- a/ipc/testshell/XPCShellEnvironment.cpp
+++ b/ipc/testshell/XPCShellEnvironment.cpp
@@ -55,7 +55,7 @@ namespace {
 static const char kDefaultRuntimeScriptFilename[] = "xpcshell.js";
 
 inline XPCShellEnvironment*
-Environment(Handle<JSObject*> global)
+Environment(JS::Handle<JSObject*> global)
 {
     AutoJSAPI jsapi;
EOT

Undefined symbols for architecture x86_64: “_OBJC_CLASS_$_NSSurface”, referenced from: __OBJC_$_CATEGORY_NSSurface_$_DontCutOffCorners in nsChildView.o

 5:54.99     StaticXULComponentsEnd/StaticXULComponentsEnd.o
 5:54.99
 5:54.99 Undefined symbols for architecture x86_64:
 5:54.99   "_OBJC_CLASS_$_NSSurface", referenced from:
 5:54.99       __OBJC_$_CATEGORY_NSSurface_$_DontCutOffCorners in nsChildView.o
 5:54.99 ld: symbol(s) not found for architecture x86_64
 5:54.99 clang: error: linker command failed with exit code 1 (use -v to see invocation)

ビルドの最後のリンクエラーで、シンボルが見つからないというエラーが起きている。同じ内容のエラーが「1583854 – Can’t build with macOS 10.15 SDK」に登録されていた。

macのSDKのバージョンが上がったことが原因のようで、他の修正でこのあたりのコードが削除になりそれで解決したようだ。したがって、該当箇所を丸ごと削除して対応する。

patch -Np 1 <<-'EOT'
diff --git a/widget/cocoa/nsChildView.mm b/widget/cocoa/nsChildView.mm
index de23c23871a1..28420cae3717 100644
--- a/widget/cocoa/nsChildView.mm
+++ b/widget/cocoa/nsChildView.mm
@@ -236,24 +236,6 @@ static bool sIsTabletPointerActivated = false;
 + (BOOL)_shouldZoomOnDoubleClick; // present on 10.7 and above
 @end
 
-// Starting with 10.7 the bottom corners of all windows are rounded.
-// Unfortunately, the standard rounding that OS X applies to OpenGL views
-// does not use anti-aliasing and looks very crude. Since we want a smooth,
-// anti-aliased curve, we'll draw it ourselves.
-// Additionally, we need to turn off the OS-supplied rounding because it
-// eats into our corner's curve. We do that by overriding an NSSurface method.
-@interface NSSurface @end
-
-@implementation NSSurface(DontCutOffCorners)
-- (CGSRegionObj)_createRoundedBottomRegionForRect:(CGRect)rect
-{
-  // Create a normal rect region without rounded bottom corners.
-  CGSRegionObj region;
-  CGSNewRegionWithRect(&rect, &region);
-  return region;
-}
-@end
-
 #pragma mark -
EOT

実行・パッケージング

これまでの修正で以下のビルドコマンドが成功する。M1 Macでだいたい30分かかった。

./mach build

ビルドしたら以下のコマンドで実行できる。

./mach run

しかし、起動直後にクラッシュしてしまった。以下のログが出ている。

err = 3 /Users/senooken/.local/src/bluegriffon-source/xpcom/build/mach_override.c:242
err = 3 /Users/senooken/.local/src/bluegriffon-source/xpcom/build/mach_override.c:256
err = 3 /Users/senooken/.local/src/bluegriffon-source/xpcom/build/mach_override.c:261

メモリーの割り当てのような処理に失敗しているようだ。Macのコア部分についてはよくわからないため、ここで調査を差し控える。

この状態で以下のコマンドを実行すると配布用のパッケージを生成する。

./mach package

試行錯誤していたときは問題なく成功したのだが、手順として整理するためにやり直すとエラーがでてしまった。

 0:00.43 make[3]: Entering directory `/Users/senooken/.local/src/bluegriffon-source/opt/bluegriffon/installer'
 0:04.91 Traceback (most recent call last):
 0:04.91   File "/Users/senooken/.local/src/bluegriffon-source/toolkit/mozapps/installer/find-dupes.py", line 135, in <module>
 0:04.91     main()
 0:04.91   File "/Users/senooken/.local/src/bluegriffon-source/toolkit/mozapps/installer/find-dupes.py", line 128, in main
 0:04.91     pp.do_include(filename)
 0:04.91   File "/Users/senooken/.local/src/bluegriffon-source/python/mozbuild/mozbuild/preprocessor.py", line 756, in do_include
 0:04.91     raise Preprocessor.Error(self, 'FILE_NOT_FOUND', str(args))
 0:04.91 mozbuild.preprocessor.Error: ('', 0, 'FILE_NOT_FOUND', '/Users/senooken/.local/src/bluegriffon-source/bluegriffon/installer/allowed-dupes.mn')
 0:04.91 make[3]: *** [stage-package] Error 1

bluegriffon/installer/allowed-dupes.mnがないのが問題のようだ。

browser/installer/allowed-dupes.mnに同じファイル名のファイルがあるのでこれをコピーしてみる。

cp browser/installer/allowed-dupes.mn bluegriffon/installer/

何かパッケージング中にファイルの重複があってダメらしい。

 0:07.82 ERROR: The following duplicated files are not allowed:
 0:07.82 BlueGriffon.app/Contents/MacOS/extensions/langpack-ru@bluegriffon.org/browser/chrome/.mkdir.done
 0:07.82 BlueGriffon.app/Contents/MacOS/extensions/langpack-ru@bluegriffon.org/chrome/.mkdir.done

バージョンを変えたり試してみたが解決できない。行き詰まったのでここまでとする。

ARMホストでのIntel向けビルド

Intel向けのターミナル、Homebrewを用意すれば旧来のIntel Macとほぼ同じビルド環境を用意できるので問題ないが、ARM環境のままIntel向けビルドを行うことも可能なので、その方法を記す。

mozconfigに以下を追加する。

patch -Np 1 <<-'EOT'
--- a/.mozconfig 2022-06-24 19:24:26.000000000 +0900 +++ b/.mozconfig 2022-06-24 20:07:04.000000000 +0900 @@ -67,3 +67,4 @@ ac_add_options --enable-application=bluegriffon ac_add_options --enable-chrome-format=jar +ac_add_options --host=x86_64-apple-darwin
EOT

これをしないとまずこのエラーが出る。

 0:03.45 ERROR: Don't know how to translate arm-apple-darwin20.6.0 for rustc
 0:03.46 *** Fix above errors and then restart with               "/Applications/Xcode.app/Contents/Developer/usr/bin/make -f client.mk build"
 0:03.46 make[2]: *** [configure] Error 1

続いて、rustcをARM版をインストールしていた場合、Intel版をインストールしてそちらを使うようにする。

rustup install 1.34.0-x86_64-apple-darwin
rustup default 1.34.0-x86_64-apple-darwin

これをしないとビルド時に以下のエラーが出る。

 0:02.80 DEBUG: | For more information about this error, try `rustc --explain E0463`.
 0:02.80 ERROR: Cannot compile for x86_64-apple-darwin with /opt/homebrew/bin/rustc
 0:02.80 The target may be unsupported, or you may not have
 0:02.80 a rust std library for that target installed. Try:
 0:02.80
 0:02.80   rustup target add x86_64-apple-darwin
 0:02.80
 0:02.81 *** Fix above errors and then restart with               "/Applications/Xcode.app/Contents/Developer/usr/bin/make -f client.mk build"

以上でIntel版と同じビルド環境となり、Intel版と同じ状態になる。

結論

HTMLエディターのBlueGriffonのmacOS Big Sur (M1) でのビルド手順を記した。ビルドはできたものの、実行するとクラッシュして、パッケージングもうまくいっていない。結局当初のダイアログ白紙の問題の修正の土台にまでたどり着けなかった。

2週間かけて取り組んだがこれが限界だった。中途半端で心苦しいが、他にこの問題に取り組む人の助けとなるためにここまでで一旦情報を公開する。

うまくいった人や取り組んでいる人などいれば協力したいのでご連絡を歓迎する。

コメントを残す

メールアドレスが公開されることはありません。