Merge branch 'gimick'

Conflicts:
	packaging/windows/py2exe_setup.py
This commit is contained in:
Steffen Schaumburg 2011-03-15 21:52:16 +01:00
commit b000278000
6 changed files with 664 additions and 255 deletions

View File

@ -0,0 +1,125 @@
Create MySqlPython version 1.2.3 windows installer for Python26
This walkthrough is derived from excellent installation instructions released under GNU Free Documentation License 1.2. The original work is here ... http://www.bcspcsonline.com/wiki/index.php?title=MySQL-5.1.34_Python-2.6_Module_Build_Instructions The Wiki author appears to be "Irondesk"
This version by Gimick on 29th June 2010
Content is available under GNU Free Documentation License 1.2
Premamble
---------
The FPDB exe needs to build against the MySql-Python project. Unfortunately, for python 2.6 there is no official installer for windows, and none is ever likely to be provided.
Community builds are available, but to reduce third-party dependencies, we will build our own here.
Step 0 Get a fresh XP installation
----------------------------------
0.1/ Using XPhome 32bit
Step 1, VisualStudio 2008 express install
-----------------------------------------
1.1/ Get the ISO CD from here ... http://www.microsoft.com/express/Downloads/#2008-All
1.2/ Run and install Visual C++ only, don't bother with the additional packages offered
This package will run 30 days before registration is needed
Step 2, setup Mysql Server
--------------------------
2.1/ Install MySQL server runtime ... http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.34-win32.msi
Choose Typical, choose configure, choose Standard Configuration, choose all defaults, supply admin username/password.
Step 3, more installs
----------------------
3.1/ install the following in sequence (accept all default options) there should be no errors !
Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi
7zip 914 ... http://sourceforge.net/projects/sevenzip/files/7-Zip/9.14/7z914.exe/download
Step 4, grab Mysql server Source
--------------------------------
4.1/ Download ... http://downloads.mysql.com/archives/mysql-5.1/mysql-noinstall-5.1.34-win32.zip
4.2/ Unpacking Desktop\mysqlsource (use 7zip)
4.3/ Copy the following source directories to the MySql installation:
dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\data\* "c:\Program Files\MySQL\MySQL Server 5.1\data" /I/E/F/H
dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\Embedded\* "c:\Program Files\MySQL\MySQL Server 5.1\Embedded" /I/E/F/H
dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\include\* "c:\Program Files\MySQL\MySQL Server 5.1\include" /I/E/F/H
dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\lib\* "c:\Program Files\MySQL\MySQL Server 5.1\lib" /I/E/F/H
dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\mysql-test\* "c:\Program Files\MySQL\MySQL Server 5.1\mysql-test" /I/E/F/H
dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\sql-bench\* "c:\Program Files\MySQL\MySQL Server 5.1\sql-bench" /I/E/F/H
4.4/ You can delete Destop\mysqlsource, is no longer needed.
Step 5, grab Mysql-python source
--------------------------------
5.1/ get download
MySql for python ... http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz/download
5.2/ extract MySQL-python-1.2.3 directory to the Desktop using 7zip
(note: use 7zip, open the gz, then open the tar, then extract the directory found inside there)
Desktop\MySQL-python-1.2.3 should now exist
Step 6, get python build tools
------------------------------
6.1/ get Easy Setup installer
Easy setup installer ... http://peak.telecommunity.com/dist/ez_setup.py
6.2/ Check the DEFAULT VERSION specified in Easy Setup and get the corresponding setuptools (version c11 in this case)
Setuptools version 11 ... http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
6.3/ Put both of these files into Desktop\MySQL-python-1.2.3, overwriting any existing files
Step 7, install the build tool
------------------------------
dos> cd Desktop\MySQL-python-1.2.3
dos> c:\Python27\python.exe ez_setup.py setuptools-0.6c11-py2.7.egg
Step 8, Tweak the configuration
-------------------------------
dos> cd Desktop\MySQL-python-1.2.3
8.1/ dos> write site.cfg
Change registry_key = SOFTWARE\MySQL AB\MySQL Server 5.0
to registry_key = SOFTWARE\MySQL AB\MySQL Server 5.1
Step 9, build
-------------
dos> cd Desktop\MySQL-python-1.2.3
9.1/ dos> c:\python27\python.exe setup.py build
* Note: You will probably get a bunch of warnings and maybe a manifest error status 31, these are ok as long as there are no errors in compiling or linking.
* Note: This will generate the "MySQL-python-1.2.3/build" folder
9.2/ dos> c:\python27\python.exe setup.py bdist_wininst
Step 10, done
-------------
10.1/ the \dist directory will contain MySQL-python-1.2.3.win32-py2.7.exe !!!!!
10.2/ upload this file to sourceforge

