🥞

M1(Appel Silicon) Macでpythonのmysqlclientをインストールしてつまづいた話

2021/06/05に公開

環境

  • M1(Apple Silicon)
  • mac OS Big Sur
  • MySQL 8.0.25
  • Python3.9(pyenvでインストール)

問題

PythonでMySQLを接続したいときに使うドライバーがいくつかあります。

その中でもmysqlclientをM1 Macで使おうと思ってインストールしようとしたのですが、以下のようなエラーが出てしまいます…

    ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib'
    ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib/'
    ld: library not found for -lzstd
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    error: command '/usr/bin/clang' failed with exit code 1
    ----------------------------------------

ERROR: Command errored out with exit status 1: /Users/koki/Codes/web_env/bin/python -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/4r/r23l3j015rzfj1_2hv9fqczr0000gn/T/pip-install-7upzm9y4/mysqlclient_651b3cf9e475472195df0fc7e8c67572/setup.py'"'"'; __file__='"'"'/private/var/folders/4r/r23l3j015rzfj1_2hv9fqczr0000gn/T/pip-install-7upzm9y4/mysqlclient_651b3cf9e475472195df0fc7e8c67572/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/4r/r23l3j015rzfj1_2hv9fqczr0000gn/T/pip-record-vlufo3cd/install-record.txt --single-version-externally-managed --compile --install-headers /Users/koki/Codes/jobpit_env/include/site/python3.9/mysqlclient Check the logs for full command output.

他のドライバを使うという選択肢もあったのですが、Djangoの3系だとmysqlclientのインストールが必須なのでなんとか解決しようとしました。

調べてみたのですが、あまり情報が少なくてしかもインテル入ってるMacだと何もしなくてもこんなエラーが出ないので、悩んでいましたが乏しい情報量で解決方法を見つけ出しました。

解決策

mysql_configを修正することでインストールができるようになりました。mysql_configの場所は以下のコマンドで確認できます。

which mysql_config

mysql_configを開いたらだいたい120行目あたりにある以下の記述を修正していきます。

libs="-L$pkglibdir"
libs="$libs -l "

この設定を以下のように書き換えます。

libs="-L$pkglibdir"
libs="$libs -lmysqlclient -lssl -lcrypto"

これでpip install mysqlclientでうまくインストール出来ました。

Discussion