at backyard

Color my life with the chaos of trouble.

M1 Mac環境でのcx_Freezeの実行ファイル作成までのメモ

Pythonで配布可能な実行ファイルを作成する際に有効な手段としてcx_Freezeがある。

少し前に下記のポストでも書いたが、似た選択肢としてはpyinstallerがあるが、こちらはライセンスがGPLなので、例えば商用で利用するようなケースでは厳しくなってくる。
その点、cx_FreezeはPython Software Foundation License となっているので、GPLよりは扱いやすい。

shinshin86.hateblo.jp

目次

このポストは少々長いため、まずは目次をこちらに記載する。

M1 MacBook Airだとcx_Freezeのインストールが失敗する(ld: library not found for -lintl)

ところでM1 MacBook Airでcx_Freezeのインストールを試したところ、下記のようなエラーが出て失敗してしまった。

環境は pyenvで構築したPython 3.10.1 である。

インストール時のコマンド

pip install --upgrade cx_Freeze

エラーのメッセージを一部抜粋。

 ld: library not found for -lintl
  clang: error: linker command failed with exit code 1 (use -v to see invocation)
  error: command '/usr/bin/clang' failed with exit code 1

intel MacBook Proだとcx_Freezeのインストールは問題なさそう

intelチップのMacBook Proで同様の環境( pyenv経由で構築したPython 3.10.1 )を再現し、こちらでインストールしたところ、intelチップのmacでは問題なくcx_Freezeのインストールは完了した。

実行ファイルを作成し、下記のtkinterのサンプルアプリケーションが動くところまで確認している。

cx_Freeze/cx_Freeze/samples/Tkinter at main · marcelotduarte/cx_Freeze · GitHub

GitHubでissueを立てたところ、作者の方が相談に乗ってくれた

エラー内容でググっても私と同じような問題が出なかったことや、同様の問題がGitHubのissueにはなかったようなので、issueを立ててみたところ、作者の方が色々と相談に乗ってくれた。

こちらのissue内でより詳細なエラーログや試行したことの内容はすべて記載されているので、より詳細に内容を知りたい方はissueを参照してください。

github.com

M1 MacBook Airでcx_Freezeのインストールを行い、配布可能な実行ファイルを作成するまでのメモ

M1 Macでcx_Freezeを使う際は miniforge 経由でインストールすると動くようだった。

miniforgeを選択した理由

pyenv経由ではminiconda環境を構築することも可能だが、残念ながらminicondaはarm64(m1 mac)には対応していないようだったので、M1でも動く環境であるminiforgeを選択した次第である。

github.com

私は今回Python 3.10.1の環境でcx_Freezeを動かしたかったので、下記のようにセットアップをしてcx_Freezeのインストールを行った。
(実際にはまず3.9系のインストールから行うなど他のことも行っているが、そちらについてはissue内のログを参照いただけたらと思います)

# miniforgeのセットアップ
pyenv install miniforge3-4.10.3-10

# 指定したディレクトリ内のみでminiforge環境を有効化
pyenv local miniforge3-4.10.3-10

# 仮想環境構築
export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk
conda create -n cx310conda -c conda-forge python=3.10 libpython-static -y
conda init zsh
source ~/.zshrc
conda activate cx310conda

# cx_Fre
conda install -c conda-forge c-compiler importlib-metadata -y
pip install --no-binary :all: --pre cx_Freeze -v

なお、cx_Freezeのページを見ると下記のようなインストール方法も紹介されていたが、

conda install -c conda-forge cx_freeze

私の環境ではこの方法でインストールしようとしても、

PackagesNotFoundError: The following packages are not available from current channels:

というエラーが出てしまい、installできなかったため、上記のやり方でインストールしている。

なお、こちらについては作者の方でconda-forgeにosx-arm64のビルドを登録リクエストしてくれたようなので、そのうち conda-forge でもインストールが可能になるかもしれない。

というわけで、miniforge を用いることでm1 macでもcx_Freezeが使えるようになった。

下記のキャプチャは実際にcx_Freezeを使って作成したtkinterのサンプルアプリを実行したところ。

f:id:shinshin86:20220113204137p:plain
tkinterのサンプルアプリ

追記: Apple Silicon用のビルドがconda intallを用いたインストールにも対応した

現在はconda install でもM1(Apple Silicon) Mac用のビルドがダウンロードできるようになった。そのため下記のコマンドでインストールが可能。

conda install -c conda-forge cx_freeze

cx_Freezeを用いてmac環境で配布可能な実行ファイルを作成する方法

次にmac環境で配布可能な実行ファイルを作成する方法だが、これも作者の方に教えてもらったのだが、mac環境で配布可能な実行ファイルを作成する方法は下記のようだ。

python setup.py bdist_mac

https://cx-freeze.readthedocs.io/en/latest/setup_script.html#bdist-mac

これで上に貼ったtkinterのサンプルアプリケーションをcx_Freezeを用いて配布可能な実行ファイルとしてコンパイルすることができた。

f:id:shinshin86:20220113204003p:plain
cx_Freezeを使って配布可能な状態となった実行ファイル

作者の方には色々と相談に乗ってくれて感謝である。

以上のようなやり方で、miniforgeを使うことでM1 Macでもcx_Freezeを扱うことができるので、興味ある方はぜひ利用してみてください。