view setup.py @ 286:0dbb50d07764

Poke the current state before checking to see if there is text in case the world has changed and it is time for the state machine to move on.
author Simon Cross <hodgestar@gmail.com>
date Fri, 08 Apr 2011 20:58:12 +0200
parents f0c108bee0b2
children 4e8be9c52952
line wrap: on
line source

import os

# usage: python setup.py command
#
# sdist - build a source dist
# py2exe - build an exe
# py2app - build an app
# cx_freeze - build a linux binary (not implemented)
#
# the goods are placed in the dist dir for you to .zip up or whatever...


APP_NAME = 'skaapsteker'
DESCRIPTION = open('README.txt').read()
CHANGES = open('CHANGES.txt').read()
TODO = open('TODO.txt').read()



METADATA = {
    'name':APP_NAME,
    'version':          '0.0.1',
    'license':          'short_licence',
    'description':      '',
    'author':           'Adrianna Pinska, Anna Malczyk, Jeremy Thurgood, Neil Muller, Oliver Hambsch, Simon Cross, Stefano Rivera',
    #'author_email':     '',
    'url':              'http://pyweek.org/e/skaapsteker',
    'classifiers':      [
            'Development Status :: 4 - Beta',
            'Intended Audience :: End Users/Desktop',
            'Intended Audience :: Information Technology',
            'License :: OSI Approved :: BSD License',
            'Operating System :: OS Independent',
            'Programming Language :: Python :: 2',
            'Programming Language :: Python :: 2.6',
            'Programming Language :: Python :: 2.7',
            'Topic :: Software Development :: Libraries :: pygame',
            'Topic :: Games/Entertainment :: Real Time Strategy',
    ],


    'py2exe.target':'',
    #'py2exe.icon':'icon.ico', #64x64
    'py2exe.binary':APP_NAME, #leave off the .exe, it will be added
    
    'py2app.target':APP_NAME,
    'py2app.icon':'icon.icns', #128x128
    
    #'cx_freeze.cmd':'~/src/cx_Freeze-3.0.3/FreezePython',
    'cx_freeze.cmd':'cxfreeze',
    'cx_freeze.target':'%s_linux' % APP_NAME,
    'cx_freeze.binary':APP_NAME,
    }
    
files_to_remove = ['tk84.dll',
                    '_ssl.pyd',
                    'tcl84.dll',
                    os.path.join('numpy','core', '_dotblas.pyd'),
                    os.path.join('numpy', 'linalg', 'lapack_lite.pyd'),
]


directories_to_remove = [os.path.join('numpy', 'distutils'),
                         'distutils',
                         'tcl',
]


cmdclass = {}
PACKAGEDATA = {
    'cmdclass':    cmdclass,

    'package_dir': {'skaapsteker': 'skaapsteker',
                   },
    'packages': ['skaapsteker',
                ],
    'scripts': ['scripts/skaapsteker'],
}

PACKAGEDATA.update(METADATA)


from distutils.core import setup, Extension
try:
    import py2exe
except:
    pass

import sys
import glob
import os
import shutil

try:
    cmd = sys.argv[1]
except IndexError:
    print 'Usage: setup.py install|py2exe|py2app|cx_freeze'
    raise SystemExit

# utility for adding subdirectories
def add_files(dest,generator):
    for dirpath, dirnames, filenames in generator:
        for name in 'CVS', '.svn':
            if name in dirnames:
                dirnames.remove(name)

        for name in filenames:
            if '~' in name: continue
            suffix = os.path.splitext(name)[1]
            if suffix in ('.pyc', '.pyo'): continue
            if name[0] == '.': continue
            filename = os.path.join(dirpath, name)
            dest.append(filename)

# define what is our data
_DATA_DIR = os.path.join('skaapsteker', 'data')
data = []
add_files(data,os.walk(_DATA_DIR))




#data_dirs = [os.path.join(f2.replace(_DATA_DIR, 'data'), '*') for f2 in data]
data_dirs = [os.path.join(f2.replace(_DATA_DIR, 'data')) for f2 in data]
PACKAGEDATA['package_data'] = {'skaapsteker': data_dirs}





data.extend(glob.glob('*.txt'))
#data.append('MANIFEST.in')
# define what is our source
src = []
add_files(src,os.walk('skaapsteker'))
src.extend(glob.glob('*.py'))




