はじめに
Pyenv+Virtualenvで環境構築をしていて、mmcv-fullをインストールしようとしたらエラーが出た人向け。
現象
インストールすると、cmath系のエラーがたくさん出る。
$ pip install mmcv-full
......<省略>
de/ATen/core/aten_interned_strings.h:633:9: note: expanded from macro 'FORALL_ATEN_BASE_SYMBOLS'
_(aten, signbit) \
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
error: command 'clang' failed with exit status 1
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: legacy-install-failure
× Encountered error while trying to install package.
╰─> mmcv-full
note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.
対策
SDKの参照先関係の理由が考えられるので、対策1,対策2を行った上で、Pyenvの環境を再構築する。
PyenvでPyenv installしたあとに、CommandLineToolを変更した場合などに、SDK参照先のコンフリクトが起きて発生しそう。正直詳細はわかっていないけど、下記手順で回復できた。詳しい人教えてください。
対策1: xcode-selectの再インストール
sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
対策2: SDKの参照先を確認
こんなふうに表示されれば問題ない。
$ xcrun --show-sdk-path
/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk
ちなみに、参照先を変更したい場合は、下記の様なコマンドを打つ。
$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
$ xcrun --show-sdk-path
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
参照先をデフォルトに戻したい場合は、下記で戻せる。
$ sudo xcode-select --reset
Pyenv virtualenvでの環境再構築
これは普通に削除して、再インストールする。
$ pyenv virtualenv-delete <ENV_NAME>
$ pyenv uninstall <BASE PYTHON VER>
$ pyenv install <BASE PYTHON VER>
$ pyenv virtualenv <BASE PYTHON VER> <ENV_NAME>
結果
$ pip install mmcv-full
Collecting mmcv-full
Using cached mmcv-full-1.4.4.tar.gz (420 kB)
Requirement already satisfied: addict in ./.pyenv/versions/3.8.12/envs/py38-mmdetection/lib/python3.8/site-packages (from mmcv-full) (2.4.0)
Requirement already satisfied: numpy in ./.pyenv/versions/3.8.12/envs/py38-mmdetection/lib/python3.8/site-packages (from mmcv-full) (1.22.2)
Requirement already satisfied: packaging in ./.pyenv/versions/3.8.12/envs/py38-mmdetection/lib/python3.8/site-packages (from mmcv-full) (21.3)
Requirement already satisfied: Pillow in ./.pyenv/versions/3.8.12/envs/py38-mmdetection/lib/python3.8/site-packages (from mmcv-full) (9.0.1)
Requirement already satisfied: pyyaml in ./.pyenv/versions/3.8.12/envs/py38-mmdetection/lib/python3.8/site-packages (from mmcv-full) (6.0)
Requirement already satisfied: yapf in ./.pyenv/versions/3.8.12/envs/py38-mmdetection/lib/python3.8/site-packages (from mmcv-full) (0.32.0)
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in ./.pyenv/versions/3.8.12/envs/py38-mmdetection/lib/python3.8/site-packages (from packaging->mmcv-full) (3.0.7)
Using legacy 'setup.py install' for mmcv-full, since package 'wheel' is not installed.
Installing collected packages: mmcv-full
Running setup.py install for mmcv-full ... done
Successfully installed mmcv-full-1.4.4
無事にインストールできました。