View File

@ -1,16 +1,24 @@
This is a list of download links of Windows packages for Python 2.7 of our dependencies. This is a list of download links of Windows32 packages for Python 2.7 of our dependencies.
These are as of 26Feb2011: These are as of 27Feb2011:
matplotlib 1.0.1 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/
pygtk 2.22 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.22/
pycairo 1.8.10 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/
pyGobject X ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/
Required:
The below are from Aug2010, and should probably be updated to newer versions:
Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi
pywin 214 ... https://sourceforge.net/projects/pywin32/files/pywin32/Build%20214/pywin32-214.win32-py2.7.exe/download gtk+ allinone... http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip
py2exe 0.6.9 ... https://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download matplotlib 1.0.1 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.win32-py2.7.exe/download
psycopg2 ... http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.2.2.win32-py2.7-pg8.4.4-release.exe pygtk 2.22 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.22/pygtk-2.22.0-1.win32-py2.7.exe
pycairo 1.8.10 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.10.win32-py2.7.exe
pyGobject X ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/pygobject-2.26.0-1.win32-py2.7.exe
pywin 216 ... http://sourceforge.net/projects/pywin32/files/pywin32/Build216/pywin32-216.win32-py2.7.exe/download
numpy 1.5.1 ... http://sourceforge.net/projects/numpy/files/NumPy/1.5.1/numpy-1.5.1-win32-superpack-python2.7.exe/download
pypokereval 138 ... http://sourceforge.net/projects/fpdb/files/fpdb/pokereval-138.win32-py2.7.exe/download
optional:
cdecimal 2.2 ... http://www.bytereef.org/software/mpdecimal/releases/cdecimal-2.2.win32-py2.7.msi
mysql-python 1.2.3 ... http://sourceforge.net/projects/fpdb/files/fpdb/MySQL-python-1.2.3.win32-py2.7.exe/download
psycopg2 ... http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.3.1.win32-py2.7-pg9.0.1-release.exe
Developers only:
py2exe 0.6.9 ... http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download

View File

