virtualenv/res/lib/lib_create_env.py
changeset 731 aba6c30b6d2a
parent 727 0e91e924b945
child 732 fa3f1f436ecd
--- a/virtualenv/res/lib/lib_create_env.py	Thu Aug 02 11:16:36 2012 +0200
+++ b/virtualenv/res/lib/lib_create_env.py	Sun Aug 05 15:18:53 2012 +0200
@@ -7,6 +7,9 @@
 import urllib
 import platform
 import patch
+import struct
+import glob
+import re
 
 join = os.path.join
 system_str = platform.system()
@@ -22,7 +25,6 @@
     'OAUTH2': { 'setup': 'python-oauth2', 'url':"https://github.com/simplegeo/python-oauth2/tarball/hudson-python-oauth2-211", 'local':"oauth2-1.5.211.tar.gz", 'install': {'method': 'easy_install', 'option_str': None, 'dict_extra_env': None}},
     'HTTPLIB2': { 'setup': 'python-httplib2', 'url':'http://code.google.com/p/httplib2/downloads/detail?name=httplib2-0.7.4.tar.gz&can=2&q=', 'local':"httplib2-0.7.4.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
     'DJANGO-OAUTH-PLUS': { 'setup': 'django-oauth-plus', 'url':'http://bitbucket.org/david/django-oauth-plus/get/f314f018e473.gz', 'local':"django-oauth-plus.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
-    'MYSQL': { 'setup': 'mysql-python', 'url': 'http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz/download', 'local':"MySQL-python-1.2.3.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
     'OPENID': {'setup':'openid', 'url':'http://pypi.python.org/packages/source/p/python-openid/python-openid-2.2.5.tar.gz', 'local':"python-openid-2.2.5.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
     'DJANGO_OPENID_CONSUMER': {'setup':'django_openid_consumer', 'url':'http://pypi.python.org/packages/source/d/django-openid-consumer/django-openid-consumer-0.1.1.tar.gz', 'local':"django-openid-consumer-0.1.1.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
     'SOCIAL_AUTH': {'setup':'social_auth', 'url':'https://github.com/omab/django-social-auth/tarball/v0.3.10', 'local':"omab-django-social-auth-v0.3.10-modified.tar.gz", 'install': {'method': 'easy_install', 'option_str': None, 'dict_extra_env': None}},
@@ -42,23 +44,34 @@
 }
 
 if system_str == 'Windows':
+    
+    size = 8 * struct.calcsize("P")
+    if size==32:
+        mysqlres = "MySQL-python-1.2.3.win32-py2.7.exe"
+    else:
+        mysqlres = "MySQL-python-1.2.3.win-amd64-py2.7.exe"
+    
     URLS.update({
         'PSYCOPG2': {'setup': 'psycopg2','url': 'psycopg2-2.0.14.win32-py2.6-pg8.4.3-release.zip', 'local':"psycopg2-2.0.14.win32-py2.6-pg8.4.3-release.zip", 'install': {'method': 'install_psycopg2', 'option_str': None, 'dict_extra_env': None}},
         'PIL': {'setup': 'pil', 'url': 'http://effbot.org/media/downloads/PIL-1.1.7.win32-py2.6.exe', 'local':"PIL-1.1.7.win32-py2.6.exe", 'install': {'method': 'easy_install', 'option_str': None, 'dict_extra_env': None}},
-        'LXML': {'setup': 'lxml', 'url': 'http://pypi.python.org/packages/2.6/l/lxml/lxml-2.2.2-py2.6-win32.egg', 'local':"lxml-2.2.2-py2.6-win32.egg", 'install': {'method': 'easy_install', 'option_str': None, 'dict_extra_env': None}}
+        'LXML': {'setup': 'lxml', 'url': 'http://pypi.python.org/packages/2.6/l/lxml/lxml-2.2.2-py2.6-win32.egg', 'local':"lxml-2.2.2-py2.6-win32.egg", 'install': {'method': 'easy_install', 'option_str': None, 'dict_extra_env': None}},
+        'MYSQL': { 'setup': 'mysql-python', 'url': mysqlres, 'local': mysqlres, 'install': {'method': 'easy_install', 'option_str': None, 'dict_extra_env': None}},
     })
 else:
     if system_str == "Darwin":        
         lxml_options = {'STATIC_DEPS': 'true', 'LIBXML2_VERSION': '2.8.0', 'LIBXSLT_VERSION': '1.1.26', 'LIBICONV_VERSION': '1.14'}
         lxml_method = 'easy_install'
+        mysql_method = 'install_mysql'
     else:
         lxml_options = None
         lxml_method = 'pip'
+        mysql_method = 'pip'
 
     URLS.update({
         'PSYCOPG2': {'setup': 'psycopg2','url': 'http://www.psycopg.org/psycopg/tarballs/PSYCOPG-2-4/psycopg2-2.4.5.tar.gz', 'local':"psycopg2-2.4.5.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
         'PIL': {'setup': 'pil', 'url': 'http://effbot.org/downloads/Imaging-1.1.7.tar.gz', 'local':"Imaging-1.1.7.tar.gz", 'install': {'method': 'easy_install', 'option_str': None, 'dict_extra_env': None}},
         'LXML': {'setup': 'lxml', 'url':"lxml-2.3.4.tar.bz2", 'local':"lxml-2.3.4.tar.bz2", 'install': {'method': lxml_method, 'option_str': None, 'dict_extra_env': lxml_options}},
+        'MYSQL': { 'setup': 'mysql-python', 'url': 'http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz/download', 'local':"MySQL-python-1.2.3.tar.gz", 'install': {'method': mysql_method, 'option_str': None, 'dict_extra_env': None}},
     })
     
 
@@ -107,101 +120,7 @@
         metavar='ignore_packages',
         dest='ignore_packages',
         default=None,
-        help='list of comma separated keys for package to ignore')
-
-def install_pylucene(option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop):
-    
-    logger.notify("PYLUCENE Custom install")
-    logger.notify("Get Pylucene from %s " % res_env.URLS['PYLUCENE'][res_source_key])
-    pylucene_src = os.path.join(src_dir,"pylucene.tar.gz")
-    if res_source_key == 'local':
-        shutil.copy(res_env.URLS['PYLUCENE'][res_source_key], pylucene_src)
-    else:
-        urllib.urlretrieve(res_env.URLS['PYLUCENE'][res_source_key], pylucene_src)
-    tf = tarfile.open(pylucene_src,'r:gz')
-    pylucene_base_path = os.path.join(src_dir,"pylucene") 
-    logger.notify("Extract Pylucene to %s " % pylucene_base_path)
-    tf.extractall(pylucene_base_path)
-    tf.close()
-    
-    pylucene_src_path = os.path.join(pylucene_base_path, os.listdir(pylucene_base_path)[0])
-    jcc_src_path = os.path.abspath(os.path.join(pylucene_src_path,"jcc"))
-    
-    #install jcc
-
-    #patch for linux
-    if system_str == 'Linux' :
-        olddir = os.getcwd()
-        setuptools_path = os.path.join(lib_dir, 'site-packages', 'setuptools')
-        if os.path.exists(setuptools_path) and os.path.isdir(setuptools_path):
-            patch_dest_path = os.path.join(lib_dir, 'site-packages')
-        else:
-            patch_dest_path = os.path.join(lib_dir,'site-packages','setuptools-0.6c11-py%s.%s.egg' % (sys.version_info[0], sys.version_info[1]))
-            if os.path.isfile(patch_dest_path):
-                # must unzip egg
-                # rename file and etract all
-                shutil.move(patch_dest_path, patch_dest_path + ".zip")
-                zf = zipfile.ZipFile(patch_dest_path + ".zip",'r')
-                zf.extractall(patch_dest_path)
-                os.remove(patch_dest_path + ".zip")
-        logger.notify("Patch jcc : %s " % (patch_dest_path))
-        os.chdir(patch_dest_path)
-        p = patch.fromfile(os.path.join(jcc_src_path,"jcc","patches","patch.43.0.6c11"))
-        p.apply()
-        os.chdir(olddir)
-
-    logger.notify("Install jcc")
-    call_subprocess([os.path.abspath(os.path.join(home_dir, 'bin', 'python')), 'setup.py', 'install'],
-                    cwd=jcc_src_path,
-                    filter_stdout=filter_python_develop,
-                    show_stdout=True)
-    #install pylucene
-    
-    logger.notify("Install pylucene")
-    #modify makefile
-    makefile_path = os.path.join(pylucene_src_path,"Makefile")
-    logger.notify("Modify makefile %s " % makefile_path)
-    shutil.move( makefile_path, makefile_path+"~" )
-
-    destination= open( makefile_path, "w" )
-    source= open( makefile_path+"~", "r" )
-    destination.write("PREFIX_PYTHON="+os.path.abspath(home_dir)+"\n")
-    destination.write("ANT=ant\n")
-    destination.write("PYTHON=$(PREFIX_PYTHON)/bin/python\n")
-    
-    if system_str == "Darwin":
-        if sys.version_info >= (2,6):
-            destination.write("JCC=$(PYTHON) -m jcc.__main__ --shared --arch x86_64 --arch i386\n")
-        else:
-            destination.write("JCC=$(PYTHON) -m jcc --shared --arch x86_64 --arch i386\n")
-        destination.write("NUM_FILES=2\n")
-    elif system_str == "Windows":
-        destination.write("JCC=$(PYTHON) -m jcc.__main__ --shared --arch x86_64 --arch i386\n")
-        destination.write("NUM_FILES=2\n")
-    else:
-        if sys.version_info >= (2,6) and sys.version_info <= (2,7):
-            destination.write("JCC=$(PYTHON) -m jcc.__main__ --shared\n")
-        else:
-            destination.write("JCC=$(PYTHON) -m jcc --shared\n")
-        destination.write("NUM_FILES=2\n")
-    for line in source:
-        destination.write( line )
-    source.close()
-    destination.close()
-    os.remove(makefile_path+"~" )
-
-    logger.notify("pylucene make")
-    call_subprocess(['make'],
-                    cwd=os.path.abspath(pylucene_src_path),
-                    filter_stdout=filter_python_develop,
-                    show_stdout=True)
-
-    logger.notify("pylucene make install")
-    call_subprocess(['make', 'install'],
-                    cwd=os.path.abspath(pylucene_src_path),
-                    filter_stdout=filter_python_develop,
-                    show_stdout=True)
-    
+        help='list of comma separated keys for package to ignore')    
 
 def install_psycopg2(option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop):
     psycopg2_src = os.path.join(src_dir,"psycopg2.zip")
@@ -215,6 +134,55 @@
     psycopg2_src_path = os.path.join(psycopg2_base_path, os.listdir(psycopg2_base_path)[0])
     shutil.copytree(os.path.join(psycopg2_src_path, 'psycopg2'), os.path.abspath(os.path.join(home_dir, 'Lib/site-packages', 'psycopg2')))
     shutil.copy(os.path.join(psycopg2_src_path, 'psycopg2-2.0.14-py2.6.egg-info'), os.path.abspath(os.path.join(home_dir, 'Lib/site-packages', 'site-packages')))
+    
+
+def install_mysql(option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop):
+    
+    args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', res_env.URLS['MYSQL'][res_source_key]]                
+    if option_str :
+        args.insert(4,option_str)
+    call_subprocess(args,
+            cwd=os.path.abspath(tmp_dir),
+            filter_stdout=filter_python_develop,
+            show_stdout=True,
+            extra_env=extra_env)
+
+    mysqlconfig_output = []
+    
+    call_subprocess(['mysql_config', '--libmysqld-libs'],
+        cwd=os.path.abspath(tmp_dir),
+        filter_stdout=lambda line: mysqlconfig_output.append(line),
+        show_stdout=True)
+        
+    mysqlconfig_output = "".join(mysqlconfig_output)
+    m = re.search("\-L[\'\"]?([\w\/]+)[\'\"]?", mysqlconfig_output)
+    if m:
+        repdylibpath = m.group(1)
+    else:
+        repdylibpath = '/usr/local/mysql/lib'
+        
+    dyliblist = glob.glob(repdylibpath+"/libmysqlclient.*.dylib")
+    def key_func(s):
+        m = re.match(repdylibpath+"/libmysqlclient\.([\d]+)\.dylib", s)
+        if m:
+            return int(m.group(1))
+        else:
+            return sys.maxint
+    dyliblist.sort(key=key_func)
+    
+    if dyliblist:
+        dylibpath = dyliblist[0]
+    else:
+        dylibpath = '/usr/local/mysql/lib/libmysqlclient.18.dylib'
+        
+    dylibname = os.path.basename(dylibpath)    
+    sopath = os.path.join(os.path.abspath(lib_dir), 'site-packages', '_mysql.so')
+    
+    call_subprocess(['install_name_tool', '-change', dylibname, dylibpath, sopath],
+        cwd=os.path.abspath(tmp_dir),
+        filter_stdout=filter_python_develop,
+        show_stdout=True)
+
 
 def gen_install_comp_lib(lib_name, lib_key, configure_options=[]):
     
@@ -229,19 +197,19 @@
         
         lib_src_path = os.path.join(lib_base_path, os.listdir(lib_base_path)[0])
     
-        logger.notify("libjpeg configure")
+        logger.notify(libname + " configure")
         call_subprocess(['configure', '--prefix='+os.path.abspath(home_dir)] + configure_options,
                         cwd=os.path.abspath(lib_src_path),
                         filter_stdout=filter_python_develop,
                         show_stdout=True)
         
-        logger.notify("libjpeg make")
+        logger.notify(libname + " make")
         call_subprocess(['make'],
                         cwd=os.path.abspath(lib_src_path),
                         filter_stdout=filter_python_develop,
                         show_stdout=True)
     
-        logger.notify("zlib make install")
+        logger.notify(libname + "make install")
         call_subprocess(['make', 'install'],
                         cwd=os.path.abspath(lib_src_path),
                         filter_stdout=filter_python_develop,