X-Git-Url: https://svn.cri.ensmp.fr/git/minwii.git/blobdiff_plain/b4d2fe93ad71b4328a1bc492f8a3b1eec8b64212..f50f6a146ce55fedd45133632f578b44ec4ad4e3:/setup_win_exe.py diff --git a/setup_win_exe.py b/setup_win_exe.py index de4ccd9..ed6aba6 100755 --- a/setup_win_exe.py +++ b/setup_win_exe.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # This will create a dist directory containing the executable file, all the data # directories. All Libraries will be bundled in executable file. # @@ -17,46 +18,102 @@ try: except ImportError, message: raise SystemExit, "Unable to load module. %s" % message -class pygame2exe(py2exe.build_exe.py2exe): #This hack make sure that pygame default font is copied: no need to modify code for specifying default font - def copy_extensions(self, extensions): - #Get pygame default font - pygamedir = os.path.split(pygame.base.__file__)[0] - pygame_default_font = os.path.join(pygamedir, pygame.font.get_default_font()) - #Add font to list of extension to be copied - extensions.append(Module("pygame.font", pygame_default_font)) +origIsSystemDLL = py2exe.build_exe.isSystemDLL +def isSystemDLL(pathname): + if os.path.basename(pathname).lower() in ["sdl_ttf.dll"]: + return 0 + return origIsSystemDLL(pathname) +py2exe.build_exe.isSystemDLL = isSystemDLL + +def findPguThemesDir() : + import pgu.gui.theme + theme_file = pgu.gui.theme.__file__ + dnames = [] + dnames.append(os.path.join(os.path.dirname(theme_file),"..","..","data","themes")) + + #if the package is installed, and the package is installed + #in /usr/lib/python2.3/site-packages/pgu/ + #or c:\python23\lib\site-packages\pgu\ + #the data is in ... lib/../share/ ... + dnames.append(os.path.join(os.path.dirname(theme_file),"..","..","..","..","share","pgu","themes")) + dnames.append(os.path.join(os.path.dirname(theme_file),"..","..","..","..","..","share","pgu","themes")) + dnames.append(os.path.join(os.path.dirname(theme_file),"..","..","share","pgu","themes")) + for dname in dnames: + if os.path.isdir(dname): + return dname + raise IOError('pgu themes folder not found') + +def findMinwiiDir() : + import minwii + return os.path.dirname(minwii.__file__) + +class MinWii2exe(py2exe.build_exe.py2exe) : + def copy_extensions(self, extensions) : py2exe.build_exe.py2exe.copy_extensions(self, extensions) + minwiiDir = findMinwiiDir() + self.copyDataFiles(os.path.join(minwiiDir, 'fonts'), 'minwii/fonts') + self.copyDataFiles(os.path.join(minwiiDir, 'soundfonts'), 'minwii/soundfonts') + self.copyDataFiles(os.path.join(minwiiDir, 'widgets', 'data'), 'minwii/widgets/data') + self.copyDataFiles(findPguThemesDir(), 'data/themes') + + pygamedir = os.path.dirname(pygame.base.__file__) + pygame_default_font = os.path.join(pygamedir, pygame.font.get_default_font()) + dest = os.path.join(self.collect_dir, 'pygame', pygame.font.get_default_font()) + self.copy_file(pygame_default_font, dest) + self.compiled_files.append(os.path.join('pygame', pygame.font.get_default_font())) + + def copyDataFiles(self, src, dest) : + src = src.replace('/', os.path.sep) + reldest = dest.replace('/', os.path.sep) + dest = os.path.join(self.collect_dir, reldest) + + if not os.path.exists(dest) : + self.mkpath(dest) + + for path, dirs, files in os.walk(src) : + if '.svn' in path : continue + relpath = path[len(src)+1:] + if not os.path.exists(os.path.join(dest, relpath)) : + self.mkpath(os.path.join(dest, relpath)) + + for file in files : + s = os.path.join(path, file) + d = os.path.join(dest, relpath, file) + self.copy_file(s, d) + print os.path.join(reldest, relpath, file) + self.compiled_files.append(os.path.join(reldest, relpath, file)) + class BuildExe: def __init__(self): #Name of starting .py - self.script = "MyApps.py" + self.script = "src/minwii/runminwii.py" #Name of program - self.project_name = "MyApps" + self.project_name = "MINWii" #Project url self.project_url = "about:none" #Version of program - self.project_version = "0.0" + self.project_version = "1.0" #License of the program - self.license = "MyApps License" + self.license = "GPL" #Auhor of program - self.author_name = "Me" - self.author_email = "example@example.com" - self.copyright = "Copyright (c) 2009 Me." + self.author_name = "Samuel Benveniste" + self.author_email = "samuel.benveniste@gmail.com" + self.copyright = "Copyright 2010 MINES-ParisTech" #Description - self.project_description = "MyApps Description" + self.project_description = "Musicothérapie Interractive avec la Wiimote" #Icon file (None will use pygame default icon) - self.icon_file = None + self.icon_file = 'minwii.ico' - #Extra files/dirs copied to game - self.extra_datas = [] + self.data_files = [] #Extra/excludes python modules self.extra_modules = [] @@ -66,64 +123,28 @@ class BuildExe: self.exclude_dll = [''] #Zip file name (None will bundle files in exe instead of zip file) - self.zipfile_name = None + self.zipfile_name = 'minwii_lib.zip' #Dist directory self.dist_dir ='dist' - ## Code from DistUtils tutorial at http://wiki.python.org/moin/Distutils/Tutorial - ## Originally borrowed from wxPython's setup and config files - def opj(self, *args): - path = os.path.join(*args) - return os.path.normpath(path) - - def find_data_files(self, srcdir, *wildcards, **kw): - # get a list of all files under the srcdir matching wildcards, - # returned in a format to be used for install_data - def walk_helper(arg, dirname, files): - if '.svn' in dirname: - return - names = [] - lst, wildcards = arg - for wc in wildcards: - wc_name = self.opj(dirname, wc) - for f in files: - filename = self.opj(dirname, f) - - if fnmatch.fnmatch(filename, wc_name) and not os.path.isdir(filename): - names.append(filename) - if names: - lst.append( (dirname, names ) ) - - file_list = [] - recursive = kw.get('recursive', True) - if recursive: - os.path.walk(srcdir, walk_helper, (file_list, wildcards)) - else: - walk_helper((file_list, wildcards), - srcdir, - [os.path.basename(f) for f in glob.glob(self.opj(srcdir, '*'))]) - return file_list def run(self): if os.path.isdir(self.dist_dir): #Erase previous destination dir shutil.rmtree(self.dist_dir) + if os.path.isdir('build'): #Clean up build dir + shutil.rmtree('build') + + #Use the default pygame icon, if none given if self.icon_file == None: path = os.path.split(pygame.__file__)[0] self.icon_file = os.path.join(path, 'pygame.ico') - #List all data files to add - extra_datas = [] - for data in self.extra_datas: - if os.path.isdir(data): - extra_datas.extend(self.find_data_files(data, '*')) - else: - extra_datas.append(('.', [data])) - + setup( - cmdclass = {'py2exe': pygame2exe}, + cmdclass = {'py2exe': MinWii2exe}, version = self.project_version, description = self.project_description, name = self.project_name, @@ -138,19 +159,26 @@ class BuildExe: 'icon_resources': [(0, self.icon_file)], 'copyright': self.copyright }], - options = {'py2exe': {'optimize': 2, 'bundle_files': 1, 'compressed': True, \ - 'excludes': self.exclude_modules, 'packages': self.extra_modules, \ - 'dll_excludes': self.exclude_dll} }, + #console = [self.script], + options = {'py2exe': {'optimize': 2, + 'bundle_files': 3, + #'compressed': True, + #'excludes': self.exclude_modules, + #'packages': self.extra_modules, + #'dll_excludes': self.exclude_dll, + 'skip_archive' : True + } + }, zipfile = self.zipfile_name, - data_files = extra_datas, + data_files = self.data_files, dist_dir = self.dist_dir ) - if os.path.isdir('build'): #Clean up build dir - shutil.rmtree('build') + #if os.path.isdir('build'): #Clean up build dir + # shutil.rmtree('build') if __name__ == '__main__': if operator.lt(len(sys.argv), 2): sys.argv.append('py2exe') BuildExe().run() #Run generation - raw_input("Press any key to continue") #Pause to let user see that things ends + #raw_input("Press any key to continue") #Pause to let user see that things ends