Merge branch 'py-package'
Conflicts: setup.py
This commit is contained in:
154
setup.py
Normal file → Executable file
154
setup.py
Normal file → Executable file
@@ -1,26 +1,60 @@
|
||||
from distutils.core import setup, Extension
|
||||
#!/usr/bin/env python
|
||||
|
||||
from distutils.core import setup
|
||||
from distutils.extension import Extension
|
||||
from distutils.command.build import build
|
||||
from distutils.command.clean import clean
|
||||
from distutils.command.build_ext import build_ext
|
||||
from distutils.command.sdist import sdist
|
||||
from distutils.dir_util import remove_tree
|
||||
from distutils.sysconfig import get_python_inc
|
||||
from distutils import log
|
||||
import os, os.path
|
||||
import sys, os, os.path
|
||||
import glob
|
||||
import platform
|
||||
import time
|
||||
import overviewer_core.util as util
|
||||
|
||||
try:
|
||||
import py2exe
|
||||
except ImportError:
|
||||
py2exe = None
|
||||
|
||||
try:
|
||||
import py2app
|
||||
from setuptools.extension import Extension
|
||||
except ImportError:
|
||||
py2app = None
|
||||
|
||||
# now, setup the keyword arguments for setup
|
||||
# (because we don't know until runtime if py2exe is available)
|
||||
# (because we don't know until runtime if py2exe/py2app is available)
|
||||
setup_kwargs = {}
|
||||
setup_kwargs['options'] = {}
|
||||
setup_kwargs['ext_modules'] = []
|
||||
setup_kwargs['cmdclass'] = {}
|
||||
setup_kwargs['options'] = {}
|
||||
|
||||
#
|
||||
# metadata
|
||||
#
|
||||
|
||||
# Utility function to read the README file.
|
||||
# Used for the long_description. It's nice, because now 1) we have a top level
|
||||
# README file and 2) it's easier to type in the README file than to put a raw
|
||||
# string in below ...
|
||||
def read(fname):
|
||||
return open(os.path.join(os.path.dirname(__file__), fname)).read()
|
||||
|
||||
setup_kwargs['name'] = 'Minecraft-Overviewer'
|
||||
setup_kwargs['version'] = util.findGitVersion()
|
||||
setup_kwargs['description'] = 'Generates large resolution images of a Minecraft map.'
|
||||
setup_kwargs['url'] = 'http://overviewer.org/'
|
||||
setup_kwargs['author'] = 'Andrew Brown'
|
||||
setup_kwargs['author_email'] = 'brownan@gmail.com'
|
||||
setup_kwargs['license'] = 'GNU General Public License v3'
|
||||
setup_kwargs['long_description'] = read('README.rst')
|
||||
|
||||
# top-level files that should be included as documentation
|
||||
doc_files = ['COPYING.txt', 'README.rst', 'CONTRIBUTORS.rst', 'sample.settings.py']
|
||||
|
||||
# helper to create a 'data_files'-type sequence recursively for a given dir
|
||||
def recursive_data_files(src, dest=None):
|
||||
@@ -46,9 +80,9 @@ def recursive_data_files(src, dest=None):
|
||||
|
||||
if py2exe is not None:
|
||||
setup_kwargs['console'] = ['overviewer.py']
|
||||
setup_kwargs['data_files'] = [('textures', ['textures/lava.png', 'textures/water.png', 'textures/fire.png', 'textures/portal.png']),
|
||||
('', ['COPYING.txt', 'README.rst'])]
|
||||
setup_kwargs['data_files'] += recursive_data_files('web_assets')
|
||||
setup_kwargs['data_files'] = [('', doc_files)]
|
||||
setup_kwargs['data_files'] += recursive_data_files('overviewer_core/data/textures', 'textures')
|
||||
setup_kwargs['data_files'] += recursive_data_files('overviewer_core/data/web_assets', 'web_assets')
|
||||
setup_kwargs['zipfile'] = None
|
||||
if platform.system() == 'Windows' and '64bit' in platform.architecture():
|
||||
b = 3
|
||||
@@ -56,6 +90,28 @@ if py2exe is not None:
|
||||
b = 1
|
||||
setup_kwargs['options']['py2exe'] = {'bundle_files' : b, 'excludes': 'Tkinter'}
|
||||
|
||||
#
|
||||
# py2app options
|
||||
#
|
||||
|
||||
if py2app is not None:
|
||||
setup_kwargs['app'] = ['overviewer.py']
|
||||
setup_kwargs['options']['py2app'] = {'argv_emulation' : False}
|
||||
setup_kwargs['setup_requires'] = ['py2app']
|
||||
|
||||
#
|
||||
# script, package, and data
|
||||
#
|
||||
|
||||
setup_kwargs['packages'] = ['overviewer_core']
|
||||
setup_kwargs['scripts'] = ['overviewer.py']
|
||||
setup_kwargs['package_data'] = {'overviewer_core':
|
||||
['data/textures/*',
|
||||
'data/web_assets/*']}
|
||||
if py2exe is None:
|
||||
setup_kwargs['data_files'] = [('share/doc/minecraft-overviewer', doc_files)]
|
||||
|
||||
|
||||
#
|
||||
# c_overviewer extension
|
||||
#
|
||||
@@ -79,20 +135,23 @@ except:
|
||||
# used to figure out what files to compile
|
||||
render_modes = ['normal', 'overlay', 'lighting', 'night', 'spawn', 'cave']
|
||||
|
||||
c_overviewer_files = ['src/main.c', 'src/composite.c', 'src/iterate.c', 'src/endian.c', 'src/rendermodes.c']
|
||||
c_overviewer_files += map(lambda mode: 'src/rendermode-%s.c' % (mode,), render_modes)
|
||||
c_overviewer_files += ['src/Draw.c']
|
||||
c_overviewer_includes = ['src/overviewer.h', 'src/rendermodes.h']
|
||||
c_overviewer_files = ['main.c', 'composite.c', 'iterate.c', 'endian.c', 'rendermodes.c']
|
||||
c_overviewer_files += map(lambda mode: 'rendermode-%s.c' % (mode,), render_modes)
|
||||
c_overviewer_files += ['Draw.c']
|
||||
c_overviewer_includes = ['overviewer.h', 'rendermodes.h']
|
||||
|
||||
c_overviewer_files = map(lambda s: 'overviewer_core/src/'+s, c_overviewer_files)
|
||||
c_overviewer_includes = map(lambda s: 'overviewer_core/src/'+s, c_overviewer_includes)
|
||||
|
||||
setup_kwargs['ext_modules'].append(Extension('overviewer_core.c_overviewer', c_overviewer_files, include_dirs=['.', numpy_include] + pil_include, depends=c_overviewer_includes, extra_link_args=[]))
|
||||
|
||||
setup_kwargs['ext_modules'].append(Extension('c_overviewer', c_overviewer_files, include_dirs=['.', numpy_include] + pil_include, depends=c_overviewer_includes, extra_link_args=[]))
|
||||
|
||||
# tell build_ext to build the extension in-place
|
||||
# (NOT in build/)
|
||||
setup_kwargs['options']['build_ext'] = {'inplace' : 1}
|
||||
# tell the build command to only run build_ext
|
||||
build.sub_commands = [('build_ext', None)]
|
||||
|
||||
# custom clean command to remove in-place extension
|
||||
# and the version file
|
||||
class CustomClean(clean):
|
||||
def run(self):
|
||||
# do the normal cleanup
|
||||
@@ -101,7 +160,7 @@ class CustomClean(clean):
|
||||
# try to remove '_composite.{so,pyd,...}' extension,
|
||||
# regardless of the current system's extension name convention
|
||||
build_ext = self.get_finalized_command('build_ext')
|
||||
pretty_fname = build_ext.get_ext_filename('c_overviewer')
|
||||
pretty_fname = build_ext.get_ext_filename('overviewer_core.c_overviewer')
|
||||
fname = pretty_fname
|
||||
if os.path.exists(fname):
|
||||
try:
|
||||
@@ -114,8 +173,43 @@ class CustomClean(clean):
|
||||
else:
|
||||
log.debug("'%s' does not exist -- can't clean it",
|
||||
pretty_fname)
|
||||
|
||||
versionpath = os.path.join("overviewer_core", "overviewer_version.py")
|
||||
try:
|
||||
if not self.dry_run:
|
||||
os.remove(versionpath)
|
||||
log.info("removing '%s'", versionpath)
|
||||
except OSError:
|
||||
log.warn("'%s' could not be cleaned -- permission denied", versionpath)
|
||||
|
||||
class CustomBuild(build_ext):
|
||||
def generate_version_py():
|
||||
try:
|
||||
outstr = ""
|
||||
outstr += "VERSION=%r\n" % util.findGitVersion()
|
||||
outstr += "HASH=%r\n" % util.findGitHash()
|
||||
outstr += "BUILD_DATE=%r\n" % time.asctime()
|
||||
outstr += "BUILD_PLATFORM=%r\n" % platform.processor()
|
||||
outstr += "BUILD_OS=%r\n" % platform.platform()
|
||||
f = open("overviewer_core/overviewer_version.py", "w")
|
||||
f.write(outstr)
|
||||
f.close()
|
||||
except:
|
||||
print "WARNING: failed to build overview_version file"
|
||||
|
||||
class CustomSDist(sdist):
|
||||
def run(self):
|
||||
# generate the version file
|
||||
generate_version_py()
|
||||
sdist.run(self)
|
||||
|
||||
class CustomBuild(build):
|
||||
def run(self):
|
||||
# generate the version file
|
||||
generate_version_py()
|
||||
build.run(self)
|
||||
print "\nBuild Complete"
|
||||
|
||||
class CustomBuildExt(build_ext):
|
||||
def build_extensions(self):
|
||||
c = self.compiler.compiler_type
|
||||
if c == "msvc":
|
||||
@@ -123,32 +217,18 @@ class CustomBuild(build_ext):
|
||||
for e in self.extensions:
|
||||
e.extra_link_args.append("/MANIFEST")
|
||||
|
||||
# build in place, and in the build/ tree
|
||||
self.inplace = False
|
||||
build_ext.build_extensions(self)
|
||||
self.inplace = True
|
||||
build_ext.build_extensions(self)
|
||||
|
||||
|
||||
if py2exe is not None:
|
||||
# define a subclass of py2exe to build our version file on the fly
|
||||
class CustomPy2exe(py2exe.build_exe.py2exe):
|
||||
def run(self):
|
||||
try:
|
||||
import util
|
||||
f = open("overviewer_version.py", "w")
|
||||
f.write("VERSION=%r\n" % util.findGitVersion())
|
||||
f.write("BUILD_DATE=%r\n" % time.asctime())
|
||||
f.write("BUILD_PLATFORM=%r\n" % platform.processor())
|
||||
f.write("BUILD_OS=%r\n" % platform.platform())
|
||||
f.close()
|
||||
setup_kwargs['data_files'].append(('.', ['overviewer_version.py']))
|
||||
except:
|
||||
print "WARNING: failed to build overview_version file"
|
||||
py2exe.build_exe.py2exe.run(self)
|
||||
setup_kwargs['cmdclass']['py2exe'] = CustomPy2exe
|
||||
|
||||
setup_kwargs['cmdclass']['clean'] = CustomClean
|
||||
setup_kwargs['cmdclass']['build_ext'] = CustomBuild
|
||||
setup_kwargs['cmdclass']['sdist'] = CustomSDist
|
||||
setup_kwargs['cmdclass']['build'] = CustomBuild
|
||||
setup_kwargs['cmdclass']['build_ext'] = CustomBuildExt
|
||||
###
|
||||
|
||||
setup(**setup_kwargs)
|
||||
|
||||
|
||||
print "\nBuild Complete"
|
||||
|
||||
Reference in New Issue
Block a user