@ -0,0 +1,241 @@
PY2EXE walkthrough for Python 2.7 & FPDB 0.2x
created on 27th Feb 2011 by Gimick
This walkthrough is derived from comments in the py2exe script made by Ray and SqlCoder
Additional information, formatting, updating to Python 2.6 and Python 2.7 and sequencing added by Gimick
Content is available under the the GNU Affero General Public License version 3
Step 0 Get a fresh XP installation
----------------------------------
0.1/ Using XPhome or Pro 32bit
0.2/ Ensure the CPU supports SSE2 instruction set or better.
Step 1, dependency install
--------------------------
1.1/ install the following in sequence (accept all default options) there should be no errors !
Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi
matplotlib 1.0.1 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.win32-py2.7.exe/download
pygtk 2.22 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.22/pygtk-2.22.0-1.win32-py2.7.exe
pycairo 1.8.10 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.10.win32-py2.7.exe
pyGobject X 2.26 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/pygobject-2.26.0-1.win32-py2.7.exe
pywin 216 ... http://sourceforge.net/projects/pywin32/files/pywin32/Build216/pywin32-216.win32-py2.7.exe/download
pypokereval 138 ... http://sourceforge.net/projects/fpdb/files/fpdb/pokereval-138.win32-py2.7.exe/download
cdecimal 2.2 ... http://www.bytereef.org/software/mpdecimal/releases/cdecimal-2.2.win32-py2.7.msi
psycopg2 ... http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.2.1.win32-py2.6-pg8.4.3-release.exe
(Note: stickpeople is the offical repository, not a community build)
py2exe 0.6.9 ... http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download
1.2/ MySQL
Install the following file:
mysql-python 1.2.3 ... http://sourceforge.net/projects/fpdb/files/fpdb/MySQL-python-1.2.3.win32-py2.7.exe/download
1.3/ pytz fixup to work in an executable package
pytz needs runtime access to timezone definition files. pytz is hard-coded to search in the directory from which the pytz .py modules are being run.
In a py2exe package, this directory is actually a library.zip container file, so windows cannot find the timezone definitions, and will crash the app.
We need to make a one-line change to pytz to search in the current working directory (which is not a container), and not the application directory.
The py2exe script copies the timezone datafiles into the package folder pyfpdb/zoneinfo.
Thanks to Jeff Peck <peck.jeff <at> gmail.com> on the py2exe mailing list for documenting this problem and solution.
1.3.1/ Navigate to C:\Python27\Lib\site-packages\pytz
1.3.2/ Edit __init__.py
1.3.3/ At line 55 replace the following line(s):
filename = os.path.join(os.path.dirname(__file__),
'zoneinfo', *name_parts)
with this line:
filename = os.path.join(os.getcwd(), 'zoneinfo', *name_parts)
1.3.4/ Save and exit
1.4/ Patch py2exe to stop popup runtime error message
see http://www.py2exe.org/index.cgi/StderrLog for technical info.
1.4.1/
dos> write C:\Python27\Lib\site-packages\py2exe\boot_common.py
replace:
atexit.register(alert, 0,
"See the logfile '%s' for details" % fname,
"Errors occurred")
with:
#atexit.register(alert, 0,
# "See the logfile '%s' for details" % fname,
# "Errors occurred")
1.4.2/ save and exit
Step 2 Setup GTK
-----------------
There are quite a few GTK packages needed, and rather than install them individually, I used the official AllinOne from the GTK project.
2,1/ Create a new folder c:\GTK
2.2/ Extract the following zip file into c:\GTK
gtk+ allinone 2.22.1 ... http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip
2.3/ If everything has worked, you should have c:\GTK\bin \etc \lib \src and so on created.
2.4/ The /share/doc and /share/gtk-doc folders are huge, so can be emptied now (leave the /doc and /gtk-doc folders
in place, but delete the content)
Step 3 Set GTK into the PATH variable
-------------------------------------
The path for GTK isn't set by default, so need to let the o/s know where the GTK stuff is.
3.1/ Rightclick on mycomputer to show system properties
3.2/ select advanced/environment Variables
3.3/ in "system variables" NOT "user variables" do the following
3.3.1/ create a new item as name: GTK_BASEPATH value: c:\GTK
3.3.2/ edit the item "path", press home to get to the first character and insert the following text, (no quotes, including semicolon) %GTK_BASEPATH%\bin;
3.4/ to check, open command prompt and do:
dos>path ... system should respond with ... PATH=c:\GTK\bin;C:\WIN........
3.5/ Give it a spin to test (hopefully an application will start, if not, something has gone wrong)
dos> gtk-demo
Step 4 Get the fpdb GIT tree
----------------------------
4.1/ Best to take a copy to work with; following steps will assume that the fpdb folder is on the Desktop
4.2/ Edit the script in packaging/windows/py2exe_setup.py to set the fpdbver variable for this release
5.3/ Install correct Numpy for this build
-----------------------------------------
Numpy needs special handling, as by default it will install an optimised version for the SSE level of your CPU (SSE3, SSE2 or noSSE). This means that the completed package will not run on an older CPU.
For this reason, do not just run the installer downloaded. We will force a nosse version, to minimise problems on
older client PC's
5.3.1/ download the package to the Desktop
numpy 1.5.1 ... http://sourceforge.net/projects/numpy/files/NumPy/1.5.1/numpy-1.5.1-win32-superpack-python2.7.exe/download
5.3.3/ If you are wanting to build a package which works on all CPU's, install noSSE as follows:
dos> cd Desktop
dos> numpy-1.5.1-win32-superpack-python2.7.exe /arch nosse
5.3.4/ At the end of the installation, click on "show details" to confirm the installation.
"Target CPU handles SSE2"
"Target CPU handles SSE3"
"nosse install (arch value: nosse)"
"Install NO SSE"
Extract: numpy-1.5.1-nosse.exe... 100%
Execute: "C:\DOCUME~1\user\LOCALS~1\Temp\numpy-1.5.1-nosse.exe"
Completed
Step 6 Run py2exe to generate fpdb.exe
--------------------------------------
6.1/ Run the script to create the fpdb.exe bundle
dos> cd Desktop\fpdb\packaging\windows
dos> c:\python27\python.exe py2exe_setup.py py2exe
wait a while, watch lots of copying and whatever.
6.2/ You should next get prompted for the GTK folder.
c:\GTK
6.3/ If there are no errors reported, it has probably worked, we will test soon.
Build notes:
There is a warning about dll's not included "umath.pyd - c:\Python27\lib\site-packages\numpy\core\umath.pyd"
- reason for this is not understood at present. (Umath is apparently included in the built package).
Step 7 not currently used
-------------------------
Has been deleted
Step 8 Drag out the completed bundle
------------------------------------
py2exe creates a new folder for the created software bundle, drag this out to the desktop for ease of working.
8.1/ Drag Desktop\fpdb\packaging\windows\fpdb-n.nn.nnn to Desktop\
Step 9 Initial run
------------------
9.1/ Open the Desktop\fpdb-n.nn.nnn folder
9.2/ In explorer...tools...folder options...View uncheck "Hide extensions for known file types"
9.3/ Double click run_fpdb.bat
9.4/ check the contents of pyfpdb\fpdb.exe.log, deal with any errors thrown
9.5/ hopefully, fpdb will run
9.6/ Try out a few options, deal with any errors reported
Observe that the msvcp90.dll was provided by the python runtime package, so we don't have to install the separate package from Microsoft. End-users will, however need the dependency.
Step 11 pruning
---------------
11.1/ The generated folder is 100+MB and can be pruned by removing the following directories:
pyfpdb/lib/glib-2.0
pyfpdb/lib/pkgconfig
pyfpdb/share/aclocal
pyfpdb/share/doc
pyfpdb/share/glib-2.0
pyfpdb/share/gtk-2.0
pyfpdb/share/gtk-doc
pyfpdb/share/locale
pyfpdb/share/man
Step 12 rename folder
---------------------
If needed, rename the folder to something meaningful to the community. If you have built for NoSSE, append anyCPU to the directory name.
Step 13 Compress to executable archive
--------------------------------------
13.1/ Download and install 7zip 914 ... http://sourceforge.net/projects/sevenzip/files/7-Zip/9.14/7z914.exe/download
13.2/ Rightclick on fpdb executable folder, select 7zip Add to archive... select SFX archive option switch
13.3/ Test the created exe file
Step 14 If you need to build again for a different SSE level
------------------------------------------------------------
Go back to step 5 and run again.

