Ajout module pour le nouveau navigateur de chansons.
[minwii.git] / setup_win_exe.py
index 89ca0e9..b55d449 100755 (executable)
@@ -1,4 +1,4 @@
-# -*- coding: utf-8 -*-
+# -*- 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.
 #
@@ -18,20 +18,58 @@ 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 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')
+
+        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 = "src/minwii/app.py"
+        #self.script = "src/minwii/runminwii.py"
 
         #Name of program
         self.project_name = "MINWii"
@@ -40,24 +78,23 @@ class BuildExe:
         self.project_url = "about:none"
 
         #Version of program
-        self.project_version = "0.0"
+        self.project_version = "1.2.1"
 
         #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 = []
@@ -67,64 +104,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,
@@ -135,15 +136,28 @@ class BuildExe:
 
             # targets to build
             windows = [{
-                'script': self.script,
+                'script': "src/minwii/runminwii.py",
                 '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} },
+                },
+                {
+                'script' : "src/minwii/logapp.py",
+                'icon_resources': [(0, 'logapp.ico')],
+                'copyright' : self.copyright
+                }
+                ],
+            #console = ["src/minwii/logapp.py"],
+            options = {'py2exe': {'optimize': 1,
+                                  '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
             )
         
@@ -154,4 +168,4 @@ 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