kivy/setup.py

395 lines
14 KiB
Python

import sys
from fnmatch import filter as fnfilter
from os.path import join, dirname, realpath, sep, exists
from os import walk, environ
from distutils.core import setup
from distutils.extension import Extension
platform = sys.platform
#
# Detect Python for android project
# FIXME: add a specific var for this project, not just guess
#
ndkplatform = environ.get('NDKPLATFORM')
if ndkplatform is not None and environ.get('LIBLINK'):
platform = 'android'
if environ.get('KIVYIOSROOT'):
platform = 'ios'
try:
# check for cython
from Cython.Distutils import build_ext
have_cython = True
except ImportError:
if platform not in ('android', 'ios'):
print '\nCython is missing, its required for compiling kivy !\n\n'
raise
# on python-for-android, cython usage is external
have_cython = False
from distutils.command.build_ext import build_ext
# extract version (simulate doc generation, kivy will be not imported)
environ['KIVY_DOC_INCLUDE'] = '1'
import kivy
# extra build commands go in the cmdclass dict {'command-name': CommandClass}
# see tools.packaging.{platform}.build.py for custom build commands for
# portable packages. also e.g. we use build_ext command from cython if its
# installed for c extensions.
cmdclass = {}
try:
# add build rules for portable packages to cmdclass
if platform == 'win32':
from kivy.tools.packaging.win32.build import WindowsPortableBuild
cmdclass['build_portable'] = WindowsPortableBuild
elif platform == 'darwin':
from kivy.tools.packaging.osx.build import OSXPortableBuild
cmdclass['build_portable'] = OSXPortableBuild
except ImportError:
print 'User distribution detected, avoid portable command.'
from kivy.tools.packaging.factory import FactoryBuild
cmdclass['build_factory'] = FactoryBuild
#
# Detect options
#
c_options = {
'use_opengl_es2': True,
'use_opengl_debug': False,
'use_glew': False,
'use_sdl': False,
'use_ios': False,
'use_mesagl': 'USE_MESAGL' in environ}
# now check if environ is changing the default values
for key in c_options.keys():
ukey = key.upper()
if ukey in environ:
value = bool(int(environ[ukey]))
print 'Environ change %s -> %s' % (key, value)
c_options[key] = value
# check if we are in a kivy-ios build
kivy_ios_root = environ.get('KIVYIOSROOT', None)
if kivy_ios_root is not None:
print 'Kivy-IOS project environment detect, use it.'
print 'Kivy-IOS project located at %r' % kivy_ios_root
print 'Activate SDL compilation.'
c_options['use_ios'] = True
c_options['use_sdl'] = True
# Detect which opengl version headers to use
if platform in ('android', 'darwin', 'ios'):
pass
elif platform == 'win32':
print 'Windows platform detected, force GLEW usage.'
c_options['use_glew'] = True
else:
# searching GLES headers
default_header_dirs = ['/usr/include', '/usr/local/include']
found = False
for hdir in default_header_dirs:
filename = join(hdir, 'GLES2', 'gl2.h')
if exists(filename):
found = True
print 'Found GLES 2.0 headers at', filename
break
if not found:
print 'WARNING: GLES 2.0 headers are not found'
print 'Fallback to Desktop opengl headers.'
c_options['use_opengl_es2'] = False
class KivyBuildExt(build_ext):
def build_extensions(self):
print 'Build configuration is:'
for opt, value in c_options.iteritems():
print ' *', opt, ' = ', repr(value)
print 'Generate config.h'
config_h = join(dirname(__file__), 'kivy', 'graphics', 'config.h')
with open(config_h, 'w') as fd:
fd.write('// Autogenerated file for Kivy C configuration\n')
for k, v in c_options.iteritems():
fd.write('#define __%s %d\n' % (k.upper(), int(v)))
print 'Generate config.pxi'
config_pxi = join(dirname(__file__), 'kivy', 'graphics', 'config.pxi')
with open(config_pxi, 'w') as fd:
fd.write('# Autogenerated file for Kivy Cython configuration\n')
for k, v in c_options.iteritems():
fd.write('DEF %s = %d\n' % (k.upper(), int(v)))
build_ext.build_extensions(self)
cmdclass['build_ext'] = KivyBuildExt
# extension modules
ext_modules = []
# list all files to compile
pyx_files = []
pxd_files = []
kivy_libs_dir = realpath(join(kivy.kivy_base_dir, 'libs'))
for root, dirnames, filenames in walk(join(dirname(__file__), 'kivy')):
# ignore lib directory
if realpath(root).startswith(kivy_libs_dir):
continue
for filename in fnfilter(filenames, '*.pxd'):
pxd_files.append(join(root, filename))
for filename in fnfilter(filenames, '*.pyx'):
pyx_files.append(join(root, filename))
if not have_cython:
pyx_files = pyx_files = ['%s.c' % x[:-4] for x in pyx_files]
pxd_files = []
# add cython core extension modules if cython is available
if True:
libraries = ['m']
include_dirs = []
extra_link_args = []
if platform == 'win32':
libraries.append('opengl32')
elif platform == 'darwin':
# On OSX, it's not -lGL, but -framework OpenGL...
extra_link_args = ['-framework', 'OpenGLES']
elif platform.startswith('freebsd'):
include_dirs += ['/usr/local/include']
extra_link_args += ['-L', '/usr/local/lib']
elif platform == 'android':
include_dirs += [join(ndkplatform, 'usr', 'include')]
extra_link_args += ['-L', join(ndkplatform, 'usr', 'lib')]
libraries.append('GLESv2')
else:
libraries.append('GLESv2')
if c_options['use_glew']:
if platform == 'win32':
libraries.append('glew32')
else:
libraries.append('GLEW')
def get_modulename_from_file(filename):
pyx = '.'.join(filename.split('.')[:-1])
pyxl = pyx.split(sep)
while pyxl[0] != 'kivy':
pyxl.pop(0)
if pyxl[1] == 'kivy':
pyxl.pop(0)
return '.'.join(pyxl)
if c_options['use_sdl']:
sdl_libraries = ['SDL', 'SDL_ttf', 'freetype', 'z', 'bz2', 'm']
sdl_includes = []
sdl_extra_link_args = []
sdl_extra_compile_args = []
if platform in ('ios', 'darwin'):
# Paths as per homebrew (modified formula to use hg checkout)
if c_options['use_ios']:
# Note: on IOS, SDL is already loaded by the launcher/main.m
# So if we add it here, it will just complain about duplicate
# symbol, cause libSDL.a would be included in main.m binary +
# text_sdlttf.so
# At the result, we are linking without SDL explicitly, and add
# -undefined dynamic_lookup
# (/tito)
sdl_libraries = ['SDL_ttf', 'freetype', 'bz2']
sdl_includes += [join(kivy_ios_root, 'build', 'include')]
sdl_includes += [join(kivy_ios_root, 'build', 'include', 'SDL')]
sdl_includes += [join(kivy_ios_root, 'build', 'include', 'freetype')]
sdl_extra_link_args += ['-L', join(kivy_ios_root, 'build', 'lib')]
sdl_extra_link_args += ['-undefined', 'dynamic_lookup']
sdl_extra_link_args += ['-framework', 'Foundation']
sdl_extra_link_args += ['-framework', 'UIKit']
sdl_extra_link_args += ['-framework', 'AudioToolbox']
sdl_extra_link_args += ['-framework', 'CoreGraphics']
sdl_extra_link_args += ['-framework', 'QuartzCore']
sdl_extra_link_args += ['-framework', 'ImageIO']
else:
sdl_includes = ['/usr/local/include/SDL']
sdl_extra_link_args += ['-L/usr/local/lib/']
class CythonExtension(Extension):
def __init__(self, *args, **kwargs):
# Small hack to only compile for x86_64 on OSX.
# Is there a better way to do this?
if platform == 'darwin':
extra_args = ['-arch', 'x86_64']
kwargs['extra_compile_args'] = extra_args + \
kwargs.get('extra_compile_args', [])
kwargs['extra_link_args'] = extra_args + \
kwargs.get('extra_link_args', [])
Extension.__init__(self, *args, **kwargs)
self.pyrex_directives = {
'profile': 'USE_PROFILE' in environ,
'embedsignature': True}
# XXX with pip, setuptools is imported before distutils, and change
# our pyx to c, then, cythonize doesn't happen. So force again our
# sources
self.sources = args[1]
# simple extensions
#for pyx in (x for x in pyx_files if not 'graphics' in x):
# pxd = [x for x in pxd_files if not 'graphics' in x]
# module_name = get_modulename_from_file(pyx)
# ext_modules.append(CythonExtension(module_name, [pyx] + pxd))
for pyx in pyx_files:
module_name = get_modulename_from_file(pyx)
ext_files = [pyx]
ext_libraries = libraries[:]
ext_include_dirs = include_dirs[:]
ext_extra_link_args = extra_link_args[:]
ext_extra_compile_args = []
if c_options['use_ios']:
isysroot = ['-isysroot', '/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk']
ext_include_dirs += ['/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/']
ext_extra_compile_args += isysroot
ext_extra_link_args += isysroot
if pyx.endswith('sdl.pyx') or pyx.endswith('sdl.c') \
or pyx.endswith('text_sdlttf.pyx') \
or pyx.endswith('text_sdlttf.c'):
if c_options['use_sdl'] is False:
continue
ext_libraries += sdl_libraries
ext_include_dirs += sdl_includes
ext_extra_link_args += sdl_extra_link_args
ext_extra_compile_args += sdl_extra_compile_args
elif pyx.endswith('osxcoreimage.pyx') or pyx.endswith('osxcoreimage.c'):
if c_options['use_ios'] is False:
continue
ext_extra_link_args += ['-framework', 'Foundation']
ext_extra_link_args += ['-framework', 'UIKit']
ext_extra_link_args += ['-framework', 'AudioToolbox']
ext_extra_link_args += ['-framework', 'CoreGraphics']
ext_extra_link_args += ['-framework', 'QuartzCore']
ext_extra_link_args += ['-framework', 'ImageIO']
ext_modules.append(CythonExtension(
module_name, ext_files,
libraries=ext_libraries,
extra_compile_args=ext_extra_compile_args,
include_dirs=ext_include_dirs,
extra_link_args=ext_extra_link_args))
#setup datafiles to be included in the disytibution, liek examples...
#extracts all examples files except sandbox
data_file_prefix = 'share/kivy-'
examples = {}
examples_allowed_ext = ('readme', 'py', 'wav', 'png', 'jpg', 'svg', 'json',
'avi', 'gif', 'txt', 'ttf', 'obj', 'mtl', 'kv')
for root, subFolders, files in walk('examples'):
if 'sandbox' in root:
continue
for file in files:
ext = file.split('.')[-1].lower()
if ext not in examples_allowed_ext:
continue
filename = join(root, file)
directory = '%s%s' % (data_file_prefix, dirname(filename))
if not directory in examples:
examples[directory] = []
examples[directory].append(filename)
# setup !
setup(
name='Kivy',
version=kivy.__version__,
author='Kivy Crew',
author_email='kivy-dev@googlegroups.com',
url='http://kivy.org/',
license='LGPL',
description='A software library for rapid development of ' + \
'hardware-accelerated multitouch applications.',
ext_modules=ext_modules,
cmdclass=cmdclass,
packages=[
'kivy',
'kivy.core',
'kivy.core.audio',
'kivy.core.camera',
'kivy.core.clipboard',
'kivy.core.image',
'kivy.core.gl',
'kivy.core.spelling',
'kivy.core.text',
'kivy.core.video',
'kivy.core.window',
'kivy.ext',
'kivy.graphics',
'kivy.input',
'kivy.input.postproc',
'kivy.input.providers',
'kivy.lib',
'kivy.lib.osc',
'kivy.modules',
'kivy.network',
'kivy.tools',
'kivy.tools.packaging',
'kivy.uix',
],
package_dir={'kivy': 'kivy'},
package_data={'kivy': [
'data/*.kv',
'data/*.json',
'data/fonts/*.ttf',
'data/images/*.png',
'data/images/*.jpg',
'data/images/*.gif',
'data/images/*.atlas',
'data/keyboards/*.json',
'data/logo/*.png',
'data/glsl/*.png',
'data/glsl/*.vs',
'data/glsl/*.fs',
'tools/packaging/README.txt',
'tools/packaging/win32/kivy.bat',
'tools/packaging/win32/kivyenv.sh',
'tools/packaging/win32/README.txt',
'tools/packaging/osx/kivy.sh']},
data_files=examples.items(),
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: MacOS X',
'Environment :: Win32 (MS Windows)',
'Environment :: X11 Applications',
'Intended Audience :: Developers',
'Intended Audience :: End Users/Desktop',
'Intended Audience :: Information Technology',
'Intended Audience :: Science/Research',
'License :: OSI Approved :: GNU Library or Lesser '
'General Public License (LGPL)',
'Natural Language :: English',
'Operating System :: MacOS :: MacOS X',
'Operating System :: Microsoft :: Windows',
'Operating System :: POSIX :: BSD :: FreeBSD',
'Operating System :: POSIX :: Linux',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Artistic Software',
'Topic :: Games/Entertainment',
'Topic :: Multimedia :: Graphics :: 3D Rendering',
'Topic :: Multimedia :: Graphics :: Capture :: Digital Camera',
'Topic :: Multimedia :: Graphics :: Presentation',
'Topic :: Multimedia :: Graphics :: Viewers',
'Topic :: Multimedia :: Sound/Audio :: Players :: MP3',
'Topic :: Multimedia :: Video :: Display',
'Topic :: Scientific/Engineering :: Human Machine Interfaces',
'Topic :: Scientific/Engineering :: Visualization',
'Topic :: Software Development :: Libraries :: Application Frameworks',
'Topic :: Software Development :: User Interfaces'])