Changeset 548:366e58e8d057


Ignore:
Timestamp:
04/09/11 23:09:37 (12 years ago)
Author:
Simon Cross <hodgestar@…>
Branch:
default
Phase:
public
Rebase:
35653031343035326165346439356333346239643739303461333431353533663135353036386131
Message:

Much simpler py2exe file.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • setup.py

    r545 r548  
    1 # usage: python setup.py command
    2 #
    3 # sdist - build a source dist
    4 # py2exe - build an exe
    5 # py2app - build an app
    6 # cx_freeze - build a linux binary (not implemented)
    7 #
    8 # the goods are placed in the dist dir for you to .zip up or whatever...
     1# setup.py
     2# -*- coding: utf8 -*-
     3# vim:fileencoding=utf8 ai ts=4 sts=4 et sw=4
    94
    10 import glob
    11 import os
    12 import shutil
    13 import sys
     5"""Setuptools setup.py file for Skaapsteker."""
    146
    15 from setuptools import setup, find_packages, Extension
     7from setuptools import setup, find_packages
     8
    169try:
    1710    import py2exe
    18 except:
     11except ImportError:
    1912    pass
    2013
     14VERSION_STR = "0.1"
    2115
     16setup   (   # Metadata
     17            name = "Nine Tales of the Kitsune",
     18            version = VERSION_STR,
     19            description = "Platformer for PyWeek 12",
    2220
    23 APP_NAME = 'skaapsteker'
    24 DESCRIPTION = open('README.txt').read()
    25 CHANGES = open('CHANGES.txt').read()
    26 TODO = open('TODO.txt').read()
     21            author = ("Adrianna Pinska, Anna Malczyk, Jeremy Thurgood, "
     22                      "Neil Muller, Oliver Hambsch, Simon Cross, Stefano Rivera"),
     23            author_email = "",
    2724
     25            maintainer = "Skaapsteker Team",
     26            maintainer_email = "ctpug@googlegroups.com",
    2827
     28            url = "http://ctpug.org.za/",
     29            download_url = "https://ctpug.org.za/hg/skaapsteker/",
    2930
    30 METADATA = {
    31     'name':APP_NAME,
    32     'version':          '0.0.1',
    33     'license':          'short_licence',
    34     'description':      '',
    35     'author':           'Adrianna Pinska, Anna Malczyk, Jeremy Thurgood, Neil Muller, Oliver Hambsch, Simon Cross, Stefano Rivera',
    36     #'author_email':     '',
    37     'url':              'http://pyweek.org/e/skaapsteker',
    38     'classifiers':      [
    39             'Development Status :: 4 - Beta',
    40             'Intended Audience :: End Users/Desktop',
    41             'Intended Audience :: Information Technology',
    42             'License :: OSI Approved :: BSD License',
    43             'Operating System :: OS Independent',
    44             'Programming Language :: Python :: 2',
    45             'Programming Language :: Python :: 2.6',
    46             'Programming Language :: Python :: 2.7',
    47             'Topic :: Software Development :: Libraries :: pygame',
    48             'Topic :: Games/Entertainment :: Real Time Strategy',
    49     ],
     31            license = "MIT",
    5032
     33            classifiers = [
     34                  'Development Status :: 4 - Beta',
     35                  'Environment :: MacOS X',
     36                  'Environment :: Win32 (MS Windows)',
     37                  'Environment :: X11 Applications',
     38                  'Intended Audience :: End Users/Desktop',
     39                  'License :: OSI Approved :: MIT License',
     40                  'Natural Language :: English',
     41                  'Operating System :: Microsoft :: Windows',
     42                  'Operating System :: POSIX',
     43                  'Operating System :: MacOS :: MacOS X',
     44                  'Programming Language :: Python :: 2.5',
     45                  'Programming Language :: Python :: 2.6',
     46                  'Topic :: Games/Entertainment :: Role-Playing',
     47                  'Topic :: Games/Entertainment :: Arcade',
     48             ],
    5149
    52     'py2exe.target':'',
    53     #'py2exe.icon':'icon.ico', #64x64
    54     'py2exe.binary':APP_NAME, #leave off the .exe, it will be added
    55    
    56     'py2app.target':APP_NAME,
    57     'py2app.icon':'icon.icns', #128x128
    58    
    59     #'cx_freeze.cmd':'~/src/cx_Freeze-3.0.3/FreezePython',
    60     'cx_freeze.cmd':'cxfreeze',
    61     'cx_freeze.target':'%s_linux' % APP_NAME,
    62     'cx_freeze.binary':APP_NAME,
    63     }
    64    
    65 files_to_remove = ['tk84.dll',
    66                     '_ssl.pyd',
    67                     'tcl84.dll',
    68                     os.path.join('numpy','core', '_dotblas.pyd'),
    69                     os.path.join('numpy', 'linalg', 'lapack_lite.pyd'),
    70 ]
     50            platforms = [
     51                  'Linux',
     52                  'Mac OS X',
     53                  'Windows',
     54            ],
    7155
     56            # Dependencies
     57            install_requires = [],
    7258
    73 directories_to_remove = [os.path.join('numpy', 'distutils'),
    74                          'distutils',
    75                          'tcl',
    76 ]
     59            # Files
     60            packages = find_packages(),
     61            scripts = [
     62                  'scripts/skaapsteker'
     63            ],
    7764
    78 
    79 cmdclass = {}
    80 PACKAGEDATA = {
    81     'cmdclass':    cmdclass,
    82     'packages': find_packages(),
    83     'scripts': ['scripts/skaapsteker'],
    84 }
    85 
    86 PACKAGEDATA.update(METADATA)
    87 
    88 
    89 try:
    90     cmd = sys.argv[1]
    91 except IndexError:
    92     print 'Usage: setup.py install|py2exe|py2app|cx_freeze'
    93     raise SystemExit
    94 
    95 # utility for adding subdirectories
    96 def add_files(dest,generator):
    97     for dirpath, dirnames, filenames in generator:
    98         for name in 'CVS', '.svn':
    99             if name in dirnames:
    100                 dirnames.remove(name)
    101 
    102         for name in filenames:
    103             if '~' in name: continue
    104             suffix = os.path.splitext(name)[1]
    105             if suffix in ('.pyc', '.pyo'): continue
    106             if name[0] == '.': continue
    107             filename = os.path.join(dirpath, name)
    108             dest.append(filename)
    109 
    110 # define what is our data
    111 _DATA_DIR = 'data'
    112 data = []
    113 add_files(data,os.walk(_DATA_DIR))
    114 
    115 
    116 
    117 
    118 #data_dirs = [os.path.join(f2.replace(_DATA_DIR, 'data'), '*') for f2 in data]
    119 data_dirs = [os.path.join(f2.replace(_DATA_DIR, 'data')) for f2 in data]
    120 PACKAGEDATA['package_data'] = {'skaapsteker': data_dirs}
    121 
    122 
    123 
    124 
    125 
    126 data.extend(glob.glob('*.txt'))
    127 #data.append('MANIFEST.in')
    128 # define what is our source
    129 src = []
    130 add_files(src,os.walk('skaapsteker'))
    131 src.extend(glob.glob('*.py'))
    132 
    133 
    134 
    135 
    136 # build the sdist target
    137 if cmd not in "py2exe py2app cx_freeze".split():
    138     f = open("MANIFEST.in","w")
    139     for l in data: f.write("include "+l+"\n")
    140     for l in src: f.write("include "+l+"\n")
    141     f.close()
    142    
    143     setup(**PACKAGEDATA)
    144 
    145 # build the py2exe target
    146 if cmd in ('py2exe',):
    147     dist_dir = os.path.join('dist',METADATA['py2exe.target'])
    148     data_dir = dist_dir
    149    
    150     src = 'run_game.py'
    151     dest = METADATA['py2exe.binary']+'.py'
    152     shutil.copy(src,dest)
    153    
    154     setup(
    155         options={'py2exe':{
    156             'dist_dir':dist_dir,
    157             'dll_excludes':['_dotblas.pyd','_numpy.pyd', 'numpy.linalg.lapack_lite.pyd', 'numpy.core._dotblas.pyd'] + files_to_remove,
    158             'excludes':['matplotlib', 'tcl', 'OpenGL'],
    159             'ignores':['matplotlib', 'tcl', 'OpenGL'],
    160             'bundle_files':1,
     65            # py2exe
     66            console = ['scripts/testconsole.py'],
     67            windows = [{
     68                'script': 'scripts/skaapsteker',
     69                'icon_resources': [(0, "data/icons/program/icon.ico")],
     70            }],
     71            app = ['scripts/skaapsteker'],
     72            options = {
     73            'py2exe': {
     74                'skip_archive': 1,
     75                'dist_dir': 'dist/nine-tales-%s' % VERSION_STR,
     76                'packages': [
     77                    'logging', 'encodings', 'skaapsteker',
     78                ],
     79                'includes': [
     80                    # pygame
     81                    'pygame',
     82                ],
     83                'excludes': [
     84                    'numpy',
     85                ],
     86                'ignores': [
     87                    # all database modules
     88                    'pgdb', 'Sybase', 'adodbapi',
     89                    'kinterbasdb', 'psycopg', 'psycopg2', 'pymssql',
     90                    'sapdb', 'pysqlite2', 'sqlite', 'sqlite3',
     91                    'MySQLdb', 'MySQLdb.connections',
     92                    'MySQLdb.constants.CR', 'MySQLdb.constants.ER',
     93                    # old datetime equivalents
     94                    'DateTime', 'DateTime.ISO',
     95                    'mx', 'mx.DateTime', 'mx.DateTime.ISO',
     96                    # email modules
     97                    'email.Generator', 'email.Iterators', 'email.Utils',
     98                ],
     99            },
     100            'py2app': {
     101                'argv_emulation': 1,
     102                'iconfile': 'data/icons/program/icon.icns',
     103#                 'dist_dir': 'dist/nine-tales-%s' % VERSION_STR,
     104#                 'bdist_base': 'build/bdist',
     105                'packages': [
     106                    'logging', 'encodings', 'pygame', 'skaapsteker', 'data',
     107                ],
     108                'excludes': ['numpy'],
    161109            }},
    162 #        windows=[{
    163        console=[{
    164             'script':dest,
    165             #'icon_resources':[(1,METADATA['py2exe.icon'])],
    166             }],
     110            data_files = [
     111                # 'COPYRIGHT',
     112                'LICENSE.txt',
     113                'README.txt',
     114            ],
    167115        )
    168 
    169 # build the py2app target
    170 if cmd == 'py2app':
    171     dist_dir = os.path.join('dist',METADATA['py2app.target']+'.app')
    172     data_dir = os.path.join(dist_dir,'Contents','Resources')
    173 
    174     src = 'run_game.py'
    175     dest = METADATA['py2app.target']+'.py'
    176     shutil.copy(src,dest)
    177 
    178     APP = [dest]
    179     DATA_FILES = []
    180     OPTIONS = {'argv_emulation': True,
    181                #'iconfile':METADATA['py2app.icon']
    182               }
    183 
    184     setup(
    185         app=APP,
    186         data_files=DATA_FILES,
    187         options={'py2app': OPTIONS},
    188         setup_requires=['py2app'],
    189     )
    190 
    191 # make the cx_freeze target
    192 if cmd == 'cx_freeze':
    193     app_dist_dir = METADATA['cx_freeze.target'] + "_" + METADATA['version']
    194     dist_dir = os.path.join('dist', app_dist_dir)
    195     data_dir = dist_dir
    196 
    197     modules_exclude = "tcl,tk"
    198     cmd_args = (METADATA['cx_freeze.cmd'], dist_dir, METADATA['cx_freeze.binary'], modules_exclude)
    199     sys_cmd = '%s --install-dir=%s --target-name=%s --exclude-modules=%s run_game.py' % cmd_args
    200     print sys_cmd
    201     os.system(sys_cmd)
    202 
    203     import shutil
    204     if os.path.exists(os.path.join(data_dir, "tcl")):
    205         shutil.rmtree( os.path.join(data_dir, "tcl") )
    206     if os.path.exists(os.path.join(data_dir, "tk")):
    207         shutil.rmtree( os.path.join(data_dir, "tk") )
    208 
    209 
    210 
    211 # recursively make a bunch of folders
    212 def make_dirs(dname_):
    213     parts = list(os.path.split(dname_))
    214     dname = None
    215     while len(parts):
    216         if dname == None:
    217             dname = parts.pop(0)
    218         else:
    219             dname = os.path.join(dname,parts.pop(0))
    220         if not os.path.isdir(dname):
    221             os.mkdir(dname)
    222 
    223 # copy data into the binaries
    224 if cmd in ('py2exe','cx_freeze','py2app'):
    225     dest = data_dir
    226     for fname in data:
    227         dname = os.path.join(dest,os.path.dirname(fname))
    228         make_dirs(dname)
    229         if not os.path.isdir(fname):
    230             #print (fname,dname)
    231             shutil.copy(fname,dname)
    232 
    233 # make a tgz files.
    234 if cmd == 'cx_freeze':
    235     sys_cmd = "cd dist; tar -vczf %s.tgz %s/" % (app_dist_dir,app_dist_dir) 
    236     os.system(sys_cmd)
    237 
    238 
    239 # remove files from the zip.
    240 if 0 and cmd in ('py2exe'):
    241     import shutil
    242 
    243     #shutil.rmtree( os.path.join('dist') )
    244     #shutil.rmtree( os.path.join('build') )
    245 
    246 
    247     os.system("unzip dist/library.zip -d dist\library")
    248 
    249     for fn in files_to_remove:
    250         os.remove( os.path.join('dist', 'library', fn) )
    251 
    252 
    253     for d in directories_to_remove:
    254         if os.path.exists( os.path.join('dist', 'library', d) ):
    255             shutil.rmtree( os.path.join('dist', 'library', d) )
    256 
    257     os.remove( os.path.join('dist', 'library.zip') )
    258 
    259 
    260     os.chdir("dist")
    261     os.chdir("library")
    262 
    263     os.system("zip -r -9 ..\library.zip .")
    264 
    265     os.chdir("..")
    266     os.chdir("..")
Note: See TracChangeset for help on using the changeset viewer.