# build the sdist target
if cmd not in "py2exe py2app cx_freeze".split():
    f = open("MANIFEST.in","w")
    for l in data: f.write("include "+l+"\n")
    for l in src: f.write("include "+l+"\n")
    f.close()
    
    setup(**PACKAGEDATA)

# build the py2exe target
if cmd in ('py2exe',):
    dist_dir = os.path.join('dist',METADATA['py2exe.target'])
    data_dir = dist_dir
    
    src = 'run_game.py'
    dest = METADATA['py2exe.binary']+'.py'
    shutil.copy(src,dest)
    
    setup(
        options={'py2exe':{
            'dist_dir':dist_dir,
            'dll_excludes':['_dotblas.pyd','_numpy.pyd', 'numpy.linalg.lapack_lite.pyd', 'numpy.core._dotblas.pyd'] + files_to_remove,
            'excludes':['matplotlib', 'tcl', 'OpenGL'],
            'ignores':['matplotlib', 'tcl', 'OpenGL'],
            'bundle_files':1,
            }},
#        windows=[{
       console=[{
            'script':dest,
            #'icon_resources':[(1,METADATA['py2exe.icon'])],
            }],
        )

# build the py2app target
if cmd == 'py2app':
    dist_dir = os.path.join('dist',METADATA['py2app.target']+'.app')
    data_dir = os.path.join(dist_dir,'Contents','Resources')
    from setuptools import setup

    src = 'run_game.py'
    dest = METADATA['py2app.target']+'.py'
    shutil.copy(src,dest)

    APP = [dest]
    DATA_FILES = []
    OPTIONS = {'argv_emulation': True, 
               #'iconfile':METADATA['py2app.icon']
              }

    setup(
        app=APP,
        data_files=DATA_FILES,
        options={'py2app': OPTIONS},
        setup_requires=['py2app'],
    )

# make the cx_freeze target
if cmd == 'cx_freeze':
    app_dist_dir = METADATA['cx_freeze.target'] + "_" + METADATA['version']
    dist_dir = os.path.join('dist', app_dist_dir)
    data_dir = dist_dir

    modules_exclude = "tcl,tk"
    cmd_args = (METADATA['cx_freeze.cmd'], dist_dir, METADATA['cx_freeze.binary'], modules_exclude)
    sys_cmd = '%s --install-dir=%s --target-name=%s --exclude-modules=%s run_game.py' % cmd_args
    print sys_cmd
    os.system(sys_cmd)

    import shutil
    if os.path.exists(os.path.join(data_dir, "tcl")): 
        shutil.rmtree( os.path.join(data_dir, "tcl") )
    if os.path.exists(os.path.join(data_dir, "tk")): 
        shutil.rmtree( os.path.join(data_dir, "tk") )



# recursively make a bunch of folders
def make_dirs(dname_):
    parts = list(os.path.split(dname_))
    dname = None
    while len(parts):
        if dname == None:
            dname = parts.pop(0)
        else:
            dname = os.path.join(dname,parts.pop(0))
        if not os.path.isdir(dname):
            os.mkdir(dname)

# copy data into the binaries 
if cmd in ('py2exe','cx_freeze','py2app'):
    dest = data_dir
    for fname in data:
        dname = os.path.join(dest,os.path.dirname(fname))
        make_dirs(dname)
        if not os.path.isdir(fname):
            #print (fname,dname)
            shutil.copy(fname,dname)

# make a tgz files.
if cmd == 'cx_freeze':
    sys_cmd = "cd dist; tar -vczf %s.tgz %s/" % (app_dist_dir,app_dist_dir)  
    os.system(sys_cmd)


# remove files from the zip.
if 0 and cmd in ('py2exe'):
    import shutil

    #shutil.rmtree( os.path.join('dist') )
    #shutil.rmtree( os.path.join('build') )


    os.system("unzip dist/library.zip -d dist\library")

    for fn in files_to_remove:
        os.remove( os.path.join('dist', 'library', fn) )


    for d in directories_to_remove:
        if os.path.exists( os.path.join('dist', 'library', d) ):
            shutil.rmtree( os.path.join('dist', 'library', d) )

    os.remove( os.path.join('dist', 'library.zip') )


    os.chdir("dist")
    os.chdir("library")

    os.system("zip -r -9 ..\library.zip .")

    os.chdir("..")
    os.chdir("..")