64bit Anaconda に cvxopt をインストールする

Posted: , Modified:   Python Windows Anaconda cvxopt Qiita

本稿は Qiita 投稿記事 のバックアップです.

概要

Windowsで 64bit版 の Anacondacvxopt をインストールしようと思ったら非常に苦労したので作業内容をまとめる.

cvxopt のドキュメントには Windows へのインストール方法が書かれている. しかし,32bit 版の Python を想定しているらしく,ドキュメント通りにすんなりとインストールは出来ないので注意.本稿は,このドキュメントに沿って変更すべき点をまとめる.

想定環境

これらは既にインストールされているものとする.

なお,以降の作業は専用のディレクトリを作って,その中で行うものとする.例として D:\glpk 内で行う場合は,次のようにすればコマンドプロンプトを開くことができる. 84CEE4CD-2BB7-40D7-B2EA-4A2596B8E1A2.png

依存ライブラリの準備

これは ドキュメント 通りで良い.

BLAS

BLAS のソースファイル をダウンロードする.そして,コマンドプロンプトから次のコマンドを実行する.

$ tar -xvf blas.tgz
$ cd BLAS-3.5.0
$ sed 's/_LINUX/_WIN/' make.inc -i
$ make && cp blas_WIN.a ../libblas.a
$ cd ..

ただし,2行目のディレクトリ名は取得した BLAS ソースファイルのバージョンによって変わるので適宜読み替える.

LAPACK

LAPACK のソースファイル をダウンロードする.そして,コマンドプロンプトから次のコマンドを実行する.

$ tar -xvf lapack-3.5.0.tgz
$ cd lapack-3.5.0
$ cp make.inc.example make.inc
$ make lapacklib && cp liblapack.a ..
$ cd ..

もし,libquadmath-0.dll が無いと言われたら,ここ からダウンロードして MinGW/bin(デフォルトだと C:\MinGW\bin だと思われる) に置いてから上記コマンドを実行する.

CVXOPT のコンパイル

ここからが本番.CVXOPT のソースファイル をダウンロードする.そして,コマンドプロンプトから次のコマンドを実行する.ファイル名やフォルダ名はバージョンによって変わるので適宜読み替える.

$ tar -xvf cvxopt-1.1.8.tar.gz
$ cd cvxopt-1.1.8/src

setup.py を開いて,

次に,distutils パッケージの cygwinccompiler モジュールを編集する.Anaconda が c:\Anaconda にある場合,c:\Anaconda\Lib\distutils\cygwinccompiler.py を開く.もし,このファイルに -mno-cygwin という文字列があればすべて削除する.(手元の環境では無かった)

libpython27.a と libmsvcr90.a の作成

後の処理で必要な,Linux の静的ライブラリ libpython27.alibmsvcr90.a が,デフォルトでは用意されていないので Windows 用のライブラリから変換する.

まず,変換用のツールをインストールする.

$ mingw-get install pexports

次に,Anaconda ディレクトリ(例えば c:\Anaconda)にある python27.dllmsvcr90.dll を cvxopt の setup.py があるディレクトリにコピーする.

libpython27.a の作成は次のコマンドを実行すれば良い.

$ pexports python27.dll > python27.def
$ dlltool --dllname python27.dll --def python27.def --output-lib libpython27.a

libmsvcr90.a の作成はもう少し複雑である.まず,

$ pexports msvcr90.dll > msvcr90.def

を実行し,できた msvcr90.def をテキストエディタで開く.そして,304〜314行目付近にある,

修正する.その後,

dlltool --dllname msvcr90.dll --def msvcr90.def --output-lib libmsvcr90.a

を実行する.出来上がった libpython27.alibmsvcr90.a は,Anaconda の libs フォルダにもコピーしておく. その際,もし libs ディレクトリに python27.lib があれば python27.lib_ に変更しておく.

ソースコードの修正

オリジナルのソースコードのままではエラーが出るので,次のファイルを修正する必要がある.

src/C/cholmod.c

31行目付近の

/* defined in pyconfig.h */
#if (SIZEOF_INT < SIZEOF_LONG)
#define CHOL(name) cholmod_l_ ## name
#else
#define CHOL(name) cholmod_ ## name
#endif

/* defined in pyconfig.h */
// #if (SIZEOF_INT < SIZEOF_LONG)
#define CHOL(name) cholmod_l_ ## name
// #else
// #define CHOL(name) cholmod_ ## name
// #endif

に修正.

src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.h

155行目付近にある下記のコードを削除する.

#ifndef NTIMER
#ifdef _POSIX_C_SOURCE
#if    _POSIX_C_SOURCE >= 199309L
#define SUITESPARSE_TIMER_ENABLED
#endif
#endif
#endif

src/C/amd.c

27行目付近にある,

#if (SIZEOF_INT < SIZEOF_LONG)
#define amd_order amd_l_order
#define amd_defaults amd_l_defaults
#endif

//#if (SIZEOF_INT < SIZEOF_LONG)
#define amd_order amd_l_order
#define amd_defaults amd_l_defaults
//#endif

に修正.

コンパイルとインストール

ここまでして,ようやく次のコマンドでコンパイルできる.

$ python setup.py build --compiler=mingw32

インストールするためには,Anaconda の Lib/distutilsdistutils.cfg を作成し次の内容を記入する.

[build]
compiler=mingw32

その後,インストールする.

$ python setup.py install