Add gameplay notes to README. Tweak instructions
[erdslangetjie.git] / setup.py
1 import os
2
3 # usage: python setup.py command
4 #
5 # sdist - build a source dist
6 # py2exe - build an exe
7 # py2app - build an app
8 # cx_freeze - build a linux binary (not implemented)
9 #
10 # the goods are placed in the dist dir for you to .zip up or whatever...
11
12
13 APP_NAME = 'erdslangetjie'
14 DESCRIPTION = open('README.txt').read()
15 CHANGES = open('CHANGES.txt').read()
16 TODO = open('TODO.txt').read()
17
18
19
20 METADATA = {
21     'name':APP_NAME,
22     'version':          '0.0.1',
23     'license':          'short_licence',
24     'description':      'TODO',
25     'author':           'Neil Muller',
26     #'author_email':     '',
27     'url':              'http://www.pyweek.org/e/erdslangetjie',
28     'classifiers':      [
29             'Development Status :: 4 - Beta',
30             'Intended Audience :: End Users/Desktop',
31             'Intended Audience :: Information Technology',
32             'License :: OSI Approved :: BSD License',
33             'Operating System :: OS Independent',
34             'Programming Language :: Python :: 2',
35             'Programming Language :: Python :: 2.5',
36             'Programming Language :: Python :: 2.6',
37             'Programming Language :: Python :: 2.7',
38             'Programming Language :: Python :: 3',
39             'Programming Language :: Python :: 3.0',
40             'Programming Language :: Python :: 3.1',
41             'Programming Language :: Python :: 3.2',
42             'Topic :: Software Development :: Libraries :: pygame',
43             'Topic :: Games/Entertainment :: Real Time Strategy',
44     ],
45
46
47     'py2exe.target':'',
48     #'py2exe.icon':'icon.ico', #64x64
49     'py2exe.binary':APP_NAME, #leave off the .exe, it will be added
50     
51     'py2app.target':APP_NAME,
52     'py2app.icon':'icon.icns', #128x128
53     
54     #'cx_freeze.cmd':'~/src/cx_Freeze-3.0.3/FreezePython',
55     'cx_freeze.cmd':'cxfreeze',
56     'cx_freeze.target':'%s_linux' % APP_NAME,
57     'cx_freeze.binary':APP_NAME,
58     }
59     
60 files_to_remove = ['tk84.dll',
61                     '_ssl.pyd',
62                     'tcl84.dll',
63                     os.path.join('numpy','core', '_dotblas.pyd'),
64                     os.path.join('numpy', 'linalg', 'lapack_lite.pyd'),
65 ]
66
67
68 directories_to_remove = [os.path.join('numpy', 'distutils'),
69                          'distutils',
70                          'tcl',
71 ]
72
73
74 cmdclass = {}
75 PACKAGEDATA = {
76     'cmdclass':    cmdclass,
77
78     'package_dir': {'erdslangetjie': 'erdslangetjie',
79                    },
80     'packages': ['erdslangetjie',
81                 ],
82     'scripts': ['scripts/erdslangetjie'],
83 }
84
85 PACKAGEDATA.update(METADATA)
86
87
88 from distutils.core import setup, Extension
89 try:
90     import py2exe
91 except:
92     pass
93
94 import sys
95 import glob
96 import os
97 import shutil
98
99 try:
100     cmd = sys.argv[1]
101 except IndexError:
102     print 'Usage: setup.py install|py2exe|py2app|cx_freeze'
103     raise SystemExit
104
105 # utility for adding subdirectories
106 def add_files(dest,generator):
107     for dirpath, dirnames, filenames in generator:
108         for name in 'CVS', '.svn':
109             if name in dirnames:
110                 dirnames.remove(name)
111
112         for name in filenames:
113             if '~' in name: continue
114             suffix = os.path.splitext(name)[1]
115             if suffix in ('.pyc', '.pyo'): continue
116             if name[0] == '.': continue
117             filename = os.path.join(dirpath, name)
118             dest.append(filename)
119
120 # define what is our data
121 _DATA_DIR = os.path.join('erdslangetjie', 'data')
122 data = []
123 add_files(data,os.walk(_DATA_DIR))
124
125
126
127
128 #data_dirs = [os.path.join(f2.replace(_DATA_DIR, 'data'), '*') for f2 in data]
129 data_dirs = [os.path.join(f2.replace(_DATA_DIR, 'data')) for f2 in data]
130 PACKAGEDATA['package_data'] = {'erdslangetjie': data_dirs}
131
132
133
134
135
136 data.extend(glob.glob('*.txt'))
137 #data.append('MANIFEST.in')
138 # define what is our source
139 src = []
140 add_files(src,os.walk('erdslangetjie'))
141 src.extend(glob.glob('*.py'))
142
143
144
145
146 # build the sdist target
147 if cmd not in "py2exe py2app cx_freeze".split():
148     f = open("MANIFEST.in","w")
149     for l in data: f.write("include "+l+"\n")
150     for l in src: f.write("include "+l+"\n")
151     f.close()
152     
153     setup(**PACKAGEDATA)
154
155 # build the py2exe target
156 if cmd in ('py2exe',):
157     dist_dir = os.path.join('dist',METADATA['py2exe.target'])
158     data_dir = dist_dir
159     
160     src = 'run_game.py'
161     dest = METADATA['py2exe.binary']+'.py'
162     shutil.copy(src,dest)
163     
164     setup(
165         options={'py2exe':{
166             'dist_dir':dist_dir,
167             'dll_excludes':['_dotblas.pyd','_numpy.pyd', 'numpy.linalg.lapack_lite.pyd', 'numpy.core._dotblas.pyd'] + files_to_remove,
168             'excludes':['matplotlib', 'tcl', 'OpenGL'],
169             'ignores':['matplotlib', 'tcl', 'OpenGL'],
170             'bundle_files':1,
171             }},
172 #        windows=[{
173        console=[{
174             'script':dest,
175             #'icon_resources':[(1,METADATA['py2exe.icon'])],
176             }],
177         )
178
179 # build the py2app target
180 if cmd == 'py2app':
181     dist_dir = os.path.join('dist',METADATA['py2app.target']+'.app')
182     data_dir = os.path.join(dist_dir,'Contents','Resources')
183     from setuptools import setup
184
185     src = 'run_game.py'
186     dest = METADATA['py2app.target']+'.py'
187     shutil.copy(src,dest)
188
189     APP = [dest]
190     DATA_FILES = []
191     OPTIONS = {'argv_emulation': True, 
192                #'iconfile':METADATA['py2app.icon']
193               }
194
195     setup(
196         app=APP,
197         data_files=DATA_FILES,
198         options={'py2app': OPTIONS},
199         setup_requires=['py2app'],
200     )
201
202 # make the cx_freeze target
203 if cmd == 'cx_freeze':
204     app_dist_dir = METADATA['cx_freeze.target'] + "_" + METADATA['version']
205     dist_dir = os.path.join('dist', app_dist_dir)
206     data_dir = dist_dir
207
208     modules_exclude = "tcl,tk"
209     cmd_args = (METADATA['cx_freeze.cmd'], dist_dir, METADATA['cx_freeze.binary'], modules_exclude)
210     sys_cmd = '%s --install-dir=%s --target-name=%s --exclude-modules=%s run_game.py' % cmd_args
211     print sys_cmd
212     os.system(sys_cmd)
213
214     import shutil
215     if os.path.exists(os.path.join(data_dir, "tcl")): 
216         shutil.rmtree( os.path.join(data_dir, "tcl") )
217     if os.path.exists(os.path.join(data_dir, "tk")): 
218         shutil.rmtree( os.path.join(data_dir, "tk") )
219
220
221
222 # recursively make a bunch of folders
223 def make_dirs(dname_):
224     parts = list(os.path.split(dname_))
225     dname = None
226     while len(parts):
227         if dname == None:
228             dname = parts.pop(0)
229         else:
230             dname = os.path.join(dname,parts.pop(0))
231         if not os.path.isdir(dname):
232             os.mkdir(dname)
233
234 # copy data into the binaries 
235 if cmd in ('py2exe','cx_freeze','py2app'):
236     dest = data_dir
237     for fname in data:
238         dname = os.path.join(dest,os.path.dirname(fname))
239         make_dirs(dname)
240         if not os.path.isdir(fname):
241             #print (fname,dname)
242             shutil.copy(fname,dname)
243
244 # make a tgz files.
245 if cmd == 'cx_freeze':
246     sys_cmd = "cd dist; tar -vczf %s.tgz %s/" % (app_dist_dir,app_dist_dir)  
247     os.system(sys_cmd)
248
249
250 # remove files from the zip.
251 if 0 and cmd in ('py2exe'):
252     import shutil
253
254     #shutil.rmtree( os.path.join('dist') )
255     #shutil.rmtree( os.path.join('build') )
256
257
258     os.system("unzip dist/library.zip -d dist\library")
259
260     for fn in files_to_remove:
261         os.remove( os.path.join('dist', 'library', fn) )
262
263
264     for d in directories_to_remove:
265         if os.path.exists( os.path.join('dist', 'library', d) ):
266             shutil.rmtree( os.path.join('dist', 'library', d) )
267
268     os.remove( os.path.join('dist', 'library.zip') )
269
270
271     os.chdir("dist")
272     os.chdir("library")
273
274     os.system("zip -r -9 ..\library.zip .")
275
276     os.chdir("..")
277     os.chdir("..")