MacPortsのMySQLとOSに標準で入っているPythonの組み合わせでライブラリ"MySQL-python"をインストールしようとしたがうまくいかなかった。
解凍したMySQL-python-1.2.2ディレクトリの中にある"setup_posix.py"というファイルの中に"mysql_config.path"という変数を設定している場所があるがここが

mysql_config.path = "mysql_config"

こんな感じになってる。
たぶん、コマンドのサーチパスから"mysql_config"を探そうとするが見つからないのでエラーになってしまうという事だろう。

MacPortsでMySQLをインストールした場合"mysql_config5"という名前で"/opt/local/bin/"に格納されるが、この名前が"mysql_config"ではないからだ。
これだといくらパスに"/opt/local/bin/"を追加してあっても駄目だ。
この場合はシンボリックリンクをはるというのも一つの手だが、今回は

mysql_config.path = "mysql_config5"

と書き換えよう。
その後インストールを試みるがまたエラー。
原因はよくわからなかったがいろいろと調べてみると解決方法がわかった。
同じくMySQL-python-1.2.2ディレクトリの中にある"_mysql.c"というファイルが悪さをしているようだ。
このファイルの37行目から

#ifndef uint
#define uint unsigned int
#endif

この3行を削除。
さらに484行目からの

	uint port = MYSQL_PORT;
	uint client_flag = 0;

この部分を

  unsigned int port = MYSQL_PORT;
  unsigned int client_flag = 0;

こうすればいいらしい。 これでうまくインストールができた。

実はもう既にこれらのパッチファイルは存在していて、以前MacPortsの"py25-mysql"を入れた時に一緒にインストールされてた。 場所はちょっと深いが

"/opt/local/var/macports/sources/rsync.macports.org/release/ports/python/py-mysql/files"

この中に

"patch-_mysql.c.diff"
"patch-setup_posix.py.diff"

こんな二つのファイルがあった。

MySQL-python-1.2.2ディレクトリの中に入って

patch < patch-_mysql.c.diff
patch < patch-setup_posix.py.diff

と、こうした後にインストールすればいいわけだ。 以下はダウンロードからインストールまでの一連の作業を自動化したPythonのスクリプト

import os
os.chdir(os.path.dirname(os.environ['_']))
os.system("curl -O http://nchc.dl.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.2.tar.gz")
os.system("tar -zxvf MySQL-python-1.2.2.tar.gz")
os.chdir("MySQL-python-1.2.2")
patchstr1 = '''--- _mysql.c.orig	2007-02-27 18:35:56.000000000 -0800
+++ _mysql.c	2007-11-25 21:54:09.000000000 -0800
@@ -34,9 +34,6 @@
 #else
 #include "my_config.h"
 #endif
-#ifndef uint
-#define uint unsigned int
-#endif
 #include "mysql.h"
 #include "mysqld_error.h"
 #include "errmsg.h"
@@ -481,8 +478,8 @@
 #endif
 	char *host = NULL, *user = NULL, *passwd = NULL,
 		*db = NULL, *unix_socket = NULL;
-	uint port = MYSQL_PORT;
-	uint client_flag = 0;
+	unsigned int port = MYSQL_PORT;
+	unsigned int client_flag = 0;
 	static char *kwlist[] = { "host", "user", "passwd", "db", "port",
 				  "unix_socket", "conv",
 				  "connect_timeout", "compress",
'''
patchstr2 = '''--- setup_posix.py.orig	2007-05-06 12:30:17.000000000 -0700
+++ setup_posix.py	2007-05-06 12:31:30.000000000 -0700
@@ -23,7 +23,7 @@
         if ret/256 > 1:
             raise EnvironmentError, "%s not found" % mysql_config.path
     return data
-mysql_config.path = "mysql_config"
+mysql_config.path = "mysql_config5"
 
 def get_config():
     import os, sys
'''
os.system("cat << EOT | patch\n%sEOT\n" % patchstr1)
os.system("cat << EOT | patch\n%sEOT\n" % patchstr2)
os.system("python ./setup.py build")
os.system("python ./setup.py install")

patchstr1やpatchstr2に格納されている文字列がパッチファイルの中身。
これでファイルを用意しなくてもこのPythonスクリプトをターミナルに投げれば実行される。
ルート権限で実行しないと駄目。

カテゴリ:

トラックバック(0)

トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/35

コメントする