pyjnius/setup.py

128 lines
3.5 KiB
Python
Raw Normal View History

2018-10-13 21:22:39 +00:00
'''
Setup.py for creating a binary distribution.
'''
from __future__ import print_function
from setuptools import setup, Extension
2019-11-24 14:15:20 +00:00
from setuptools.command.build_ext import build_ext
2017-10-24 14:33:12 +00:00
try:
import subprocess32 as subprocess
except ImportError:
import subprocess
2012-08-14 01:42:43 +00:00
from os import environ
from os.path import dirname, join, exists
import re
2012-08-14 01:42:43 +00:00
import sys
from platform import machine
2018-10-13 21:22:39 +00:00
from setup_sdist import SETUP_KWARGS
# XXX hack to be able to import jnius.env withough having build
# jnius.jnius yet, better solution welcome
syspath = sys.path[:]
sys.path.insert(0, 'jnius')
from env import (
get_possible_homes,
get_library_dirs,
get_include_dirs,
get_libraries,
find_javac,
PY2,
)
sys.path = syspath
2012-08-14 01:42:43 +00:00
2015-11-03 13:57:04 +00:00
def getenv(key):
2018-10-13 21:22:39 +00:00
'''Get value from environment and decode it.'''
2015-11-03 13:57:04 +00:00
val = environ.get(key)
if val is not None and not PY2:
try:
return val.decode()
except AttributeError:
return val
return val
2015-11-03 13:57:04 +00:00
2017-03-23 17:56:02 +00:00
2018-10-13 21:22:39 +00:00
FILES = [
'jni.pxi',
'jnius_compat.pxi',
'jnius_conversion.pxi',
'jnius_export_class.pxi',
'jnius_export_func.pxi',
'jnius_jvm_android.pxi',
'jnius_jvm_desktop.pxi',
2015-05-01 16:16:58 +00:00
'jnius_jvm_dlopen.pxi',
'jnius_localref.pxi',
'jnius.pyx',
'jnius_utils.pxi',
]
2018-10-13 21:22:39 +00:00
EXTRA_LINK_ARGS = []
INSTALL_REQUIRES = ['six>=1.7.0']
SETUP_REQUIRES = []
2012-08-14 01:42:43 +00:00
# detect Python for android
2018-10-13 21:22:39 +00:00
PLATFORM = sys.platform
NDKPLATFORM = getenv('NDKPLATFORM')
if NDKPLATFORM is not None and getenv('LIBLINK'):
PLATFORM = 'android'
2012-08-14 01:42:43 +00:00
# detect cython
2019-11-24 14:15:20 +00:00
if PLATFORM != 'android':
SETUP_REQUIRES.append('cython')
2018-10-13 21:22:39 +00:00
INSTALL_REQUIRES.append('cython')
2019-11-24 14:15:20 +00:00
else:
FILES = [fn[:-3] + 'c' for fn in FILES if fn.endswith('pyx')]
2018-10-13 21:22:39 +00:00
2012-08-14 01:42:43 +00:00
def compile_native_invocation_handler(*possible_homes):
2018-10-13 21:22:39 +00:00
'''Find javac and compile NativeInvocationHandler.java.'''
javac = find_javac(PLATFORM, possible_homes)
source_level = '1.7'
2019-05-17 03:36:20 +00:00
try:
subprocess.check_call([
javac, '-target', source_level, '-source', source_level,
join('jnius', 'src', 'org', 'jnius', 'NativeInvocationHandler.java')
])
2019-05-17 03:36:20 +00:00
except FileNotFoundError:
subprocess.check_call([
javac.replace('"', ''), '-target', source_level, '-source', source_level,
2019-05-17 03:36:20 +00:00
join('jnius', 'src', 'org', 'jnius', 'NativeInvocationHandler.java')
])
compile_native_invocation_handler(*get_possible_homes(PLATFORM))
2018-11-29 04:45:36 +00:00
2012-08-14 01:42:43 +00:00
# generate the config.pxi
with open(join(dirname(__file__), 'jnius', 'config.pxi'), 'w') as fd:
2018-10-13 21:22:39 +00:00
fd.write('DEF JNIUS_PLATFORM = {0!r}\n\n'.format(PLATFORM))
if not PY2:
fd.write('# cython: language_level=3\n\n')
fd.write('DEF JNIUS_PYTHON3 = True\n\n')
else:
fd.write('# cython: language_level=2\n\n')
fd.write('DEF JNIUS_PYTHON3 = False\n\n')
2012-08-14 01:42:43 +00:00
2018-11-27 17:53:01 +00:00
# pop setup.py from included files in the installed package
SETUP_KWARGS['py_modules'].remove('setup')
2012-08-14 01:42:43 +00:00
# create the extension
2017-03-23 17:56:02 +00:00
setup(
cmdclass={'build_ext': build_ext},
2018-10-13 21:22:39 +00:00
install_requires=INSTALL_REQUIRES,
setup_requires=SETUP_REQUIRES,
2017-03-23 17:56:02 +00:00
ext_modules=[
Extension(
2018-10-13 21:22:39 +00:00
'jnius', [join('jnius', x) for x in FILES],
libraries=get_libraries(PLATFORM),
library_dirs=get_library_dirs(PLATFORM),
include_dirs=get_include_dirs(PLATFORM),
extra_link_args=EXTRA_LINK_ARGS,
2017-03-23 17:56:02 +00:00
)
],
extras_require={
2019-12-05 22:57:13 +00:00
'dev': ['pytest', 'wheel', 'pytest-cov', 'pycodestyle'],
'ci': ['coveralls', 'pytest-rerunfailures', 'setuptools>=34.4.0'],
},
**SETUP_KWARGS
2017-03-23 17:56:02 +00:00
)