View File

@ -1,225 +1,225 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""setup.py """setup.py
Py2exe script for fpdb. Py2exe script for fpdb.
""" """
# Copyright 2009-2011, Ray E. Barker # Copyright 2009-2011, Ray E. Barker
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
######################################################################## ########################################################################
#TODO: #TODO:
# get rid of all the uneeded libraries (e.g., pyQT) # get rid of all the uneeded libraries (e.g., pyQT)
# think about an installer # think about an installer
# done: change GuiAutoImport so that it knows to start HUD_main.exe, when appropriate # done: change GuiAutoImport so that it knows to start HUD_main.exe, when appropriate
# include the lib needed to handle png files in mucked # include the lib needed to handle png files in mucked
#HOW TO USE this script: #HOW TO USE this script:
# #
#- cd to the folder where this script is stored, usually ...packaging/windows #- cd to the folder where this script is stored, usually ...packaging/windows
#- Run the script with python "py2exe_setup.py py2exe" #- Run the script with python "py2exe_setup.py py2exe"
#- You will frequently get messages about missing .dll files.just assume other #- You will frequently get messages about missing .dll files.just assume other
# person will have them? we have copyright issues including some dll's # person will have them? we have copyright issues including some dll's
#- If it works, you'll have a new dir fpdb-YYYYMMDD-exe which should #- If it works, you'll have a new dir fpdb-YYYYMMDD-exe which should
# contain 2 dirs; gfx and pyfpdb and run_fpdb.bat # contain 2 dirs; gfx and pyfpdb and run_fpdb.bat
#- [ This bit is now automated: #- [ This bit is now automated:
# Last, you must copy the etc/, lib/ and share/ folders from your # Last, you must copy the etc/, lib/ and share/ folders from your
# gtk/bin/ (just /gtk/?) folder to the pyfpdb folder. (the whole folders, # gtk/bin/ (just /gtk/?) folder to the pyfpdb folder. (the whole folders,
# not just the contents) ] # not just the contents) ]
#- You can (should) then prune the etc/, lib/ and share/ folders to #- You can (should) then prune the etc/, lib/ and share/ folders to
# remove components we don't need. (see output at end of program run) # remove components we don't need. (see output at end of program run)
# See walkthrough in packaging directory for versions used # See walkthrough in packaging directory for versions used
# steffeN: Doesnt seem necessary to gettext-ify this, but feel free to if you disagree # steffeN: Doesnt seem necessary to gettext-ify this, but feel free to if you disagree
# Gimick: restructure to allow script to run from packaging/windows directory, and not to write to source pyfpdb # Gimick: restructure to allow script to run from packaging/windows directory, and not to write to source pyfpdb
import os import os
import sys import sys
# get out now if parameter not passed # get out now if parameter not passed
try: try:
sys.argv[1] <> "" sys.argv[1] <> ""
except: except:
print "A parameter is required, quitting now" print "A parameter is required, quitting now"
quit() quit()
from distutils.core import setup from distutils.core import setup
import py2exe import py2exe
import glob import glob
import matplotlib import matplotlib
import shutil import shutil
#from datetime import date import cdecimal
def isSystemDLL(pathname): def isSystemDLL(pathname):
#dwmapi appears to be vista-specific file, not XP #dwmapi appears to be vista-specific file, not XP
if os.path.basename(pathname).lower() in ("dwmapi.dll"): if os.path.basename(pathname).lower() in ("dwmapi.dll"):
return 0 return 0
return origIsSystemDLL(pathname) return origIsSystemDLL(pathname)
def test_and_remove(top): def test_and_remove(top):
if os.path.exists(top): if os.path.exists(top):
if os.path.isdir(top): if os.path.isdir(top):
remove_tree(top) remove_tree(top)
else: else:
print "Unexpected file '"+top+"' found. Exiting." print "Unexpected file '"+top+"' found. Exiting."
exit() exit()
def remove_tree(top): def remove_tree(top):
# Delete everything reachable from the directory named in 'top', # Delete everything reachable from the directory named in 'top',
# assuming there are no symbolic links. # assuming there are no symbolic links.
# CAUTION: This is dangerous! For example, if top == '/', it # CAUTION: This is dangerous! For example, if top == '/', it
# could delete all your disk files. # could delete all your disk files.
# sc: Nicked this from somewhere, added the if statement to try # sc: Nicked this from somewhere, added the if statement to try
# make it a bit safer # make it a bit safer
if top in ('build','dist',distdir) and os.path.basename(os.getcwd()) == 'windows': if top in ('build','dist',distdir) and os.path.basename(os.getcwd()) == 'windows':
#print "removing directory '"+top+"' ..." #print "removing directory '"+top+"' ..."
for root, dirs, files in os.walk(top, topdown=False): for root, dirs, files in os.walk(top, topdown=False):
for name in files: for name in files:
os.remove(os.path.join(root, name)) os.remove(os.path.join(root, name))
for name in dirs: for name in dirs:
os.rmdir(os.path.join(root, name)) os.rmdir(os.path.join(root, name))
os.rmdir(top) os.rmdir(top)
def copy_tree(source,destination): def copy_tree(source,destination):
source = source.replace('\\', '\\\\') source = source.replace('\\', '\\\\')
destination = destination.replace('\\', '\\\\') destination = destination.replace('\\', '\\\\')
print "*** Copying " + source + " to " + destination + " ***" print "*** Copying " + source + " to " + destination + " ***"
shutil.copytree( source, destination ) shutil.copytree( source, destination )
def copy_file(source,destination): def copy_file(source,destination):
source = source.replace('\\', '\\\\') source = source.replace('\\', '\\\\')
destination = destination.replace('\\', '\\\\') destination = destination.replace('\\', '\\\\')
print "*** Copying " + source + " to " + destination + " ***" print "*** Copying " + source + " to " + destination + " ***"
shutil.copy( source, destination ) shutil.copy( source, destination )
fpdbver = '0.21.rc1' fpdbver = '0.21'
distdir = r'fpdb-' + fpdbver distdir = r'fpdb-' + fpdbver
rootdir = r'../../' #cwd is normally /packaging/windows rootdir = r'../../' #cwd is normally /packaging/windows
pydir = rootdir+'pyfpdb/' pydir = rootdir+'pyfpdb/'
gfxdir = rootdir+'gfx/' gfxdir = rootdir+'gfx/'
sys.path.append( pydir ) # allows fpdb modules to be found by options/includes below sys.path.append( pydir ) # allows fpdb modules to be found by options/includes below
print "\n" + r"Output will be created in "+distdir print "\n" + r"Output will be created in "+distdir
print "*** Cleaning working folders ***" print "*** Cleaning working folders ***"
test_and_remove('dist') test_and_remove('dist')
test_and_remove('build') test_and_remove('build')
test_and_remove(distdir) test_and_remove(distdir)
print "*** Building now in dist folder ***" print "*** Building now in dist folder ***"
origIsSystemDLL = py2exe.build_exe.isSystemDLL origIsSystemDLL = py2exe.build_exe.isSystemDLL
py2exe.build_exe.isSystemDLL = isSystemDLL py2exe.build_exe.isSystemDLL = isSystemDLL
setup( setup(
name = 'fpdb', name = 'fpdb',
description = 'Free Poker DataBase', description = 'Free Poker DataBase',
version = fpdbver, version = fpdbver,
windows = [ {'script': pydir+'fpdb.pyw', "icon_resources": [(1, gfxdir+"fpdb_large_icon.ico")]}, windows = [ {'script': pydir+'fpdb.pyw', "icon_resources": [(1, gfxdir+"fpdb_large_icon.ico")]},
{'script': pydir+'HUD_main.pyw', }, {'script': pydir+'HUD_main.pyw', },
{'script': pydir+'Configuration.py', } {'script': pydir+'Configuration.py', }
], ],
console = [ {'script': pydir+'Stove.py', } console = [ {'script': pydir+'Stove.py', }
], ],
options = {'py2exe': { options = {'py2exe': {
'packages' : ['encodings', 'matplotlib'], 'packages' : ['encodings', 'matplotlib'],
'includes' : ['gio', 'cairo', 'pango', 'pangocairo', 'atk', 'gobject' 'includes' : ['gio', 'cairo', 'pango', 'pangocairo', 'atk', 'gobject'
,'matplotlib.numerix.random_array' ,'matplotlib.numerix.random_array'
,'AbsoluteToFpdb', 'BetfairToFpdb' ,'AbsoluteToFpdb', 'BetfairToFpdb'
,'CarbonToFpdb', 'EverleafToFpdb' ,'CarbonToFpdb', 'EverleafToFpdb'
,'FulltiltToFpdb', 'iPokerToFpdb' ,'FulltiltToFpdb', 'iPokerToFpdb'
,'OnGameToFpdb', 'PartyPokerToFpdb' ,'OnGameToFpdb', 'PartyPokerToFpdb'
,'PkrToFpdb', 'PokerStarsToFpdb' ,'PkrToFpdb', 'PokerStarsToFpdb'
,'Win2dayToFpdb', 'WinamaxToFpdb' ,'Win2dayToFpdb', 'WinamaxToFpdb'
], ],
'excludes' : ['_tkagg', '_agg2', 'cocoaagg', 'fltkagg'], 'excludes' : ['_tkagg', '_agg2', 'cocoaagg', 'fltkagg'],
'dll_excludes': ['libglade-2.0-0.dll', 'libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll' 'dll_excludes': ['libglade-2.0-0.dll', 'libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll'
, 'msvcr90.dll', 'MSVCP90.dll', 'MSVCR90.dll','msvcr90.dll'], # these are vis c / c++ runtimes, and must not be redistributed , 'msvcr90.dll', 'MSVCP90.dll', 'MSVCR90.dll','msvcr90.dll'], # these are vis c / c++ runtimes, and must not be redistributed
} }
}, },
# files in 2nd value in tuple are moved to dir named in 1st value # files in 2nd value in tuple are moved to dir named in 1st value
# this code will not walk a tree # this code will not walk a tree
# Note: cwd for 1st value is packaging/windows/dist (this is confusing BTW) # Note: cwd for 1st value is packaging/windows/dist (this is confusing BTW)
# Note: only include files here which are to be put into the package pyfpdb folder or subfolders # Note: only include files here which are to be put into the package pyfpdb folder or subfolders
data_files = [('', glob.glob(rootdir+'*.txt')) data_files = [('', glob.glob(rootdir+'*.txt'))
,('', [pydir+'HUD_config.xml.example',pydir+'Cards01.png', pydir+'logging.conf']) ,('', [pydir+'HUD_config.xml.example',pydir+'Cards01.png', pydir+'logging.conf'])
] + matplotlib.get_py2exe_datafiles() ] + matplotlib.get_py2exe_datafiles()
) )
# ,(distdir, [rootdir+'run_fpdb.bat']) # ,(distdir, [rootdir+'run_fpdb.bat'])
# ,(distdir+r'\gfx', glob.glob(gfxdir+'*.*')) # ,(distdir+r'\gfx', glob.glob(gfxdir+'*.*'))
# ] + # ] +
print "*** py2exe build phase complete ***" print "*** py2exe build phase complete ***"
# copy zone info and fpdb translation folders # copy zone info and fpdb translation folders
copy_tree (r'c:\python26\Lib\site-packages\pytz\zoneinfo', os.path.join(r'dist', 'zoneinfo')) copy_tree (r'c:\python27\Lib\site-packages\pytz\zoneinfo', os.path.join(r'dist', 'zoneinfo'))
copy_tree (pydir+r'locale', os.path.join(r'dist', 'locale')) copy_tree (pydir+r'locale', os.path.join(r'dist', 'locale'))
# create distribution folder and populate with gfx + bat # create distribution folder and populate with gfx + bat
copy_tree (gfxdir, os.path.join(distdir, 'gfx')) copy_tree (gfxdir, os.path.join(distdir, 'gfx'))
copy_file (rootdir+'run_fpdb.bat', distdir) copy_file (rootdir+'run_fpdb.bat', distdir)
print "*** Renaming dist folder as distribution pyfpdb folder ***" print "*** Renaming dist folder as distribution pyfpdb folder ***"
dest = os.path.join(distdir, 'pyfpdb') dest = os.path.join(distdir, 'pyfpdb')
os.rename( 'dist', dest ) os.rename( 'dist', dest )
print "*** copying GTK runtime ***" print "*** copying GTK runtime ***"
gtk_dir = "" gtk_dir = ""
while not os.path.exists(gtk_dir): while not os.path.exists(gtk_dir):
print "Enter directory name for GTK (e.g. c:/gtk) : ", # the comma means no newline print "Enter directory name for GTK (e.g. c:/gtk) : ", # the comma means no newline
gtk_dir = sys.stdin.readline().rstrip() gtk_dir = sys.stdin.readline().rstrip()
print "*** copying GTK runtime ***" print "*** copying GTK runtime ***"
dest = os.path.join(distdir, 'pyfpdb') dest = os.path.join(distdir, 'pyfpdb')
copy_file(os.path.join(gtk_dir, 'bin', 'libgdk-win32-2.0-0.dll'), dest ) copy_file(os.path.join(gtk_dir, 'bin', 'libgdk-win32-2.0-0.dll'), dest )
copy_file(os.path.join(gtk_dir, 'bin', 'libgobject-2.0-0.dll'), dest) copy_file(os.path.join(gtk_dir, 'bin', 'libgobject-2.0-0.dll'), dest)
copy_tree(os.path.join(gtk_dir, 'etc'), os.path.join(dest, 'etc')) copy_tree(os.path.join(gtk_dir, 'etc'), os.path.join(dest, 'etc'))
copy_tree(os.path.join(gtk_dir, 'lib'), os.path.join(dest, 'lib')) copy_tree(os.path.join(gtk_dir, 'lib'), os.path.join(dest, 'lib'))
copy_tree(os.path.join(gtk_dir, 'share'), os.path.join(dest, 'share')) copy_tree(os.path.join(gtk_dir, 'share'), os.path.join(dest, 'share'))
print "*** All done! ***" print "*** All done! ***"
test_and_remove('build') test_and_remove('build')
print distdir+" is in the pyfpdb dir" print distdir+" is in the pyfpdb dir"
print """ print """
The following dirs can probably removed to make the final package smaller: The following dirs can probably removed to make the final package smaller:
pyfpdb/lib/glib-2.0 pyfpdb/lib/glib-2.0
pyfpdb/lib/gtk-2.0/include pyfpdb/lib/gtk-2.0/include
pyfpdb/lib/pkgconfig pyfpdb/lib/pkgconfig
pyfpdb/share/aclocal pyfpdb/share/aclocal
pyfpdb/share/doc pyfpdb/share/doc
pyfpdb/share/glib-2.0 pyfpdb/share/glib-2.0
pyfpdb/share/gtk-2.0 pyfpdb/share/gtk-2.0
pyfpdb/share/gtk-doc pyfpdb/share/gtk-doc
pyfpdb/share/locale pyfpdb/share/locale
pyfpdb/share/man pyfpdb/share/man
pyfpdb/share/themes/Default pyfpdb/share/themes/Default
Use 7-zip to zip up the distribution and create a self extracting archive and that's it! Use 7-zip to zip up the distribution and create a self extracting archive and that's it!
""" """

View File

@ -2,6 +2,7 @@ pypokereval build for windows stepbystep guide
---------------------------------------------- ----------------------------------------------
Created by Gimick on 3rd December 2010 Created by Gimick on 3rd December 2010
Updated for py27 by Gimick 27th Feb 2011
This walkthrough is derived with the assistance of EricBlade and the build notes This walkthrough is derived with the assistance of EricBlade and the build notes
supplied by Loic Dachary <loic@dachary.org> http://dachary.org/ supplied by Loic Dachary <loic@dachary.org> http://dachary.org/
@ -12,7 +13,7 @@ Content is available under the the GNU Affero General Public License version 3
0. Build environ 0. Build environ
---------------- ----------------
We are building against the 2008 runtime because Python 2.6 We are building against the 2008 runtime because Python 2.7
has the same dependency (msvcr90.dll version 9.0.21022.8) has the same dependency (msvcr90.dll version 9.0.21022.8)
Using winXPhome 32 bit Using winXPhome 32 bit
@ -31,7 +32,7 @@ This package will run 30 days before registration is needed
2.1/ Install python runtime from here ... 2.1/ Install python runtime from here ...
Python 2.6.5 ... http://www.python.org/ftp/python/2.6.5/python-2.6.5.msi Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi
3. Source install 3. Source install
----------------- -----------------
@ -62,11 +63,29 @@ change this:
to be this: to be this:
#define VERSION_NAME(W) W##2_6 #define VERSION_NAME(W) W##2_7
#define PYTHON_VERSION "2_6" #define PYTHON_VERSION "2_7"
- - - - - -
Move this block of code:
#ifdef _DEBUG // for Windows python23_d.lib is not in distribution... ugly but works
#undef _DEBUG
#include <Python.h>
#define _DEBUG
#else
#include <Python.h>
#endif
To be after this line:
#include "enumdefs.h"
4.2/ save and exit 4.2/ save and exit
- - - - -
4.3/ dos> write c:/pypoker-eval/pokereval.py 4.3/ dos> write c:/pypoker-eval/pokereval.py
Comment-out this line: Comment-out this line:
@ -75,7 +94,7 @@ _pokereval = __import__('_pokereval_' + sys.version[0] + '_' + sys.version[2])
Insert this one in its' place: Insert this one in its' place:
import _pokereval_2_6 as _pokereval import _pokereval_2_7 as _pokereval
4.4/ save and exit 4.4/ save and exit
@ -112,7 +131,7 @@ import _pokereval_2_6 as _pokereval
6.2.5 In the pythonpoker-eval properties dialog, 6.2.5 In the pythonpoker-eval properties dialog,
change references to "python24" to "python26" in the following: change references to "python24" to "python27" in the following:
= C/C++/Additional Include Directories/ = C/C++/Additional Include Directories/
= linker/general/Additional library directories = linker/general/Additional library directories
@ -121,7 +140,6 @@ change references to "python24" to "python26" in the following:
Change the following Change the following
= linker/generate debug info - set to No = linker/generate debug info - set to No
= linker/debugging/Generate debug info - set to No
6.2.6 Apply all changes to the properties dialog and close 6.2.6 Apply all changes to the properties dialog and close
@ -154,38 +172,39 @@ Change the following
8.4 Exit from visual studio 8.4 Exit from visual studio
9. packaging 9. Wrap-up
------------ ----------
9.1 Navigate to c:/pypoker-eval/release 9.1 Navigate to c:/pypoker-eval/release
9.2 the output file is pypokereval.dll 9.2 the output file is pypokereval.dll
9.3 rename this file to _pokereval_2_6.pyd 9.3 rename this file to _pokereval_2_7.pyd
9.4 create a zip file containing : 9.4 create a zip file containing :
_pokereval_2_6.pyd from releases _pokereval_2_7.pyd from releases
test.py from pypoker-eval-138.0 test.py from pypoker-eval-138.0
pokereval.py from pypoker-eval-138.0 pokereval.py from pypoker-eval-138.0
poker-eval.vcproj from c:\poker-eval poker-eval.vcproj from c:\poker-eval
pypoker-eval.vcproj from c:\pypoker-eval pypoker-eval.vcproj from c:\pypoker-eval
pypokereval.c from c:\pypoker-eval pypokereval.c from c:\pypoker-eval
Remember to include the version (138), python 265 and win32 in the package filename Remember to include the version (138), python 27 and win32 in the package filename
10. Installation and Testing 10. Testing
---------------------------- -----------
Python 2.6.5 must be installed Python 2.7 must be installed
10.1 Extract this package to directory 10.1 Extract the zip file created in 9.4 into a new directory
10.2 Change directory to the directory in 10.1 10.2 Change directory to the directory in 10.1
10.3 execute dos> c:\Python26\python.exe test.py 10.3 execute dos> c:\Python27\python.exe test.py
10.4 hand-output should scroll down the screen 10.4 hand-output should scroll down the screen
10.5 start the python interpreter 10.5 start the python interpreter
10.6 >>> import pokereval 10.6 >>> import pokereval
10.7 No errors should be seen 10.7 No errors should be seen
11. Packaging
-------------
Please follow pypokereval-win32-packaging-walkthrough.txt in the same directory as this walkthrough.

View File

@ -187,6 +187,22 @@ class fpdb:
tabBox.pack_start(tabLabel, False) tabBox.pack_start(tabLabel, False)
eventBox.add(tabBox) eventBox.add(tabBox)
# fixme: force background state to fix problem where STATE_ACTIVE
# tab labels are black in some gtk themes, and therefore unreadable
# This behaviour is probably a bug in libwimp.dll or pygtk, but
# need to force background to avoid issues with menu labels being
# unreadable
#
# gtk.STATE_ACTIVE is a displayed, but not selected tab
# gtk.STATE_NORMAL is a displayed, selected, focussed tab
# gtk.STATE_INSENSITIVE is an inactive tab
# Insensitive/base is chosen as the background colour, because
# although not perfect, it seems to be the least instrusive.
baseNormStyle = eventBox.get_style().base[gtk.STATE_INSENSITIVE]
if baseNormStyle:
print baseNormStyle
eventBox.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse(str(baseNormStyle)))
if nb.get_n_pages() > 0: if nb.get_n_pages() > 0:
tabButton = gtk.Button() tabButton = gtk.Button()