Upgrade p4a clean #21
3117 changed files with 0 additions and 588400 deletions
|
@ -1,257 +0,0 @@
|
||||||
from pythonforandroid.recipe import CythonRecipe, IncludedFilesBehaviour
|
|
||||||
from pythonforandroid.util import current_directory
|
|
||||||
from pythonforandroid import logger
|
|
||||||
|
|
||||||
from os.path import join
|
|
||||||
|
|
||||||
|
|
||||||
class AndroidRecipe(IncludedFilesBehaviour, CythonRecipe):
|
|
||||||
# name = 'android'
|
|
||||||
version = None
|
|
||||||
url = None
|
|
||||||
|
|
||||||
src_filename = 'src'
|
|
||||||
|
|
||||||
depends = [('sdl2', 'genericndkbuild'), 'pyjnius']
|
|
||||||
|
|
||||||
config_env = {}
|
|
||||||
|
|
||||||
def get_recipe_env(self, arch):
|
|
||||||
env = super().get_recipe_env(arch)
|
|
||||||
env.update(self.config_env)
|
|
||||||
return env
|
|
||||||
|
|
||||||
def prebuild_arch(self, arch):
|
|
||||||
super().prebuild_arch(arch)
|
|
||||||
ctx_bootstrap = self.ctx.bootstrap.name
|
|
||||||
|
|
||||||
# define macros for Cython, C, Python
|
|
||||||
tpxi = 'DEF {} = {}\n'
|
|
||||||
th = '#define {} {}\n'
|
|
||||||
tpy = '{} = {}\n'
|
|
||||||
|
|
||||||
# make sure bootstrap name is in unicode
|
|
||||||
if isinstance(ctx_bootstrap, bytes):
|
|
||||||
ctx_bootstrap = ctx_bootstrap.decode('utf-8')
|
|
||||||
bootstrap = bootstrap_name = ctx_bootstrap
|
|
||||||
is_lbry = bootstrap_name in ('lbry',)
|
|
||||||
is_sdl2 = (bootstrap_name == "sdl2")
|
|
||||||
if bootstrap_name in ["sdl2", "webview", "service_only", "service_library", "lbry"]:
|
|
||||||
java_ns = u'org.kivy.android'
|
|
||||||
jni_ns = u'org/kivy/android'
|
|
||||||
else:
|
|
||||||
logger.error((
|
|
||||||
'unsupported bootstrap for android recipe: {}'
|
|
||||||
''.format(bootstrap_name)
|
|
||||||
))
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
config = {
|
|
||||||
'BOOTSTRAP': bootstrap,
|
|
||||||
'IS_SDL2': int(is_sdl2),
|
|
||||||
'PY2': 0,
|
|
||||||
'JAVA_NAMESPACE': java_ns,
|
|
||||||
'JNI_NAMESPACE': jni_ns,
|
|
||||||
'ACTIVITY_CLASS_NAME': self.ctx.activity_class_name,
|
|
||||||
'ACTIVITY_CLASS_NAMESPACE': self.ctx.activity_class_name.replace('.', '/'),
|
|
||||||
'SERVICE_CLASS_NAME': self.ctx.service_class_name,
|
|
||||||
}
|
|
||||||
|
|
||||||
# create config files for Cython, C and Python
|
|
||||||
with (
|
|
||||||
current_directory(self.get_build_dir(arch.arch))), (
|
|
||||||
open(join('android', 'config.pxi'), 'w')) as fpxi, (
|
|
||||||
open(join('android', 'config.h'), 'w')) as fh, (
|
|
||||||
open(join('android', 'config.py'), 'w')) as fpy:
|
|
||||||
|
|
||||||
for key, value in config.items():
|
|
||||||
fpxi.write(tpxi.format(key, repr(value)))
|
|
||||||
fpy.write(tpy.format(key, repr(value)))
|
|
||||||
|
|
||||||
fh.write(th.format(
|
|
||||||
key,
|
|
||||||
value if isinstance(value, int) else '"{}"'.format(value)
|
|
||||||
))
|
|
||||||
self.config_env[key] = str(value)
|
|
||||||
|
|
||||||
if is_sdl2:
|
|
||||||
fh.write('JNIEnv *SDL_AndroidGetJNIEnv(void);\n')
|
|
||||||
fh.write(
|
|
||||||
'#define SDL_ANDROID_GetJNIEnv SDL_AndroidGetJNIEnv\n'
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
fh.write('JNIEnv *WebView_AndroidGetJNIEnv(void);\n')
|
|
||||||
fh.write(
|
|
||||||
'#define SDL_ANDROID_GetJNIEnv WebView_AndroidGetJNIEnv\n'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
recipe = AndroidRecipe()
|
|
||||||
|
|
||||||
'''
|
|
||||||
from pythonforandroid.recipe import CythonRecipe, IncludedFilesBehaviour
|
|
||||||
from pythonforandroid.util import current_directory
|
|
||||||
from pythonforandroid.patching import will_build
|
|
||||||
from pythonforandroid import logger
|
|
||||||
|
|
||||||
from os.path import join
|
|
||||||
|
|
||||||
|
|
||||||
class AndroidRecipe(IncludedFilesBehaviour, CythonRecipe):
|
|
||||||
# name = 'android'
|
|
||||||
version = None
|
|
||||||
url = None
|
|
||||||
|
|
||||||
src_filename = 'src'
|
|
||||||
|
|
||||||
depends = [('pygame', 'sdl2', 'genericndkbuild'), ('python2', 'python3crystax')]
|
|
||||||
|
|
||||||
config_env = {}
|
|
||||||
|
|
||||||
def get_recipe_env(self, arch):
|
|
||||||
env = super(AndroidRecipe, self).get_recipe_env(arch)
|
|
||||||
env.update(self.config_env)
|
|
||||||
return env
|
|
||||||
|
|
||||||
def prebuild_arch(self, arch):
|
|
||||||
super(AndroidRecipe, self).prebuild_arch(arch)
|
|
||||||
|
|
||||||
tpxi = 'DEF {} = {}\n'
|
|
||||||
th = '#define {} {}\n'
|
|
||||||
tpy = '{} = {}\n'
|
|
||||||
|
|
||||||
bootstrap = bootstrap_name = self.ctx.bootstrap.name
|
|
||||||
is_sdl2 = bootstrap_name in ('sdl2', 'sdl2python3', 'sdl2_gradle')
|
|
||||||
is_pygame = bootstrap_name in ('pygame',)
|
|
||||||
is_webview = bootstrap_name in ('webview',)
|
|
||||||
is_lbry = bootstrap_name in ('lbry',)
|
|
||||||
|
|
||||||
if is_sdl2 or is_webview or is_lbry:
|
|
||||||
if is_sdl2:
|
|
||||||
bootstrap = 'sdl2'
|
|
||||||
java_ns = 'org.kivy.android'
|
|
||||||
jni_ns = 'org/kivy/android'
|
|
||||||
elif is_pygame:
|
|
||||||
java_ns = 'org.renpy.android'
|
|
||||||
jni_ns = 'org/renpy/android'
|
|
||||||
else:
|
|
||||||
logger.error('unsupported bootstrap for android recipe: {}'.format(bootstrap_name))
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
config = {
|
|
||||||
'BOOTSTRAP': bootstrap,
|
|
||||||
'IS_SDL2': int(is_sdl2),
|
|
||||||
'IS_PYGAME': int(is_pygame),
|
|
||||||
'PY2': int(will_build('python2')(self)),
|
|
||||||
'JAVA_NAMESPACE': java_ns,
|
|
||||||
'JNI_NAMESPACE': jni_ns,
|
|
||||||
}
|
|
||||||
|
|
||||||
with current_directory(self.get_build_dir(arch.arch)):
|
|
||||||
with open(join('android', 'config.pxi'), 'w') as fpxi:
|
|
||||||
with open(join('android', 'config.h'), 'w') as fh:
|
|
||||||
with open(join('android', 'config.py'), 'w') as fpy:
|
|
||||||
for key, value in config.items():
|
|
||||||
fpxi.write(tpxi.format(key, repr(value)))
|
|
||||||
fpy.write(tpy.format(key, repr(value)))
|
|
||||||
fh.write(th.format(key, value if isinstance(value, int)
|
|
||||||
else '"{}"'.format(value)))
|
|
||||||
self.config_env[key] = str(value)
|
|
||||||
|
|
||||||
if is_sdl2:
|
|
||||||
fh.write('JNIEnv *SDL_AndroidGetJNIEnv(void);\n')
|
|
||||||
fh.write('#define SDL_ANDROID_GetJNIEnv SDL_AndroidGetJNIEnv\n')
|
|
||||||
elif is_pygame:
|
|
||||||
fh.write('JNIEnv *SDL_ANDROID_GetJNIEnv(void);\n')
|
|
||||||
|
|
||||||
|
|
||||||
recipe = AndroidRecipe()
|
|
||||||
'''
|
|
||||||
|
|
||||||
'''
|
|
||||||
from pythonforandroid.recipe import CythonRecipe, Recipe, IncludedFilesBehaviour
|
|
||||||
from pythonforandroid.util import current_directory
|
|
||||||
from pythonforandroid.patching import will_build
|
|
||||||
from pythonforandroid import logger
|
|
||||||
|
|
||||||
from os.path import join
|
|
||||||
|
|
||||||
|
|
||||||
class AndroidRecipe(IncludedFilesBehaviour, CythonRecipe):
|
|
||||||
# name = 'android'
|
|
||||||
version = None
|
|
||||||
url = None
|
|
||||||
|
|
||||||
src_filename = 'src'
|
|
||||||
|
|
||||||
depends = [('pygame', 'sdl2', 'genericndkbuild'), ('python2', 'python3crystax')]
|
|
||||||
|
|
||||||
call_hostpython_via_targetpython = False
|
|
||||||
|
|
||||||
config_env = {}
|
|
||||||
|
|
||||||
def get_recipe_env(self, arch):
|
|
||||||
env = super(AndroidRecipe, self).get_recipe_env(arch)
|
|
||||||
env.update(self.config_env)
|
|
||||||
|
|
||||||
target_python = Recipe.get_recipe('python2', self.ctx).get_build_dir(arch.arch)
|
|
||||||
env['PYTHON_ROOT'] = join(target_python, 'python-install')
|
|
||||||
env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7'
|
|
||||||
env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython2.7'
|
|
||||||
|
|
||||||
return env
|
|
||||||
|
|
||||||
def prebuild_arch(self, arch):
|
|
||||||
super(AndroidRecipe, self).prebuild_arch(arch)
|
|
||||||
|
|
||||||
tpxi = 'DEF {} = {}\n'
|
|
||||||
th = '#define {} {}\n'
|
|
||||||
tpy = '{} = {}\n'
|
|
||||||
|
|
||||||
bootstrap = bootstrap_name = self.ctx.bootstrap.name
|
|
||||||
is_sdl2 = bootstrap_name in ('sdl2', 'sdl2python3')
|
|
||||||
is_pygame = bootstrap_name in ('pygame',)
|
|
||||||
is_webview = bootstrap_name in ('webview')
|
|
||||||
is_lbry = bootstrap_name in ('lbry')
|
|
||||||
|
|
||||||
if is_sdl2 or is_webview or is_lbry:
|
|
||||||
if is_sdl2:
|
|
||||||
bootstrap = 'sdl2'
|
|
||||||
java_ns = 'org.kivy.android'
|
|
||||||
jni_ns = 'org/kivy/android'
|
|
||||||
elif is_pygame:
|
|
||||||
java_ns = 'org.renpy.android'
|
|
||||||
jni_ns = 'org/renpy/android'
|
|
||||||
else:
|
|
||||||
logger.error('unsupported bootstrap for android recipe: {}'.format(bootstrap_name))
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
config = {
|
|
||||||
'BOOTSTRAP': bootstrap,
|
|
||||||
'IS_SDL2': int(is_sdl2),
|
|
||||||
'IS_PYGAME': int(is_pygame),
|
|
||||||
'PY2': int(will_build('python2')(self)),
|
|
||||||
'JAVA_NAMESPACE': java_ns,
|
|
||||||
'JNI_NAMESPACE': jni_ns,
|
|
||||||
}
|
|
||||||
|
|
||||||
with current_directory(self.get_build_dir(arch.arch)):
|
|
||||||
with open(join('android', 'config.pxi'), 'w') as fpxi:
|
|
||||||
with open(join('android', 'config.h'), 'w') as fh:
|
|
||||||
with open(join('android', 'config.py'), 'w') as fpy:
|
|
||||||
for key, value in config.items():
|
|
||||||
fpxi.write(tpxi.format(key, repr(value)))
|
|
||||||
fpy.write(tpy.format(key, repr(value)))
|
|
||||||
fh.write(th.format(key, value if isinstance(value, int)
|
|
||||||
else '"{}"'.format(value)))
|
|
||||||
self.config_env[key] = str(value)
|
|
||||||
|
|
||||||
if is_sdl2:
|
|
||||||
fh.write('JNIEnv *SDL_AndroidGetJNIEnv(void);\n')
|
|
||||||
fh.write('#define SDL_ANDROID_GetJNIEnv SDL_AndroidGetJNIEnv\n')
|
|
||||||
elif is_pygame:
|
|
||||||
fh.write('JNIEnv *SDL_ANDROID_GetJNIEnv(void);\n')
|
|
||||||
|
|
||||||
|
|
||||||
recipe = AndroidRecipe()
|
|
||||||
'''
|
|
|
@ -1,8 +0,0 @@
|
||||||
'''
|
|
||||||
Android module
|
|
||||||
==============
|
|
||||||
|
|
||||||
'''
|
|
||||||
|
|
||||||
# legacy import
|
|
||||||
from android._android import *
|
|
|
@ -1,385 +0,0 @@
|
||||||
# Android-specific python services.
|
|
||||||
|
|
||||||
include "config.pxi"
|
|
||||||
|
|
||||||
IF BOOTSTRAP == 'pygame':
|
|
||||||
cdef extern int SDL_ANDROID_CheckPause()
|
|
||||||
cdef extern void SDL_ANDROID_WaitForResume() nogil
|
|
||||||
cdef extern void SDL_ANDROID_MapKey(int scancode, int keysym)
|
|
||||||
|
|
||||||
def check_pause():
|
|
||||||
return SDL_ANDROID_CheckPause()
|
|
||||||
|
|
||||||
def wait_for_resume():
|
|
||||||
android_accelerometer_enable(False)
|
|
||||||
SDL_ANDROID_WaitForResume()
|
|
||||||
android_accelerometer_enable(accelerometer_enabled)
|
|
||||||
|
|
||||||
def map_key(scancode, keysym):
|
|
||||||
SDL_ANDROID_MapKey(scancode, keysym)
|
|
||||||
|
|
||||||
# Android keycodes.
|
|
||||||
KEYCODE_UNKNOWN = 0
|
|
||||||
KEYCODE_SOFT_LEFT = 1
|
|
||||||
KEYCODE_SOFT_RIGHT = 2
|
|
||||||
KEYCODE_HOME = 3
|
|
||||||
KEYCODE_BACK = 4
|
|
||||||
KEYCODE_CALL = 5
|
|
||||||
KEYCODE_ENDCALL = 6
|
|
||||||
KEYCODE_0 = 7
|
|
||||||
KEYCODE_1 = 8
|
|
||||||
KEYCODE_2 = 9
|
|
||||||
KEYCODE_3 = 10
|
|
||||||
KEYCODE_4 = 11
|
|
||||||
KEYCODE_5 = 12
|
|
||||||
KEYCODE_6 = 13
|
|
||||||
KEYCODE_7 = 14
|
|
||||||
KEYCODE_8 = 15
|
|
||||||
KEYCODE_9 = 16
|
|
||||||
KEYCODE_STAR = 17
|
|
||||||
KEYCODE_POUND = 18
|
|
||||||
KEYCODE_DPAD_UP = 19
|
|
||||||
KEYCODE_DPAD_DOWN = 20
|
|
||||||
KEYCODE_DPAD_LEFT = 21
|
|
||||||
KEYCODE_DPAD_RIGHT = 22
|
|
||||||
KEYCODE_DPAD_CENTER = 23
|
|
||||||
KEYCODE_VOLUME_UP = 24
|
|
||||||
KEYCODE_VOLUME_DOWN = 25
|
|
||||||
KEYCODE_POWER = 26
|
|
||||||
KEYCODE_CAMERA = 27
|
|
||||||
KEYCODE_CLEAR = 28
|
|
||||||
KEYCODE_A = 29
|
|
||||||
KEYCODE_B = 30
|
|
||||||
KEYCODE_C = 31
|
|
||||||
KEYCODE_D = 32
|
|
||||||
KEYCODE_E = 33
|
|
||||||
KEYCODE_F = 34
|
|
||||||
KEYCODE_G = 35
|
|
||||||
KEYCODE_H = 36
|
|
||||||
KEYCODE_I = 37
|
|
||||||
KEYCODE_J = 38
|
|
||||||
KEYCODE_K = 39
|
|
||||||
KEYCODE_L = 40
|
|
||||||
KEYCODE_M = 41
|
|
||||||
KEYCODE_N = 42
|
|
||||||
KEYCODE_O = 43
|
|
||||||
KEYCODE_P = 44
|
|
||||||
KEYCODE_Q = 45
|
|
||||||
KEYCODE_R = 46
|
|
||||||
KEYCODE_S = 47
|
|
||||||
KEYCODE_T = 48
|
|
||||||
KEYCODE_U = 49
|
|
||||||
KEYCODE_V = 50
|
|
||||||
KEYCODE_W = 51
|
|
||||||
KEYCODE_X = 52
|
|
||||||
KEYCODE_Y = 53
|
|
||||||
KEYCODE_Z = 54
|
|
||||||
KEYCODE_COMMA = 55
|
|
||||||
KEYCODE_PERIOD = 56
|
|
||||||
KEYCODE_ALT_LEFT = 57
|
|
||||||
KEYCODE_ALT_RIGHT = 58
|
|
||||||
KEYCODE_SHIFT_LEFT = 59
|
|
||||||
KEYCODE_SHIFT_RIGHT = 60
|
|
||||||
KEYCODE_TAB = 61
|
|
||||||
KEYCODE_SPACE = 62
|
|
||||||
KEYCODE_SYM = 63
|
|
||||||
KEYCODE_EXPLORER = 64
|
|
||||||
KEYCODE_ENVELOPE = 65
|
|
||||||
KEYCODE_ENTER = 66
|
|
||||||
KEYCODE_DEL = 67
|
|
||||||
KEYCODE_GRAVE = 68
|
|
||||||
KEYCODE_MINUS = 69
|
|
||||||
KEYCODE_EQUALS = 70
|
|
||||||
KEYCODE_LEFT_BRACKET = 71
|
|
||||||
KEYCODE_RIGHT_BRACKET = 72
|
|
||||||
KEYCODE_BACKSLASH = 73
|
|
||||||
KEYCODE_SEMICOLON = 74
|
|
||||||
KEYCODE_APOSTROPHE = 75
|
|
||||||
KEYCODE_SLASH = 76
|
|
||||||
KEYCODE_AT = 77
|
|
||||||
KEYCODE_NUM = 78
|
|
||||||
KEYCODE_HEADSETHOOK = 79
|
|
||||||
KEYCODE_FOCUS = 80
|
|
||||||
KEYCODE_PLUS = 81
|
|
||||||
KEYCODE_MENU = 82
|
|
||||||
KEYCODE_NOTIFICATION = 83
|
|
||||||
KEYCODE_SEARCH = 84
|
|
||||||
KEYCODE_MEDIA_PLAY_PAUSE= 85
|
|
||||||
KEYCODE_MEDIA_STOP = 86
|
|
||||||
KEYCODE_MEDIA_NEXT = 87
|
|
||||||
KEYCODE_MEDIA_PREVIOUS = 88
|
|
||||||
KEYCODE_MEDIA_REWIND = 89
|
|
||||||
KEYCODE_MEDIA_FAST_FORWARD = 90
|
|
||||||
KEYCODE_MUTE = 91
|
|
||||||
|
|
||||||
# Vibration support.
|
|
||||||
cdef extern void android_vibrate(double)
|
|
||||||
|
|
||||||
def vibrate(s):
|
|
||||||
android_vibrate(s)
|
|
||||||
|
|
||||||
# Accelerometer support.
|
|
||||||
cdef extern void android_accelerometer_enable(int)
|
|
||||||
cdef extern void android_accelerometer_reading(float *)
|
|
||||||
|
|
||||||
accelerometer_enabled = False
|
|
||||||
|
|
||||||
def accelerometer_enable(p):
|
|
||||||
global accelerometer_enabled
|
|
||||||
|
|
||||||
android_accelerometer_enable(p)
|
|
||||||
|
|
||||||
accelerometer_enabled = p
|
|
||||||
|
|
||||||
def accelerometer_reading():
|
|
||||||
cdef float rv[3]
|
|
||||||
android_accelerometer_reading(rv)
|
|
||||||
|
|
||||||
return (rv[0], rv[1], rv[2])
|
|
||||||
|
|
||||||
# Wifi reading support
|
|
||||||
cdef extern void android_wifi_scanner_enable()
|
|
||||||
cdef extern char * android_wifi_scan()
|
|
||||||
|
|
||||||
def wifi_scanner_enable():
|
|
||||||
android_wifi_scanner_enable()
|
|
||||||
|
|
||||||
def wifi_scan():
|
|
||||||
cdef char * reading
|
|
||||||
reading = android_wifi_scan()
|
|
||||||
|
|
||||||
reading_list = []
|
|
||||||
|
|
||||||
for line in filter(lambda l: l, reading.split('\n')):
|
|
||||||
[ssid, mac, level] = line.split('\t')
|
|
||||||
reading_list.append((ssid.strip(), mac.upper().strip(), int(level)))
|
|
||||||
|
|
||||||
return reading_list
|
|
||||||
|
|
||||||
# DisplayMetrics information.
|
|
||||||
cdef extern int android_get_dpi()
|
|
||||||
|
|
||||||
def get_dpi():
|
|
||||||
return android_get_dpi()
|
|
||||||
|
|
||||||
|
|
||||||
# Soft keyboard.
|
|
||||||
cdef extern void android_show_keyboard(int)
|
|
||||||
cdef extern void android_hide_keyboard()
|
|
||||||
|
|
||||||
|
|
||||||
from jnius import autoclass, PythonJavaClass, java_method, cast
|
|
||||||
|
|
||||||
# API versions
|
|
||||||
api_version = autoclass('android.os.Build$VERSION').SDK_INT
|
|
||||||
version_codes = autoclass('android.os.Build$VERSION_CODES')
|
|
||||||
|
|
||||||
|
|
||||||
python_act = autoclass(JAVA_NAMESPACE + '.PythonActivity')
|
|
||||||
Rect = autoclass('android.graphics.Rect')
|
|
||||||
mActivity = python_act.mActivity
|
|
||||||
if mActivity:
|
|
||||||
# PyGame backend already has the listener so adding
|
|
||||||
# one here leads to a crash/too much cpu usage.
|
|
||||||
# SDL2 now does noe need the listener so there is
|
|
||||||
# no point adding a processor intensive layout listenere here.
|
|
||||||
height = 0
|
|
||||||
def get_keyboard_height():
|
|
||||||
rctx = Rect()
|
|
||||||
mActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rctx)
|
|
||||||
# NOTE top should always be zero
|
|
||||||
rctx.top = 0
|
|
||||||
height = mActivity.getWindowManager().getDefaultDisplay().getHeight() - (rctx.bottom - rctx.top)
|
|
||||||
return height
|
|
||||||
else:
|
|
||||||
def get_keyboard_height():
|
|
||||||
return 0
|
|
||||||
|
|
||||||
# Flags for input_type, for requesting a particular type of keyboard
|
|
||||||
#android FLAGS
|
|
||||||
TYPE_CLASS_DATETIME = 4
|
|
||||||
TYPE_CLASS_NUMBER = 2
|
|
||||||
TYPE_NUMBER_VARIATION_NORMAL = 0
|
|
||||||
TYPE_NUMBER_VARIATION_PASSWORD = 16
|
|
||||||
TYPE_CLASS_TEXT = 1
|
|
||||||
TYPE_TEXT_FLAG_AUTO_COMPLETE = 65536
|
|
||||||
TYPE_TEXT_FLAG_AUTO_CORRECT = 32768
|
|
||||||
TYPE_TEXT_FLAG_NO_SUGGESTIONS = 524288
|
|
||||||
TYPE_TEXT_VARIATION_EMAIL_ADDRESS = 32
|
|
||||||
TYPE_TEXT_VARIATION_NORMAL = 0
|
|
||||||
TYPE_TEXT_VARIATION_PASSWORD = 128
|
|
||||||
TYPE_TEXT_VARIATION_POSTAL_ADDRESS = 112
|
|
||||||
TYPE_TEXT_VARIATION_URI = 16
|
|
||||||
TYPE_CLASS_PHONE = 3
|
|
||||||
|
|
||||||
IF BOOTSTRAP == 'sdl2':
|
|
||||||
def remove_presplash():
|
|
||||||
# Remove android presplash in SDL2 bootstrap.
|
|
||||||
mActivity.removeLoadingScreen()
|
|
||||||
|
|
||||||
def show_keyboard(target, input_type):
|
|
||||||
if input_type == 'text':
|
|
||||||
_input_type = TYPE_CLASS_TEXT
|
|
||||||
elif input_type == 'number':
|
|
||||||
_input_type = TYPE_CLASS_NUMBER
|
|
||||||
elif input_type == 'url':
|
|
||||||
_input_type = \
|
|
||||||
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_URI
|
|
||||||
elif input_type == 'mail':
|
|
||||||
_input_type = \
|
|
||||||
TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_EMAIL_ADDRESS
|
|
||||||
elif input_type == 'datetime':
|
|
||||||
_input_type = TYPE_CLASS_DATETIME
|
|
||||||
elif input_type == 'tel':
|
|
||||||
_input_type = TYPE_CLASS_PHONE
|
|
||||||
elif input_type == 'address':
|
|
||||||
_input_type = TYPE_TEXT_VARIATION_POSTAL_ADDRESS
|
|
||||||
|
|
||||||
if hasattr(target, 'password') and target.password:
|
|
||||||
if _input_type == TYPE_CLASS_TEXT:
|
|
||||||
_input_type |= TYPE_TEXT_VARIATION_PASSWORD
|
|
||||||
elif _input_type == TYPE_CLASS_NUMBER:
|
|
||||||
_input_type |= TYPE_NUMBER_VARIATION_PASSWORD
|
|
||||||
|
|
||||||
if hasattr(target, 'keyboard_suggestions') and not target.keyboard_suggestions:
|
|
||||||
if _input_type == TYPE_CLASS_TEXT:
|
|
||||||
_input_type = TYPE_CLASS_TEXT | \
|
|
||||||
TYPE_TEXT_FLAG_NO_SUGGESTIONS
|
|
||||||
|
|
||||||
android_show_keyboard(_input_type)
|
|
||||||
|
|
||||||
def hide_keyboard():
|
|
||||||
android_hide_keyboard()
|
|
||||||
|
|
||||||
# Build info.
|
|
||||||
cdef extern char* BUILD_MANUFACTURER
|
|
||||||
cdef extern char* BUILD_MODEL
|
|
||||||
cdef extern char* BUILD_PRODUCT
|
|
||||||
cdef extern char* BUILD_VERSION_RELEASE
|
|
||||||
|
|
||||||
cdef extern void android_get_buildinfo()
|
|
||||||
|
|
||||||
class BuildInfo:
|
|
||||||
MANUFACTURER = None
|
|
||||||
MODEL = None
|
|
||||||
PRODUCT = None
|
|
||||||
VERSION_RELEASE = None
|
|
||||||
|
|
||||||
def get_buildinfo():
|
|
||||||
android_get_buildinfo()
|
|
||||||
binfo = BuildInfo()
|
|
||||||
binfo.MANUFACTURER = BUILD_MANUFACTURER
|
|
||||||
binfo.MODEL = BUILD_MODEL
|
|
||||||
binfo.PRODUCT = BUILD_PRODUCT
|
|
||||||
binfo.VERSION_RELEASE = BUILD_VERSION_RELEASE
|
|
||||||
return binfo
|
|
||||||
|
|
||||||
IF IS_PYGAME:
|
|
||||||
# Activate input - required to receive input events.
|
|
||||||
cdef extern void android_activate_input()
|
|
||||||
|
|
||||||
def init():
|
|
||||||
android_activate_input()
|
|
||||||
|
|
||||||
# Action send
|
|
||||||
cdef extern void android_action_send(char*, char*, char*, char*, char*)
|
|
||||||
def action_send(mimetype, filename=None, subject=None, text=None,
|
|
||||||
chooser_title=None):
|
|
||||||
cdef char *j_mimetype = <bytes>mimetype
|
|
||||||
cdef char *j_filename = NULL
|
|
||||||
cdef char *j_subject = NULL
|
|
||||||
cdef char *j_text = NULL
|
|
||||||
cdef char *j_chooser_title = NULL
|
|
||||||
if filename is not None:
|
|
||||||
j_filename = <bytes>filename
|
|
||||||
if subject is not None:
|
|
||||||
j_subject = <bytes>subject
|
|
||||||
if text is not None:
|
|
||||||
j_text = <bytes>text
|
|
||||||
if chooser_title is not None:
|
|
||||||
j_chooser_title = <bytes>chooser_title
|
|
||||||
android_action_send(j_mimetype, j_filename, j_subject, j_text,
|
|
||||||
j_chooser_title)
|
|
||||||
|
|
||||||
cdef extern int android_checkstop()
|
|
||||||
cdef extern void android_ackstop()
|
|
||||||
|
|
||||||
def check_stop():
|
|
||||||
return android_checkstop()
|
|
||||||
|
|
||||||
def ack_stop():
|
|
||||||
android_ackstop()
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------
|
|
||||||
# URL Opening.
|
|
||||||
def open_url(url):
|
|
||||||
Intent = autoclass('android.content.Intent')
|
|
||||||
Uri = autoclass('android.net.Uri')
|
|
||||||
browserIntent = Intent()
|
|
||||||
browserIntent.setAction(Intent.ACTION_VIEW)
|
|
||||||
browserIntent.setData(Uri.parse(url))
|
|
||||||
currentActivity = cast('android.app.Activity', mActivity)
|
|
||||||
currentActivity.startActivity(browserIntent)
|
|
||||||
return True
|
|
||||||
|
|
||||||
# Web browser support.
|
|
||||||
class AndroidBrowser(object):
|
|
||||||
def open(self, url, new=0, autoraise=True):
|
|
||||||
return open_url(url)
|
|
||||||
def open_new(self, url):
|
|
||||||
return open_url(url)
|
|
||||||
def open_new_tab(self, url):
|
|
||||||
return open_url(url)
|
|
||||||
|
|
||||||
import webbrowser
|
|
||||||
webbrowser.register('android', AndroidBrowser, None, -1)
|
|
||||||
|
|
||||||
cdef extern void android_start_service(char *, char *, char *)
|
|
||||||
def start_service(title=None, description=None, arg=None):
|
|
||||||
cdef char *j_title = NULL
|
|
||||||
cdef char *j_description = NULL
|
|
||||||
if title is not None:
|
|
||||||
j_title = <bytes>title
|
|
||||||
if description is not None:
|
|
||||||
j_description = <bytes>description
|
|
||||||
if arg is not None:
|
|
||||||
j_arg = <bytes>arg
|
|
||||||
android_start_service(j_title, j_description, j_arg)
|
|
||||||
|
|
||||||
cdef extern void android_stop_service()
|
|
||||||
def stop_service():
|
|
||||||
android_stop_service()
|
|
||||||
|
|
||||||
class AndroidService(object):
|
|
||||||
'''Android service class.
|
|
||||||
Run ``service/main.py`` from application directory as a service.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`title`: str, default to 'Python service'
|
|
||||||
Notification title.
|
|
||||||
|
|
||||||
`description`: str, default to 'Kivy Python service started'
|
|
||||||
Notification text.
|
|
||||||
'''
|
|
||||||
|
|
||||||
def __init__(self, title='Python service',
|
|
||||||
description='Kivy Python service started'):
|
|
||||||
self.title = title
|
|
||||||
self.description = description
|
|
||||||
|
|
||||||
def start(self, arg=''):
|
|
||||||
'''Start the service.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`arg`: str, default to ''
|
|
||||||
Argument to pass to a service,
|
|
||||||
through environment variable ``PYTHON_SERVICE_ARGUMENT``.
|
|
||||||
'''
|
|
||||||
start_service(self.title, self.description, arg)
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
'''Stop the service.
|
|
||||||
'''
|
|
||||||
stop_service()
|
|
||||||
|
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
# -------------------------------------------------------------------
|
|
||||||
# Billing
|
|
||||||
cdef extern void android_billing_service_start()
|
|
||||||
cdef extern void android_billing_service_stop()
|
|
||||||
cdef extern void android_billing_buy(char *sku)
|
|
||||||
cdef extern char *android_billing_get_purchased_items()
|
|
||||||
cdef extern char *android_billing_get_pending_message()
|
|
||||||
|
|
||||||
class BillingService(object):
|
|
||||||
|
|
||||||
BILLING_ACTION_SUPPORTED = 'billingsupported'
|
|
||||||
BILLING_ACTION_ITEMSCHANGED = 'itemschanged'
|
|
||||||
|
|
||||||
BILLING_TYPE_INAPP = 'inapp'
|
|
||||||
BILLING_TYPE_SUBSCRIPTION = 'subs'
|
|
||||||
|
|
||||||
def __init__(self, callback):
|
|
||||||
super(BillingService, self).__init__()
|
|
||||||
self.callback = callback
|
|
||||||
self.purchased_items = None
|
|
||||||
android_billing_service_start()
|
|
||||||
|
|
||||||
def _stop(self):
|
|
||||||
android_billing_service_stop()
|
|
||||||
|
|
||||||
def buy(self, sku):
|
|
||||||
cdef char *j_sku = <bytes>sku
|
|
||||||
android_billing_buy(j_sku)
|
|
||||||
|
|
||||||
def get_purchased_items(self):
|
|
||||||
cdef char *items = NULL
|
|
||||||
cdef bytes pitem
|
|
||||||
items = android_billing_get_purchased_items()
|
|
||||||
if items == NULL:
|
|
||||||
return []
|
|
||||||
pitems = items
|
|
||||||
ret = {}
|
|
||||||
for item in pitems.split('\n'):
|
|
||||||
if not item:
|
|
||||||
continue
|
|
||||||
sku, qt = item.split(',')
|
|
||||||
ret[sku] = {'qt': int(qt)}
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def check(self, *largs):
|
|
||||||
cdef char *message
|
|
||||||
cdef bytes pymessage
|
|
||||||
|
|
||||||
while True:
|
|
||||||
message = android_billing_get_pending_message()
|
|
||||||
if message == NULL:
|
|
||||||
break
|
|
||||||
pymessage = <bytes>message
|
|
||||||
self._handle_message(pymessage)
|
|
||||||
|
|
||||||
if self.purchased_items is None:
|
|
||||||
self._check_new_items()
|
|
||||||
|
|
||||||
def _handle_message(self, message):
|
|
||||||
action, data = message.split('|', 1)
|
|
||||||
#print "HANDLE MESSAGE-----", (action, data)
|
|
||||||
|
|
||||||
if action == 'billingSupported':
|
|
||||||
tp, value = data.split('|')
|
|
||||||
value = True if value == '1' else False
|
|
||||||
self.callback(BillingService.BILLING_ACTION_SUPPORTED, tp, value)
|
|
||||||
|
|
||||||
elif action == 'requestPurchaseResponse':
|
|
||||||
self._check_new_items()
|
|
||||||
|
|
||||||
elif action == 'purchaseStateChange':
|
|
||||||
self._check_new_items()
|
|
||||||
|
|
||||||
elif action == 'restoreTransaction':
|
|
||||||
self._check_new_items()
|
|
||||||
|
|
||||||
def _check_new_items(self):
|
|
||||||
items = self.get_purchased_items()
|
|
||||||
if self.purchased_items != items:
|
|
||||||
self.purchased_items = items
|
|
||||||
self.callback(BillingService.BILLING_ACTION_ITEMSCHANGED, self.purchased_items)
|
|
|
@ -1,120 +0,0 @@
|
||||||
#include <jni.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <android/log.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#define aassert(x) { if (!x) { __android_log_print(ANDROID_LOG_ERROR, "android_jni", "Assertion failed. %s:%d", __FILE__, __LINE__); abort(); }}
|
|
||||||
#define PUSH_FRAME { (*env)->PushLocalFrame(env, 16); }
|
|
||||||
#define POP_FRAME { (*env)->PopLocalFrame(env, NULL); }
|
|
||||||
|
|
||||||
void android_billing_service_start() {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, JNI_NAMESPACE "/PythonActivity");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "billingServiceStart", "()V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
(*env)->CallStaticVoidMethod(env, cls, mid);
|
|
||||||
POP_FRAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_billing_service_stop() {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, JNI_NAMESPACE "/PythonActivity");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "billingServiceStop", "()V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
(*env)->CallStaticVoidMethod(env, cls, mid);
|
|
||||||
POP_FRAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_billing_buy(char *sku) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, JNI_NAMESPACE "/PythonActivity");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "billingBuy", "(Ljava/lang/String;)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
(*env)->NewStringUTF(env, sku)
|
|
||||||
);
|
|
||||||
|
|
||||||
POP_FRAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *android_billing_get_purchased_items() {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
jobject jreading;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, JNI_NAMESPACE "/PythonActivity");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "billingGetPurchasedItems", "()Ljava/lang/String;");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
jreading = (*env)->CallStaticObjectMethod(env, cls, mid);
|
|
||||||
const char * reading = (*env)->GetStringUTFChars(env, jreading, 0);
|
|
||||||
POP_FRAME;
|
|
||||||
|
|
||||||
return reading;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *android_billing_get_pending_message() {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
jobject jreading;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, JNI_NAMESPACE "/PythonActivity");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "billingGetPendingMessage", "()Ljava/lang/String;");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
jreading = (*env)->CallStaticObjectMethod(env, cls, mid);
|
|
||||||
const char * reading = (*env)->GetStringUTFChars(env, jreading, 0);
|
|
||||||
POP_FRAME;
|
|
||||||
|
|
||||||
return reading;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,358 +0,0 @@
|
||||||
#include <jni.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <android/log.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#define aassert(x) { if (!x) { __android_log_print(ANDROID_LOG_ERROR, "android_jni", "Assertion failed. %s:%d", __FILE__, __LINE__); abort(); }}
|
|
||||||
#define PUSH_FRAME { (*env)->PushLocalFrame(env, 16); }
|
|
||||||
#define POP_FRAME { (*env)->PopLocalFrame(env, NULL); }
|
|
||||||
|
|
||||||
void android_vibrate(double seconds) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/Hardware");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "vibrate", "(D)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
(jdouble) seconds);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_accelerometer_enable(int enable) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/Hardware");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "accelerometerEnable", "(Z)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
(jboolean) enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_wifi_scanner_enable(void){
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/Hardware");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "enableWifiScanner", "()V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(env, cls, mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char * android_wifi_scan() {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
jobject jreading;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/Hardware");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "scanWifi", "()Ljava/lang/String;");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
jreading = (*env)->CallStaticObjectMethod(env, cls, mid);
|
|
||||||
const char * reading = (*env)->GetStringUTFChars(env, jreading, 0);
|
|
||||||
POP_FRAME;
|
|
||||||
|
|
||||||
return reading;
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_accelerometer_reading(float *values) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
jobject jvalues;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/Hardware");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "accelerometerReading", "()[F");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
|
|
||||||
jvalues = (*env)->CallStaticObjectMethod(env, cls, mid);
|
|
||||||
(*env)->GetFloatArrayRegion(env, jvalues, 0, 3, values);
|
|
||||||
|
|
||||||
POP_FRAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
int android_get_dpi(void) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/Hardware");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "getDPI", "()I");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (*env)->CallStaticIntMethod(env, cls, mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_show_keyboard(int input_type) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/Hardware");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "showKeyboard", "(I)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(env, cls, mid, (jint) input_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_hide_keyboard(void) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/Hardware");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "hideKeyboard", "()V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(env, cls, mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* BUILD_MANUFACTURER = NULL;
|
|
||||||
char* BUILD_MODEL = NULL;
|
|
||||||
char* BUILD_PRODUCT = NULL;
|
|
||||||
char* BUILD_VERSION_RELEASE = NULL;
|
|
||||||
|
|
||||||
void android_get_buildinfo() {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
jclass *cls = NULL;
|
|
||||||
jfieldID fid;
|
|
||||||
jstring sval;
|
|
||||||
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
|
|
||||||
cls = (*env)->FindClass(env, "android/os/Build");
|
|
||||||
|
|
||||||
fid = (*env)->GetStaticFieldID(env, cls, "MANUFACTURER", "Ljava/lang/String;");
|
|
||||||
sval = (jstring) (*env)->GetStaticObjectField(env, cls, fid);
|
|
||||||
BUILD_MANUFACTURER = (*env)->GetStringUTFChars(env, sval, 0);
|
|
||||||
|
|
||||||
fid = (*env)->GetStaticFieldID(env, cls, "MODEL", "Ljava/lang/String;");
|
|
||||||
sval = (jstring) (*env)->GetStaticObjectField(env, cls, fid);
|
|
||||||
BUILD_MODEL = (*env)->GetStringUTFChars(env, sval, 0);
|
|
||||||
|
|
||||||
fid = (*env)->GetStaticFieldID(env, cls, "PRODUCT", "Ljava/lang/String;");
|
|
||||||
sval = (jstring) (*env)->GetStaticObjectField(env, cls, fid);
|
|
||||||
BUILD_PRODUCT = (*env)->GetStringUTFChars(env, sval, 0);
|
|
||||||
|
|
||||||
cls = (*env)->FindClass(env, "android/os/Build$VERSION");
|
|
||||||
|
|
||||||
fid = (*env)->GetStaticFieldID(env, cls, "RELEASE", "Ljava/lang/String;");
|
|
||||||
sval = (jstring) (*env)->GetStaticObjectField(env, cls, fid);
|
|
||||||
BUILD_VERSION_RELEASE = (*env)->GetStringUTFChars(env, sval, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if IS_PYGAME
|
|
||||||
void android_activate_input(void) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/SDLSurfaceView");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "activateInput", "()V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(env, cls, mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
int android_checkstop(void) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/SDLSurfaceView");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "checkStop", "()I");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (*env)->CallStaticIntMethod(env, cls, mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_ackstop(void) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/SDLSurfaceView");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "ackStop", "()I");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticIntMethod(env, cls, mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_action_send(char *mimeType, char *filename, char *subject, char *text, char *chooser_title) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/Action");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "send",
|
|
||||||
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
jstring j_mimeType = (*env)->NewStringUTF(env, mimeType);
|
|
||||||
jstring j_filename = NULL;
|
|
||||||
jstring j_subject = NULL;
|
|
||||||
jstring j_text = NULL;
|
|
||||||
jstring j_chooser_title = NULL;
|
|
||||||
if ( filename != NULL )
|
|
||||||
j_filename = (*env)->NewStringUTF(env, filename);
|
|
||||||
if ( subject != NULL )
|
|
||||||
j_subject = (*env)->NewStringUTF(env, subject);
|
|
||||||
if ( text != NULL )
|
|
||||||
j_text = (*env)->NewStringUTF(env, text);
|
|
||||||
if ( chooser_title != NULL )
|
|
||||||
j_chooser_title = (*env)->NewStringUTF(env, text);
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
j_mimeType, j_filename, j_subject, j_text,
|
|
||||||
j_chooser_title);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_open_url(char *url) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/SDLSurfaceView");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "openUrl", "(Ljava/lang/String;)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
(*env)->NewStringUTF(env, url)
|
|
||||||
);
|
|
||||||
|
|
||||||
POP_FRAME;
|
|
||||||
}
|
|
||||||
#endif // IS_PYGAME
|
|
||||||
|
|
||||||
void android_start_service(char *title, char *description, char *arg) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, JNI_NAMESPACE "/PythonActivity");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "start_service",
|
|
||||||
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
jstring j_title = NULL;
|
|
||||||
jstring j_description = NULL;
|
|
||||||
jstring j_arg = NULL;
|
|
||||||
if ( title != 0 )
|
|
||||||
j_title = (*env)->NewStringUTF(env, title);
|
|
||||||
if ( description != 0 )
|
|
||||||
j_description = (*env)->NewStringUTF(env, description);
|
|
||||||
if ( arg != 0 )
|
|
||||||
j_arg = (*env)->NewStringUTF(env, arg);
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(env, cls, mid, j_title, j_description, j_arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_stop_service() {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
cls = (*env)->FindClass(env, JNI_NAMESPACE "/PythonActivity");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "stop_service", "()V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(env, cls, mid);
|
|
||||||
}
|
|
|
@ -1,125 +0,0 @@
|
||||||
cdef extern void android_sound_queue(int, char *, char *, long long, long long)
|
|
||||||
cdef extern void android_sound_play(int, char *, char *, long long, long long)
|
|
||||||
cdef extern void android_sound_stop(int)
|
|
||||||
cdef extern void android_sound_seek(int, float)
|
|
||||||
cdef extern void android_sound_dequeue(int)
|
|
||||||
cdef extern void android_sound_playing_name(int, char *, int)
|
|
||||||
cdef extern void android_sound_pause(int)
|
|
||||||
cdef extern void android_sound_unpause(int)
|
|
||||||
|
|
||||||
cdef extern void android_sound_set_volume(int, float)
|
|
||||||
cdef extern void android_sound_set_secondary_volume(int, float)
|
|
||||||
cdef extern void android_sound_set_pan(int, float)
|
|
||||||
|
|
||||||
cdef extern int android_sound_queue_depth(int)
|
|
||||||
cdef extern int android_sound_get_pos(int)
|
|
||||||
cdef extern int android_sound_get_length(int)
|
|
||||||
|
|
||||||
channels = set()
|
|
||||||
volumes = { }
|
|
||||||
|
|
||||||
def queue(channel, file, name, fadein=0, tight=False):
|
|
||||||
|
|
||||||
channels.add(channel)
|
|
||||||
|
|
||||||
real_fn = file.name
|
|
||||||
base = getattr(file, "base", -1)
|
|
||||||
length = getattr(file, "length", -1)
|
|
||||||
|
|
||||||
android_sound_queue(channel, name, real_fn, base, length)
|
|
||||||
|
|
||||||
def play(channel, file, name, paused=False, fadein=0, tight=False):
|
|
||||||
|
|
||||||
channels.add(channel)
|
|
||||||
|
|
||||||
real_fn = file.name
|
|
||||||
base = getattr(file, "base", -1)
|
|
||||||
length = getattr(file, "length", -1)
|
|
||||||
|
|
||||||
android_sound_play(channel, name, real_fn, base, length)
|
|
||||||
|
|
||||||
def seek(channel, position):
|
|
||||||
android_sound_seek(channel, position)
|
|
||||||
|
|
||||||
def stop(channel):
|
|
||||||
android_sound_stop(channel)
|
|
||||||
|
|
||||||
def dequeue(channel, even_tight=False):
|
|
||||||
android_sound_dequeue(channel)
|
|
||||||
|
|
||||||
def queue_depth(channel):
|
|
||||||
return android_sound_queue_depth(channel)
|
|
||||||
|
|
||||||
def playing_name(channel):
|
|
||||||
cdef char buf[1024]
|
|
||||||
|
|
||||||
android_sound_playing_name(channel, buf, 1024)
|
|
||||||
|
|
||||||
rv = buf
|
|
||||||
if not len(rv):
|
|
||||||
return None
|
|
||||||
return rv
|
|
||||||
|
|
||||||
def pause(channel):
|
|
||||||
android_sound_pause(channel)
|
|
||||||
return
|
|
||||||
|
|
||||||
def unpause(channel):
|
|
||||||
android_sound_unpause(channel)
|
|
||||||
return
|
|
||||||
|
|
||||||
def unpause_all():
|
|
||||||
for i in channels:
|
|
||||||
unpause(i)
|
|
||||||
|
|
||||||
def pause_all():
|
|
||||||
for i in channels:
|
|
||||||
pause(i)
|
|
||||||
|
|
||||||
def fadeout(channel, ms):
|
|
||||||
stop(channel)
|
|
||||||
|
|
||||||
def busy(channel):
|
|
||||||
return playing_name(channel) != None
|
|
||||||
|
|
||||||
def get_pos(channel):
|
|
||||||
return android_sound_get_pos(channel)
|
|
||||||
|
|
||||||
def get_length(channel):
|
|
||||||
return android_sound_get_length(channel)
|
|
||||||
|
|
||||||
def set_volume(channel, volume):
|
|
||||||
android_sound_set_volume(channel, volume)
|
|
||||||
volumes[channel] = volume
|
|
||||||
|
|
||||||
def set_secondary_volume(channel, volume):
|
|
||||||
android_sound_set_secondary_volume(channel, volume)
|
|
||||||
|
|
||||||
def set_pan(channel, pan):
|
|
||||||
android_sound_set_pan(channel, pan)
|
|
||||||
|
|
||||||
def set_end_event(channel, event):
|
|
||||||
return
|
|
||||||
|
|
||||||
def get_volume(channel):
|
|
||||||
return volumes.get(channel, 1.0)
|
|
||||||
|
|
||||||
def init(freq, stereo, samples, status=False):
|
|
||||||
return
|
|
||||||
|
|
||||||
def quit():
|
|
||||||
for i in channels:
|
|
||||||
stop(i)
|
|
||||||
|
|
||||||
def periodic():
|
|
||||||
return
|
|
||||||
|
|
||||||
def alloc_event(surf):
|
|
||||||
return
|
|
||||||
|
|
||||||
def refresh_event():
|
|
||||||
return
|
|
||||||
|
|
||||||
def check_version(version):
|
|
||||||
return
|
|
||||||
|
|
|
@ -1,308 +0,0 @@
|
||||||
#include <jni.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <android/log.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
JNIEnv *SDL_ANDROID_GetJNIEnv();
|
|
||||||
|
|
||||||
#define aassert(x) { if (!x) { __android_log_print(ANDROID_LOG_ERROR, "android_sound_jni", "Assertion failed. %s:%d", __FILE__, __LINE__); abort(); }}
|
|
||||||
#define PUSH_FRAME { (*env)->PushLocalFrame(env, 16); }
|
|
||||||
#define POP_FRAME { (*env)->PopLocalFrame(env, NULL); }
|
|
||||||
|
|
||||||
|
|
||||||
void android_sound_queue(int channel, char *filename, char *real_fn, long long base, long long length) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "queue", "(ILjava/lang/String;Ljava/lang/String;JJ)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel,
|
|
||||||
(*env)->NewStringUTF(env, filename),
|
|
||||||
(*env)->NewStringUTF(env, real_fn),
|
|
||||||
(jlong) base,
|
|
||||||
(jlong) length);
|
|
||||||
|
|
||||||
POP_FRAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_sound_play(int channel, char *filename, char *real_fn, long long base, long long length) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "play", "(ILjava/lang/String;Ljava/lang/String;JJ)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel,
|
|
||||||
(*env)->NewStringUTF(env, filename),
|
|
||||||
(*env)->NewStringUTF(env, real_fn),
|
|
||||||
(jlong) base,
|
|
||||||
(jlong) length);
|
|
||||||
|
|
||||||
POP_FRAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_sound_seek(int channel, float position){
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "seek", "(IF)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel,
|
|
||||||
(jfloat) position);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_sound_stop(int channel) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "stop", "(I)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_sound_dequeue(int channel) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "dequeue", "(I)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
int android_sound_queue_depth(int channel) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "queue_depth", "(I)I");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticIntMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_sound_playing_name(int channel, char *buf, int buflen) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
jobject s = NULL;
|
|
||||||
char *jbuf;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "playing_name", "(I)Ljava/lang/String;");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_FRAME;
|
|
||||||
|
|
||||||
s = (*env)->CallStaticObjectMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel);
|
|
||||||
|
|
||||||
jbuf = (*env)->GetStringUTFChars(env, s, NULL);
|
|
||||||
strncpy(buf, jbuf, buflen);
|
|
||||||
(*env)->ReleaseStringUTFChars(env, s, jbuf);
|
|
||||||
|
|
||||||
POP_FRAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_sound_set_volume(int channel, float value) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "set_volume", "(IF)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel,
|
|
||||||
(jfloat) value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_sound_set_secondary_volume(int channel, float value) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "set_secondary_volume", "(IF)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel,
|
|
||||||
(jfloat) value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_sound_set_pan(int channel, float value) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "set_pan", "(IF)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel,
|
|
||||||
(jfloat) value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_sound_pause(int channel) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "pause", "(I)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void android_sound_unpause(int channel) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "unpause", "(I)V");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*env)->CallStaticVoidMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
int android_sound_get_pos(int channel) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "get_pos", "(I)I");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (*env)->CallStaticIntMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
int android_sound_get_length(int channel) {
|
|
||||||
static JNIEnv *env = NULL;
|
|
||||||
static jclass *cls = NULL;
|
|
||||||
static jmethodID mid = NULL;
|
|
||||||
|
|
||||||
if (env == NULL) {
|
|
||||||
env = SDL_ANDROID_GetJNIEnv();
|
|
||||||
aassert(env);
|
|
||||||
cls = (*env)->FindClass(env, "org/renpy/android/RenPySound");
|
|
||||||
aassert(cls);
|
|
||||||
mid = (*env)->GetStaticMethodID(env, cls, "get_length", "(I)I");
|
|
||||||
aassert(mid);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (*env)->CallStaticIntMethod(
|
|
||||||
env, cls, mid,
|
|
||||||
channel);
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
from jnius import PythonJavaClass, java_method, autoclass, cast
|
|
||||||
from android.config import JAVA_NAMESPACE, JNI_NAMESPACE
|
|
||||||
|
|
||||||
_activity = autoclass(JAVA_NAMESPACE + '.PythonActivity').mActivity
|
|
||||||
|
|
||||||
_callbacks = {
|
|
||||||
'on_new_intent': [],
|
|
||||||
'on_activity_result': [] }
|
|
||||||
|
|
||||||
class NewIntentListener(PythonJavaClass):
|
|
||||||
__javainterfaces__ = [JNI_NAMESPACE + '/PythonActivity$NewIntentListener']
|
|
||||||
__javacontext__ = 'app'
|
|
||||||
|
|
||||||
def __init__(self, callback, **kwargs):
|
|
||||||
super(NewIntentListener, self).__init__(**kwargs)
|
|
||||||
self.callback = callback
|
|
||||||
|
|
||||||
@java_method('(Landroid/content/Intent;)V')
|
|
||||||
def onNewIntent(self, intent):
|
|
||||||
self.callback(intent)
|
|
||||||
|
|
||||||
|
|
||||||
class ActivityResultListener(PythonJavaClass):
|
|
||||||
__javainterfaces__ = [JNI_NAMESPACE + '/PythonActivity$ActivityResultListener']
|
|
||||||
__javacontext__ = 'app'
|
|
||||||
|
|
||||||
def __init__(self, callback):
|
|
||||||
super(ActivityResultListener, self).__init__()
|
|
||||||
self.callback = callback
|
|
||||||
|
|
||||||
@java_method('(IILandroid/content/Intent;)V')
|
|
||||||
def onActivityResult(self, requestCode, resultCode, intent):
|
|
||||||
self.callback(requestCode, resultCode, intent)
|
|
||||||
|
|
||||||
|
|
||||||
def bind(**kwargs):
|
|
||||||
for event, callback in kwargs.items():
|
|
||||||
if event not in _callbacks:
|
|
||||||
raise Exception('Unknown {!r} event'.format(event))
|
|
||||||
elif event == 'on_new_intent':
|
|
||||||
listener = NewIntentListener(callback)
|
|
||||||
_activity.registerNewIntentListener(listener)
|
|
||||||
_callbacks[event].append(listener)
|
|
||||||
elif event == 'on_activity_result':
|
|
||||||
listener = ActivityResultListener(callback)
|
|
||||||
_activity.registerActivityResultListener(listener)
|
|
||||||
_callbacks[event].append(listener)
|
|
||||||
|
|
||||||
def unbind(**kwargs):
|
|
||||||
for event, callback in kwargs.items():
|
|
||||||
if event not in _callbacks:
|
|
||||||
raise Exception('Unknown {!r} event'.format(event))
|
|
||||||
else:
|
|
||||||
for listener in _callbacks[event][:]:
|
|
||||||
if listener.callback == callback:
|
|
||||||
_callbacks[event].remove(listener)
|
|
||||||
if event == 'on_new_intent':
|
|
||||||
_activity.unregisterNewIntentListener(listener)
|
|
||||||
elif event == 'on_activity_result':
|
|
||||||
_activity.unregisterActivityResultListener(listener)
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
'''
|
|
||||||
Android Billing API
|
|
||||||
===================
|
|
||||||
|
|
||||||
'''
|
|
||||||
|
|
||||||
from android._android_billing import *
|
|
|
@ -1,79 +0,0 @@
|
||||||
# -------------------------------------------------------------------
|
|
||||||
# Broadcast receiver bridge
|
|
||||||
|
|
||||||
from jnius import autoclass, PythonJavaClass, java_method
|
|
||||||
from android.config import JAVA_NAMESPACE, JNI_NAMESPACE
|
|
||||||
|
|
||||||
|
|
||||||
class BroadcastReceiver(object):
|
|
||||||
|
|
||||||
class Callback(PythonJavaClass):
|
|
||||||
__javainterfaces__ = [JNI_NAMESPACE + '/GenericBroadcastReceiverCallback']
|
|
||||||
__javacontext__ = 'app'
|
|
||||||
|
|
||||||
def __init__(self, callback, *args, **kwargs):
|
|
||||||
self.callback = callback
|
|
||||||
PythonJavaClass.__init__(self, *args, **kwargs)
|
|
||||||
|
|
||||||
@java_method('(Landroid/content/Context;Landroid/content/Intent;)V')
|
|
||||||
def onReceive(self, context, intent):
|
|
||||||
self.callback(context, intent)
|
|
||||||
|
|
||||||
def __init__(self, callback, actions=None, categories=None):
|
|
||||||
super(BroadcastReceiver, self).__init__()
|
|
||||||
self.callback = callback
|
|
||||||
|
|
||||||
if not actions and not categories:
|
|
||||||
raise Exception('You need to define at least actions or categories')
|
|
||||||
|
|
||||||
def _expand_partial_name(partial_name):
|
|
||||||
if '.' in partial_name:
|
|
||||||
return partial_name # Its actually a full dotted name
|
|
||||||
else:
|
|
||||||
name = 'ACTION_{}'.format(partial_name.upper())
|
|
||||||
if not hasattr(Intent, name):
|
|
||||||
raise Exception('The intent {} doesnt exist'.format(name))
|
|
||||||
return getattr(Intent, name)
|
|
||||||
|
|
||||||
# resolve actions/categories first
|
|
||||||
Intent = autoclass('android.content.Intent')
|
|
||||||
resolved_actions = [_expand_partial_name(x) for x in actions or []]
|
|
||||||
resolved_categories = [_expand_partial_name(x) for x in categories or []]
|
|
||||||
|
|
||||||
# resolve android API
|
|
||||||
GenericBroadcastReceiver = autoclass(JAVA_NAMESPACE + '.GenericBroadcastReceiver')
|
|
||||||
IntentFilter = autoclass('android.content.IntentFilter')
|
|
||||||
HandlerThread = autoclass('android.os.HandlerThread')
|
|
||||||
|
|
||||||
# create a thread for handling events from the receiver
|
|
||||||
self.handlerthread = HandlerThread('handlerthread')
|
|
||||||
|
|
||||||
# create a listener
|
|
||||||
self.listener = BroadcastReceiver.Callback(self.callback)
|
|
||||||
self.receiver = GenericBroadcastReceiver(self.listener)
|
|
||||||
self.receiver_filter = IntentFilter()
|
|
||||||
for x in resolved_actions:
|
|
||||||
self.receiver_filter.addAction(x)
|
|
||||||
for x in resolved_categories:
|
|
||||||
self.receiver_filter.addCategory(x)
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
Handler = autoclass('android.os.Handler')
|
|
||||||
self.handlerthread.start()
|
|
||||||
self.handler = Handler(self.handlerthread.getLooper())
|
|
||||||
self.context.registerReceiver(self.receiver, self.receiver_filter, None,
|
|
||||||
self.handler)
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
self.context.unregisterReceiver(self.receiver)
|
|
||||||
self.handlerthread.quit()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def context(self):
|
|
||||||
from os import environ
|
|
||||||
if 'PYTHON_SERVICE_ARGUMENT' in environ:
|
|
||||||
PythonService = autoclass(JAVA_NAMESPACE + '.PythonService')
|
|
||||||
return PythonService.mService
|
|
||||||
PythonActivity = autoclass(JAVA_NAMESPACE + '.PythonActivity')
|
|
||||||
return PythonActivity.mActivity
|
|
||||||
|
|
|
@ -1,309 +0,0 @@
|
||||||
# This module is, as much a possible, a clone of the pygame
|
|
||||||
# mixer api.
|
|
||||||
|
|
||||||
import android._android_sound as sound
|
|
||||||
import time
|
|
||||||
import threading
|
|
||||||
import os
|
|
||||||
|
|
||||||
condition = threading.Condition()
|
|
||||||
|
|
||||||
def periodic():
|
|
||||||
for i in range(0, num_channels):
|
|
||||||
if i in channels:
|
|
||||||
channels[i].periodic()
|
|
||||||
|
|
||||||
num_channels = 8
|
|
||||||
reserved_channels = 0
|
|
||||||
|
|
||||||
def init(frequency=22050, size=-16, channels=2, buffer=4096):
|
|
||||||
return None
|
|
||||||
|
|
||||||
def pre_init(frequency=22050, size=-16, channels=2, buffersize=4096):
|
|
||||||
return None
|
|
||||||
|
|
||||||
def quit():
|
|
||||||
stop()
|
|
||||||
return None
|
|
||||||
|
|
||||||
def stop():
|
|
||||||
for i in range(0, num_channels):
|
|
||||||
sound.stop(i)
|
|
||||||
|
|
||||||
def pause():
|
|
||||||
for i in range(0, num_channels):
|
|
||||||
sound.pause(i)
|
|
||||||
|
|
||||||
def unpause():
|
|
||||||
for i in range(0, num_channels):
|
|
||||||
sound.unpause(i)
|
|
||||||
|
|
||||||
def get_busy():
|
|
||||||
for i in range(0, num_channels):
|
|
||||||
if sound.busy(i):
|
|
||||||
return True
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
def fadeout(time):
|
|
||||||
# Fadeout doesn't work - it just immediately stops playback.
|
|
||||||
stop()
|
|
||||||
|
|
||||||
|
|
||||||
# A map from channel number to Channel object.
|
|
||||||
channels = { }
|
|
||||||
|
|
||||||
def set_num_channels(count):
|
|
||||||
global num_channels
|
|
||||||
num_channels = count
|
|
||||||
|
|
||||||
def get_num_channels(count):
|
|
||||||
return num_channels
|
|
||||||
|
|
||||||
def set_reserved(count):
|
|
||||||
global reserved_channels
|
|
||||||
reserved_channels = count
|
|
||||||
|
|
||||||
def find_channel(force=False):
|
|
||||||
|
|
||||||
busy = [ ]
|
|
||||||
|
|
||||||
for i in range(reserved_channels, num_channels):
|
|
||||||
c = Channel(i)
|
|
||||||
|
|
||||||
if not c.get_busy():
|
|
||||||
return c
|
|
||||||
|
|
||||||
busy.append(c)
|
|
||||||
|
|
||||||
if not force:
|
|
||||||
return None
|
|
||||||
|
|
||||||
return min(busy, key=lambda x : x.play_time)
|
|
||||||
|
|
||||||
class ChannelImpl(object):
|
|
||||||
|
|
||||||
def __init__(self, id):
|
|
||||||
self.id = id
|
|
||||||
self.loop = None
|
|
||||||
self.queued = None
|
|
||||||
|
|
||||||
self.play_time = time.time()
|
|
||||||
|
|
||||||
def periodic(self):
|
|
||||||
qd = sound.queue_depth(self.id)
|
|
||||||
|
|
||||||
if qd < 2:
|
|
||||||
self.queued = None
|
|
||||||
|
|
||||||
if self.loop is not None and sound.queue_depth(self.id) < 2:
|
|
||||||
self.queue(self.loop, loops=1)
|
|
||||||
|
|
||||||
|
|
||||||
def play(self, s, loops=0, maxtime=0, fade_ms=0):
|
|
||||||
if loops:
|
|
||||||
self.loop = s
|
|
||||||
|
|
||||||
sound.play(self.id, s.file, s.serial)
|
|
||||||
|
|
||||||
self.play_time = time.time()
|
|
||||||
|
|
||||||
with condition:
|
|
||||||
condition.notify()
|
|
||||||
|
|
||||||
def seek(self, position):
|
|
||||||
sound.seek(self.id, position)
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
self.loop = None
|
|
||||||
sound.stop(self.id)
|
|
||||||
|
|
||||||
def pause(self):
|
|
||||||
sound.pause(self.id)
|
|
||||||
|
|
||||||
def unpause(self):
|
|
||||||
sound.pause(self.id)
|
|
||||||
|
|
||||||
def fadeout(self, time):
|
|
||||||
# No fadeout
|
|
||||||
self.stop()
|
|
||||||
|
|
||||||
def set_volume(self, left, right=None):
|
|
||||||
sound.set_volume(self.id, left)
|
|
||||||
|
|
||||||
def get_volume(self):
|
|
||||||
return sound.get_volume(self.id)
|
|
||||||
|
|
||||||
def get_busy(self):
|
|
||||||
return sound.busy(self.id)
|
|
||||||
|
|
||||||
def get_sound(self):
|
|
||||||
is_busy = sound.busy(self.id)
|
|
||||||
if not is_busy:
|
|
||||||
return
|
|
||||||
serial = sound.playing_name(self.id)
|
|
||||||
if not serial:
|
|
||||||
return
|
|
||||||
return sounds.get(serial, None)
|
|
||||||
|
|
||||||
def queue(self, s):
|
|
||||||
self.loop = None
|
|
||||||
self.queued = s
|
|
||||||
|
|
||||||
sound.queue(self.id, s.what, s.serial)
|
|
||||||
|
|
||||||
with condition:
|
|
||||||
condition.notify()
|
|
||||||
|
|
||||||
def get_queue(self):
|
|
||||||
return self.queued
|
|
||||||
|
|
||||||
def get_pos(self):
|
|
||||||
return sound.get_pos(self.id)/1000.
|
|
||||||
|
|
||||||
def get_length(self):
|
|
||||||
return sound.get_length(self.id)/1000.
|
|
||||||
|
|
||||||
|
|
||||||
def Channel(n):
|
|
||||||
"""
|
|
||||||
Gets the channel with the given number.
|
|
||||||
"""
|
|
||||||
|
|
||||||
rv = channels.get(n, None)
|
|
||||||
if rv is None:
|
|
||||||
rv = ChannelImpl(n)
|
|
||||||
channels[n] = rv
|
|
||||||
|
|
||||||
return rv
|
|
||||||
|
|
||||||
|
|
||||||
sound_serial = 0
|
|
||||||
sounds = { }
|
|
||||||
|
|
||||||
class Sound(object):
|
|
||||||
|
|
||||||
def __init__(self, what):
|
|
||||||
|
|
||||||
# Doesn't support buffers.
|
|
||||||
|
|
||||||
global sound_serial
|
|
||||||
|
|
||||||
self._channel = None
|
|
||||||
self._volume = 1.
|
|
||||||
self.serial = str(sound_serial)
|
|
||||||
sound_serial += 1
|
|
||||||
|
|
||||||
if isinstance(what, file):
|
|
||||||
self.file = what
|
|
||||||
else:
|
|
||||||
self.file = file(os.path.abspath(what), "rb")
|
|
||||||
|
|
||||||
sounds[self.serial] = self
|
|
||||||
|
|
||||||
def play(self, loops=0, maxtime=0, fade_ms=0):
|
|
||||||
# avoid new play if the sound is already playing
|
|
||||||
# -> same behavior as standard pygame.
|
|
||||||
if self._channel is not None:
|
|
||||||
if self._channel.get_sound() is self:
|
|
||||||
return
|
|
||||||
self._channel = channel = find_channel(True)
|
|
||||||
channel.set_volume(self._volume)
|
|
||||||
channel.play(self, loops=loops)
|
|
||||||
return channel
|
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
for i in range(0, num_channels):
|
|
||||||
if Channel(i).get_sound() is self:
|
|
||||||
Channel(i).stop()
|
|
||||||
|
|
||||||
def fadeout(self, time):
|
|
||||||
self.stop()
|
|
||||||
|
|
||||||
def set_volume(self, left, right=None):
|
|
||||||
self._volume = left
|
|
||||||
if self._channel:
|
|
||||||
if self._channel.get_sound() is self:
|
|
||||||
self._channel.set_volume(self._volume)
|
|
||||||
|
|
||||||
def get_volume(self):
|
|
||||||
return self._volume
|
|
||||||
|
|
||||||
def get_num_channels(self):
|
|
||||||
rv = 0
|
|
||||||
|
|
||||||
for i in range(0, num_channels):
|
|
||||||
if Channel(i).get_sound() is self:
|
|
||||||
rv += 1
|
|
||||||
|
|
||||||
return rv
|
|
||||||
|
|
||||||
def get_length(self):
|
|
||||||
return 1.0
|
|
||||||
|
|
||||||
music_channel = Channel(256)
|
|
||||||
music_sound = None
|
|
||||||
|
|
||||||
class music(object):
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def load(filename):
|
|
||||||
|
|
||||||
music_channel.stop()
|
|
||||||
|
|
||||||
global music_sound
|
|
||||||
music_sound = Sound(filename)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def play(loops=0, start=0.0):
|
|
||||||
# No start.
|
|
||||||
|
|
||||||
music_channel.play(music_sound, loops=loops)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def rewind():
|
|
||||||
music_channel.play(music_sound)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def seek(position):
|
|
||||||
music_channel.seek(position)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def stop():
|
|
||||||
music_channel.stop()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def pause():
|
|
||||||
music_channel.pause()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def unpause():
|
|
||||||
music_channel.unpause()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def fadeout(time):
|
|
||||||
music_channel.fadeout(time)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def set_volume(value):
|
|
||||||
music_channel.set_volume(value)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_volume():
|
|
||||||
return music_channel.get_volume()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_busy():
|
|
||||||
return music_channel.get_busy()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_pos():
|
|
||||||
return music_channel.get_pos()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def queue(filename):
|
|
||||||
return music_channel.queue(Sound(filename))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
'''
|
|
||||||
Runnable
|
|
||||||
========
|
|
||||||
|
|
||||||
'''
|
|
||||||
|
|
||||||
from jnius import PythonJavaClass, java_method, autoclass
|
|
||||||
from android.config import JAVA_NAMESPACE
|
|
||||||
|
|
||||||
# reference to the activity
|
|
||||||
_PythonActivity = autoclass(JAVA_NAMESPACE + '.PythonActivity')
|
|
||||||
|
|
||||||
|
|
||||||
class Runnable(PythonJavaClass):
|
|
||||||
'''Wrapper around Java Runnable class. This class can be used to schedule a
|
|
||||||
call of a Python function into the PythonActivity thread.
|
|
||||||
'''
|
|
||||||
|
|
||||||
__javainterfaces__ = ['java/lang/Runnable']
|
|
||||||
__runnables__ = []
|
|
||||||
|
|
||||||
def __init__(self, func):
|
|
||||||
super(Runnable, self).__init__()
|
|
||||||
self.func = func
|
|
||||||
|
|
||||||
def __call__(self, *args, **kwargs):
|
|
||||||
self.args = args
|
|
||||||
self.kwargs = kwargs
|
|
||||||
Runnable.__runnables__.append(self)
|
|
||||||
_PythonActivity.mActivity.runOnUiThread(self)
|
|
||||||
|
|
||||||
@java_method('()V')
|
|
||||||
def run(self):
|
|
||||||
try:
|
|
||||||
self.func(*self.args, **self.kwargs)
|
|
||||||
except:
|
|
||||||
import traceback
|
|
||||||
traceback.print_exc()
|
|
||||||
|
|
||||||
Runnable.__runnables__.remove(self)
|
|
||||||
|
|
||||||
def run_on_ui_thread(f):
|
|
||||||
'''Decorator to create automatically a :class:`Runnable` object with the
|
|
||||||
function. The function will be delayed and call into the Activity thread.
|
|
||||||
'''
|
|
||||||
def f2(*args, **kwargs):
|
|
||||||
Runnable(f)(*args, **kwargs)
|
|
||||||
return f2
|
|
|
@ -1,34 +0,0 @@
|
||||||
from distutils.core import setup, Extension
|
|
||||||
import os
|
|
||||||
|
|
||||||
library_dirs = ['libs/' + os.environ['ARCH']]
|
|
||||||
lib_dict = {
|
|
||||||
'pygame': ['sdl'],
|
|
||||||
'sdl2': ['SDL2', 'SDL2_image', 'SDL2_mixer', 'SDL2_ttf']
|
|
||||||
}
|
|
||||||
sdl_libs = lib_dict[os.environ['BOOTSTRAP']] if os.environ['BOOTSTRAP'] == 'sdl2' else []
|
|
||||||
|
|
||||||
renpy_sound = Extension('android._android_sound',
|
|
||||||
['android/_android_sound.c', 'android/_android_sound_jni.c', ],
|
|
||||||
libraries=sdl_libs + ['log'],
|
|
||||||
library_dirs=library_dirs)
|
|
||||||
|
|
||||||
modules = [Extension('android._android',
|
|
||||||
['android/_android.c', 'android/_android_jni.c'],
|
|
||||||
libraries=sdl_libs + ['log'],
|
|
||||||
library_dirs=library_dirs),
|
|
||||||
Extension('android._android_billing',
|
|
||||||
['android/_android_billing.c', 'android/_android_billing_jni.c'],
|
|
||||||
libraries=['log'],
|
|
||||||
library_dirs=library_dirs)]
|
|
||||||
|
|
||||||
if int(os.environ['IS_PYGAME']):
|
|
||||||
modules.append(renpy_sound)
|
|
||||||
|
|
||||||
|
|
||||||
setup(name='android',
|
|
||||||
version='1.0',
|
|
||||||
packages=['android'],
|
|
||||||
package_dir={'android': 'android'},
|
|
||||||
ext_modules=modules
|
|
||||||
)
|
|
|
@ -1,58 +0,0 @@
|
||||||
|
|
||||||
import os
|
|
||||||
from pythonforandroid.recipe import CompiledComponentsPythonRecipe
|
|
||||||
|
|
||||||
|
|
||||||
class CffiRecipe(CompiledComponentsPythonRecipe):
|
|
||||||
name = 'cffi'
|
|
||||||
version = '1.14.6'
|
|
||||||
url = 'https://pypi.python.org/packages/source/c/cffi/cffi-{version}.tar.gz'
|
|
||||||
|
|
||||||
depends = [('python2', 'python3'), 'setuptools', 'pycparser', 'libffi']
|
|
||||||
|
|
||||||
patches = ['disable-pkg-config.patch']
|
|
||||||
|
|
||||||
# call_hostpython_via_targetpython = False
|
|
||||||
install_in_hostpython = True
|
|
||||||
|
|
||||||
def get_hostrecipe_env(self, arch=None):
|
|
||||||
# fixes missing ffi.h on some host systems (e.g. gentoo)
|
|
||||||
env = super(CffiRecipe, self).get_hostrecipe_env(arch)
|
|
||||||
libffi = self.get_recipe('libffi', self.ctx)
|
|
||||||
includes = libffi.get_include_dirs(arch)
|
|
||||||
env['FFI_INC'] = ",".join(includes)
|
|
||||||
return env
|
|
||||||
|
|
||||||
def get_recipe_env(self, arch=None):
|
|
||||||
env = super(CffiRecipe, self).get_recipe_env(arch)
|
|
||||||
# sets linker to use the correct gcc (cross compiler)
|
|
||||||
env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
|
|
||||||
libffi = self.get_recipe('libffi', self.ctx)
|
|
||||||
includes = libffi.get_include_dirs(arch)
|
|
||||||
env['CFLAGS'] = ' -I'.join([env.get('CFLAGS', '')] + includes)
|
|
||||||
env['LDFLAGS'] = (env.get('CFLAGS', '') + ' -L' +
|
|
||||||
self.ctx.get_libs_dir(arch.arch))
|
|
||||||
env['LDFLAGS'] += ' -L{}'.format(os.path.join(self.ctx.bootstrap.build_dir, 'libs', arch.arch))
|
|
||||||
|
|
||||||
# required for libc and libdl/include
|
|
||||||
ndk_dir = self.ctx.ndk_platform
|
|
||||||
ndk_lib_dir = os.path.join(ndk_dir, 'usr', 'lib')
|
|
||||||
env['LDFLAGS'] += ' -L{}'.format(ndk_lib_dir)
|
|
||||||
env['LDFLAGS'] += " --sysroot={}".format(self.ctx.ndk_platform)
|
|
||||||
env['PYTHONPATH'] = ':'.join([
|
|
||||||
self.ctx.get_site_packages_dir(),
|
|
||||||
env['BUILDLIB_PATH'],
|
|
||||||
])
|
|
||||||
# if self.ctx.ndk == 'crystax':
|
|
||||||
# # only keeps major.minor (discards patch)
|
|
||||||
# python_version = self.ctx.python_recipe.version[0:3]
|
|
||||||
# ndk_dir_python = os.path.join(self.ctx.ndk_dir, 'sources/python/', python_version)
|
|
||||||
# env['LDFLAGS'] += ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
|
|
||||||
# env['LDFLAGS'] += ' -lpython{}'.format(python_version)
|
|
||||||
# # until `pythonforandroid/archs.py` gets merged upstream:
|
|
||||||
# # https://github.com/kivy/python-for-android/pull/1250/files#diff-569e13021e33ced8b54385f55b49cbe6
|
|
||||||
# env['CFLAGS'] += ' -I{}/include/python/'.format(ndk_dir_python)
|
|
||||||
# return env
|
|
||||||
|
|
||||||
|
|
||||||
recipe = CffiRecipe()
|
|
|
@ -1,30 +0,0 @@
|
||||||
diff --git a/setup.py b/setup.py
|
|
||||||
index c1db368..57311c3 100644
|
|
||||||
--- a/setup.py
|
|
||||||
+++ b/setup.py
|
|
||||||
@@ -5,8 +5,7 @@ import errno
|
|
||||||
|
|
||||||
sources = ['c/_cffi_backend.c']
|
|
||||||
libraries = ['ffi']
|
|
||||||
-include_dirs = ['/usr/include/ffi',
|
|
||||||
- '/usr/include/libffi'] # may be changed by pkg-config
|
|
||||||
+include_dirs = os.environ['FFI_INC'].split(",") if 'FFI_INC' in os.environ else []
|
|
||||||
define_macros = []
|
|
||||||
library_dirs = []
|
|
||||||
extra_compile_args = []
|
|
||||||
@@ -67,14 +66,7 @@ def ask_supports_thread():
|
|
||||||
sys.stderr.write("The above error message can be safely ignored\n")
|
|
||||||
|
|
||||||
def use_pkg_config():
|
|
||||||
- if sys.platform == 'darwin' and os.path.exists('/usr/local/bin/brew'):
|
|
||||||
- use_homebrew_for_libffi()
|
|
||||||
-
|
|
||||||
- _ask_pkg_config(include_dirs, '--cflags-only-I', '-I', sysroot=True)
|
|
||||||
- _ask_pkg_config(extra_compile_args, '--cflags-only-other')
|
|
||||||
- _ask_pkg_config(library_dirs, '--libs-only-L', '-L', sysroot=True)
|
|
||||||
- _ask_pkg_config(extra_link_args, '--libs-only-other')
|
|
||||||
- _ask_pkg_config(libraries, '--libs-only-l', '-l')
|
|
||||||
+ pass
|
|
||||||
|
|
||||||
def use_homebrew_for_libffi():
|
|
||||||
# We can build by setting:
|
|
|
@ -1,74 +0,0 @@
|
||||||
import os
|
|
||||||
from pythonforandroid.recipe import PythonRecipe, CompiledComponentsPythonRecipe
|
|
||||||
|
|
||||||
|
|
||||||
class CoincurveRecipe(CompiledComponentsPythonRecipe):
|
|
||||||
# version = '15.0.0'
|
|
||||||
# url = 'https://github.com/ofek/coincurve/archive/{version}.tar.gz'
|
|
||||||
# call_hostpython_via_targetpython = False
|
|
||||||
# depends = ['setuptools',
|
|
||||||
# 'libffi', 'cffi', 'libsecp256k1']
|
|
||||||
# patches = [
|
|
||||||
# "cross_compile.patch", "drop_setup_requires.patch",
|
|
||||||
# "find_lib.patch", "no-download.patch", "setup.py.patch"]
|
|
||||||
#
|
|
||||||
# def get_recipe_env(self, arch=None, with_flags_in_cc=True):
|
|
||||||
# env = super().get_recipe_env(arch, with_flags_in_cc)
|
|
||||||
# # sets linker to use the correct gcc (cross compiler)
|
|
||||||
# env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
|
|
||||||
# libsecp256k1 = self.get_recipe('libsecp256k1', self.ctx)
|
|
||||||
# libsecp256k1_dir = libsecp256k1.get_build_dir(arch.arch)
|
|
||||||
# env['LDFLAGS'] += ' -L{}'.format(os.path.join(libsecp256k1_dir, '.libs'))
|
|
||||||
# env['CFLAGS'] += ' -I' + os.path.join(libsecp256k1_dir, 'include')
|
|
||||||
# # only keeps major.minor (discards patch)
|
|
||||||
# python_version = self.ctx.python_recipe.version[0:3]
|
|
||||||
# # required additional library and path for Crystax
|
|
||||||
# if self.ctx.ndk == 'crystax':
|
|
||||||
# ndk_dir_python = os.path.join(self.ctx.ndk_dir, 'sources/python/', python_version)
|
|
||||||
# env['LDFLAGS'] += ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
|
|
||||||
# env['LDFLAGS'] += ' -lpython{}'.format(python_version)
|
|
||||||
# # until `pythonforandroid/archs.py` gets merged upstream:
|
|
||||||
# # https://github.com/kivy/python-for-android/pull/1250/files#diff-569e13021e33ced8b54385f55b49cbe6
|
|
||||||
# env['CFLAGS'] += ' -I{}/include/python/'.format(ndk_dir_python)
|
|
||||||
# else:
|
|
||||||
# env['PYTHON_ROOT'] = self.ctx.get_python_install_dir(arch.arch)
|
|
||||||
# env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python{}'.format(python_version)
|
|
||||||
# env['LDFLAGS'] += " -lpython{}".format(python_version)
|
|
||||||
# env['LDFLAGS'] += " -lsecp256k1"
|
|
||||||
# return env
|
|
||||||
version = 'v15.0.1'
|
|
||||||
url = 'https://github.com/ofek/coincurve/archive/refs/tags/v15.0.1.tar.gz'
|
|
||||||
call_hostpython_via_targetpython = False
|
|
||||||
depends = [('python2', 'python3'), 'setuptools',
|
|
||||||
'libffi', 'cffi', 'libsecp256k1']
|
|
||||||
patches = [
|
|
||||||
"cross_compile.patch", "drop_setup_requires.patch",
|
|
||||||
"find_lib.patch", "no-download.patch", "setup.py.patch"]
|
|
||||||
|
|
||||||
def get_recipe_env(self, arch=None, with_flags_in_cc=True):
|
|
||||||
env = super().get_recipe_env(arch, with_flags_in_cc)
|
|
||||||
# sets linker to use the correct gcc (cross compiler)
|
|
||||||
env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
|
|
||||||
libsecp256k1 = self.get_recipe('libsecp256k1', self.ctx)
|
|
||||||
libsecp256k1_dir = libsecp256k1.get_build_dir(arch.arch)
|
|
||||||
env['LDFLAGS'] += ' -L{}'.format(os.path.join(libsecp256k1_dir, '.libs'))
|
|
||||||
env['CFLAGS'] += ' -I' + os.path.join(libsecp256k1_dir, 'include')
|
|
||||||
# only keeps major.minor (discards patch)
|
|
||||||
python_version = self.ctx.python_recipe.version[0:3]
|
|
||||||
# required additional library and path for Crystax
|
|
||||||
# if self.ctx.ndk == 'crystax':
|
|
||||||
# ndk_dir_python = os.path.join(self.ctx.ndk_dir, 'sources/python/', python_version)
|
|
||||||
# env['LDFLAGS'] += ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
|
|
||||||
# env['LDFLAGS'] += ' -lpython{}m'.format(python_version)
|
|
||||||
# # until `pythonforandroid/archs.py` gets merged upstream:
|
|
||||||
# # https://github.com/kivy/python-for-android/pull/1250/files#diff-569e13021e33ced8b54385f55b49cbe6
|
|
||||||
# env['CFLAGS'] += ' -I{}/include/python/'.format(ndk_dir_python)
|
|
||||||
# else:
|
|
||||||
env['PYTHON_ROOT'] = self.ctx.get_python_install_dir(arch.arch)
|
|
||||||
env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python{}'.format(python_version)
|
|
||||||
env['LDFLAGS'] += " -lpython{}".format(python_version)
|
|
||||||
env['LDFLAGS'] += " -lsecp256k1"
|
|
||||||
return env
|
|
||||||
|
|
||||||
|
|
||||||
recipe = CoincurveRecipe()
|
|
|
@ -1,12 +0,0 @@
|
||||||
diff --git a/setup.py b/setup.py
|
|
||||||
index c224fb2..bf925bd 100644
|
|
||||||
--- a/setup.py
|
|
||||||
+++ b/setup.py
|
|
||||||
@@ -182,6 +182,7 @@ class build_clib(_build_clib):
|
|
||||||
'--disable-dependency-tracking',
|
|
||||||
'--with-pic',
|
|
||||||
'--enable-module-recovery',
|
|
||||||
+ "--host=%s" % os.environ['TOOLCHAIN_PREFIX'],
|
|
||||||
'--disable-jni',
|
|
||||||
'--prefix',
|
|
||||||
os.path.abspath(self.build_clib),
|
|
|
@ -1,12 +0,0 @@
|
||||||
diff --git a/setup.py b/setup.py
|
|
||||||
index c224fb2..466e789 100644
|
|
||||||
--- a/setup.py
|
|
||||||
+++ b/setup.py
|
|
||||||
@@ -250,7 +250,6 @@ else:
|
|
||||||
def has_c_libraries(self):
|
|
||||||
return not has_system_lib()
|
|
||||||
setup_kwargs = dict(
|
|
||||||
- setup_requires=['cffi>=1.3.0', 'pytest-runner>=2.6.2'],
|
|
||||||
ext_package='coincurve',
|
|
||||||
cffi_modules=['_cffi_build/build.py:ffi'],
|
|
||||||
cmdclass={
|
|
|
@ -1,13 +0,0 @@
|
||||||
diff --git a/setup_support.py b/setup_support.py
|
|
||||||
index e7a4f2e..72f0c4d 100644
|
|
||||||
--- a/setup_support.py
|
|
||||||
+++ b/setup_support.py
|
|
||||||
@@ -68,6 +69,8 @@ def build_flags(library, type_, path):
|
|
||||||
|
|
||||||
|
|
||||||
def _find_lib():
|
|
||||||
+ # we're picking up the recipe one
|
|
||||||
+ return True
|
|
||||||
from cffi import FFI
|
|
||||||
ffi = FFI()
|
|
||||||
try:
|
|
|
@ -1,13 +0,0 @@
|
||||||
diff --git a/setup.py b/setup.py
|
|
||||||
index c224fb2..d5f6d1a 100644
|
|
||||||
--- a/setup.py
|
|
||||||
+++ b/setup.py
|
|
||||||
@@ -51,6 +51,8 @@ if [int(i) for i in setuptools_version.split('.', 2)[:2]] < [3, 3]:
|
|
||||||
|
|
||||||
|
|
||||||
def download_library(command):
|
|
||||||
+ # we will use the custom libsecp256k1 recipe
|
|
||||||
+ return
|
|
||||||
if command.dry_run:
|
|
||||||
return
|
|
||||||
libdir = absolute('libsecp256k1')
|
|
|
@ -1,22 +0,0 @@
|
||||||
From bf3a0684e9b0af29d9777f61d6e7e1d3cc0f2803 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kieran Prasch <kieranprasch@gmail.com>
|
|
||||||
Date: Thu, 19 Jul 2018 14:11:48 -0700
|
|
||||||
Subject: [PATCH] Exclude tests in setup.py
|
|
||||||
|
|
||||||
---
|
|
||||||
setup.py | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/setup.py b/setup.py
|
|
||||||
index 0b579f1..0a793ed 100644
|
|
||||||
--- a/setup.py
|
|
||||||
+++ b/setup.py
|
|
||||||
@@ -277,7 +277,7 @@ def has_c_libraries(self):
|
|
||||||
install_requires=['asn1crypto', 'cffi>=1.3.0'],
|
|
||||||
tests_require=['pytest>=2.8.7'],
|
|
||||||
|
|
||||||
- packages=find_packages(exclude=('_cffi_build', '_cffi_build.*', 'libsecp256k1')),
|
|
||||||
+ packages=find_packages(exclude=('_cffi_build', '_cffi_build.*', 'libsecp256k1', 'tests')),
|
|
||||||
|
|
||||||
distclass=Distribution,
|
|
||||||
zip_safe=False,
|
|
|
@ -1,37 +0,0 @@
|
||||||
from pythonforandroid.recipe import CompiledComponentsPythonRecipe, Recipe
|
|
||||||
from os.path import dirname, join
|
|
||||||
import os
|
|
||||||
|
|
||||||
class CryptographyRecipe(CompiledComponentsPythonRecipe):
|
|
||||||
name = 'cryptography'
|
|
||||||
version = '3.1.1'
|
|
||||||
url = 'https://github.com/pyca/cryptography/archive/{version}.tar.gz'
|
|
||||||
depends = [('python2', 'python3crystax'), 'openssl', 'six', 'setuptools', 'cffi']
|
|
||||||
call_hostpython_via_targetpython = False
|
|
||||||
patches = ['libpthread.patch']
|
|
||||||
|
|
||||||
def get_recipe_env(self, arch):
|
|
||||||
env = super(CryptographyRecipe, self).get_recipe_env(arch)
|
|
||||||
r = self.get_recipe('openssl', self.ctx)
|
|
||||||
openssl_dir = r.get_build_dir(arch.arch)
|
|
||||||
env['CFLAGS'] += ' -I' + join(openssl_dir, 'include') + ' -w'
|
|
||||||
# Set linker to use the correct gcc
|
|
||||||
env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
|
|
||||||
env['LDFLAGS'] += ' -L' + openssl_dir + \
|
|
||||||
' -lssl' + r.version + \
|
|
||||||
' -lcrypto' + r.version
|
|
||||||
|
|
||||||
if self.ctx.ndk == 'crystax':
|
|
||||||
# only keeps major.minor (discards patch)
|
|
||||||
python_version = self.ctx.python_recipe.version[0:3]
|
|
||||||
ndk_dir_python = os.path.join(self.ctx.ndk_dir, 'sources/python/', python_version)
|
|
||||||
env['LDFLAGS'] += ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
|
|
||||||
env['LDFLAGS'] += ' -lpython{}'.format(python_version)
|
|
||||||
# until `pythonforandroid/archs.py` gets merged upstream:
|
|
||||||
# https://github.com/kivy/python-for-android/pull/1250/files#diff-569e13021e33ced8b54385f55b49cbe6
|
|
||||||
env['CFLAGS'] += ' -I{}/include/python/'.format(ndk_dir_python) + ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
|
|
||||||
|
|
||||||
|
|
||||||
return env
|
|
||||||
|
|
||||||
recipe = CryptographyRecipe()
|
|
|
@ -1,16 +0,0 @@
|
||||||
diff --git a/src/_cffi_src/build_openssl.py b/src/_cffi_src/build_openssl.py
|
|
||||||
index 35ccd6b..6d5ee4c 100755
|
|
||||||
--- a/src/_cffi_src/build_openssl.py
|
|
||||||
+++ b/src/_cffi_src/build_openssl.py
|
|
||||||
@@ -42,10 +42,7 @@ def _get_openssl_libraries(platform):
|
|
||||||
# -lpthread required due to usage of pthread an potential
|
|
||||||
# existance of a static part containing e.g. pthread_atfork
|
|
||||||
# (https://github.com/pyca/cryptography/issues/5084)
|
|
||||||
- if sys.platform == "zos":
|
|
||||||
- return ["ssl", "crypto"]
|
|
||||||
- else:
|
|
||||||
- return ["ssl", "crypto", "pthread"]
|
|
||||||
+ return ["ssl", "crypto"]
|
|
||||||
|
|
||||||
|
|
||||||
def _extra_compile_args(platform):
|
|
|
@ -1,46 +0,0 @@
|
||||||
from pythonforandroid.recipe import Recipe
|
|
||||||
from pythonforandroid.toolchain import shprint
|
|
||||||
from os.path import join
|
|
||||||
import sh
|
|
||||||
|
|
||||||
|
|
||||||
class Hostpython3Recipe(Recipe):
|
|
||||||
version = 'auto' # the version is taken from the python3crystax recipe
|
|
||||||
name = 'hostpython3crystax'
|
|
||||||
|
|
||||||
conflicts = ['hostpython2']
|
|
||||||
|
|
||||||
def get_build_container_dir(self, arch=None):
|
|
||||||
choices = self.check_recipe_choices()
|
|
||||||
dir_name = '-'.join([self.name] + choices)
|
|
||||||
return join(self.ctx.build_dir, 'other_builds', dir_name, 'desktop')
|
|
||||||
|
|
||||||
# def prebuild_armeabi(self):
|
|
||||||
# # Override hostpython Setup?
|
|
||||||
# shprint(sh.cp, join(self.get_recipe_dir(), 'Setup'),
|
|
||||||
# join(self.get_build_dir('armeabi'), 'Modules', 'Setup'))
|
|
||||||
|
|
||||||
def get_build_dir(self, arch=None):
|
|
||||||
return join(self.get_build_container_dir(), self.name)
|
|
||||||
|
|
||||||
def build_arch(self, arch):
|
|
||||||
"""
|
|
||||||
Creates expected build and symlinks system Python version.
|
|
||||||
"""
|
|
||||||
self.ctx.hostpython = '/usr/bin/false'
|
|
||||||
self.ctx.hostpgen = '/usr/bin/false'
|
|
||||||
# creates the sub buildir (used by other recipes)
|
|
||||||
# https://github.com/kivy/python-for-android/issues/1154
|
|
||||||
sub_build_dir = join(self.get_build_dir(), 'build')
|
|
||||||
shprint(sh.mkdir, '-p', sub_build_dir)
|
|
||||||
python3crystax = self.get_recipe('python3crystax', self.ctx)
|
|
||||||
system_python = sh.which("python" + python3crystax.version)
|
|
||||||
if system_python is None:
|
|
||||||
raise OSError(
|
|
||||||
('Trying to use python3crystax=={} but this Python version '
|
|
||||||
'is not installed locally.').format(python3crystax.version))
|
|
||||||
link_dest = join(self.get_build_dir(), 'hostpython')
|
|
||||||
shprint(sh.ln, '-sf', system_python, link_dest)
|
|
||||||
|
|
||||||
|
|
||||||
recipe = Hostpython3Recipe()
|
|
|
@ -1,3 +0,0 @@
|
||||||
APP_OPTIM := release
|
|
||||||
APP_ABI := all # or armeabi
|
|
||||||
APP_MODULES := libffi
|
|
|
@ -1,53 +0,0 @@
|
||||||
from os.path import exists, join
|
|
||||||
from multiprocessing import cpu_count
|
|
||||||
from pythonforandroid.recipe import Recipe
|
|
||||||
from pythonforandroid.logger import shprint
|
|
||||||
from pythonforandroid.util import current_directory, ensure_dir
|
|
||||||
import sh
|
|
||||||
|
|
||||||
|
|
||||||
class LibffiRecipe(Recipe):
|
|
||||||
"""
|
|
||||||
Requires additional system dependencies on Ubuntu:
|
|
||||||
- `automake` for the `aclocal` binary
|
|
||||||
- `autoconf` for the `autoreconf` binary
|
|
||||||
- `libltdl-dev` which defines the `LT_SYS_SYMBOL_USCORE` macro
|
|
||||||
"""
|
|
||||||
name = 'libffi'
|
|
||||||
version = '3.2.1'
|
|
||||||
url = 'https://github.com/libffi/libffi/archive/v{version}.tar.gz'
|
|
||||||
|
|
||||||
patches = ['remove-version-info.patch',
|
|
||||||
# This patch below is already included into libffi's master
|
|
||||||
# branch and included in the pre-release 3.3rc0...so we should
|
|
||||||
# remove this when we update the version number for libffi
|
|
||||||
'fix-includedir.patch']
|
|
||||||
|
|
||||||
def should_build(self, arch):
|
|
||||||
return not exists(join(self.ctx.get_libs_dir(arch.arch), 'libffi.so'))
|
|
||||||
|
|
||||||
def build_arch(self, arch):
|
|
||||||
env = self.get_recipe_env(arch)
|
|
||||||
with current_directory(self.get_build_dir(arch.arch)):
|
|
||||||
if not exists('configure'):
|
|
||||||
shprint(sh.Command('./autogen.sh'), _env=env)
|
|
||||||
shprint(sh.Command('autoreconf'), '-vif', _env=env)
|
|
||||||
shprint(sh.Command('./configure'),
|
|
||||||
'--host=' + arch.command_prefix,
|
|
||||||
'--prefix=' + self.get_build_dir(arch.arch),
|
|
||||||
'--disable-builddir',
|
|
||||||
'--enable-shared', _env=env)
|
|
||||||
|
|
||||||
shprint(sh.make, '-j', str(cpu_count()), 'libffi.la', _env=env)
|
|
||||||
|
|
||||||
host_build = self.get_build_dir(arch.arch)
|
|
||||||
ensure_dir(self.ctx.get_libs_dir(arch.arch))
|
|
||||||
shprint(sh.cp,
|
|
||||||
join(host_build, '.libs', 'libffi.so'),
|
|
||||||
self.ctx.get_libs_dir(arch.arch))
|
|
||||||
|
|
||||||
def get_include_dirs(self, arch):
|
|
||||||
return [join(self.get_build_dir(arch.arch), 'include')]
|
|
||||||
|
|
||||||
|
|
||||||
recipe = LibffiRecipe()
|
|
|
@ -1,35 +0,0 @@
|
||||||
diff -Naur libffi/Android.mk b/Android.mk
|
|
||||||
--- libffi/Android.mk 2015-12-22 17:00:48.025478556 -0600
|
|
||||||
+++ b/Android.mk 2015-12-22 17:02:23.999249390 -0600
|
|
||||||
@@ -23,23 +23,20 @@
|
|
||||||
# Build rules for the target.
|
|
||||||
#
|
|
||||||
|
|
||||||
-# We only build ffi for mips.
|
|
||||||
-ifeq ($(TARGET_ARCH),mips)
|
|
||||||
|
|
||||||
- include $(CLEAR_VARS)
|
|
||||||
+include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
- ffi_arch := $(TARGET_ARCH)
|
|
||||||
- ffi_os := $(TARGET_OS)
|
|
||||||
+ffi_arch := $(TARGET_ARCH)
|
|
||||||
+ffi_os := $(TARGET_OS)
|
|
||||||
|
|
||||||
- # This include just keeps the nesting a bit saner.
|
|
||||||
- include $(LOCAL_PATH)/Libffi.mk
|
|
||||||
+# This include just keeps the nesting a bit saner.
|
|
||||||
+include $(LOCAL_PATH)/Libffi.mk
|
|
||||||
|
|
||||||
- LOCAL_MODULE_TAGS := optional
|
|
||||||
- LOCAL_MODULE := libffi
|
|
||||||
+LOCAL_MODULE_TAGS := optional
|
|
||||||
+LOCAL_MODULE := libffi
|
|
||||||
|
|
||||||
- include $(BUILD_SHARED_LIBRARY)
|
|
||||||
+include $(BUILD_SHARED_LIBRARY)
|
|
||||||
|
|
||||||
-endif
|
|
||||||
|
|
||||||
# Also include the rules for the test suite.
|
|
||||||
include external/libffi/testsuite/Android.mk
|
|
|
@ -1,34 +0,0 @@
|
||||||
From 982b89c01aca99c7bc229914fc1521f96930919b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yen Chi Hsuan <yan12125@gmail.com>
|
|
||||||
Date: Sun, 13 Nov 2016 19:17:19 +0800
|
|
||||||
Subject: [PATCH] Install public headers in the standard path
|
|
||||||
|
|
||||||
---
|
|
||||||
include/Makefile.am | 3 +--
|
|
||||||
libffi.pc.in | 2 +-
|
|
||||||
2 files changed, 2 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/Makefile.am b/include/Makefile.am
|
|
||||||
index bb241e88..c59df9fb 100644
|
|
||||||
--- a/include/Makefile.am
|
|
||||||
+++ b/include/Makefile.am
|
|
||||||
@@ -6,5 +6,4 @@ DISTCLEANFILES=ffitarget.h
|
|
||||||
noinst_HEADERS=ffi_common.h ffi_cfi.h
|
|
||||||
EXTRA_DIST=ffi.h.in
|
|
||||||
|
|
||||||
-includesdir = $(libdir)/@PACKAGE_NAME@-@PACKAGE_VERSION@/include
|
|
||||||
-nodist_includes_HEADERS = ffi.h ffitarget.h
|
|
||||||
+nodist_include_HEADERS = ffi.h ffitarget.h
|
|
||||||
diff --git a/libffi.pc.in b/libffi.pc.in
|
|
||||||
index edf6fde5..6fad83b4 100644
|
|
||||||
--- a/libffi.pc.in
|
|
||||||
+++ b/libffi.pc.in
|
|
||||||
@@ -2,7 +2,7 @@ prefix=@prefix@
|
|
||||||
exec_prefix=@exec_prefix@
|
|
||||||
libdir=@libdir@
|
|
||||||
toolexeclibdir=@toolexeclibdir@
|
|
||||||
-includedir=${libdir}/@PACKAGE_NAME@-@PACKAGE_VERSION@/include
|
|
||||||
+includedir=@includedir@
|
|
||||||
|
|
||||||
Name: @PACKAGE_NAME@
|
|
||||||
Description: Library supporting Foreign Function Interfaces
|
|
|
@ -1,12 +0,0 @@
|
||||||
diff -Naur libffi/Makefile.am b/Makefile.am
|
|
||||||
--- libffi/Makefile.am 2014-11-12 06:00:59.000000000 -0600
|
|
||||||
+++ b/Makefile.am 2015-12-23 15:57:10.363148806 -0600
|
|
||||||
@@ -249,7 +249,7 @@
|
|
||||||
AM_CFLAGS += -DFFI_DEBUG
|
|
||||||
endif
|
|
||||||
|
|
||||||
-libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
|
|
||||||
+libffi_la_LDFLAGS = -no-undefined -avoid-version $(LTLDFLAGS) $(AM_LTLDFLAGS)
|
|
||||||
|
|
||||||
AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
|
|
||||||
AM_CCASFLAGS = $(AM_CPPFLAGS)
|
|
|
@ -1,33 +0,0 @@
|
||||||
from pythonforandroid.toolchain import shprint, current_directory
|
|
||||||
from pythonforandroid.recipe import Recipe
|
|
||||||
from multiprocessing import cpu_count
|
|
||||||
from os.path import exists
|
|
||||||
import sh
|
|
||||||
|
|
||||||
|
|
||||||
class LibSecp256k1Recipe(Recipe):
|
|
||||||
|
|
||||||
version = 'b0452e6'
|
|
||||||
url = 'https://github.com/bitcoin-core/secp256k1/archive/{version}.zip'
|
|
||||||
|
|
||||||
def build_arch(self, arch):
|
|
||||||
super(LibSecp256k1Recipe, self).build_arch(arch)
|
|
||||||
env = self.get_recipe_env(arch)
|
|
||||||
with current_directory(self.get_build_dir(arch.arch)):
|
|
||||||
if not exists('configure'):
|
|
||||||
shprint(sh.Command('./autogen.sh'), _env=env)
|
|
||||||
shprint(
|
|
||||||
sh.Command('./configure'),
|
|
||||||
'--host=' + arch.toolchain_prefix,
|
|
||||||
'--prefix=' + self.ctx.get_python_install_dir(),
|
|
||||||
'--enable-shared',
|
|
||||||
'--enable-module-recovery',
|
|
||||||
'--enable-experimental',
|
|
||||||
'--enable-module-ecdh',
|
|
||||||
_env=env)
|
|
||||||
shprint(sh.make, '-j' + str(cpu_count()), _env=env)
|
|
||||||
libs = ['.libs/libsecp256k1.so']
|
|
||||||
self.install_libs(arch, *libs)
|
|
||||||
|
|
||||||
|
|
||||||
recipe = LibSecp256k1Recipe()
|
|
|
@ -1,32 +0,0 @@
|
||||||
import glob
|
|
||||||
from pythonforandroid.recipe import CompiledComponentsPythonRecipe, Recipe
|
|
||||||
from os.path import join
|
|
||||||
import os
|
|
||||||
import sh
|
|
||||||
|
|
||||||
|
|
||||||
class NetifacesRecipe(CompiledComponentsPythonRecipe):
|
|
||||||
version = '0.10.7'
|
|
||||||
url = 'https://files.pythonhosted.org/packages/81/39/4e9a026265ba944ddf1fea176dbb29e0fe50c43717ba4fcf3646d099fe38/netifaces-{version}.tar.gz'
|
|
||||||
depends = [('python2', 'python3crystax'), 'setuptools']
|
|
||||||
call_hostpython_via_targetpython = False
|
|
||||||
patches = ['socket-ioctls.patch']
|
|
||||||
|
|
||||||
def get_recipe_env(self, arch):
|
|
||||||
env = super(NetifacesRecipe, self).get_recipe_env(arch)
|
|
||||||
|
|
||||||
env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
|
|
||||||
|
|
||||||
if self.ctx.ndk == 'crystax':
|
|
||||||
# only keeps major.minor (discards patch)
|
|
||||||
python_version = self.ctx.python_recipe.version
|
|
||||||
ndk_dir_python = os.path.join(self.ctx.ndk_dir, 'sources/python/', python_version)
|
|
||||||
env['LDFLAGS'] += ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
|
|
||||||
env['LDFLAGS'] += ' -lpython{}'.format(python_version)
|
|
||||||
# until `pythonforandroid/archs.py` gets merged upstream:
|
|
||||||
# https://github.com/kivy/python-for-android/pull/1250/files#diff-569e13021e33ced8b54385f55b49cbe6
|
|
||||||
env['CFLAGS'] += ' -I{}/include/python/'.format(ndk_dir_python)
|
|
||||||
|
|
||||||
return env
|
|
||||||
|
|
||||||
recipe = NetifacesRecipe()
|
|
|
@ -1,29 +0,0 @@
|
||||||
--- a/netifaces.c 2018-09-25 21:26:48.238476102 +0100
|
|
||||||
+++ b/netifaces.c 2018-09-25 21:55:14.201995669 +0100
|
|
||||||
@@ -22,6 +22,10 @@
|
|
||||||
obj = Py_InitModule3((name), (methods), (doc));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#ifndef HAVE_SOCKET_IOCTLS
|
|
||||||
+#define HAVE_SOCKET_IOCTLS 1
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
#ifndef WIN32
|
|
||||||
|
|
||||||
# include <sys/types.h>
|
|
||||||
@@ -178,12 +182,12 @@
|
|
||||||
# include <ifaddrs.h>
|
|
||||||
# endif /* HAVE_GETIFADDRS */
|
|
||||||
|
|
||||||
-# if !HAVE_GETIFADDRS && (!HAVE_SOCKET_IOCTLS || !HAVE_SIOCGIFCONF)
|
|
||||||
+//# if !HAVE_GETIFADDRS && (!HAVE_SOCKET_IOCTLS || !HAVE_SIOCGIFCONF)
|
|
||||||
/* If the platform doesn't define, what we need, barf. If you're seeing this,
|
|
||||||
it means you need to write suitable code to retrieve interface information
|
|
||||||
on your system. */
|
|
||||||
-# error You need to add code for your platform.
|
|
||||||
-# endif
|
|
||||||
+//# error You need to add code for your platform.
|
|
||||||
+//# endif
|
|
||||||
|
|
||||||
#else /* defined(WIN32) */
|
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
from functools import partial
|
|
||||||
|
|
||||||
from pythonforandroid.recipe import Recipe
|
|
||||||
from pythonforandroid.toolchain import shprint, current_directory
|
|
||||||
from os.path import join
|
|
||||||
import sh
|
|
||||||
|
|
||||||
|
|
||||||
class OpenSSLRecipe(Recipe):
|
|
||||||
version = '1.1'
|
|
||||||
url_version = '1.1.1k'
|
|
||||||
url = 'https://www.openssl.org/source/openssl-{url_version}.tar.gz'
|
|
||||||
|
|
||||||
@property
|
|
||||||
def versioned_url(self):
|
|
||||||
if self.url is None:
|
|
||||||
return None
|
|
||||||
return self.url.format(url_version=self.url_version)
|
|
||||||
|
|
||||||
def should_build(self, arch):
|
|
||||||
return not self.has_libs(arch, 'libssl' + self.version + '.so',
|
|
||||||
'libcrypto' + self.version + '.so')
|
|
||||||
|
|
||||||
def check_symbol(self, env, sofile, symbol):
|
|
||||||
nm = env.get('NM', 'nm')
|
|
||||||
syms = sh.sh('-c', "{} -gp {} | cut -d' ' -f3".format(
|
|
||||||
nm, sofile), _env=env).splitlines()
|
|
||||||
if symbol in syms:
|
|
||||||
return True
|
|
||||||
print('{} missing symbol {}; rebuilding'.format(sofile, symbol))
|
|
||||||
return False
|
|
||||||
|
|
||||||
def get_recipe_env(self, arch=None):
|
|
||||||
env = super(OpenSSLRecipe, self).get_recipe_env(arch)
|
|
||||||
env['OPENSSL_VERSION'] = self.version
|
|
||||||
env['MAKE'] = 'make' # This removes the '-j5', which isn't safe
|
|
||||||
env['CFLAGS'] += ' ' + env['LDFLAGS']
|
|
||||||
env['CC'] += ' ' + env['LDFLAGS']
|
|
||||||
env['ANDROID_NDK'] = self.ctx.ndk_dir
|
|
||||||
return env
|
|
||||||
|
|
||||||
def select_build_arch(self, arch):
|
|
||||||
aname = arch.arch
|
|
||||||
if 'arm64' in aname:
|
|
||||||
return 'android-arm64'
|
|
||||||
if 'v7a' in aname:
|
|
||||||
return 'android-arm'
|
|
||||||
if 'arm' in aname:
|
|
||||||
return 'android'
|
|
||||||
return 'linux-armv4'
|
|
||||||
|
|
||||||
def build_arch(self, arch):
|
|
||||||
env = self.get_recipe_env(arch)
|
|
||||||
with current_directory(self.get_build_dir(arch.arch)):
|
|
||||||
# sh fails with code 255 trying to execute ./Configure
|
|
||||||
# so instead we manually run perl passing in Configure
|
|
||||||
perl = sh.Command('perl')
|
|
||||||
buildarch = self.select_build_arch(arch)
|
|
||||||
|
|
||||||
config_args = ['shared', 'no-dso', 'no-asm']
|
|
||||||
config_args.append(buildarch)
|
|
||||||
shprint(perl, 'Configure', *config_args, _env=env)
|
|
||||||
self.apply_patch('disable-sover.patch', arch.arch)
|
|
||||||
|
|
||||||
makefile = join(self.get_build_dir(arch.arch), 'Makefile')
|
|
||||||
sh.sed('-i', 's/CROSS_COMPILE=arm-linux-androideabi-/CROSS_COMPILE=/g', makefile)
|
|
||||||
sh.sed('-i', 's/CROSS_COMPILE=aarch64-linux-android-/CROSS_COMPILE=/g', makefile)
|
|
||||||
shprint(sh.make, 'build_libs', _env=env)
|
|
||||||
|
|
||||||
self.install_libs(arch, 'libssl.a', 'libssl' + self.version + '.so',
|
|
||||||
'libcrypto.a', 'libcrypto' + self.version + '.so')
|
|
||||||
|
|
||||||
recipe = OpenSSLRecipe()
|
|
|
@ -1,11 +0,0 @@
|
||||||
--- openssl/Makefile.orig 2018-10-20 22:49:40.418310423 +0200
|
|
||||||
+++ openssl/Makefile 2018-10-20 22:50:23.347322403 +0200
|
|
||||||
@@ -19,7 +19,7 @@
|
|
||||||
SHLIB_MAJOR=1
|
|
||||||
SHLIB_MINOR=1
|
|
||||||
SHLIB_TARGET=linux-shared
|
|
||||||
-SHLIB_EXT=.so.$(SHLIB_VERSION_NUMBER)
|
|
||||||
+SHLIB_EXT=$(SHLIB_VERSION_NUMBER).so
|
|
||||||
SHLIB_EXT_SIMPLE=.so
|
|
||||||
SHLIB_EXT_IMPORT=
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
--- openssl/Makefile.shared 2016-05-03 15:44:42.000000000 +0200
|
|
||||||
+++ patch/Makefile.shared 2016-07-14 00:08:37.268792948 +0200
|
|
||||||
@@ -147,11 +147,11 @@
|
|
||||||
DETECT_GNU_LD=($(CC) -Wl,-V /dev/null 2>&1 | grep '^GNU ld' )>/dev/null
|
|
||||||
|
|
||||||
DO_GNU_SO=$(CALC_VERSIONS); \
|
|
||||||
- SHLIB=lib$(LIBNAME).so; \
|
|
||||||
+ SHLIB=lib$(LIBNAME)$(OPENSSL_VERSION).so; \
|
|
||||||
SHLIB_SUFFIX=; \
|
|
||||||
ALLSYMSFLAGS='-Wl,--whole-archive'; \
|
|
||||||
NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
|
|
||||||
- SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"
|
|
||||||
+ SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB"
|
|
||||||
|
|
||||||
DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"
|
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
from pythonforandroid.recipe import CythonRecipe
|
|
||||||
from pythonforandroid.toolchain import shprint, current_directory, info
|
|
||||||
from pythonforandroid.patching import will_build
|
|
||||||
import sh
|
|
||||||
from os.path import join
|
|
||||||
|
|
||||||
|
|
||||||
class PyjniusRecipe(CythonRecipe):
|
|
||||||
version = '1.3.0'
|
|
||||||
url = 'https://github.com/kivy/pyjnius/archive/{version}.zip'
|
|
||||||
name = 'pyjnius'
|
|
||||||
depends = [('genericndkbuild', 'sdl2', 'sdl'), 'six']
|
|
||||||
site_packages_name = 'jnius'
|
|
||||||
|
|
||||||
patches = [('sdl2_jnienv_getter.patch', will_build('sdl2')),
|
|
||||||
('genericndkbuild_jnienv_getter.patch', will_build('genericndkbuild'))]
|
|
||||||
|
|
||||||
def get_recipe_env(self, arch):
|
|
||||||
env = super(PyjniusRecipe, self).get_recipe_env(arch)
|
|
||||||
|
|
||||||
return env
|
|
||||||
|
|
||||||
def postbuild_arch(self, arch):
|
|
||||||
super(PyjniusRecipe, self).postbuild_arch(arch)
|
|
||||||
info('Copying pyjnius java class to classes build dir')
|
|
||||||
with current_directory(self.get_build_dir(arch.arch)):
|
|
||||||
shprint(sh.cp, '-a', join('jnius', 'src', 'org'), self.ctx.javaclass_dir)
|
|
||||||
|
|
||||||
|
|
||||||
recipe = PyjniusRecipe()
|
|
|
@ -1,25 +0,0 @@
|
||||||
diff --git a/jnius/jnius_jvm_android.pxi b/jnius/jnius_jvm_android.pxi
|
|
||||||
index ac89fec..71daa43 100644
|
|
||||||
--- a/jnius/jnius_jvm_android.pxi
|
|
||||||
+++ b/jnius/jnius_jvm_android.pxi
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
# on android, rely on SDL to get the JNI env
|
|
||||||
-cdef extern JNIEnv *SDL_ANDROID_GetJNIEnv()
|
|
||||||
+cdef extern JNIEnv *WebView_AndroidGetJNIEnv()
|
|
||||||
|
|
||||||
cdef JNIEnv *get_platform_jnienv():
|
|
||||||
- return SDL_ANDROID_GetJNIEnv()
|
|
||||||
+ return <JNIEnv*>WebView_AndroidGetJNIEnv()
|
|
||||||
diff --git a/jnius/env.py b/jnius/env.py
|
|
||||||
--- a/jnius/env.py
|
|
||||||
+++ b/jnius/env.py
|
|
||||||
@@ -185,10 +185,10 @@ except ImportError:
|
|
||||||
|
|
||||||
def get_libraries(platform):
|
|
||||||
if platform == 'android':
|
|
||||||
# for android, we use SDL...
|
|
||||||
- return ['sdl', 'log']
|
|
||||||
+ return ['main', 'log']
|
|
||||||
|
|
||||||
elif platform == 'win32':
|
|
||||||
return ['jvm']
|
|
|
@ -1,26 +0,0 @@
|
||||||
diff --git a/jnius/jnius_jvm_android.pxi b/jnius/jnius_jvm_android.pxi
|
|
||||||
index ac89fec..71daa43 100644
|
|
||||||
--- a/jnius/jnius_jvm_android.pxi
|
|
||||||
+++ b/jnius/jnius_jvm_android.pxi
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
# on android, rely on SDL to get the JNI env
|
|
||||||
-cdef extern JNIEnv *SDL_ANDROID_GetJNIEnv()
|
|
||||||
+cdef extern JNIEnv *SDL_AndroidGetJNIEnv()
|
|
||||||
|
|
||||||
cdef JNIEnv *get_platform_jnienv():
|
|
||||||
- return SDL_ANDROID_GetJNIEnv()
|
|
||||||
+ return <JNIEnv*>SDL_AndroidGetJNIEnv()
|
|
||||||
diff --git a/env.py b/env.py
|
|
||||||
index 740510f..0c8e55f 100644
|
|
||||||
--- a/jnius/env.py
|
|
||||||
+++ b/jnius/env.py
|
|
||||||
@@ -185,10 +185,10 @@ except ImportError:
|
|
||||||
|
|
||||||
def get_libraries(platform):
|
|
||||||
if platform == 'android':
|
|
||||||
# for android, we use SDL...
|
|
||||||
- return ['sdl', 'log']
|
|
||||||
+ return ['SDL2', 'log']
|
|
||||||
|
|
||||||
elif platform == 'win32':
|
|
||||||
return ['jvm']
|
|
|
@ -1,377 +0,0 @@
|
||||||
from pythonforandroid.recipe import TargetPythonRecipe
|
|
||||||
from pythonforandroid.toolchain import shprint, current_directory
|
|
||||||
from pythonforandroid.logger import info, error
|
|
||||||
from pythonforandroid.util import ensure_dir, temp_directory
|
|
||||||
from os.path import exists, join
|
|
||||||
import os
|
|
||||||
import glob
|
|
||||||
import sh
|
|
||||||
from sh import Command
|
|
||||||
|
|
||||||
# This is the content of opensslconf.h taken from
|
|
||||||
# ndkdir/build/tools/build-target-openssl.sh
|
|
||||||
OPENSSLCONF = """#if defined(__ARM_ARCH_5TE__)
|
|
||||||
#include "opensslconf_armeabi.h"
|
|
||||||
#elif defined(__ARM_ARCH_7A__) && !defined(__ARM_PCS_VFP)
|
|
||||||
#include "opensslconf_armeabi_v7a.h"
|
|
||||||
#elif defined(__ARM_ARCH_7A__) && defined(__ARM_PCS_VFP)
|
|
||||||
#include "opensslconf_armeabi_v7a_hard.h"
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
#include "opensslconf_arm64_v8a.h"
|
|
||||||
#elif defined(__i386__)
|
|
||||||
#include "opensslconf_x86.h"
|
|
||||||
#elif defined(__x86_64__)
|
|
||||||
#include "opensslconf_x86_64.h"
|
|
||||||
#elif defined(__mips__) && !defined(__mips64)
|
|
||||||
#include "opensslconf_mips.h"
|
|
||||||
#elif defined(__mips__) && defined(__mips64)
|
|
||||||
#include "opensslconf_mips64.h"
|
|
||||||
#else
|
|
||||||
#error "Unsupported ABI"
|
|
||||||
#endif
|
|
||||||
"""
|
|
||||||
LATEST_FULL_VERSION = {
|
|
||||||
'3.5': '3.5.1',
|
|
||||||
'3.6': '3.6.6',
|
|
||||||
'3.7': '3.7.1',
|
|
||||||
'3.9': '3.9.6'
|
|
||||||
}
|
|
||||||
|
|
||||||
def realpath(fname):
|
|
||||||
"""
|
|
||||||
Own implementation of os.realpath which may be broken in some python versions
|
|
||||||
Returns: the absolute path o
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
if not os.path.islink(fname):
|
|
||||||
return os.path.abspath(fname)
|
|
||||||
|
|
||||||
abs_path = os.path.abspath(fname).split(os.sep)[:-1]
|
|
||||||
rel_path = os.readlink(fname)
|
|
||||||
|
|
||||||
if os.path.abspath(rel_path) == rel_path:
|
|
||||||
return rel_path
|
|
||||||
|
|
||||||
rel_path = rel_path.split(os.sep)
|
|
||||||
for folder in rel_path:
|
|
||||||
if folder == '..':
|
|
||||||
abs_path.pop()
|
|
||||||
else:
|
|
||||||
abs_path.append(folder)
|
|
||||||
return os.sep.join(abs_path)
|
|
||||||
|
|
||||||
class Python3Recipe(TargetPythonRecipe):
|
|
||||||
version = '3.9'
|
|
||||||
url = ''
|
|
||||||
name = 'python3crystax'
|
|
||||||
|
|
||||||
depends = ['hostpython3crystax', 'sqlite3', 'openssl']
|
|
||||||
conflicts = ['python2', 'python3']
|
|
||||||
|
|
||||||
from_crystax = True
|
|
||||||
|
|
||||||
def download_if_necessary(self):
|
|
||||||
if 'openssl' in self.ctx.recipe_build_order or self.version in ('3.6', '3.7', '3.9'):
|
|
||||||
full_version = LATEST_FULL_VERSION[self.version]
|
|
||||||
Python3Recipe.url = 'https://www.python.org/ftp/python/{0}.{1}.{2}/Python-{0}.{1}.{2}.tgz'.format(*full_version.split('.'))
|
|
||||||
super(Python3Recipe, self).download_if_necessary()
|
|
||||||
|
|
||||||
def get_dir_name(self):
|
|
||||||
name = super(Python3Recipe, self).get_dir_name()
|
|
||||||
name += '-version{}'.format(self.version)
|
|
||||||
return name
|
|
||||||
|
|
||||||
def copy_include_dir(self, source, target):
|
|
||||||
ensure_dir(target)
|
|
||||||
for fname in os.listdir(source):
|
|
||||||
sh.ln('-sf', realpath(join(source, fname)), join(target, fname))
|
|
||||||
|
|
||||||
def _patch_dev_defaults(self, fp, target_ver):
|
|
||||||
for line in fp:
|
|
||||||
if 'OPENSSL_VERSIONS=' in line:
|
|
||||||
versions = line.split('"')[1].split(' ')
|
|
||||||
if versions[0] == target_ver:
|
|
||||||
raise ValueError('Patch not needed')
|
|
||||||
|
|
||||||
if target_ver in versions:
|
|
||||||
versions.remove(target_ver)
|
|
||||||
|
|
||||||
versions.insert(0, target_ver)
|
|
||||||
|
|
||||||
yield 'OPENSSL_VERSIONS="{}"\n'.format(' '.join(versions))
|
|
||||||
else:
|
|
||||||
yield line
|
|
||||||
|
|
||||||
def patch_dev_defaults(self, ssl_recipe):
|
|
||||||
def_fname = join(self.ctx.ndk_dir, 'build', 'tools', 'dev-defaults.sh')
|
|
||||||
try:
|
|
||||||
with open(def_fname, 'r') as fp:
|
|
||||||
s = ''.join(self._patch_dev_defaults(fp,
|
|
||||||
str(ssl_recipe.version)))
|
|
||||||
with open(def_fname, 'w') as fp:
|
|
||||||
fp.write(s)
|
|
||||||
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def include_root(self, arch_name):
|
|
||||||
return join(self.ctx.ndk_dir, 'sources', 'python', self.major_minor_version_string,
|
|
||||||
'include', 'python')
|
|
||||||
|
|
||||||
def link_root(self, arch_name):
|
|
||||||
return join(self.ctx.ndk_dir, 'sources', 'python', self.major_minor_version_string,
|
|
||||||
'libs', arch_name)
|
|
||||||
|
|
||||||
def check_for_sqlite3so(self, sqlite_recipe, arch):
|
|
||||||
dynlib_dir = join(self.ctx.ndk_dir, 'sources', 'python', self.version,
|
|
||||||
'libs', arch.arch, 'modules')
|
|
||||||
|
|
||||||
if os.path.exists(join(dynlib_dir, 'libsqlite3.so')):
|
|
||||||
return 10, 'Shared object exists in ndk'
|
|
||||||
|
|
||||||
major_version = sqlite_recipe.version.split('.')[0]
|
|
||||||
# find out why _ssl.so is missin
|
|
||||||
source_dir = join(self.ctx.ndk_dir, 'sources', 'sqlite', major_version)
|
|
||||||
if not os.path.exists(source_dir):
|
|
||||||
return 0, 'sqlite3 version not present'
|
|
||||||
|
|
||||||
# these two path checks are lifted straight from:
|
|
||||||
# crystax-ndk/build/tools/build-target-python.sh
|
|
||||||
if not os.path.exists(join(source_dir, 'Android.mk')):
|
|
||||||
return 1.1, 'Android.mk is missing in sqlite3 source'
|
|
||||||
|
|
||||||
include_dir = join(source_dir, 'include')
|
|
||||||
if not os.path.exists(join(include_dir, 'sqlite3.h')):
|
|
||||||
return 1.2, 'sqlite3 include dir missing'
|
|
||||||
|
|
||||||
# lastly a check to see whether shared objects for the correct arch
|
|
||||||
# is present in the ndk
|
|
||||||
if not os.path.exists(join(source_dir, 'libs', arch.arch, 'libsqlite3.a')):
|
|
||||||
return 2, 'sqlite3 libs for this arch is missing in ndk'
|
|
||||||
|
|
||||||
return 5, 'Ready to recompile python'
|
|
||||||
|
|
||||||
|
|
||||||
def check_for_sslso(self, ssl_recipe, arch):
|
|
||||||
# type: (Recipe, str)
|
|
||||||
dynlib_dir = join(self.ctx.ndk_dir, 'sources', 'python', self.version,
|
|
||||||
'libs', arch.arch, 'modules')
|
|
||||||
|
|
||||||
if os.path.exists(join(dynlib_dir, '_ssl.so')):
|
|
||||||
return 10, 'Shared object exists in ndk'
|
|
||||||
|
|
||||||
# find out why _ssl.so is missing
|
|
||||||
source_dir = join(self.ctx.ndk_dir, 'sources', 'openssl', ssl_recipe.version)
|
|
||||||
if not os.path.exists(source_dir):
|
|
||||||
return 0, 'Openssl version not present'
|
|
||||||
|
|
||||||
# these two path checks are lifted straight from:
|
|
||||||
# crystax-ndk/build/tools/build-target-python.sh
|
|
||||||
if not os.path.exists(join(source_dir, 'Android.mk')):
|
|
||||||
return 1.1, 'Android.mk is missing in openssl source'
|
|
||||||
|
|
||||||
include_dir = join(source_dir, 'include','openssl')
|
|
||||||
if not os.path.exists(join(include_dir, 'opensslconf.h')):
|
|
||||||
return 1.2, 'Openssl include dir missing'
|
|
||||||
|
|
||||||
under_scored_arch = arch.arch.replace('-', '_')
|
|
||||||
if not os.path.lexists(join(include_dir,
|
|
||||||
'opensslconf_{}.h'.format(under_scored_arch))):
|
|
||||||
return 1.3, 'Opensslconf arch header missing from include'
|
|
||||||
|
|
||||||
# lastly a check to see whether shared objects for the correct arch
|
|
||||||
# is present in the ndk
|
|
||||||
if not os.path.exists(join(source_dir, 'libs', arch.arch)):
|
|
||||||
return 2, 'Openssl libs for this arch is missing in ndk'
|
|
||||||
|
|
||||||
return 5, 'Ready to recompile python'
|
|
||||||
|
|
||||||
def find_Android_mk(self):
|
|
||||||
openssl_dir = join(self.ctx.ndk_dir, 'sources', 'openssl')
|
|
||||||
for version in os.listdir(openssl_dir):
|
|
||||||
mk_path = join(openssl_dir, version, 'Android.mk')
|
|
||||||
if os.path.exists(mk_path):
|
|
||||||
return mk_path
|
|
||||||
|
|
||||||
def find_sqlite3_Android_mk(self):
|
|
||||||
sqlite_dir = join(self.ctx.ndk_dir, 'sources', 'sqlite')
|
|
||||||
for version in os.listdir(sqlite_dir):
|
|
||||||
mk_path = join(sqlite_dir, version, 'Android.mk')
|
|
||||||
if os.path.exists(mk_path):
|
|
||||||
return mk_path
|
|
||||||
|
|
||||||
def prebuild_arch(self, arch):
|
|
||||||
super(Python3Recipe, self).prebuild_arch(arch)
|
|
||||||
if self.version in ('3.6', '3.7', '3.9'):
|
|
||||||
Python3Recipe.patches = [
|
|
||||||
'patch/patch_python3.6.patch',
|
|
||||||
'patch/remove_android_api_check.patch',
|
|
||||||
'patch/selectors.patch'
|
|
||||||
]
|
|
||||||
|
|
||||||
if self.version in ('3.9'):
|
|
||||||
Python3Recipe.patches = [
|
|
||||||
'patch/remove_android_api_check.patch',
|
|
||||||
'patch/patch_python3.9.patch',
|
|
||||||
'patch/platlibdir.patch',
|
|
||||||
'patch/strdup.patch',
|
|
||||||
|
|
||||||
# from https://github.com/kivy/python-for-android/blob/develop/pythonforandroid/recipes/python3/__init__.py#L63
|
|
||||||
'patch/pyconfig_detection.patch',
|
|
||||||
'patch/reproducible-buildinfo.diff',
|
|
||||||
'patch/py3.8.1.patch'
|
|
||||||
]
|
|
||||||
|
|
||||||
if sh.which('lld') is not None:
|
|
||||||
Python3Recipe.patches += ['patch/py3.8.1_fix_cortex_a8.patch']
|
|
||||||
|
|
||||||
build_dir = self.get_build_dir(arch.arch)
|
|
||||||
|
|
||||||
# copy bundled libffi to _ctypes
|
|
||||||
sh.cp("-r", join(self.get_recipe_dir(), 'libffi'), join(build_dir, 'Modules', '_ctypes'))
|
|
||||||
print #####Copied bundle####'
|
|
||||||
|
|
||||||
shprint(sh.ln, '-sf',
|
|
||||||
realpath(join(build_dir, 'Lib/site-packages/README.txt')),
|
|
||||||
join(build_dir, 'Lib/site-packages/README'))
|
|
||||||
python_build_files = ['android.mk', 'config.c', 'interpreter.c']
|
|
||||||
ndk_build_tools_python_dir = join(self.ctx.ndk_dir, 'build', 'tools', 'build-target-python')
|
|
||||||
for python_build_file in python_build_files:
|
|
||||||
shprint(sh.cp, join(self.get_recipe_dir(), '{}.{}'.format(python_build_file, self.version)),
|
|
||||||
join(ndk_build_tools_python_dir, '{}.{}'.format(python_build_file, self.version)))
|
|
||||||
ndk_sources_python_dir = join(self.ctx.ndk_dir, 'sources', 'python')
|
|
||||||
if not os.path.exists(join(ndk_sources_python_dir, self.version)):
|
|
||||||
os.mkdir(join(ndk_sources_python_dir, self.version))
|
|
||||||
sh.sed('s#3.5#{}#'.format(self.version),
|
|
||||||
join(ndk_sources_python_dir, '3.5/Android.mk'),
|
|
||||||
_out=join(ndk_sources_python_dir, '{}/Android.mk.tmp'.format(self.version)))
|
|
||||||
sh.sed('s#{}m#{}#'.format(self.version, self.version),
|
|
||||||
join(ndk_sources_python_dir, '{}/Android.mk.tmp'.format(self.version)),
|
|
||||||
_out=join(ndk_sources_python_dir, '{}/Android.mk'.format(self.version)))
|
|
||||||
shprint(sh.rm, '-f', join(ndk_sources_python_dir, '{}/Android.mk.tmp'.format(self.version)))
|
|
||||||
|
|
||||||
def build_arch(self, arch):
|
|
||||||
rebuild = False
|
|
||||||
|
|
||||||
if self.from_crystax and 'sqlite3' in self.ctx.recipe_build_order:
|
|
||||||
info('checking sqlite3 in crystax-python')
|
|
||||||
sqlite_recipe = self.get_recipe('sqlite3', self.ctx)
|
|
||||||
stage, msg = self.check_for_sqlite3so(sqlite_recipe, arch)
|
|
||||||
major_version = sqlite_recipe.version.split('.')[0]
|
|
||||||
info(msg)
|
|
||||||
sqlite3_build_dir = sqlite_recipe.get_build_dir(arch.arch)
|
|
||||||
sqlite3_ndk_dir = join(self.ctx.ndk_dir, 'sources', 'sqlite', major_version)
|
|
||||||
|
|
||||||
if stage < 2:
|
|
||||||
info('copying sqlite3 Android.mk to ndk')
|
|
||||||
ensure_dir(sqlite3_ndk_dir)
|
|
||||||
if stage < 1.2:
|
|
||||||
# copy include folder and Android.mk to ndk
|
|
||||||
mk_path = self.find_sqlite3_Android_mk()
|
|
||||||
if mk_path is None:
|
|
||||||
raise IOError('Android.mk file could not be found in '
|
|
||||||
'any versions in ndk->sources->sqlite')
|
|
||||||
if not ssl_recipe.version in mk_path:
|
|
||||||
shprint(sh.cp, '-f', mk_path, sqlite3_ndk_dir)
|
|
||||||
|
|
||||||
include_dir = join(sqlite3_build_dir, 'include')
|
|
||||||
if stage < 1.3:
|
|
||||||
ndk_include_dir = join(sqlite3_ndk_dir, 'include')
|
|
||||||
ensure_dir(ndk_include_dir)
|
|
||||||
shprint(sh.cp, '-f', join(sqlite3_build_dir, 'sqlite3.h'), join(ndk_include_dir, 'sqlite3.h'))
|
|
||||||
shprint(sh.cp, '-f', join(sqlite3_build_dir, 'sqlite3ext.h'), join(ndk_include_dir, 'sqlite3ext.h'))
|
|
||||||
|
|
||||||
if stage < 3:
|
|
||||||
info('copying sqlite3 libs to ndk')
|
|
||||||
arch_ndk_lib = join(sqlite3_ndk_dir, 'libs', arch.arch)
|
|
||||||
ensure_dir(arch_ndk_lib)
|
|
||||||
shprint(sh.ln, '-sf',
|
|
||||||
realpath(join(sqlite3_build_dir, 'libsqlite3')),
|
|
||||||
join(sqlite3_build_dir, 'libsqlite3.a'))
|
|
||||||
libs = ['libs/{}/libsqlite3.a'.format(arch.arch)]
|
|
||||||
cmd = [join(sqlite3_build_dir, lib) for lib in libs] + [arch_ndk_lib]
|
|
||||||
shprint(sh.cp, '-f', *cmd)
|
|
||||||
|
|
||||||
if stage < 10:
|
|
||||||
rebuild = True
|
|
||||||
|
|
||||||
# If openssl is needed we may have to recompile cPython to get the
|
|
||||||
# ssl.py module working properly
|
|
||||||
if self.from_crystax and 'openssl' in self.ctx.recipe_build_order:
|
|
||||||
info('openssl and crystax-python combination may require '
|
|
||||||
'recompilation of python...')
|
|
||||||
ssl_recipe = self.get_recipe('openssl', self.ctx)
|
|
||||||
stage, msg = self.check_for_sslso(ssl_recipe, arch)
|
|
||||||
stage = 0 if stage < 5 else stage
|
|
||||||
info(msg)
|
|
||||||
openssl_build_dir = ssl_recipe.get_build_dir(arch.arch)
|
|
||||||
openssl_ndk_dir = join(self.ctx.ndk_dir, 'sources', 'openssl', ssl_recipe.version)
|
|
||||||
|
|
||||||
if stage < 2:
|
|
||||||
info('Copying openssl headers and Android.mk to ndk')
|
|
||||||
ensure_dir(openssl_ndk_dir)
|
|
||||||
if stage < 1.2:
|
|
||||||
# copy include folder and Android.mk to ndk
|
|
||||||
mk_path = self.find_Android_mk()
|
|
||||||
if mk_path is None:
|
|
||||||
raise IOError('Android.mk file could not be found in '
|
|
||||||
'any versions in ndk->sources->openssl')
|
|
||||||
shprint(sh.cp, mk_path, openssl_ndk_dir)
|
|
||||||
|
|
||||||
include_dir = join(openssl_build_dir, 'include')
|
|
||||||
if stage < 1.3:
|
|
||||||
ndk_include_dir = join(openssl_ndk_dir, 'include', 'openssl')
|
|
||||||
self.copy_include_dir(join(include_dir, 'openssl'), ndk_include_dir)
|
|
||||||
|
|
||||||
target_conf = join(openssl_ndk_dir, 'include', 'openssl',
|
|
||||||
'opensslconf.h')
|
|
||||||
shprint(sh.rm, '-f', target_conf)
|
|
||||||
# overwrite opensslconf.h
|
|
||||||
with open(target_conf, 'w') as fp:
|
|
||||||
fp.write(OPENSSLCONF)
|
|
||||||
|
|
||||||
if stage < 1.4:
|
|
||||||
# move current conf to arch specific conf in ndk
|
|
||||||
under_scored_arch = arch.arch.replace('-', '_')
|
|
||||||
shprint(sh.ln, '-sf',
|
|
||||||
realpath(join(include_dir, 'openssl', 'opensslconf.h')),
|
|
||||||
join(openssl_ndk_dir, 'include', 'openssl',
|
|
||||||
'opensslconf_{}.h'.format(under_scored_arch))
|
|
||||||
)
|
|
||||||
|
|
||||||
if stage < 3:
|
|
||||||
info('Copying openssl libs to ndk')
|
|
||||||
arch_ndk_lib = join(openssl_ndk_dir, 'libs', arch.arch)
|
|
||||||
ensure_dir(arch_ndk_lib)
|
|
||||||
shprint(sh.ln, '-sf',
|
|
||||||
realpath(join(openssl_build_dir, 'libcrypto{}.so'.format(ssl_recipe.version))),
|
|
||||||
join(openssl_build_dir, 'libcrypto.so'))
|
|
||||||
shprint(sh.ln, '-sf',
|
|
||||||
realpath(join(openssl_build_dir, 'libssl{}.so'.format(ssl_recipe.version))),
|
|
||||||
join(openssl_build_dir, 'libssl.so'))
|
|
||||||
libs = ['libcrypto.a', 'libcrypto.so', 'libssl.a', 'libssl.so']
|
|
||||||
cmd = [join(openssl_build_dir, lib) for lib in libs] + [arch_ndk_lib]
|
|
||||||
shprint(sh.cp, '-f', *cmd)
|
|
||||||
|
|
||||||
if stage < 10:
|
|
||||||
rebuild = True
|
|
||||||
|
|
||||||
if rebuild:
|
|
||||||
info('Recompiling python-crystax')
|
|
||||||
self.patch_dev_defaults(ssl_recipe)
|
|
||||||
build_script = join(self.ctx.ndk_dir, 'build', 'tools',
|
|
||||||
'build-target-python.sh')
|
|
||||||
|
|
||||||
shprint(Command(build_script),
|
|
||||||
'--ndk-dir={}'.format(self.ctx.ndk_dir),
|
|
||||||
'--abis={}'.format(arch.arch),
|
|
||||||
'-j5', '--verbose',
|
|
||||||
self.get_build_dir(arch.arch))
|
|
||||||
|
|
||||||
info('Extracting CrystaX python3 from NDK package')
|
|
||||||
dirn = self.ctx.get_python_install_dir()
|
|
||||||
ensure_dir(dirn)
|
|
||||||
self.ctx.hostpython = 'python{}'.format(self.version)
|
|
||||||
|
|
||||||
recipe = Python3Recipe()
|
|
|
@ -1,201 +0,0 @@
|
||||||
LOCAL_SRC_FILES := config.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/asdl.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/ast.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/ast_opt.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/ast_unparse.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/bltinmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/bootstrap_hash.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/ceval.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/codecs.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/compile.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/context.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/dtoa.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/dup2.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/dynamic_annotations.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/dynload_shlib.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/errors.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/fileutils.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/formatter_unicode.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/frozen.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/frozenmain.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/future.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/getargs.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/getcompiler.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/getcopyright.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/getopt.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/getplatform.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/getversion.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/graminit.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/hamt.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/hashtable.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/import.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/importdl.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/initconfig.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/marshal.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/modsupport.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/mysnprintf.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/mystrtoul.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pathconfig.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/peephole.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/preconfig.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pyarena.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pyctype.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pyfpe.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pyhash.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pylifecycle.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pymath.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pystate.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pystrcmp.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pystrhex.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pystrtod.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/Python-ast.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pythonrun.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/pytime.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/strdup.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/structmember.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/symtable.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/sysmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/thread.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/traceback.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Python/_warnings.c \
|
|
||||||
\
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/acceler.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/grammar1.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/listnode.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/myreadline.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/node.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/parser.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/parsetok.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/token.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/tokenizer.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/pegen/parse.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/pegen/parse_string.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/pegen/peg_api.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Parser/pegen/pegen.c \
|
|
||||||
\
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/abstract.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/accu.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/boolobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/bytearrayobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/bytes_methods.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/bytesobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/call.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/capsule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/cellobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/classobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/codeobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/complexobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/descrobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/dictobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/enumobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/exceptions.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/fileobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/floatobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/frameobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/funcobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/genobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/genericaliasobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/interpreteridobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/iterobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/listobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/longobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/memoryobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/methodobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/moduleobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/namespaceobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/object.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/obmalloc.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/odictobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/picklebufobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/rangeobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/setobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/sliceobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/structseq.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/tupleobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/typeobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/unicodectype.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/unicodeobject.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Objects/weakrefobject.c \
|
|
||||||
\
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_abc.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/arraymodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_asynciomodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/atexitmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/audioop.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/binascii.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_bisectmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_bz2module.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/cmathmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_codecsmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_collectionsmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_contextvarsmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_csv.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_datetimemodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/errnomodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/faulthandler.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/fcntlmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_functoolsmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/gcmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/getbuildinfo.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/getpath.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_heapqmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/itertoolsmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_localemodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_lsprof.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/main.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_math.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/mathmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/md5module.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/mmapmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_opcode.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_operator.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/ossaudiodev.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/parsermodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_peg_parser.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/posixmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_posixsubprocess.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/pwdmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_queuemodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_randommodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/resource.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/rotatingtree.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/selectmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/sha1module.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/sha256module.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/sha512module.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/signalmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/socketmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_sre.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_stat.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_statisticsmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_struct.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/symtablemodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/termios.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_testbuffer.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_testimportmultiple.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_testmultiphase.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_threadmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/timemodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_tracemalloc.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/unicodedata.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_weakref.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/xxlimited.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/xxmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_xxsubinterpretersmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/xxsubtype.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/zlibmodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_zoneinfo.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/cjkcodecs/_codecs_cn.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/cjkcodecs/_codecs_hk.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/cjkcodecs/_codecs_iso2022.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/cjkcodecs/_codecs_jp.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/cjkcodecs/_codecs_kr.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/cjkcodecs/_codecs_tw.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/cjkcodecs/multibytecodec.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_io/_iomodule.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_io/textio.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_io/iobase.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_io/bufferedio.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_io/stringio.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_io/bytesio.c \
|
|
||||||
$(MY_PYTHON_SRC_ROOT)/Modules/_io/fileio.c
|
|
|
@ -1,138 +0,0 @@
|
||||||
#include <Python.h>
|
|
||||||
|
|
||||||
extern PyObject* PyInit_posix(void);
|
|
||||||
extern PyObject* PyInit_pwd(void);
|
|
||||||
extern PyObject* PyInit_fcntl(void);
|
|
||||||
extern PyObject* PyInit__posixsubprocess(void);
|
|
||||||
extern PyObject* PyInit_termios(void);
|
|
||||||
extern PyObject* PyInit_audioop(void);
|
|
||||||
extern PyObject* PyInit__locale(void);
|
|
||||||
extern PyObject* PyInit_array(void);
|
|
||||||
extern PyObject* PyInit_binascii(void);
|
|
||||||
extern PyObject* PyInit_cmath(void);
|
|
||||||
extern PyObject* PyInit_errno(void);
|
|
||||||
extern PyObject* PyInit_faulthandler(void);
|
|
||||||
extern PyObject* PyInit__tracemalloc(void);
|
|
||||||
extern PyObject* PyInit_gc(void);
|
|
||||||
extern PyObject* PyInit_math(void);
|
|
||||||
extern PyObject* PyInit__md5(void);
|
|
||||||
extern PyObject* PyInit__operator(void);
|
|
||||||
extern PyObject* PyInit__signal(void);
|
|
||||||
extern PyObject* PyInit__sha1(void);
|
|
||||||
extern PyObject* PyInit__sha256(void);
|
|
||||||
extern PyObject* PyInit__sha512(void);
|
|
||||||
extern PyObject* PyInit_time(void);
|
|
||||||
extern PyObject* PyInit__thread(void);
|
|
||||||
extern PyObject* PyInit__codecs(void);
|
|
||||||
extern PyObject* PyInit__weakref(void);
|
|
||||||
extern PyObject* PyInit_xxsubtype(void);
|
|
||||||
extern PyObject* PyInit__xxsubinterpreters(void);
|
|
||||||
extern PyObject* PyInit__random(void);
|
|
||||||
extern PyObject* PyInit_itertools(void);
|
|
||||||
extern PyObject* PyInit__collections(void);
|
|
||||||
extern PyObject* PyInit__heapq(void);
|
|
||||||
extern PyObject* PyInit__bisect(void);
|
|
||||||
extern PyObject* PyInit__symtable(void);
|
|
||||||
extern PyObject* PyInit_mmap(void);
|
|
||||||
extern PyObject* PyInit__csv(void);
|
|
||||||
extern PyObject* PyInit__sre(void);
|
|
||||||
extern PyObject* PyInit_parser(void);
|
|
||||||
extern PyObject* PyInit__struct(void);
|
|
||||||
extern PyObject* PyInit__datetime(void);
|
|
||||||
extern PyObject* PyInit__functools(void);
|
|
||||||
extern PyObject* PyInit_zlib(void);
|
|
||||||
extern PyObject* PyInit__multibytecodec(void);
|
|
||||||
extern PyObject* PyInit__codecs_cn(void);
|
|
||||||
extern PyObject* PyInit__codecs_hk(void);
|
|
||||||
extern PyObject* PyInit__codecs_iso2022(void);
|
|
||||||
extern PyObject* PyInit__codecs_jp(void);
|
|
||||||
extern PyObject* PyInit__codecs_kr(void);
|
|
||||||
extern PyObject* PyInit__codecs_tw(void);
|
|
||||||
extern PyObject* PyInit__winapi(void);
|
|
||||||
extern PyObject* PyInit__lsprof(void);
|
|
||||||
extern PyObject* PyInit__ast(void);
|
|
||||||
extern PyObject* PyInit__io(void);
|
|
||||||
extern PyObject* PyInit_atexit(void);
|
|
||||||
extern PyObject* _PyWarnings_Init(void);
|
|
||||||
extern PyObject* PyInit__string(void);
|
|
||||||
extern PyObject* PyInit__stat(void);
|
|
||||||
extern PyObject* PyInit__opcode(void);
|
|
||||||
extern PyObject* PyMarshal_Init(void);
|
|
||||||
extern PyObject* PyInit__imp(void);
|
|
||||||
|
|
||||||
struct _inittab _PyImport_Inittab[] = {
|
|
||||||
{"posix", PyInit_posix},
|
|
||||||
{"pwd", PyInit_pwd},
|
|
||||||
{"fcntl", PyInit_fcntl},
|
|
||||||
{"_posixsubprocess", PyInit__posixsubprocess},
|
|
||||||
{"termios", PyInit_termios},
|
|
||||||
{"audioop", PyInit_audioop},
|
|
||||||
{"_locale", PyInit__locale},
|
|
||||||
{"array", PyInit_array},
|
|
||||||
{"_ast", PyInit__ast},
|
|
||||||
{"binascii", PyInit_binascii},
|
|
||||||
{"cmath", PyInit_cmath},
|
|
||||||
{"errno", PyInit_errno},
|
|
||||||
{"faulthandler", PyInit_faulthandler},
|
|
||||||
{"gc", PyInit_gc},
|
|
||||||
{"math", PyInit_math},
|
|
||||||
{"_operator", PyInit__operator},
|
|
||||||
{"_signal", PyInit__signal},
|
|
||||||
{"_md5", PyInit__md5},
|
|
||||||
{"_sha1", PyInit__sha1},
|
|
||||||
{"_sha256", PyInit__sha256},
|
|
||||||
{"_sha512", PyInit__sha512},
|
|
||||||
{"time", PyInit_time},
|
|
||||||
{"_thread", PyInit__thread},
|
|
||||||
{"_tracemalloc", PyInit__tracemalloc},
|
|
||||||
{"_codecs", PyInit__codecs},
|
|
||||||
{"_weakref", PyInit__weakref},
|
|
||||||
{"_random", PyInit__random},
|
|
||||||
{"_bisect", PyInit__bisect},
|
|
||||||
{"_heapq", PyInit__heapq},
|
|
||||||
{"_lsprof", PyInit__lsprof},
|
|
||||||
{"itertools", PyInit_itertools},
|
|
||||||
{"_collections", PyInit__collections},
|
|
||||||
{"_symtable", PyInit__symtable},
|
|
||||||
{"mmap", PyInit_mmap},
|
|
||||||
{"_csv", PyInit__csv},
|
|
||||||
{"_sre", PyInit__sre},
|
|
||||||
{"parser", PyInit_parser},
|
|
||||||
{"_struct", PyInit__struct},
|
|
||||||
{"_datetime", PyInit__datetime},
|
|
||||||
{"_functools", PyInit__functools},
|
|
||||||
|
|
||||||
{"xxsubtype", PyInit_xxsubtype},
|
|
||||||
{"_xxsubinterpreters", PyInit__xxsubinterpreters},
|
|
||||||
{"zlib", PyInit_zlib},
|
|
||||||
|
|
||||||
/* CJK codecs */
|
|
||||||
{"_multibytecodec", PyInit__multibytecodec},
|
|
||||||
{"_codecs_cn", PyInit__codecs_cn},
|
|
||||||
{"_codecs_hk", PyInit__codecs_hk},
|
|
||||||
{"_codecs_iso2022", PyInit__codecs_iso2022},
|
|
||||||
{"_codecs_jp", PyInit__codecs_jp},
|
|
||||||
{"_codecs_kr", PyInit__codecs_kr},
|
|
||||||
{"_codecs_tw", PyInit__codecs_tw},
|
|
||||||
|
|
||||||
/* This module "lives in" with marshal.c */
|
|
||||||
{"marshal", PyMarshal_Init},
|
|
||||||
|
|
||||||
/* This lives it with import.c */
|
|
||||||
{"_imp", PyInit__imp},
|
|
||||||
|
|
||||||
/* These entries are here for sys.builtin_module_names */
|
|
||||||
{"builtins", NULL},
|
|
||||||
{"sys", NULL},
|
|
||||||
{"_warnings", _PyWarnings_Init},
|
|
||||||
{"_string", PyInit__string},
|
|
||||||
|
|
||||||
{"_io", PyInit__io},
|
|
||||||
{"atexit", PyInit_atexit},
|
|
||||||
{"_stat", PyInit__stat},
|
|
||||||
{"_opcode", PyInit__opcode},
|
|
||||||
|
|
||||||
/* Sentinel */
|
|
||||||
{0, 0}
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,199 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#include <wchar.h>
|
|
||||||
#include <locale.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#define PYTHON3_STDLIB_REL_PATH "stdlib.zip"
|
|
||||||
#define PYTHON3_MODULES_REL_PATH "modules"
|
|
||||||
#define PYTHON3_DLL_REL_PATH "libpython3.9.so"
|
|
||||||
|
|
||||||
#define SYS_PATH_BUFFER_SIZE (2*(PATH_MAX + 1))
|
|
||||||
|
|
||||||
static char NULL_PTR_STR[] = "NULL";
|
|
||||||
|
|
||||||
static void GetExecutablePath(char* path)
|
|
||||||
{
|
|
||||||
int size = readlink("/proc/self/exe", path, PATH_MAX);
|
|
||||||
if (size < 0)
|
|
||||||
size = 0;
|
|
||||||
path[size] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void GetRelativePathFormat(char* base, char* fmt)
|
|
||||||
{
|
|
||||||
unsigned idx;
|
|
||||||
char *p, *end;
|
|
||||||
end = strrchr(base, '/');
|
|
||||||
for (idx = 0, p = base; *p; ++p, ++idx)
|
|
||||||
{
|
|
||||||
fmt[idx] = *p;
|
|
||||||
if (p == end)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fmt[++idx] = '%';
|
|
||||||
fmt[++idx] = 's';
|
|
||||||
fmt[++idx] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef void (*Py_SetProgramNamePtr)(wchar_t*);
|
|
||||||
typedef void (*Py_SetPathPtr)(const wchar_t*);
|
|
||||||
typedef int (*Py_MainPtr)(int, wchar_t**);
|
|
||||||
typedef void* (*PyMem_RawMallocPtr)(size_t);
|
|
||||||
typedef void (*PyMem_RawFreePtr)(void*);
|
|
||||||
typedef wchar_t* (*Py_DecodeLocalePtr)(const char*, size_t*);
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
|
||||||
{
|
|
||||||
char executable[PATH_MAX + 1] = {0};
|
|
||||||
char pthfmt[PATH_MAX + 1] = {0};
|
|
||||||
char corepath[PATH_MAX + 1] = {0};
|
|
||||||
char stdlibpath[PATH_MAX + 1] = {0};
|
|
||||||
char modpath[PATH_MAX + 1] = {0};
|
|
||||||
char syspath[SYS_PATH_BUFFER_SIZE] = {0};
|
|
||||||
void* core = 0;
|
|
||||||
int retcode = 126;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
Py_SetProgramNamePtr Py_SetProgramName = 0;
|
|
||||||
Py_SetPathPtr Py_SetPath = 0;
|
|
||||||
Py_MainPtr Py_Main = 0;
|
|
||||||
PyMem_RawMallocPtr PyMem_RawMalloc = 0;
|
|
||||||
PyMem_RawFreePtr PyMem_RawFree = 0;
|
|
||||||
Py_DecodeLocalePtr Py_DecodeLocale = 0;
|
|
||||||
|
|
||||||
GetExecutablePath(executable);
|
|
||||||
GetRelativePathFormat(executable, pthfmt);
|
|
||||||
|
|
||||||
snprintf(corepath, PATH_MAX, pthfmt, PYTHON3_DLL_REL_PATH);
|
|
||||||
snprintf(stdlibpath, PATH_MAX, pthfmt, PYTHON3_STDLIB_REL_PATH);
|
|
||||||
snprintf(modpath, PATH_MAX, pthfmt, PYTHON3_MODULES_REL_PATH);
|
|
||||||
snprintf(syspath, SYS_PATH_BUFFER_SIZE-1, "%s:%s", stdlibpath, modpath);
|
|
||||||
|
|
||||||
core = dlopen(corepath, RTLD_LAZY);
|
|
||||||
if (core == 0)
|
|
||||||
{
|
|
||||||
const char* lasterr = dlerror();
|
|
||||||
if (lasterr == 0)
|
|
||||||
lasterr = NULL_PTR_STR;
|
|
||||||
fprintf(stderr, "Fatal Python error: cannot load library: '%s', dlerror: %s\n", corepath, lasterr);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
Py_SetProgramName = (Py_SetProgramNamePtr)dlsym(core, "Py_SetProgramName");
|
|
||||||
if (Py_SetProgramName == 0)
|
|
||||||
{
|
|
||||||
const char* lasterr = dlerror();
|
|
||||||
if (lasterr == 0)
|
|
||||||
lasterr = NULL_PTR_STR;
|
|
||||||
fprintf(stderr, "Fatal Python error: cannot load symbol: '%s' from library '%s', dlerror: %s\n", "Py_SetProgramName", corepath, lasterr);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
Py_SetPath = (Py_SetPathPtr)dlsym(core, "Py_SetPath");
|
|
||||||
if (Py_SetPath == 0)
|
|
||||||
{
|
|
||||||
const char* lasterr = dlerror();
|
|
||||||
if (lasterr == 0)
|
|
||||||
lasterr = NULL_PTR_STR;
|
|
||||||
fprintf(stderr, "Fatal Python error: cannot load symbol: '%s' from library '%s', dlerror: %s\n", "Py_SetPath", corepath, lasterr);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
Py_Main = (Py_MainPtr)dlsym(core, "Py_Main");
|
|
||||||
if (Py_Main == 0)
|
|
||||||
{
|
|
||||||
const char* lasterr = dlerror();
|
|
||||||
if (lasterr == 0)
|
|
||||||
lasterr = NULL_PTR_STR;
|
|
||||||
fprintf(stderr, "Fatal Python error: cannot load symbol: '%s' from library '%s', dlerror: %s\n", "Py_Main", corepath, lasterr);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
PyMem_RawMalloc = (PyMem_RawMallocPtr)dlsym(core, "PyMem_RawMalloc");
|
|
||||||
if (PyMem_RawMalloc == 0)
|
|
||||||
{
|
|
||||||
const char* lasterr = dlerror();
|
|
||||||
if (lasterr == 0)
|
|
||||||
lasterr = NULL_PTR_STR;
|
|
||||||
fprintf(stderr, "Fatal Python error: cannot load symbol: '%s' from library '%s', dlerror: %s\n", "PyMem_RawMalloc", corepath, lasterr);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
PyMem_RawFree = (PyMem_RawFreePtr)dlsym(core, "PyMem_RawFree");
|
|
||||||
if (PyMem_RawFree == 0)
|
|
||||||
{
|
|
||||||
const char* lasterr = dlerror();
|
|
||||||
if (lasterr == 0)
|
|
||||||
lasterr = NULL_PTR_STR;
|
|
||||||
fprintf(stderr, "Fatal Python error: cannot load symbol: '%s' from library '%s', dlerror: %s\n", "PyMem_RawFree", corepath, lasterr);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
Py_DecodeLocale = (Py_DecodeLocalePtr)dlsym(core, "Py_DecodeLocale");
|
|
||||||
if (Py_DecodeLocale == 0)
|
|
||||||
{
|
|
||||||
const char* lasterr = dlerror();
|
|
||||||
if (lasterr == 0)
|
|
||||||
lasterr = NULL_PTR_STR;
|
|
||||||
fprintf(stderr, "Fatal Python error: cannot load symbol: '%s' from library '%s', dlerror: %s\n", "Py_DecodeLocale", corepath, lasterr);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
wchar_t* executable_w = Py_DecodeLocale(executable, 0);
|
|
||||||
if (executable_w == 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Fatal Python error: unable to decode executable path: '%s'\n", executable);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
wchar_t* syspath_w = Py_DecodeLocale(syspath, 0);
|
|
||||||
if (syspath_w == 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Fatal Python error: unable to decode syspath: '%s'\n", syspath);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
wchar_t** argv_copy = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*)*(argc+1));
|
|
||||||
wchar_t** argv_copy2 = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*)*(argc+1));
|
|
||||||
|
|
||||||
char* oldloc = strdup(setlocale(LC_ALL, 0));
|
|
||||||
setlocale(LC_ALL, "");
|
|
||||||
for (i = 0; i < argc; ++i)
|
|
||||||
{
|
|
||||||
argv_copy[i] = Py_DecodeLocale(argv[i], 0);
|
|
||||||
if (argv_copy[i] == 0)
|
|
||||||
{
|
|
||||||
free(oldloc);
|
|
||||||
fprintf(stderr, "Fatal Python error: unable to decode the command line argument #%i\n", i + 1);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
argv_copy2[i] = argv_copy[i];
|
|
||||||
}
|
|
||||||
argv_copy2[argc] = argv_copy[argc] = 0;
|
|
||||||
setlocale(LC_ALL, oldloc);
|
|
||||||
free(oldloc);
|
|
||||||
|
|
||||||
Py_SetProgramName(executable_w);
|
|
||||||
Py_SetPath(syspath_w);
|
|
||||||
retcode = Py_Main(argc, argv_copy);
|
|
||||||
|
|
||||||
PyMem_RawFree(executable_w);
|
|
||||||
PyMem_RawFree(syspath_w);
|
|
||||||
for (i = 0; i < argc; i++)
|
|
||||||
{
|
|
||||||
PyMem_RawFree(argv_copy2[i]);
|
|
||||||
}
|
|
||||||
PyMem_RawFree(argv_copy);
|
|
||||||
PyMem_RawFree(argv_copy2);
|
|
||||||
|
|
||||||
exit:
|
|
||||||
if (core != 0)
|
|
||||||
dlclose(core);
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,584 +0,0 @@
|
||||||
2011-02-08 Andreas Tobler <andreast@fgznet.ch>
|
|
||||||
|
|
||||||
* testsuite/lib/libffi.exp: Tweak for stand-alone mode.
|
|
||||||
|
|
||||||
2009-12-25 Samuli Suominen <ssuominen@gentoo.org>
|
|
||||||
|
|
||||||
* configure.ac: Undefine _AC_ARG_VAR_PRECIOUS for autoconf 2.64.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
* fficonfig.h.in: Rebuilt.
|
|
||||||
|
|
||||||
2009-06-16 Andrew Haley <aph@redhat.com>
|
|
||||||
|
|
||||||
* testsuite/libffi.call/cls_align_sint64.c,
|
|
||||||
testsuite/libffi.call/cls_align_uint64.c,
|
|
||||||
testsuite/libffi.call/cls_longdouble_va.c,
|
|
||||||
testsuite/libffi.call/cls_ulonglong.c,
|
|
||||||
testsuite/libffi.call/return_ll1.c,
|
|
||||||
testsuite/libffi.call/stret_medium2.c: Fix printf format
|
|
||||||
specifiers.
|
|
||||||
* testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs.
|
|
||||||
* testsuite/libffi.call/float2.c: Fix dg-excess-errors.
|
|
||||||
* testsuite/libffi.call/ffitest.h,
|
|
||||||
testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define.
|
|
||||||
|
|
||||||
2009-06-12 Andrew Haley <aph@redhat.com>
|
|
||||||
|
|
||||||
* testsuite/libffi.call/cls_align_sint64.c,
|
|
||||||
testsuite/libffi.call/cls_align_uint64.c,
|
|
||||||
testsuite/libffi.call/cls_ulonglong.c,
|
|
||||||
testsuite/libffi.call/return_ll1.c,
|
|
||||||
testsuite/libffi.call/stret_medium2.c: Fix printf format
|
|
||||||
specifiers.
|
|
||||||
testsuite/libffi.special/unwindtest.cc: include stdint.h.
|
|
||||||
|
|
||||||
2009-06-11 Timothy Wall <twall@users.sf.net>
|
|
||||||
|
|
||||||
* Makefile.am,
|
|
||||||
configure.ac,
|
|
||||||
include/ffi.h.in,
|
|
||||||
include/ffi_common.h,
|
|
||||||
src/closures.c,
|
|
||||||
src/dlmalloc.c,
|
|
||||||
src/x86/ffi.c,
|
|
||||||
src/x86/ffitarget.h,
|
|
||||||
src/x86/win64.S (new),
|
|
||||||
README: Added win64 support (mingw or MSVC)
|
|
||||||
* Makefile.in,
|
|
||||||
include/Makefile.in,
|
|
||||||
man/Makefile.in,
|
|
||||||
testsuite/Makefile.in,
|
|
||||||
configure,
|
|
||||||
aclocal.m4: Regenerated
|
|
||||||
* ltcf-c.sh: properly escape cygwin/w32 path
|
|
||||||
* man/ffi_call.3: Clarify size requirements for return value.
|
|
||||||
* src/x86/ffi64.c: Fix filename in comment.
|
|
||||||
* src/x86/win32.S: Remove unused extern.
|
|
||||||
|
|
||||||
* testsuite/libffi.call/closure_fn0.c,
|
|
||||||
testsuite/libffi.call/closure_fn1.c,
|
|
||||||
testsuite/libffi.call/closure_fn2.c,
|
|
||||||
testsuite/libffi.call/closure_fn3.c,
|
|
||||||
testsuite/libffi.call/closure_fn4.c,
|
|
||||||
testsuite/libffi.call/closure_fn5.c,
|
|
||||||
testsuite/libffi.call/closure_fn6.c,
|
|
||||||
testsuite/libffi.call/closure_stdcall.c,
|
|
||||||
testsuite/libffi.call/cls_12byte.c,
|
|
||||||
testsuite/libffi.call/cls_16byte.c,
|
|
||||||
testsuite/libffi.call/cls_18byte.c,
|
|
||||||
testsuite/libffi.call/cls_19byte.c,
|
|
||||||
testsuite/libffi.call/cls_1_1byte.c,
|
|
||||||
testsuite/libffi.call/cls_20byte.c,
|
|
||||||
testsuite/libffi.call/cls_20byte1.c,
|
|
||||||
testsuite/libffi.call/cls_24byte.c,
|
|
||||||
testsuite/libffi.call/cls_2byte.c,
|
|
||||||
testsuite/libffi.call/cls_3_1byte.c,
|
|
||||||
testsuite/libffi.call/cls_3byte1.c,
|
|
||||||
testsuite/libffi.call/cls_3byte2.c,
|
|
||||||
testsuite/libffi.call/cls_4_1byte.c,
|
|
||||||
testsuite/libffi.call/cls_4byte.c,
|
|
||||||
testsuite/libffi.call/cls_5_1_byte.c,
|
|
||||||
testsuite/libffi.call/cls_5byte.c,
|
|
||||||
testsuite/libffi.call/cls_64byte.c,
|
|
||||||
testsuite/libffi.call/cls_6_1_byte.c,
|
|
||||||
testsuite/libffi.call/cls_6byte.c,
|
|
||||||
testsuite/libffi.call/cls_7_1_byte.c,
|
|
||||||
testsuite/libffi.call/cls_7byte.c,
|
|
||||||
testsuite/libffi.call/cls_8byte.c,
|
|
||||||
testsuite/libffi.call/cls_9byte1.c,
|
|
||||||
testsuite/libffi.call/cls_9byte2.c,
|
|
||||||
testsuite/libffi.call/cls_align_double.c,
|
|
||||||
testsuite/libffi.call/cls_align_float.c,
|
|
||||||
testsuite/libffi.call/cls_align_longdouble.c,
|
|
||||||
testsuite/libffi.call/cls_align_longdouble_split.c,
|
|
||||||
testsuite/libffi.call/cls_align_longdouble_split2.c,
|
|
||||||
testsuite/libffi.call/cls_align_pointer.c,
|
|
||||||
testsuite/libffi.call/cls_align_sint16.c,
|
|
||||||
testsuite/libffi.call/cls_align_sint32.c,
|
|
||||||
testsuite/libffi.call/cls_align_sint64.c,
|
|
||||||
testsuite/libffi.call/cls_align_uint16.c,
|
|
||||||
testsuite/libffi.call/cls_align_uint32.c,
|
|
||||||
testsuite/libffi.call/cls_align_uint64.c,
|
|
||||||
testsuite/libffi.call/cls_dbls_struct.c,
|
|
||||||
testsuite/libffi.call/cls_double.c,
|
|
||||||
testsuite/libffi.call/cls_double_va.c,
|
|
||||||
testsuite/libffi.call/cls_float.c,
|
|
||||||
testsuite/libffi.call/cls_longdouble.c,
|
|
||||||
testsuite/libffi.call/cls_longdouble_va.c,
|
|
||||||
testsuite/libffi.call/cls_multi_schar.c,
|
|
||||||
testsuite/libffi.call/cls_multi_sshort.c,
|
|
||||||
testsuite/libffi.call/cls_multi_sshortchar.c,
|
|
||||||
testsuite/libffi.call/cls_multi_uchar.c,
|
|
||||||
testsuite/libffi.call/cls_multi_ushort.c,
|
|
||||||
testsuite/libffi.call/cls_multi_ushortchar.c,
|
|
||||||
testsuite/libffi.call/cls_pointer.c,
|
|
||||||
testsuite/libffi.call/cls_pointer_stack.c,
|
|
||||||
testsuite/libffi.call/cls_schar.c,
|
|
||||||
testsuite/libffi.call/cls_sint.c,
|
|
||||||
testsuite/libffi.call/cls_sshort.c,
|
|
||||||
testsuite/libffi.call/cls_uchar.c,
|
|
||||||
testsuite/libffi.call/cls_uint.c,
|
|
||||||
testsuite/libffi.call/cls_ulonglong.c,
|
|
||||||
testsuite/libffi.call/cls_ushort.c,
|
|
||||||
testsuite/libffi.call/err_bad_abi.c,
|
|
||||||
testsuite/libffi.call/err_bad_typedef.c,
|
|
||||||
testsuite/libffi.call/float2.c,
|
|
||||||
testsuite/libffi.call/huge_struct.c,
|
|
||||||
testsuite/libffi.call/nested_struct.c,
|
|
||||||
testsuite/libffi.call/nested_struct1.c,
|
|
||||||
testsuite/libffi.call/nested_struct10.c,
|
|
||||||
testsuite/libffi.call/nested_struct2.c,
|
|
||||||
testsuite/libffi.call/nested_struct3.c,
|
|
||||||
testsuite/libffi.call/nested_struct4.c,
|
|
||||||
testsuite/libffi.call/nested_struct5.c,
|
|
||||||
testsuite/libffi.call/nested_struct6.c,
|
|
||||||
testsuite/libffi.call/nested_struct7.c,
|
|
||||||
testsuite/libffi.call/nested_struct8.c,
|
|
||||||
testsuite/libffi.call/nested_struct9.c,
|
|
||||||
testsuite/libffi.call/problem1.c,
|
|
||||||
testsuite/libffi.call/return_ldl.c,
|
|
||||||
testsuite/libffi.call/return_ll1.c,
|
|
||||||
testsuite/libffi.call/stret_large.c,
|
|
||||||
testsuite/libffi.call/stret_large2.c,
|
|
||||||
testsuite/libffi.call/stret_medium.c,
|
|
||||||
testsuite/libffi.call/stret_medium2.c,
|
|
||||||
testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead
|
|
||||||
of checking for MMAP. Use intptr_t instead of long casts.
|
|
||||||
|
|
||||||
2009-06-04 Andrew Haley <aph@redhat.com>
|
|
||||||
|
|
||||||
* src/powerpc/ffitarget.h: Fix misapplied merge from gcc.
|
|
||||||
|
|
||||||
2009-06-04 Andrew Haley <aph@redhat.com>
|
|
||||||
|
|
||||||
* src/mips/o32.S,
|
|
||||||
src/mips/n32.S: Fix licence formatting.
|
|
||||||
|
|
||||||
2009-06-04 Andrew Haley <aph@redhat.com>
|
|
||||||
|
|
||||||
* src/x86/darwin.S: Fix licence formatting.
|
|
||||||
src/x86/win32.S: Likewise.
|
|
||||||
src/sh64/sysv.S: Likewise.
|
|
||||||
src/sh/sysv.S: Likewise.
|
|
||||||
|
|
||||||
2009-06-04 Andrew Haley <aph@redhat.com>
|
|
||||||
|
|
||||||
* src/sh64/ffi.c: Remove lint directives. Was missing from merge
|
|
||||||
of Andreas Tobler's patch from 2006-04-22.
|
|
||||||
|
|
||||||
2009-06-04 Andrew Haley <aph@redhat.com>
|
|
||||||
|
|
||||||
* src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of
|
|
||||||
2007-03-07.
|
|
||||||
|
|
||||||
2008-12-26 Timothy Wall <twall@users.sf.net>
|
|
||||||
|
|
||||||
* testsuite/libffi.call/cls_longdouble.c,
|
|
||||||
testsuite/libffi.call/cls_longdouble_va.c,
|
|
||||||
testsuite/libffi.call/cls_align_longdouble.c,
|
|
||||||
testsuite/libffi.call/cls_align_longdouble_split.c,
|
|
||||||
testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected
|
|
||||||
failures on x86_64 cygwin/mingw.
|
|
||||||
|
|
||||||
2008-12-22 Timothy Wall <twall@users.sf.net>
|
|
||||||
|
|
||||||
* testsuite/libffi.call/closure_fn0.c,
|
|
||||||
testsuite/libffi.call/closure_fn1.c,
|
|
||||||
testsuite/libffi.call/closure_fn2.c,
|
|
||||||
testsuite/libffi.call/closure_fn3.c,
|
|
||||||
testsuite/libffi.call/closure_fn4.c,
|
|
||||||
testsuite/libffi.call/closure_fn5.c,
|
|
||||||
testsuite/libffi.call/closure_fn6.c,
|
|
||||||
testsuite/libffi.call/closure_loc_fn0.c,
|
|
||||||
testsuite/libffi.call/closure_stdcall.c,
|
|
||||||
testsuite/libffi.call/cls_align_pointer.c,
|
|
||||||
testsuite/libffi.call/cls_pointer.c,
|
|
||||||
testsuite/libffi.call/cls_pointer_stack.c: use portable cast from
|
|
||||||
pointer to integer (intptr_t).
|
|
||||||
* testsuite/libffi.call/cls_longdouble.c: disable for win64.
|
|
||||||
|
|
||||||
2008-12-19 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* configure.ac: Bump version to 3.0.8.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
* libtool-version: Increment revision.
|
|
||||||
* README: Update for new release.
|
|
||||||
|
|
||||||
2008-11-11 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* configure.ac: Bump version to 3.0.7.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
* libtool-version: Increment revision.
|
|
||||||
* README: Update for new release.
|
|
||||||
|
|
||||||
2008-08-25 Andreas Tobler <a.tobler@schweiz.org>
|
|
||||||
|
|
||||||
* src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and
|
|
||||||
FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum.
|
|
||||||
Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT.
|
|
||||||
Adjust copyright notice.
|
|
||||||
* src/powerpc/ffi.c: Add two new flags to indicate if we have one
|
|
||||||
register or two register to use for FFI_SYSV structs.
|
|
||||||
(ffi_prep_cif_machdep): Pass the right register flag introduced above.
|
|
||||||
(ffi_closure_helper_SYSV): Fix the return type for
|
|
||||||
FFI_SYSV_TYPE_SMALL_STRUCT. Comment.
|
|
||||||
Adjust copyright notice.
|
|
||||||
|
|
||||||
2008-07-24 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* testsuite/libffi.call/cls_dbls_struct.c,
|
|
||||||
testsuite/libffi.call/cls_double_va.c,
|
|
||||||
testsuite/libffi.call/cls_longdouble.c,
|
|
||||||
testsuite/libffi.call/cls_longdouble_va.c,
|
|
||||||
testsuite/libffi.call/cls_pointer.c,
|
|
||||||
testsuite/libffi.call/cls_pointer_stack.c,
|
|
||||||
testsuite/libffi.call/err_bad_abi.c: Clean up failures from
|
|
||||||
compiler warnings.
|
|
||||||
|
|
||||||
2008-07-17 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* configure.ac: Bump version to 3.0.6.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
* libtool-version: Increment revision. Add documentation.
|
|
||||||
* README: Update for new release.
|
|
||||||
|
|
||||||
2008-07-16 Kaz Kojima <kkojima@gcc.gnu.org>
|
|
||||||
|
|
||||||
* src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned
|
|
||||||
int.
|
|
||||||
|
|
||||||
2008-07-16 Kaz Kojima <kkojima@gcc.gnu.org>
|
|
||||||
|
|
||||||
* src/sh/sysv.S: Add .note.GNU-stack on Linux.
|
|
||||||
* src/sh64/sysv.S: Likewise.
|
|
||||||
|
|
||||||
2008-04-03 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* libffi.pc.in (Libs): Add -L${libdir}.
|
|
||||||
* configure.ac: Bump version to 3.0.5.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
* libtool-version: Increment revision.
|
|
||||||
* README: Update for new release.
|
|
||||||
|
|
||||||
2008-04-03 Anthony Green <green@redhat.com>
|
|
||||||
Xerces Ranby <xerxes@zafena.se>
|
|
||||||
|
|
||||||
* include/ffi.h.in: Wrap definition of target architecture to
|
|
||||||
protect from double definitions.
|
|
||||||
|
|
||||||
2008-03-22 Moriyoshi Koizumi <moriyoshi@gmail.com>
|
|
||||||
|
|
||||||
* src/x86/ffi.c (ffi_prep_closure_loc): Fix for bug revealed in
|
|
||||||
closure_loc_fn0.c.
|
|
||||||
* testsuite/libffi.call/closure_loc_fn0.c (closure_loc_test_fn0):
|
|
||||||
New test.
|
|
||||||
|
|
||||||
2008-03-04 Anthony Green <green@redhat.com>
|
|
||||||
Blake Chaffin
|
|
||||||
hos@tamanegi.org
|
|
||||||
|
|
||||||
* testsuite/libffi.call/cls_align_longdouble_split2.c
|
|
||||||
testsuite/libffi.call/cls_align_longdouble_split.c
|
|
||||||
testsuite/libffi.call/cls_dbls_struct.c
|
|
||||||
testsuite/libffi.call/cls_double_va.c
|
|
||||||
testsuite/libffi.call/cls_longdouble.c
|
|
||||||
testsuite/libffi.call/cls_longdouble_va.c
|
|
||||||
testsuite/libffi.call/cls_pointer.c
|
|
||||||
testsuite/libffi.call/cls_pointer_stack.c
|
|
||||||
testsuite/libffi.call/err_bad_abi.c
|
|
||||||
testsuite/libffi.call/err_bad_typedef.c
|
|
||||||
testsuite/libffi.call/huge_struct.c
|
|
||||||
testsuite/libffi.call/stret_large2.c
|
|
||||||
testsuite/libffi.call/stret_large.c
|
|
||||||
testsuite/libffi.call/stret_medium2.c
|
|
||||||
testsuite/libffi.call/stret_medium.c: New tests from Apple.
|
|
||||||
|
|
||||||
2008-02-26 Jakub Jelinek <jakub@redhat.com>
|
|
||||||
Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* src/alpha/osf.S: Add .note.GNU-stack on Linux.
|
|
||||||
* src/s390/sysv.S: Likewise.
|
|
||||||
* src/powerpc/linux64.S: Likewise.
|
|
||||||
* src/powerpc/linux64_closure.S: Likewise.
|
|
||||||
* src/powerpc/ppc_closure.S: Likewise.
|
|
||||||
* src/powerpc/sysv.S: Likewise.
|
|
||||||
* src/x86/unix64.S: Likewise.
|
|
||||||
* src/x86/sysv.S: Likewise.
|
|
||||||
* src/sparc/v8.S: Likewise.
|
|
||||||
* src/sparc/v9.S: Likewise.
|
|
||||||
* src/m68k/sysv.S: Likewise.
|
|
||||||
* src/ia64/unix.S: Likewise.
|
|
||||||
* src/arm/sysv.S: Likewise.
|
|
||||||
|
|
||||||
2008-02-26 Anthony Green <green@redhat.com>
|
|
||||||
Thomas Heller <theller@ctypes.org>
|
|
||||||
|
|
||||||
* src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C
|
|
||||||
comment.
|
|
||||||
|
|
||||||
2008-02-26 Anthony Green <green@redhat.org>
|
|
||||||
Thomas Heller <theller@ctypes.org>
|
|
||||||
|
|
||||||
* include/ffi.h.in: Change void (*)() to void (*)(void).
|
|
||||||
|
|
||||||
2008-02-26 Anthony Green <green@redhat.org>
|
|
||||||
Thomas Heller <theller@ctypes.org>
|
|
||||||
|
|
||||||
* src/alpha/ffi.c: Change void (*)() to void (*)(void).
|
|
||||||
src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c,
|
|
||||||
src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c,
|
|
||||||
src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S,
|
|
||||||
src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c,
|
|
||||||
src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c,
|
|
||||||
src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S,
|
|
||||||
src/x86/ffi64.c: Ditto.
|
|
||||||
|
|
||||||
2008-02-24 Anthony Green <green@redhat.org>
|
|
||||||
|
|
||||||
* configure.ac: Accept openbsd*, not just openbsd.
|
|
||||||
Bump version to 3.0.4.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
* libtool-version: Increment revision.
|
|
||||||
* README: Update for new release.
|
|
||||||
|
|
||||||
2008-02-22 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* README: Clean up list of tested platforms.
|
|
||||||
|
|
||||||
2008-02-22 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* configure.ac: Bump version to 3.0.3.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
* libtool-version: Increment revision.
|
|
||||||
* README: Update for new release. Clean up test docs.
|
|
||||||
|
|
||||||
2008-02-22 Bjoern Koenig <bkoenig@alpha-tierchen.de>
|
|
||||||
Andreas Tobler <a.tobler@schweiz.org>
|
|
||||||
|
|
||||||
* configure.ac: Add amd64-*-freebsd* target.
|
|
||||||
* configure: Regenerate.
|
|
||||||
|
|
||||||
2008-02-22 Thomas Heller <theller@ctypes.org>
|
|
||||||
|
|
||||||
* configure.ac: Add x86 OpenBSD support.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-21 Thomas Heller <theller@ctypes.org>
|
|
||||||
|
|
||||||
* README: Change "make test" to "make check".
|
|
||||||
|
|
||||||
2008-02-21 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* configure.ac: Bump version to 3.0.2.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
* libtool-version: Increment revision.
|
|
||||||
* README: Update for new release.
|
|
||||||
|
|
||||||
2008-02-21 Björn König <bkoenig@alpha-tierchen.de>
|
|
||||||
|
|
||||||
* src/x86/freebsd.S: New file.
|
|
||||||
* configure.ac: Add x86 FreeBSD support.
|
|
||||||
* Makefile.am: Ditto.
|
|
||||||
|
|
||||||
2008-02-15 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* configure.ac: Bump version to 3.0.1.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
* libtool-version: Increment revision.
|
|
||||||
* README: Update for new release.
|
|
||||||
|
|
||||||
2008-02-15 David Daney <ddaney@avtrex.com>
|
|
||||||
|
|
||||||
* src/mips/ffi.c: Remove extra '>' from include directive.
|
|
||||||
(ffi_prep_closure_loc): Use clear_location instead of tramp.
|
|
||||||
|
|
||||||
2008-02-15 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* configure.ac: Bump version to 3.0.0.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-15 David Daney <ddaney@avtrex.com>
|
|
||||||
|
|
||||||
* src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE):
|
|
||||||
Define (conditionally), and use it to include cachectl.h.
|
|
||||||
(ffi_prep_closure_loc): Fix cache flushing.
|
|
||||||
* src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define.
|
|
||||||
|
|
||||||
2008-02-15 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3:
|
|
||||||
Update dates and remove all references to ffi_prep_closure.
|
|
||||||
* configure.ac: Bump version to 2.99.9.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-15 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* man/ffi_prep_closure.3: Delete.
|
|
||||||
* man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3.
|
|
||||||
(man_MANS): Ditto.
|
|
||||||
* man/Makefile.in: Rebuilt.
|
|
||||||
* configure.ac: Bump version to 2.99.8.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-14 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* configure.ac: Bump version to 2.99.7.
|
|
||||||
* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
|
|
||||||
* include/ffi.h.in LICENSE src/debug.c src/closures.c
|
|
||||||
src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h
|
|
||||||
src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c
|
|
||||||
src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S
|
|
||||||
src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c
|
|
||||||
src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c
|
|
||||||
src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S
|
|
||||||
src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h
|
|
||||||
src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c
|
|
||||||
src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S
|
|
||||||
src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h
|
|
||||||
src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h
|
|
||||||
src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S
|
|
||||||
src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h
|
|
||||||
src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S
|
|
||||||
src/arm/ffitarget.h src/prep_cif.c: Update license text.
|
|
||||||
|
|
||||||
2008-02-14 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* README: Update tested platforms.
|
|
||||||
* configure.ac: Bump version to 2.99.6.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-14 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* configure.ac: Bump version to 2.99.5.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
* Makefile.am (EXTRA_DIST): Add darwin64.S
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
* testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree.
|
|
||||||
* LICENSE: Update WARRANTY.
|
|
||||||
|
|
||||||
2008-02-14 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* libffi.pc.in (libdir): Fix libdir definition.
|
|
||||||
* configure.ac: Bump version to 2.99.4.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-14 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* README: Update.
|
|
||||||
* libffi.info: New file.
|
|
||||||
* doc/stamp-vti: New file.
|
|
||||||
* configure.ac: Bump version to 2.99.3.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-14 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* Makefile.am (SUBDIRS): Add man dir.
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
* configure.ac: Create Makefile.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
* man/ffi_call.3 man/ffi_prep_cif.3 man/ffi_prep_closure.3
|
|
||||||
man/Makefile.am man/Makefile.in: New files.
|
|
||||||
|
|
||||||
2008-02-14 Tom Tromey <tromey@redhat.com>
|
|
||||||
|
|
||||||
* aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt.
|
|
||||||
* mdate-sh, texinfo.tex: New files.
|
|
||||||
* Makefile.am (info_TEXINFOS): New variable.
|
|
||||||
* doc/libffi.texi: New file.
|
|
||||||
* doc/version.texi: Likewise.
|
|
||||||
|
|
||||||
2008-02-14 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* Makefile.am (AM_CFLAGS): Don't compile with -D$(TARGET).
|
|
||||||
(lib_LTLIBRARIES): Define.
|
|
||||||
(toolexeclib_LIBRARIES): Undefine.
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
* configure.ac: Reset version to 2.99.1.
|
|
||||||
* configure.in: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-14 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* libffi.pc.in: Use @PACKAGE_NAME@ and @PACKAGE_VERSION@.
|
|
||||||
* configure.ac: Reset version to 2.99.1.
|
|
||||||
* configure.in: Rebuilt.
|
|
||||||
* Makefile.am (EXTRA_DIST): Add ChangeLog.libffi.
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
* LICENSE: Update copyright notice.
|
|
||||||
|
|
||||||
2008-02-14 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* include/Makefile.am (nodist_includes_HEADERS): Define. Don't
|
|
||||||
distribute ffitarget.h or ffi.h from the build include dir.
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-14 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* include/Makefile.am (includesdir): Install headers under libdir.
|
|
||||||
(pkgconfigdir): Define. Install libffi.pc.
|
|
||||||
* include/Makefile.in: Rebuilt.
|
|
||||||
* libffi.pc.in: Create.
|
|
||||||
* libtool-version: Increment CURRENT
|
|
||||||
* configure.ac: Add libffi.pc.in
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-03 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* include/Makefile.am (includesdir): Fix header install with
|
|
||||||
DESTDIR.
|
|
||||||
* include/Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
2008-02-03 Timothy Wall <twall@users.sf.net>
|
|
||||||
|
|
||||||
* src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return
|
|
||||||
offset based on code pointer, not data pointer.
|
|
||||||
|
|
||||||
2008-02-01 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* include/Makefile.am: Fix header installs.
|
|
||||||
* Makefile.am: Ditto.
|
|
||||||
* include/Makefile.in: Rebuilt.
|
|
||||||
* Makefile.in: Ditto.
|
|
||||||
|
|
||||||
2008-02-01 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL,
|
|
||||||
FFI_INIT_TRAMPOLINE): Revert my broken changes to twall's last
|
|
||||||
patch.
|
|
||||||
|
|
||||||
2008-01-31 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* Makefile.am (EXTRA_DIST): Add missing files.
|
|
||||||
* testsuite/Makefile.am: Ditto.
|
|
||||||
* Makefile.in, testsuite/Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
2008-01-31 Timothy Wall <twall@users.sf.net>
|
|
||||||
|
|
||||||
* testsuite/libffi.call/closure_stdcall.c: Add test for stdcall
|
|
||||||
closures.
|
|
||||||
* src/x86/ffitarget.h: Increase size of trampoline for stdcall
|
|
||||||
closures.
|
|
||||||
* src/x86/win32.S: Add assembly for stdcall closure.
|
|
||||||
* src/x86/ffi.c: Initialize stdcall closure trampoline.
|
|
||||||
|
|
||||||
2008-01-30 H.J. Lu <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
PR libffi/34612
|
|
||||||
* src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when
|
|
||||||
returning struct.
|
|
||||||
|
|
||||||
* testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer"
|
|
||||||
tests.
|
|
||||||
|
|
||||||
2008-01-30 Anthony Green <green@redhat.com>
|
|
||||||
|
|
||||||
* Makefile.am, include/Makefile.am: Move headers to
|
|
||||||
libffi_la_SOURCES for new automake.
|
|
||||||
* Makefile.in, include/Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
* testsuite/lib/wrapper.exp: Copied from gcc tree to allow for
|
|
||||||
execution outside of gcc tree.
|
|
||||||
* testsuite/lib/target-libpath.exp: Ditto.
|
|
||||||
|
|
||||||
* testsuite/lib/libffi-dg.exp: Many changes to allow for execution
|
|
||||||
outside of gcc tree.
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,40 +0,0 @@
|
||||||
2004-01-14 Kelley Cook <kcook@gcc.gnu.org>
|
|
||||||
|
|
||||||
* configure.in: Add in AC_PREREQ(2.13)
|
|
||||||
|
|
||||||
2003-02-20 Alexandre Oliva <aoliva@redhat.com>
|
|
||||||
|
|
||||||
* configure.in: Propagate ORIGINAL_LD_FOR_MULTILIBS to
|
|
||||||
config.status.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
2002-01-27 Alexandre Oliva <aoliva@redhat.com>
|
|
||||||
|
|
||||||
* configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST.
|
|
||||||
Remove USE_LIBDIR conditional.
|
|
||||||
* Makefile.am (toolexecdir, toolexeclibdir): Don't override.
|
|
||||||
* Makefile.in, configure: Rebuilt.
|
|
||||||
|
|
||||||
Mon Aug 9 18:33:38 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
|
|
||||||
|
|
||||||
* include/Makefile.in: Rebuilt.
|
|
||||||
* Makefile.in: Rebuilt
|
|
||||||
* Makefile.am (toolexeclibdir): Add $(MULTISUBDIR) even for native
|
|
||||||
builds.
|
|
||||||
Use USE_LIBDIR.
|
|
||||||
|
|
||||||
* configure: Rebuilt.
|
|
||||||
* configure.in (USE_LIBDIR): Define for native builds.
|
|
||||||
Use lowercase in configure --help explanations.
|
|
||||||
|
|
||||||
1999-08-08 Anthony Green <green@cygnus.com>
|
|
||||||
|
|
||||||
* include/ffi.h.in (FFI_FN): Remove `...'.
|
|
||||||
|
|
||||||
1999-08-08 Anthony Green <green@cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
* Makefile.am (AM_CFLAGS): Compile with -fexceptions.
|
|
||||||
|
|
||||||
* src/x86/sysv.S: Add exception handling metadata.
|
|
||||||
|
|
|
@ -1,764 +0,0 @@
|
||||||
The libffi version 1 ChangeLog archive.
|
|
||||||
|
|
||||||
Version 1 of libffi had per-directory ChangeLogs. Current and future
|
|
||||||
versions have a single ChangeLog file in the root directory. The
|
|
||||||
version 1 ChangeLogs have all been concatenated into this file for
|
|
||||||
future reference only.
|
|
||||||
|
|
||||||
--- libffi ----------------------------------------------------------------
|
|
||||||
|
|
||||||
Mon Oct 5 02:17:50 1998 Anthony Green <green@cygnus.com>
|
|
||||||
|
|
||||||
* configure.in: Boosted rev.
|
|
||||||
* configure, Makefile.in, aclocal.m4: Rebuilt.
|
|
||||||
* README: Boosted rev and updated release notes.
|
|
||||||
|
|
||||||
Mon Oct 5 01:03:03 1998 Anthony Green <green@cygnus.com>
|
|
||||||
|
|
||||||
* configure.in: Boosted rev.
|
|
||||||
* configure, Makefile.in, aclocal.m4: Rebuilt.
|
|
||||||
* README: Boosted rev and updated release notes.
|
|
||||||
|
|
||||||
1998-07-25 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
|
||||||
|
|
||||||
* m68k/ffi.c (ffi_prep_cif_machdep): Use bitmask for cif->flags.
|
|
||||||
Correctly handle small structures.
|
|
||||||
(ffi_prep_args): Also handle small structures.
|
|
||||||
(ffi_call): Pass size of return type to ffi_call_SYSV.
|
|
||||||
* m68k/sysv.S: Adjust for above changes. Correctly align small
|
|
||||||
structures in the return value.
|
|
||||||
|
|
||||||
* types.c (uint64, sint64) [M68K]: Change alignment to 4.
|
|
||||||
|
|
||||||
Fri Apr 17 17:26:58 1998 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* configure.in: Boosted rev.
|
|
||||||
* configure,Makefile.in,aclocal.m4: Rebuilt.
|
|
||||||
* README: Boosted rev and added release notes.
|
|
||||||
|
|
||||||
Sun Feb 22 00:50:41 1998 Geoff Keating <geoffk@ozemail.com.au>
|
|
||||||
|
|
||||||
* configure.in: Add PowerPC config bits.
|
|
||||||
|
|
||||||
1998-02-14 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
|
||||||
|
|
||||||
* configure.in: Add m68k config bits. Change AC_CANONICAL_SYSTEM
|
|
||||||
to AC_CANONICAL_HOST, this is not a compiler. Use $host instead
|
|
||||||
of $target. Remove AC_CHECK_SIZEOF(char), we already know the
|
|
||||||
result. Fix argument of AC_ARG_ENABLE.
|
|
||||||
* configure, fficonfig.h.in: Rebuilt.
|
|
||||||
|
|
||||||
Tue Feb 10 20:53:40 1998 Richard Henderson <rth@cygnus.com>
|
|
||||||
|
|
||||||
* configure.in: Add Alpha config bits.
|
|
||||||
|
|
||||||
Tue May 13 13:39:20 1997 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* README: Updated dates and reworded Irix comments.
|
|
||||||
|
|
||||||
* configure.in: Removed AC_PROG_RANLIB.
|
|
||||||
|
|
||||||
* Makefile.in, aclocal.m4, config.guess, config.sub, configure,
|
|
||||||
ltmain.sh, */Makefile.in: libtoolized again and rebuilt with
|
|
||||||
automake and autoconf.
|
|
||||||
|
|
||||||
Sat May 10 18:44:50 1997 Tom Tromey <tromey@cygnus.com>
|
|
||||||
|
|
||||||
* configure, aclocal.m4: Rebuilt.
|
|
||||||
* configure.in: Don't compute EXTRADIST; now handled in
|
|
||||||
src/Makefile.in. Removed macros implied by AM_INIT_AUTOMAKE.
|
|
||||||
Don't run AM_MAINTAINER_MODE.
|
|
||||||
|
|
||||||
Thu May 8 14:34:05 1997 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* missing, ltmain.sh, ltconfig.sh: Created. These are new files
|
|
||||||
required by automake and libtool.
|
|
||||||
|
|
||||||
* README: Boosted rev to 1.14. Added notes.
|
|
||||||
|
|
||||||
* acconfig.h: Moved PACKAGE and VERSION for new automake.
|
|
||||||
|
|
||||||
* configure.in: Changes for libtool.
|
|
||||||
|
|
||||||
* Makefile.am (check): make test now make check. Uses libtool now.
|
|
||||||
|
|
||||||
* Makefile.in, configure.in, aclocal.h, fficonfig.h.in: Rebuilt.
|
|
||||||
|
|
||||||
Thu May 1 16:27:07 1997 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* missing: Added file required by new automake.
|
|
||||||
|
|
||||||
Tue Nov 26 14:10:42 1996 Anthony Green <green@csk3.cygnus.com>
|
|
||||||
|
|
||||||
* acconfig.h: Added USING_PURIFY flag. This is defined when
|
|
||||||
--enable-purify-safety was used at configure time.
|
|
||||||
|
|
||||||
* configure.in (allsources): Added --enable-purify-safety switch.
|
|
||||||
(VERSION): Boosted rev to 1.13.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
Fri Nov 22 06:46:12 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* configure.in (VERSION): Boosted rev to 1.12.
|
|
||||||
Removed special CFLAGS hack for gcc.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
* README: Boosted rev to 1.12. Added notes.
|
|
||||||
|
|
||||||
* Many files: Cygnus Support changed to Cygnus Solutions.
|
|
||||||
|
|
||||||
Wed Oct 30 11:15:25 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* configure.in (VERSION): Boosted rev to 1.11.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
* README: Boosted rev to 1.11. Added notes about GNU make.
|
|
||||||
|
|
||||||
Tue Oct 29 12:25:12 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* configure.in: Fixed -Wall trick.
|
|
||||||
(VERSION): Boosted rev.
|
|
||||||
* configure: Rebuilt
|
|
||||||
|
|
||||||
* acconfig.h: Needed for --enable-debug configure switch.
|
|
||||||
|
|
||||||
* README: Boosted rev to 1.09. Added more notes on building
|
|
||||||
libffi, and LCLint.
|
|
||||||
|
|
||||||
* configure.in: Added --enable-debug switch. Boosted rev to
|
|
||||||
1.09.
|
|
||||||
* configure: Rebuilt
|
|
||||||
|
|
||||||
Tue Oct 15 13:11:28 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* configure.in (VERSION): Boosted rev to 1.08
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
* README: Added n32 bug fix notes.
|
|
||||||
|
|
||||||
* Makefile.am: Added "make lint" production.
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
Mon Oct 14 10:54:46 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* README: Added web page reference.
|
|
||||||
|
|
||||||
* configure.in, README: Boosted rev to 1.05
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
* README: Fixed n32 sample code.
|
|
||||||
|
|
||||||
Fri Oct 11 17:09:28 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* README: Added sparc notes.
|
|
||||||
|
|
||||||
* configure.in, README: Boosted rev to 1.04.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
Thu Oct 10 10:31:03 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* configure.in, README: Boosted rev to 1.03.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
* README: Added struct notes.
|
|
||||||
|
|
||||||
* Makefile.am (EXTRA_DIST): Added LICENSE to distribution.
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
* README: Removed Linux section. No special notes now
|
|
||||||
because aggregates arg/return types work.
|
|
||||||
|
|
||||||
Wed Oct 9 16:16:42 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* README, configure.in (VERSION): Boosted rev to 1.02
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
Tue Oct 8 11:56:33 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* README (NOTE): Added n32 notes.
|
|
||||||
|
|
||||||
* Makefile.am: Added test production.
|
|
||||||
* Makefile: Rebuilt
|
|
||||||
|
|
||||||
* README: spell checked!
|
|
||||||
|
|
||||||
* configure.in (VERSION): Boosted rev to 1.01
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
Mon Oct 7 15:50:22 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* configure.in: Added nasty bit to support SGI tools.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
* README: Added SGI notes. Added note about automake bug.
|
|
||||||
|
|
||||||
Mon Oct 7 11:00:28 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* README: Rewrote intro, and fixed examples.
|
|
||||||
|
|
||||||
Fri Oct 4 10:19:55 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* configure.in: -D$TARGET is no longer used as a compiler switch.
|
|
||||||
It is now inserted into ffi.h at configure time.
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
* FFI_ABI and FFI_STATUS are now ffi_abi and ffi_status.
|
|
||||||
|
|
||||||
Thu Oct 3 13:47:34 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* README, LICENSE: Created. Wrote some docs.
|
|
||||||
|
|
||||||
* configure.in: Don't barf on i586-unknown-linuxaout.
|
|
||||||
Added EXTRADIST code for "make dist".
|
|
||||||
* configure: Rebuilt.
|
|
||||||
|
|
||||||
* */Makefile.in: Rebuilt with patched automake.
|
|
||||||
|
|
||||||
Tue Oct 1 17:12:25 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.am, aclocal.m4, config.guess, config.sub,
|
|
||||||
configure.in, fficonfig.h.in, install-sh, mkinstalldirs,
|
|
||||||
stamp-h.in: Created
|
|
||||||
* Makefile.in, configure: Generated
|
|
||||||
|
|
||||||
--- libffi/include --------------------------------------------------------
|
|
||||||
|
|
||||||
Tue Feb 24 13:09:36 1998 Anthony Green <green@gerbil.cygnus.com>
|
|
||||||
|
|
||||||
* ffi_mips.h: Updated FFI_TYPE_STRUCT_* values based on
|
|
||||||
ffi.h.in changes. This is a work-around for SGI's "simple"
|
|
||||||
assembler.
|
|
||||||
|
|
||||||
Sun Feb 22 00:51:55 1998 Geoff Keating <geoffk@ozemail.com.au>
|
|
||||||
|
|
||||||
* ffi.h.in: PowerPC support.
|
|
||||||
|
|
||||||
1998-02-14 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
|
||||||
|
|
||||||
* ffi.h.in: Add m68k support.
|
|
||||||
(FFI_TYPE_LONGDOUBLE): Make it a separate value.
|
|
||||||
|
|
||||||
Tue Feb 10 20:55:16 1998 Richard Henderson <rth@cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in (SIZEOF_ARG): Use a pointer type by default.
|
|
||||||
|
|
||||||
* ffi.h.in: Alpha support.
|
|
||||||
|
|
||||||
Fri Nov 22 06:48:45 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in, ffi_common.h: Cygnus Support -> Cygnus Solutions.
|
|
||||||
|
|
||||||
Wed Nov 20 22:31:01 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in: Added ffi_type_void definition.
|
|
||||||
|
|
||||||
Tue Oct 29 12:22:40 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.am (hack_DATA): Always install ffi_mips.h.
|
|
||||||
|
|
||||||
* ffi.h.in: Removed FFI_DEBUG. It's now in the correct
|
|
||||||
place (acconfig.h).
|
|
||||||
Added #include <stddef.h> for size_t definition.
|
|
||||||
|
|
||||||
Tue Oct 15 17:23:35 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in, ffi_common.h, ffi_mips.h: More clean up.
|
|
||||||
Commented out #define of FFI_DEBUG.
|
|
||||||
|
|
||||||
Tue Oct 15 13:01:06 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi_common.h: Added bool definition.
|
|
||||||
|
|
||||||
* ffi.h.in, ffi_common.h: Clean up based on LCLint output.
|
|
||||||
Added funny /*@...@*/ comments to annotate source.
|
|
||||||
|
|
||||||
Mon Oct 14 12:29:23 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in: Interface changes based on feedback from Jim
|
|
||||||
Blandy.
|
|
||||||
|
|
||||||
Fri Oct 11 16:49:35 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in: Small change for sparc support.
|
|
||||||
|
|
||||||
Thu Oct 10 14:53:37 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi_mips.h: Added FFI_TYPE_STRUCT_* definitions for
|
|
||||||
special structure return types.
|
|
||||||
|
|
||||||
Wed Oct 9 13:55:57 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in: Added SIZEOF_ARG definition for X86
|
|
||||||
|
|
||||||
Tue Oct 8 11:40:36 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in (FFI_FN): Added macro for eliminating compiler warnings.
|
|
||||||
Use it to case your function pointers to the proper type.
|
|
||||||
|
|
||||||
* ffi_mips.h (SIZEOF_ARG): Added magic to fix type promotion bug.
|
|
||||||
|
|
||||||
* Makefile.am (EXTRA_DIST): Added ffi_mips.h to EXTRA_DIST.
|
|
||||||
* Makefile: Rebuilt.
|
|
||||||
|
|
||||||
* ffi_mips.h: Created. Moved all common mips definitions here.
|
|
||||||
|
|
||||||
Mon Oct 7 10:58:12 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in: The SGI assember is very picky about parens. Redefined
|
|
||||||
some macros to avoid problems.
|
|
||||||
|
|
||||||
* ffi.h.in: Added FFI_DEFAULT_ABI definitions. Also added
|
|
||||||
externs for pointer, and 64bit integral ffi_types.
|
|
||||||
|
|
||||||
Fri Oct 4 09:51:37 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in: Added FFI_ABI member to ffi_cif and changed
|
|
||||||
function prototypes accordingly.
|
|
||||||
Added #define @TARGET@. Now programs including ffi.h don't
|
|
||||||
have to specify this themselves.
|
|
||||||
|
|
||||||
Thu Oct 3 15:36:44 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in: Changed ffi_prep_cif's values from void* to void**
|
|
||||||
|
|
||||||
* Makefile.am (EXTRA_DIST): Added EXTRA_DIST for "make dist"
|
|
||||||
to work.
|
|
||||||
* Makefile.in: Regenerated.
|
|
||||||
|
|
||||||
Wed Oct 2 10:16:59 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.am: Created
|
|
||||||
* Makefile.in: Generated
|
|
||||||
|
|
||||||
* ffi_common.h: Added rcsid comment
|
|
||||||
|
|
||||||
Tue Oct 1 17:13:51 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.h.in, ffi_common.h: Created
|
|
||||||
|
|
||||||
--- libffi/src ------------------------------------------------------------
|
|
||||||
|
|
||||||
Mon Oct 5 02:17:50 1998 Anthony Green <green@cygnus.com>
|
|
||||||
|
|
||||||
* arm/ffi.c, arm/sysv.S: Created.
|
|
||||||
|
|
||||||
* Makefile.am: Added arm files.
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
Mon Oct 5 01:41:38 1998 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.am (libffi_la_LDFLAGS): Incremented revision.
|
|
||||||
|
|
||||||
Sun Oct 4 16:27:17 1998 Anthony Green <green@cygnus.com>
|
|
||||||
|
|
||||||
* alpha/osf.S (ffi_call_osf): Patch for DU assembler.
|
|
||||||
|
|
||||||
* ffitest.c (main): long long and long double return values work
|
|
||||||
for x86.
|
|
||||||
|
|
||||||
Fri Apr 17 11:50:58 1998 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
* ffitest.c (main): Floating point tests not executed for systems
|
|
||||||
with broken lond double (SunOS 4 w/ GCC).
|
|
||||||
|
|
||||||
* types.c: Fixed x86 alignment info for long long types.
|
|
||||||
|
|
||||||
Thu Apr 16 07:15:28 1998 Anthony Green <green@ada.cygnus.com>
|
|
||||||
|
|
||||||
* ffitest.c: Added more notes about GCC bugs under Irix 6.
|
|
||||||
|
|
||||||
Wed Apr 15 08:42:22 1998 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffitest.c (struct5): New test function.
|
|
||||||
(main): New test with struct5.
|
|
||||||
|
|
||||||
Thu Mar 5 10:48:11 1998 Anthony Green <green@tootie.to.cygnus.com>
|
|
||||||
|
|
||||||
* prep_cif.c (initialize_aggregate): Fix assertion for
|
|
||||||
nested structures.
|
|
||||||
|
|
||||||
Tue Feb 24 16:33:41 1998 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* prep_cif.c (ffi_prep_cif): Added long double support for sparc.
|
|
||||||
|
|
||||||
Sun Feb 22 00:52:18 1998 Geoff Keating <geoffk@ozemail.com.au>
|
|
||||||
|
|
||||||
* powerpc/asm.h: New file.
|
|
||||||
* powerpc/ffi.c: New file.
|
|
||||||
* powerpc/sysv.S: New file.
|
|
||||||
* Makefile.am: PowerPC port.
|
|
||||||
* ffitest.c (main): Allow all tests to run even in presence of gcc
|
|
||||||
bug on PowerPC.
|
|
||||||
|
|
||||||
1998-02-17 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* mips/ffi.c: Fixed comment typo.
|
|
||||||
|
|
||||||
* x86/ffi.c (ffi_prep_cif_machdep), x86/sysv.S (retfloat):
|
|
||||||
Fixed x86 long double return handling.
|
|
||||||
|
|
||||||
* types.c: Fixed x86 long double alignment info.
|
|
||||||
|
|
||||||
1998-02-14 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
|
||||||
|
|
||||||
* types.c: Add m68k support.
|
|
||||||
|
|
||||||
* ffitest.c (floating): Add long double parameter.
|
|
||||||
(return_ll, ldblit): New functions to test long long and long
|
|
||||||
double return value.
|
|
||||||
(main): Fix type error in assignment of ts[1-4]_type.elements.
|
|
||||||
Add tests for long long and long double arguments and return
|
|
||||||
values.
|
|
||||||
|
|
||||||
* prep_cif.c (ffi_prep_cif) [M68K]: Don't allocate argument for
|
|
||||||
struct value pointer.
|
|
||||||
|
|
||||||
* m68k/ffi.c, m68k/sysv.S: New files.
|
|
||||||
* Makefile.am: Add bits for m68k port. Add kludge to work around
|
|
||||||
automake deficiency.
|
|
||||||
(test): Don't require "." in $PATH.
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
Wed Feb 11 07:36:50 1998 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
Tue Feb 10 20:56:00 1998 Richard Henderson <rth@cygnus.com>
|
|
||||||
|
|
||||||
* alpha/ffi.c, alpha/osf.S: New files.
|
|
||||||
* Makefile.am: Alpha port.
|
|
||||||
|
|
||||||
Tue Nov 18 14:12:07 1997 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* mips/ffi.c (ffi_prep_cif_machdep): Initialize rstruct_flag
|
|
||||||
for n32.
|
|
||||||
|
|
||||||
Tue Jun 3 17:18:20 1997 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffitest.c (main): Added hack to get structure tests working
|
|
||||||
correctly.
|
|
||||||
|
|
||||||
Sat May 10 19:06:42 1997 Tom Tromey <tromey@cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
* Makefile.am (EXTRA_DIST): Explicitly list all distributable
|
|
||||||
files in subdirs.
|
|
||||||
(VERSION, CC): Removed.
|
|
||||||
|
|
||||||
Thu May 8 17:19:01 1997 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.am: Many changes for new automake and libtool.
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
Fri Nov 22 06:57:56 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffitest.c (main): Fixed test case for non mips machines.
|
|
||||||
|
|
||||||
Wed Nov 20 22:31:59 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* types.c: Added ffi_type_void declaration.
|
|
||||||
|
|
||||||
Tue Oct 29 13:07:19 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffitest.c (main): Fixed character constants.
|
|
||||||
(main): Emit warning for structure test 3 failure on Sun.
|
|
||||||
|
|
||||||
* Makefile.am (VPATH): Fixed VPATH def'n so automake won't
|
|
||||||
strip it out.
|
|
||||||
Moved distdir hack from libffi to automake.
|
|
||||||
(ffitest): Added missing -c for $(COMPILE) (change in automake).
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
Tue Oct 15 13:08:20 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.am: Added "make lint" production.
|
|
||||||
* Makefile.in: Rebuilt.
|
|
||||||
|
|
||||||
* prep_cif.c (STACK_ARG_SIZE): Improved STACK_ARG_SIZE macro.
|
|
||||||
Clean up based on LCLint output. Added funny /*@...@*/ comments to
|
|
||||||
annotate source.
|
|
||||||
|
|
||||||
* ffitest.c, debug.c: Cleaned up code.
|
|
||||||
|
|
||||||
Mon Oct 14 12:26:56 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffitest.c: Changes based on interface changes.
|
|
||||||
|
|
||||||
* prep_cif.c (ffi_prep_cif): Cleaned up interface based on
|
|
||||||
feedback from Jim Blandy.
|
|
||||||
|
|
||||||
Fri Oct 11 15:53:18 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffitest.c: Reordered tests while porting to sparc.
|
|
||||||
Made changes to handle lame structure passing for sparc.
|
|
||||||
Removed calls to fflush().
|
|
||||||
|
|
||||||
* prep_cif.c (ffi_prep_cif): Added special case for sparc
|
|
||||||
aggregate type arguments.
|
|
||||||
|
|
||||||
Thu Oct 10 09:56:51 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffitest.c (main): Added structure passing/returning tests.
|
|
||||||
|
|
||||||
* prep_cif.c (ffi_prep_cif): Perform proper initialization
|
|
||||||
of structure return types if needed.
|
|
||||||
(initialize_aggregate): Bug fix
|
|
||||||
|
|
||||||
Wed Oct 9 16:04:20 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* types.c: Added special definitions for x86 (double doesn't
|
|
||||||
need double word alignment).
|
|
||||||
|
|
||||||
* ffitest.c: Added many tests
|
|
||||||
|
|
||||||
Tue Oct 8 09:19:22 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* prep_cif.c (ffi_prep_cif): Fixed assertion.
|
|
||||||
|
|
||||||
* debug.c (ffi_assert): Must return a non void now.
|
|
||||||
|
|
||||||
* Makefile.am: Added test production.
|
|
||||||
* Makefile: Rebuilt.
|
|
||||||
|
|
||||||
* ffitest.c (main): Created.
|
|
||||||
|
|
||||||
* types.c: Created. Stripped common code out of */ffi.c.
|
|
||||||
|
|
||||||
* prep_cif.c: Added missing stdlib.h include.
|
|
||||||
|
|
||||||
* debug.c (ffi_type_test): Used "a" to eliminate compiler
|
|
||||||
warnings in non-debug builds. Included ffi_common.h.
|
|
||||||
|
|
||||||
Mon Oct 7 15:36:42 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* Makefile.am: Added a rule for .s -> .o
|
|
||||||
This is required by the SGI compiler.
|
|
||||||
* Makefile: Rebuilt.
|
|
||||||
|
|
||||||
Fri Oct 4 09:51:08 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* prep_cif.c (initialize_aggregate): Moved abi specification
|
|
||||||
to ffi_prep_cif().
|
|
||||||
|
|
||||||
Thu Oct 3 15:37:37 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* prep_cif.c (ffi_prep_cif): Changed values from void* to void**.
|
|
||||||
(initialize_aggregate): Fixed aggregate type initialization.
|
|
||||||
|
|
||||||
* Makefile.am (EXTRA_DIST): Added support code for "make dist".
|
|
||||||
* Makefile.in: Regenerated.
|
|
||||||
|
|
||||||
Wed Oct 2 11:41:57 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* debug.c, prep_cif: Created.
|
|
||||||
|
|
||||||
* Makefile.am: Added debug.o and prep_cif.o to OBJ.
|
|
||||||
* Makefile.in: Regenerated.
|
|
||||||
|
|
||||||
* Makefile.am (INCLUDES): Added missing -I../include
|
|
||||||
* Makefile.in: Regenerated.
|
|
||||||
|
|
||||||
Tue Oct 1 17:11:51 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* error.c, Makefile.am: Created.
|
|
||||||
* Makefile.in: Generated.
|
|
||||||
|
|
||||||
--- libffi/src/x86 --------------------------------------------------------
|
|
||||||
|
|
||||||
Sun Oct 4 16:27:17 1998 Anthony Green <green@cygnus.com>
|
|
||||||
|
|
||||||
* sysv.S (retlongdouble): Fixed long long return value support.
|
|
||||||
* ffi.c (ffi_prep_cif_machdep): Ditto.
|
|
||||||
|
|
||||||
Wed May 13 04:30:33 1998 Anthony Green <green@raft.ppp.tsoft.net>
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_cif_machdep): Fixed long double return value
|
|
||||||
support.
|
|
||||||
|
|
||||||
Wed Apr 15 08:43:20 1998 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_args): small struct support was missing.
|
|
||||||
|
|
||||||
Thu May 8 16:53:58 1997 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* objects.mak: Removed.
|
|
||||||
|
|
||||||
Mon Dec 2 15:12:58 1996 Tom Tromey <tromey@cygnus.com>
|
|
||||||
|
|
||||||
* sysv.S: Use .balign, for a.out Linux boxes.
|
|
||||||
|
|
||||||
Tue Oct 15 13:06:50 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c: Clean up based on LCLint output.
|
|
||||||
Added funny /*@...@*/ comments to annotate source.
|
|
||||||
|
|
||||||
Fri Oct 11 16:43:38 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c (ffi_call): Added assertion for bad ABIs.
|
|
||||||
|
|
||||||
Wed Oct 9 13:57:27 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* sysv.S (retdouble): Fixed double return problems.
|
|
||||||
|
|
||||||
* ffi.c (ffi_call): Corrected fn arg definition.
|
|
||||||
(ffi_prep_cif_machdep): Fixed double return problems
|
|
||||||
|
|
||||||
Tue Oct 8 12:12:49 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c: Moved ffi_type definitions to types.c.
|
|
||||||
(ffi_prep_args): Fixed type promotion bug.
|
|
||||||
|
|
||||||
Mon Oct 7 15:53:06 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c (FFI_*_TYPEDEF): Removed redundant ';'
|
|
||||||
|
|
||||||
Fri Oct 4 09:54:53 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c (ffi_call): Removed FFI_ABI arg, and swapped
|
|
||||||
remaining args.
|
|
||||||
|
|
||||||
Wed Oct 2 10:07:05 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c, sysv.S, objects.mak: Created.
|
|
||||||
(ffi_prep_cif): cif->rvalue no longer initialized to NULL.
|
|
||||||
(ffi_prep_cif_machdep): Moved machine independent cif processing
|
|
||||||
to src/prep_cif.c. Introduced ffi_prep_cif_machdep().
|
|
||||||
|
|
||||||
--- libffi/src/mips -------------------------------------------------------
|
|
||||||
|
|
||||||
Tue Feb 17 17:18:07 1998 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* o32.S: Fixed typo in comment.
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_cif_machdep): Fixed argument processing.
|
|
||||||
|
|
||||||
Thu May 8 16:53:58 1997 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* o32.s, n32.s: Wrappers for SGI tool support.
|
|
||||||
|
|
||||||
* objects.mak: Removed.
|
|
||||||
|
|
||||||
Tue Oct 29 14:37:45 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_args): Changed int z to size_t z.
|
|
||||||
|
|
||||||
Tue Oct 15 13:17:25 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* n32.S: Fixed bad stack munging.
|
|
||||||
|
|
||||||
* ffi.c: Moved prototypes for ffi_call_?32() to here from
|
|
||||||
ffi_mips.h because extended_cif is not defined in ffi_mips.h.
|
|
||||||
|
|
||||||
Mon Oct 14 12:42:02 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c: Interface changes based on feedback from Jim Blandy.
|
|
||||||
|
|
||||||
Thu Oct 10 11:22:16 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* n32.S, ffi.c: Lots of changes to support passing and
|
|
||||||
returning structures with the n32 calling convention.
|
|
||||||
|
|
||||||
* n32.S: Fixed fn pointer bug.
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_cif_machdep): Fix for o32 structure
|
|
||||||
return values.
|
|
||||||
(ffi_prep_args): Fixed n32 structure passing when structures
|
|
||||||
partially fit in registers.
|
|
||||||
|
|
||||||
Wed Oct 9 13:49:25 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* objects.mak: Added n32.o.
|
|
||||||
|
|
||||||
* n32.S: Created.
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_args): Added magic to support proper
|
|
||||||
n32 processing.
|
|
||||||
|
|
||||||
Tue Oct 8 10:37:35 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c: Moved ffi_type definitions to types.c.
|
|
||||||
(ffi_prep_args): Fixed type promotion bug.
|
|
||||||
|
|
||||||
* o32.S: This code is only built for o32 compiles.
|
|
||||||
A lot of the #define cruft has moved to ffi_mips.h.
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_cif_machdep): Fixed arg flags. Second arg
|
|
||||||
is only processed if the first is either a float or double.
|
|
||||||
|
|
||||||
Mon Oct 7 15:33:59 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* o32.S: Modified to compile under each of o32, n32 and n64.
|
|
||||||
|
|
||||||
* ffi.c (FFI_*_TYPEDEF): Removed redundant ';'
|
|
||||||
|
|
||||||
Fri Oct 4 09:53:25 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c (ffi_call): Removed FFI_ABI arg, and swapped
|
|
||||||
remaining args.
|
|
||||||
|
|
||||||
Wed Oct 2 17:41:22 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* o32.S: Removed crufty definitions.
|
|
||||||
|
|
||||||
Wed Oct 2 12:53:42 1996 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_cif): cif->rvalue no longer initialized to NULL.
|
|
||||||
(ffi_prep_cif_machdep): Moved all machine independent cif processing
|
|
||||||
to src/prep_cif.c. Introduced ffi_prep_cif_machdep. Return types
|
|
||||||
of FFI_TYPE_STRUCT are no different than FFI_TYPE_INT.
|
|
||||||
|
|
||||||
Tue Oct 1 17:11:02 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c, o32.S, object.mak: Created
|
|
||||||
|
|
||||||
--- libffi/src/sparc ------------------------------------------------------
|
|
||||||
|
|
||||||
Tue Feb 24 16:33:18 1998 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_args): Added long double support.
|
|
||||||
|
|
||||||
Thu May 8 16:53:58 1997 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* objects.mak: Removed.
|
|
||||||
|
|
||||||
Thu May 1 16:07:56 1997 Anthony Green <green@hoser.cygnus.com>
|
|
||||||
|
|
||||||
* v8.S: Fixed minor portability problem reported by
|
|
||||||
Russ McManus <mcmanr@eq.gs.com>.
|
|
||||||
|
|
||||||
Tue Nov 26 14:12:43 1996 Anthony Green <green@csk3.cygnus.com>
|
|
||||||
|
|
||||||
* v8.S: Used STACKFRAME define elsewhere.
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_args): Zero out space when USING_PURIFY
|
|
||||||
is set.
|
|
||||||
(ffi_prep_cif_machdep): Allocate the correct stack frame
|
|
||||||
space for functions with < 6 args.
|
|
||||||
|
|
||||||
Tue Oct 29 15:08:55 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c (ffi_prep_args): int z is now size_t z.
|
|
||||||
|
|
||||||
Mon Oct 14 13:31:24 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* v8.S (ffi_call_V8): Gordon rewrites this again. It looks
|
|
||||||
great now.
|
|
||||||
|
|
||||||
* ffi.c (ffi_call): The comment about hijacked registers
|
|
||||||
is no longer valid after gordoni hacked v8.S.
|
|
||||||
|
|
||||||
* v8.S (ffi_call_V8): Rewrote with gordoni. Much simpler.
|
|
||||||
|
|
||||||
* v8.S, ffi.c: ffi_call() had changed to accept more than
|
|
||||||
two args, so v8.S had to change (because it hijacks incoming
|
|
||||||
arg registers).
|
|
||||||
|
|
||||||
* ffi.c: Interface changes based on feedback from Jim Blandy.
|
|
||||||
|
|
||||||
Thu Oct 10 17:48:16 1996 Anthony Green <green@rtl.cygnus.com>
|
|
||||||
|
|
||||||
* ffi.c, v8.S, objects.mak: Created.
|
|
||||||
|
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
libffi - Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others.
|
|
||||||
See source files for details.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
``Software''), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,254 +0,0 @@
|
||||||
## Process this with automake to create Makefile.in
|
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = foreign subdir-objects
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
|
||||||
|
|
||||||
SUBDIRS = include testsuite man
|
|
||||||
|
|
||||||
EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj \
|
|
||||||
src/aarch64/ffi.c src/aarch64/ffitarget.h src/aarch64/sysv.S \
|
|
||||||
src/alpha/ffi.c src/alpha/osf.S \
|
|
||||||
src/alpha/ffitarget.h src/arc/ffi.c src/arc/arcompact.S \
|
|
||||||
src/arc/ffitarget.h src/arm/ffi.c src/arm/sysv.S \
|
|
||||||
src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \
|
|
||||||
src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \
|
|
||||||
src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \
|
|
||||||
src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \
|
|
||||||
src/mips/n32.S src/mips/o32.S src/metag/ffi.c \
|
|
||||||
src/metag/ffitarget.h src/metag/sysv.S src/moxie/ffi.c \
|
|
||||||
src/moxie/ffitarget.h src/moxie/eabi.S src/mips/ffitarget.h \
|
|
||||||
src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \
|
|
||||||
src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \
|
|
||||||
src/m88k/ffi.c src/m88k/obsd.S src/m88k/ffitarget.h \
|
|
||||||
src/microblaze/ffi.c src/microblaze/sysv.S \
|
|
||||||
src/microblaze/ffitarget.h \
|
|
||||||
src/nios2/ffi.c src/nios2/ffitarget.h src/nios2/sysv.S \
|
|
||||||
src/powerpc/ffi.c src/powerpc/ffi_powerpc.h \
|
|
||||||
src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \
|
|
||||||
src/powerpc/sysv.S src/powerpc/linux64.S \
|
|
||||||
src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \
|
|
||||||
src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \
|
|
||||||
src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \
|
|
||||||
src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \
|
|
||||||
src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \
|
|
||||||
src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \
|
|
||||||
src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \
|
|
||||||
src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \
|
|
||||||
src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \
|
|
||||||
src/x86/win32.S src/x86/darwin.S src/x86/win64.S \
|
|
||||||
src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \
|
|
||||||
src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \
|
|
||||||
src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/bfin/ffi.c \
|
|
||||||
src/bfin/ffitarget.h src/bfin/sysv.S src/frv/eabi.S \
|
|
||||||
src/frv/ffitarget.h src/dlmalloc.c src/tile/ffi.c \
|
|
||||||
src/tile/ffitarget.h src/tile/tile.S libtool-version \
|
|
||||||
src/vax/ffi.c src/vax/ffitarget.h src/vax/elfbsd.S \
|
|
||||||
src/xtensa/ffitarget.h src/xtensa/ffi.c src/xtensa/sysv.S \
|
|
||||||
ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \
|
|
||||||
m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \
|
|
||||||
m4/ltversion.m4 src/arm/gentramp.sh src/debug.c msvcc.sh \
|
|
||||||
generate-darwin-source-and-headers.py \
|
|
||||||
libffi.xcodeproj/project.pbxproj src/arm/trampoline.S \
|
|
||||||
libtool-ldflags ChangeLog.libffi-3.1
|
|
||||||
|
|
||||||
info_TEXINFOS = doc/libffi.texi
|
|
||||||
|
|
||||||
## ################################################################
|
|
||||||
|
|
||||||
##
|
|
||||||
## This section is for make and multilib madness.
|
|
||||||
##
|
|
||||||
|
|
||||||
# Work around what appears to be a GNU make bug handling MAKEFLAGS
|
|
||||||
# values defined in terms of make variables, as is the case for CC and
|
|
||||||
# friends when we are called from the top level Makefile.
|
|
||||||
AM_MAKEFLAGS = \
|
|
||||||
'AR_FLAGS=$(AR_FLAGS)' \
|
|
||||||
'CC_FOR_BUILD=$(CC_FOR_BUILD)' \
|
|
||||||
'CFLAGS=$(CFLAGS)' \
|
|
||||||
'CXXFLAGS=$(CXXFLAGS)' \
|
|
||||||
'CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)' \
|
|
||||||
'CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)' \
|
|
||||||
'INSTALL=$(INSTALL)' \
|
|
||||||
'INSTALL_DATA=$(INSTALL_DATA)' \
|
|
||||||
'INSTALL_PROGRAM=$(INSTALL_PROGRAM)' \
|
|
||||||
'INSTALL_SCRIPT=$(INSTALL_SCRIPT)' \
|
|
||||||
'JC1FLAGS=$(JC1FLAGS)' \
|
|
||||||
'LDFLAGS=$(LDFLAGS)' \
|
|
||||||
'LIBCFLAGS=$(LIBCFLAGS)' \
|
|
||||||
'LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)' \
|
|
||||||
'MAKE=$(MAKE)' \
|
|
||||||
'MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)' \
|
|
||||||
'PICFLAG=$(PICFLAG)' \
|
|
||||||
'PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)' \
|
|
||||||
'RUNTESTFLAGS=$(RUNTESTFLAGS)' \
|
|
||||||
'SHELL=$(SHELL)' \
|
|
||||||
'exec_prefix=$(exec_prefix)' \
|
|
||||||
'infodir=$(infodir)' \
|
|
||||||
'libdir=$(libdir)' \
|
|
||||||
'mandir=$(mandir)' \
|
|
||||||
'prefix=$(prefix)' \
|
|
||||||
'AR=$(AR)' \
|
|
||||||
'AS=$(AS)' \
|
|
||||||
'CC=$(CC)' \
|
|
||||||
'CXX=$(CXX)' \
|
|
||||||
'LD=$(LD)' \
|
|
||||||
'NM=$(NM)' \
|
|
||||||
'RANLIB=$(RANLIB)' \
|
|
||||||
'DESTDIR=$(DESTDIR)'
|
|
||||||
|
|
||||||
# Subdir rules rely on $(FLAGS_TO_PASS)
|
|
||||||
FLAGS_TO_PASS = $(AM_MAKEFLAGS)
|
|
||||||
|
|
||||||
MAKEOVERRIDES=
|
|
||||||
|
|
||||||
toolexeclib_LTLIBRARIES = libffi.la
|
|
||||||
noinst_LTLIBRARIES = libffi_convenience.la
|
|
||||||
|
|
||||||
libffi_la_SOURCES = src/prep_cif.c src/types.c \
|
|
||||||
src/raw_api.c src/java_raw_api.c src/closures.c
|
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
|
||||||
pkgconfig_DATA = libffi.pc
|
|
||||||
|
|
||||||
nodist_libffi_la_SOURCES =
|
|
||||||
|
|
||||||
if FFI_DEBUG
|
|
||||||
nodist_libffi_la_SOURCES += src/debug.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
if MIPS
|
|
||||||
nodist_libffi_la_SOURCES += src/mips/ffi.c src/mips/o32.S src/mips/n32.S
|
|
||||||
endif
|
|
||||||
if BFIN
|
|
||||||
nodist_libffi_la_SOURCES += src/bfin/ffi.c src/bfin/sysv.S
|
|
||||||
endif
|
|
||||||
if X86
|
|
||||||
nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/sysv.S src/x86/win32.S
|
|
||||||
endif
|
|
||||||
if X86_FREEBSD
|
|
||||||
nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/freebsd.S src/x86/win32.S
|
|
||||||
endif
|
|
||||||
if X86_WIN32
|
|
||||||
nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win32.S
|
|
||||||
endif
|
|
||||||
if X86_WIN64
|
|
||||||
nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win64.S
|
|
||||||
endif
|
|
||||||
if X86_DARWIN
|
|
||||||
nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S
|
|
||||||
if X86_DARWIN32
|
|
||||||
nodist_libffi_la_SOURCES += src/x86/win32.S
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
if SPARC
|
|
||||||
nodist_libffi_la_SOURCES += src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S
|
|
||||||
endif
|
|
||||||
if ALPHA
|
|
||||||
nodist_libffi_la_SOURCES += src/alpha/ffi.c src/alpha/osf.S
|
|
||||||
endif
|
|
||||||
if IA64
|
|
||||||
nodist_libffi_la_SOURCES += src/ia64/ffi.c src/ia64/unix.S
|
|
||||||
endif
|
|
||||||
if M32R
|
|
||||||
nodist_libffi_la_SOURCES += src/m32r/sysv.S src/m32r/ffi.c
|
|
||||||
endif
|
|
||||||
if M68K
|
|
||||||
nodist_libffi_la_SOURCES += src/m68k/ffi.c src/m68k/sysv.S
|
|
||||||
endif
|
|
||||||
if M88K
|
|
||||||
nodist_libffi_la_SOURCES += src/m88k/ffi.c src/m88k/obsd.S
|
|
||||||
endif
|
|
||||||
if MOXIE
|
|
||||||
nodist_libffi_la_SOURCES += src/moxie/ffi.c src/moxie/eabi.S
|
|
||||||
endif
|
|
||||||
if MICROBLAZE
|
|
||||||
nodist_libffi_la_SOURCES += src/microblaze/ffi.c src/microblaze/sysv.S
|
|
||||||
endif
|
|
||||||
if NIOS2
|
|
||||||
nodist_libffi_la_SOURCES += src/nios2/sysv.S src/nios2/ffi.c
|
|
||||||
endif
|
|
||||||
if POWERPC
|
|
||||||
nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S
|
|
||||||
endif
|
|
||||||
if POWERPC_AIX
|
|
||||||
nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
|
|
||||||
endif
|
|
||||||
if POWERPC_DARWIN
|
|
||||||
nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
|
|
||||||
endif
|
|
||||||
if POWERPC_FREEBSD
|
|
||||||
nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
|
|
||||||
endif
|
|
||||||
if AARCH64
|
|
||||||
nodist_libffi_la_SOURCES += src/aarch64/sysv.S src/aarch64/ffi.c
|
|
||||||
endif
|
|
||||||
if ARC
|
|
||||||
nodist_libffi_la_SOURCES += src/arc/arcompact.S src/arc/ffi.c
|
|
||||||
endif
|
|
||||||
if ARM
|
|
||||||
nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c
|
|
||||||
if FFI_EXEC_TRAMPOLINE_TABLE
|
|
||||||
nodist_libffi_la_SOURCES += src/arm/trampoline.S
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
if AVR32
|
|
||||||
nodist_libffi_la_SOURCES += src/avr32/sysv.S src/avr32/ffi.c
|
|
||||||
endif
|
|
||||||
if LIBFFI_CRIS
|
|
||||||
nodist_libffi_la_SOURCES += src/cris/sysv.S src/cris/ffi.c
|
|
||||||
endif
|
|
||||||
if FRV
|
|
||||||
nodist_libffi_la_SOURCES += src/frv/eabi.S src/frv/ffi.c
|
|
||||||
endif
|
|
||||||
if S390
|
|
||||||
nodist_libffi_la_SOURCES += src/s390/sysv.S src/s390/ffi.c
|
|
||||||
endif
|
|
||||||
if X86_64
|
|
||||||
nodist_libffi_la_SOURCES += src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
|
|
||||||
endif
|
|
||||||
if SH
|
|
||||||
nodist_libffi_la_SOURCES += src/sh/sysv.S src/sh/ffi.c
|
|
||||||
endif
|
|
||||||
if SH64
|
|
||||||
nodist_libffi_la_SOURCES += src/sh64/sysv.S src/sh64/ffi.c
|
|
||||||
endif
|
|
||||||
if PA_LINUX
|
|
||||||
nodist_libffi_la_SOURCES += src/pa/linux.S src/pa/ffi.c
|
|
||||||
endif
|
|
||||||
if PA_HPUX
|
|
||||||
nodist_libffi_la_SOURCES += src/pa/hpux32.S src/pa/ffi.c
|
|
||||||
endif
|
|
||||||
if TILE
|
|
||||||
nodist_libffi_la_SOURCES += src/tile/tile.S src/tile/ffi.c
|
|
||||||
endif
|
|
||||||
if XTENSA
|
|
||||||
nodist_libffi_la_SOURCES += src/xtensa/sysv.S src/xtensa/ffi.c
|
|
||||||
endif
|
|
||||||
if METAG
|
|
||||||
nodist_libffi_la_SOURCES += src/metag/sysv.S src/metag/ffi.c
|
|
||||||
endif
|
|
||||||
if VAX
|
|
||||||
nodist_libffi_la_SOURCES += src/vax/elfbsd.S src/vax/ffi.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
|
|
||||||
nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
|
|
||||||
|
|
||||||
LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS))
|
|
||||||
|
|
||||||
AM_CFLAGS =
|
|
||||||
if FFI_DEBUG
|
|
||||||
# Build debug. Define FFI_DEBUG on the commandline so that, when building with
|
|
||||||
# MSVC, it can link against the debug CRT.
|
|
||||||
AM_CFLAGS += -DFFI_DEBUG
|
|
||||||
endif
|
|
||||||
|
|
||||||
libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
|
|
||||||
|
|
||||||
AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
|
|
||||||
AM_CCASFLAGS = $(AM_CPPFLAGS)
|
|
||||||
|
|
||||||
dist-hook:
|
|
||||||
if [ -d $(top_srcdir)/.git ] ; then (cd $(top_srcdir); git log --no-decorate) ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,428 +0,0 @@
|
||||||
Status
|
|
||||||
======
|
|
||||||
|
|
||||||
libffi-3.1 was released on May 19, 2014. Check the libffi web page
|
|
||||||
for updates: <URL:http://sourceware.org/libffi/>.
|
|
||||||
|
|
||||||
|
|
||||||
What is libffi?
|
|
||||||
===============
|
|
||||||
|
|
||||||
Compilers for high level languages generate code that follow certain
|
|
||||||
conventions. These conventions are necessary, in part, for separate
|
|
||||||
compilation to work. One such convention is the "calling
|
|
||||||
convention". The "calling convention" is essentially a set of
|
|
||||||
assumptions made by the compiler about where function arguments will
|
|
||||||
be found on entry to a function. A "calling convention" also specifies
|
|
||||||
where the return value for a function is found.
|
|
||||||
|
|
||||||
Some programs may not know at the time of compilation what arguments
|
|
||||||
are to be passed to a function. For instance, an interpreter may be
|
|
||||||
told at run-time about the number and types of arguments used to call
|
|
||||||
a given function. Libffi can be used in such programs to provide a
|
|
||||||
bridge from the interpreter program to compiled code.
|
|
||||||
|
|
||||||
The libffi library provides a portable, high level programming
|
|
||||||
interface to various calling conventions. This allows a programmer to
|
|
||||||
call any function specified by a call interface description at run
|
|
||||||
time.
|
|
||||||
|
|
||||||
FFI stands for Foreign Function Interface. A foreign function
|
|
||||||
interface is the popular name for the interface that allows code
|
|
||||||
written in one language to call code written in another language. The
|
|
||||||
libffi library really only provides the lowest, machine dependent
|
|
||||||
layer of a fully featured foreign function interface. A layer must
|
|
||||||
exist above libffi that handles type conversions for values passed
|
|
||||||
between the two languages.
|
|
||||||
|
|
||||||
|
|
||||||
Supported Platforms
|
|
||||||
===================
|
|
||||||
|
|
||||||
Libffi has been ported to many different platforms.
|
|
||||||
For specific configuration details and testing status, please
|
|
||||||
refer to the wiki page here:
|
|
||||||
|
|
||||||
http://www.moxielogic.org/wiki/index.php?title=Libffi_3.1
|
|
||||||
|
|
||||||
At the time of release, the following basic configurations have been
|
|
||||||
tested:
|
|
||||||
|
|
||||||
|-----------------+------------------+-------------------------|
|
|
||||||
| Architecture | Operating System | Compiler |
|
|
||||||
|-----------------+------------------+-------------------------|
|
|
||||||
| AArch64 (ARM64) | iOS | Clang |
|
|
||||||
| AArch64 | Linux | GCC |
|
|
||||||
| Alpha | Linux | GCC |
|
|
||||||
| Alpha | Tru64 | GCC |
|
|
||||||
| ARC | Linux | GCC |
|
|
||||||
| ARM | Linux | GCC |
|
|
||||||
| ARM | iOS | GCC |
|
|
||||||
| AVR32 | Linux | GCC |
|
|
||||||
| Blackfin | uClinux | GCC |
|
|
||||||
| HPPA | HPUX | GCC |
|
|
||||||
| IA-64 | Linux | GCC |
|
|
||||||
| M68K | FreeMiNT | GCC |
|
|
||||||
| M68K | Linux | GCC |
|
|
||||||
| M68K | RTEMS | GCC |
|
|
||||||
| M88K | OpenBSD/mvme88k | GCC |
|
|
||||||
| Meta | Linux | GCC |
|
|
||||||
| MicroBlaze | Linux | GCC |
|
|
||||||
| MIPS | IRIX | GCC |
|
|
||||||
| MIPS | Linux | GCC |
|
|
||||||
| MIPS | RTEMS | GCC |
|
|
||||||
| MIPS64 | Linux | GCC |
|
|
||||||
| Moxie | Bare metal | GCC |
|
|
||||||
| Nios II | Linux | GCC |
|
|
||||||
| PowerPC 32-bit | AIX | IBM XL C |
|
|
||||||
| PowerPC 64-bit | AIX | IBM XL C |
|
|
||||||
| PowerPC | AMIGA | GCC |
|
|
||||||
| PowerPC | Linux | GCC |
|
|
||||||
| PowerPC | Mac OSX | GCC |
|
|
||||||
| PowerPC | FreeBSD | GCC |
|
|
||||||
| PowerPC 64-bit | FreeBSD | GCC |
|
|
||||||
| PowerPC 64-bit | Linux ELFv1 | GCC |
|
|
||||||
| PowerPC 64-bit | Linux ELFv2 | GCC |
|
|
||||||
| S390 | Linux | GCC |
|
|
||||||
| S390X | Linux | GCC |
|
|
||||||
| SPARC | Linux | GCC |
|
|
||||||
| SPARC | Solaris | GCC |
|
|
||||||
| SPARC | Solaris | Oracle Solaris Studio C |
|
|
||||||
| SPARC64 | Linux | GCC |
|
|
||||||
| SPARC64 | FreeBSD | GCC |
|
|
||||||
| SPARC64 | Solaris | Oracle Solaris Studio C |
|
|
||||||
| TILE-Gx/TILEPro | Linux | GCC |
|
|
||||||
| VAX | OpenBSD/vax | GCC |
|
|
||||||
| X86 | FreeBSD | GCC |
|
|
||||||
| X86 | GNU HURD | GCC |
|
|
||||||
| X86 | Interix | GCC |
|
|
||||||
| X86 | kFreeBSD | GCC |
|
|
||||||
| X86 | Linux | GCC |
|
|
||||||
| X86 | Mac OSX | GCC |
|
|
||||||
| X86 | OpenBSD | GCC |
|
|
||||||
| X86 | OS/2 | GCC |
|
|
||||||
| X86 | Solaris | GCC |
|
|
||||||
| X86 | Solaris | Oracle Solaris Studio C |
|
|
||||||
| X86 | Windows/Cygwin | GCC |
|
|
||||||
| X86 | Windows/MingW | GCC |
|
|
||||||
| X86-64 | FreeBSD | GCC |
|
|
||||||
| X86-64 | Linux | GCC |
|
|
||||||
| X86-64 | Linux/x32 | GCC |
|
|
||||||
| X86-64 | OpenBSD | GCC |
|
|
||||||
| X86-64 | Solaris | Oracle Solaris Studio C |
|
|
||||||
| X86-64 | Windows/MingW | GCC |
|
|
||||||
| Xtensa | Linux | GCC |
|
|
||||||
|-----------------+------------------+-------------------------|
|
|
||||||
|
|
||||||
Please send additional platform test results to
|
|
||||||
libffi-discuss@sourceware.org and feel free to update the wiki page
|
|
||||||
above.
|
|
||||||
|
|
||||||
Installing libffi
|
|
||||||
=================
|
|
||||||
|
|
||||||
First you must configure the distribution for your particular
|
|
||||||
system. Go to the directory you wish to build libffi in and run the
|
|
||||||
"configure" program found in the root directory of the libffi source
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
If you're building libffi directly from version control, configure won't
|
|
||||||
exist yet; run ./autogen.sh first.
|
|
||||||
|
|
||||||
You may want to tell configure where to install the libffi library and
|
|
||||||
header files. To do that, use the --prefix configure switch. Libffi
|
|
||||||
will install under /usr/local by default.
|
|
||||||
|
|
||||||
If you want to enable extra run-time debugging checks use the the
|
|
||||||
--enable-debug configure switch. This is useful when your program dies
|
|
||||||
mysteriously while using libffi.
|
|
||||||
|
|
||||||
Another useful configure switch is --enable-purify-safety. Using this
|
|
||||||
will add some extra code which will suppress certain warnings when you
|
|
||||||
are using Purify with libffi. Only use this switch when using
|
|
||||||
Purify, as it will slow down the library.
|
|
||||||
|
|
||||||
It's also possible to build libffi on Windows platforms with
|
|
||||||
Microsoft's Visual C++ compiler. In this case, use the msvcc.sh
|
|
||||||
wrapper script during configuration like so:
|
|
||||||
|
|
||||||
path/to/configure CC=path/to/msvcc.sh CXX=path/to/msvcc.sh LD=link CPP=\"cl -nologo -EP\"
|
|
||||||
|
|
||||||
For 64-bit Windows builds, use CC="path/to/msvcc.sh -m64" and
|
|
||||||
CXX="path/to/msvcc.sh -m64". You may also need to specify --build
|
|
||||||
appropriately.
|
|
||||||
|
|
||||||
When building with MSVC under a MingW environment, you may need to
|
|
||||||
remove the line in configure that sets 'fix_srcfile_path' to a 'cygpath'
|
|
||||||
command. ('cygpath' is not present in MingW, and is not required when
|
|
||||||
using MingW-style paths.)
|
|
||||||
|
|
||||||
For iOS builds, the 'libffi.xcodeproj' Xcode project is available.
|
|
||||||
|
|
||||||
Configure has many other options. Use "configure --help" to see them all.
|
|
||||||
|
|
||||||
Once configure has finished, type "make". Note that you must be using
|
|
||||||
GNU make. You can ftp GNU make from ftp.gnu.org:/pub/gnu/make .
|
|
||||||
|
|
||||||
To ensure that libffi is working as advertised, type "make check".
|
|
||||||
This will require that you have DejaGNU installed.
|
|
||||||
|
|
||||||
To install the library and header files, type "make install".
|
|
||||||
|
|
||||||
|
|
||||||
History
|
|
||||||
=======
|
|
||||||
|
|
||||||
See the git log for details at http://github.com/atgreen/libffi.
|
|
||||||
|
|
||||||
3.1 May-19-14
|
|
||||||
Add AArch64 (ARM64) iOS support.
|
|
||||||
Add Nios II support.
|
|
||||||
Add m88k and DEC VAX support.
|
|
||||||
Add support for stdcall, thiscall, and fastcall on non-Windows
|
|
||||||
32-bit x86 targets such as Linux.
|
|
||||||
Various Android, MIPS N32, x86, FreeBSD and UltraSPARC IIi
|
|
||||||
fixes.
|
|
||||||
Make the testsuite more robust: eliminate several spurious
|
|
||||||
failures, and respect the $CC and $CXX environment variables.
|
|
||||||
Archive off the manually maintained ChangeLog in favor of git
|
|
||||||
log.
|
|
||||||
|
|
||||||
3.0.13 Mar-17-13
|
|
||||||
Add Meta support.
|
|
||||||
Add missing Moxie bits.
|
|
||||||
Fix stack alignment bug on 32-bit x86.
|
|
||||||
Build fix for m68000 targets.
|
|
||||||
Build fix for soft-float Power targets.
|
|
||||||
Fix the install dir location for some platforms when building
|
|
||||||
with GCC (OS X, Solaris).
|
|
||||||
Fix Cygwin regression.
|
|
||||||
|
|
||||||
3.0.12 Feb-11-13
|
|
||||||
Add Moxie support.
|
|
||||||
Add AArch64 support.
|
|
||||||
Add Blackfin support.
|
|
||||||
Add TILE-Gx/TILEPro support.
|
|
||||||
Add MicroBlaze support.
|
|
||||||
Add Xtensa support.
|
|
||||||
Add support for PaX enabled kernels with MPROTECT.
|
|
||||||
Add support for native vendor compilers on
|
|
||||||
Solaris and AIX.
|
|
||||||
Work around LLVM/GCC interoperability issue on x86_64.
|
|
||||||
|
|
||||||
3.0.11 Apr-11-12
|
|
||||||
Lots of build fixes.
|
|
||||||
Add support for variadic functions (ffi_prep_cif_var).
|
|
||||||
Add Linux/x32 support.
|
|
||||||
Add thiscall, fastcall and MSVC cdecl support on Windows.
|
|
||||||
Add Amiga and newer MacOS support.
|
|
||||||
Add m68k FreeMiNT support.
|
|
||||||
Integration with iOS' xcode build tools.
|
|
||||||
Fix Octeon and MC68881 support.
|
|
||||||
Fix code pessimizations.
|
|
||||||
|
|
||||||
3.0.10 Aug-23-11
|
|
||||||
Add support for Apple's iOS.
|
|
||||||
Add support for ARM VFP ABI.
|
|
||||||
Add RTEMS support for MIPS and M68K.
|
|
||||||
Fix instruction cache clearing problems on
|
|
||||||
ARM and SPARC.
|
|
||||||
Fix the N64 build on mips-sgi-irix6.5.
|
|
||||||
Enable builds with Microsoft's compiler.
|
|
||||||
Enable x86 builds with Oracle's Solaris compiler.
|
|
||||||
Fix support for calling code compiled with Oracle's Sparc
|
|
||||||
Solaris compiler.
|
|
||||||
Testsuite fixes for Tru64 Unix.
|
|
||||||
Additional platform support.
|
|
||||||
|
|
||||||
3.0.9 Dec-31-09
|
|
||||||
Add AVR32 and win64 ports. Add ARM softfp support.
|
|
||||||
Many fixes for AIX, Solaris, HP-UX, *BSD.
|
|
||||||
Several PowerPC and x86-64 bug fixes.
|
|
||||||
Build DLL for windows.
|
|
||||||
|
|
||||||
3.0.8 Dec-19-08
|
|
||||||
Add *BSD, BeOS, and PA-Linux support.
|
|
||||||
|
|
||||||
3.0.7 Nov-11-08
|
|
||||||
Fix for ppc FreeBSD.
|
|
||||||
(thanks to Andreas Tobler)
|
|
||||||
|
|
||||||
3.0.6 Jul-17-08
|
|
||||||
Fix for closures on sh.
|
|
||||||
Mark the sh/sh64 stack as non-executable.
|
|
||||||
(both thanks to Kaz Kojima)
|
|
||||||
|
|
||||||
3.0.5 Apr-3-08
|
|
||||||
Fix libffi.pc file.
|
|
||||||
Fix #define ARM for IcedTea users.
|
|
||||||
Fix x86 closure bug.
|
|
||||||
|
|
||||||
3.0.4 Feb-24-08
|
|
||||||
Fix x86 OpenBSD configury.
|
|
||||||
|
|
||||||
3.0.3 Feb-22-08
|
|
||||||
Enable x86 OpenBSD thanks to Thomas Heller, and
|
|
||||||
x86-64 FreeBSD thanks to Björn König and Andreas Tobler.
|
|
||||||
Clean up test instruction in README.
|
|
||||||
|
|
||||||
3.0.2 Feb-21-08
|
|
||||||
Improved x86 FreeBSD support.
|
|
||||||
Thanks to Björn König.
|
|
||||||
|
|
||||||
3.0.1 Feb-15-08
|
|
||||||
Fix instruction cache flushing bug on MIPS.
|
|
||||||
Thanks to David Daney.
|
|
||||||
|
|
||||||
3.0.0 Feb-15-08
|
|
||||||
Many changes, mostly thanks to the GCC project.
|
|
||||||
Cygnus Solutions is now Red Hat.
|
|
||||||
|
|
||||||
[10 years go by...]
|
|
||||||
|
|
||||||
1.20 Oct-5-98
|
|
||||||
Raffaele Sena produces ARM port.
|
|
||||||
|
|
||||||
1.19 Oct-5-98
|
|
||||||
Fixed x86 long double and long long return support.
|
|
||||||
m68k bug fixes from Andreas Schwab.
|
|
||||||
Patch for DU assembler compatibility for the Alpha from Richard
|
|
||||||
Henderson.
|
|
||||||
|
|
||||||
1.18 Apr-17-98
|
|
||||||
Bug fixes and MIPS configuration changes.
|
|
||||||
|
|
||||||
1.17 Feb-24-98
|
|
||||||
Bug fixes and m68k port from Andreas Schwab. PowerPC port from
|
|
||||||
Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes.
|
|
||||||
|
|
||||||
1.16 Feb-11-98
|
|
||||||
Richard Henderson produces Alpha port.
|
|
||||||
|
|
||||||
1.15 Dec-4-97
|
|
||||||
Fixed an n32 ABI bug. New libtool, auto* support.
|
|
||||||
|
|
||||||
1.14 May-13-97
|
|
||||||
libtool is now used to generate shared and static libraries.
|
|
||||||
Fixed a minor portability problem reported by Russ McManus
|
|
||||||
<mcmanr@eq.gs.com>.
|
|
||||||
|
|
||||||
1.13 Dec-2-96
|
|
||||||
Added --enable-purify-safety to keep Purify from complaining
|
|
||||||
about certain low level code.
|
|
||||||
Sparc fix for calling functions with < 6 args.
|
|
||||||
Linux x86 a.out fix.
|
|
||||||
|
|
||||||
1.12 Nov-22-96
|
|
||||||
Added missing ffi_type_void, needed for supporting void return
|
|
||||||
types. Fixed test case for non MIPS machines. Cygnus Support
|
|
||||||
is now Cygnus Solutions.
|
|
||||||
|
|
||||||
1.11 Oct-30-96
|
|
||||||
Added notes about GNU make.
|
|
||||||
|
|
||||||
1.10 Oct-29-96
|
|
||||||
Added configuration fix for non GNU compilers.
|
|
||||||
|
|
||||||
1.09 Oct-29-96
|
|
||||||
Added --enable-debug configure switch. Clean-ups based on LCLint
|
|
||||||
feedback. ffi_mips.h is always installed. Many configuration
|
|
||||||
fixes. Fixed ffitest.c for sparc builds.
|
|
||||||
|
|
||||||
1.08 Oct-15-96
|
|
||||||
Fixed n32 problem. Many clean-ups.
|
|
||||||
|
|
||||||
1.07 Oct-14-96
|
|
||||||
Gordon Irlam rewrites v8.S again. Bug fixes.
|
|
||||||
|
|
||||||
1.06 Oct-14-96
|
|
||||||
Gordon Irlam improved the sparc port.
|
|
||||||
|
|
||||||
1.05 Oct-14-96
|
|
||||||
Interface changes based on feedback.
|
|
||||||
|
|
||||||
1.04 Oct-11-96
|
|
||||||
Sparc port complete (modulo struct passing bug).
|
|
||||||
|
|
||||||
1.03 Oct-10-96
|
|
||||||
Passing struct args, and returning struct values works for
|
|
||||||
all architectures/calling conventions. Expanded tests.
|
|
||||||
|
|
||||||
1.02 Oct-9-96
|
|
||||||
Added SGI n32 support. Fixed bugs in both o32 and Linux support.
|
|
||||||
Added "make test".
|
|
||||||
|
|
||||||
1.01 Oct-8-96
|
|
||||||
Fixed float passing bug in mips version. Restructured some
|
|
||||||
of the code. Builds cleanly with SGI tools.
|
|
||||||
|
|
||||||
1.00 Oct-7-96
|
|
||||||
First release. No public announcement.
|
|
||||||
|
|
||||||
|
|
||||||
Authors & Credits
|
|
||||||
=================
|
|
||||||
|
|
||||||
libffi was originally written by Anthony Green <green@moxielogic.com>.
|
|
||||||
|
|
||||||
The developers of the GNU Compiler Collection project have made
|
|
||||||
innumerable valuable contributions. See the ChangeLog file for
|
|
||||||
details.
|
|
||||||
|
|
||||||
Some of the ideas behind libffi were inspired by Gianni Mariani's free
|
|
||||||
gencall library for Silicon Graphics machines.
|
|
||||||
|
|
||||||
The closure mechanism was designed and implemented by Kresten Krab
|
|
||||||
Thorup.
|
|
||||||
|
|
||||||
Major processor architecture ports were contributed by the following
|
|
||||||
developers:
|
|
||||||
|
|
||||||
aarch64 Marcus Shawcroft, James Greenhalgh
|
|
||||||
alpha Richard Henderson
|
|
||||||
arm Raffaele Sena
|
|
||||||
blackfin Alexandre Keunecke I. de Mendonca
|
|
||||||
cris Simon Posnjak, Hans-Peter Nilsson
|
|
||||||
frv Anthony Green
|
|
||||||
ia64 Hans Boehm
|
|
||||||
m32r Kazuhiro Inaoka
|
|
||||||
m68k Andreas Schwab
|
|
||||||
m88k Miod Vallat
|
|
||||||
microblaze Nathan Rossi
|
|
||||||
mips Anthony Green, Casey Marshall
|
|
||||||
mips64 David Daney
|
|
||||||
moxie Anthony Green
|
|
||||||
nios ii Sandra Loosemore
|
|
||||||
pa Randolph Chung, Dave Anglin, Andreas Tobler
|
|
||||||
powerpc Geoffrey Keating, Andreas Tobler,
|
|
||||||
David Edelsohn, John Hornkvist
|
|
||||||
powerpc64 Jakub Jelinek
|
|
||||||
s390 Gerhard Tonn, Ulrich Weigand
|
|
||||||
sh Kaz Kojima
|
|
||||||
sh64 Kaz Kojima
|
|
||||||
sparc Anthony Green, Gordon Irlam
|
|
||||||
tile-gx/tilepro Walter Lee
|
|
||||||
vax Miod Vallat
|
|
||||||
x86 Anthony Green, Jon Beniston
|
|
||||||
x86-64 Bo Thorsen
|
|
||||||
xtensa Chris Zankel
|
|
||||||
|
|
||||||
Jesper Skov and Andrew Haley both did more than their fair share of
|
|
||||||
stepping through the code and tracking down bugs.
|
|
||||||
|
|
||||||
Thanks also to Tom Tromey for bug fixes, documentation and
|
|
||||||
configuration help.
|
|
||||||
|
|
||||||
Thanks to Jim Blandy, who provided some useful feedback on the libffi
|
|
||||||
interface.
|
|
||||||
|
|
||||||
Andreas Tobler has done a tremendous amount of work on the testsuite.
|
|
||||||
|
|
||||||
Alex Oliva solved the executable page problem for SElinux.
|
|
||||||
|
|
||||||
The list above is almost certainly incomplete and inaccurate. I'm
|
|
||||||
happy to make corrections or additions upon request.
|
|
||||||
|
|
||||||
If you have a problem, or have found a bug, please send a note to the
|
|
||||||
author at green@moxielogic.com, or the project mailing list at
|
|
||||||
libffi-discuss@sourceware.org.
|
|
|
@ -1,92 +0,0 @@
|
||||||
# mmap(2) blacklisting. Some platforms provide the mmap library routine
|
|
||||||
# but don't support all of the features we need from it.
|
|
||||||
AC_DEFUN([AC_FUNC_MMAP_BLACKLIST],
|
|
||||||
[
|
|
||||||
AC_CHECK_HEADER([sys/mman.h],
|
|
||||||
[libffi_header_sys_mman_h=yes], [libffi_header_sys_mman_h=no])
|
|
||||||
AC_CHECK_FUNC([mmap], [libffi_func_mmap=yes], [libffi_func_mmap=no])
|
|
||||||
if test "$libffi_header_sys_mman_h" != yes \
|
|
||||||
|| test "$libffi_func_mmap" != yes; then
|
|
||||||
ac_cv_func_mmap_file=no
|
|
||||||
ac_cv_func_mmap_dev_zero=no
|
|
||||||
ac_cv_func_mmap_anon=no
|
|
||||||
else
|
|
||||||
AC_CACHE_CHECK([whether read-only mmap of a plain file works],
|
|
||||||
ac_cv_func_mmap_file,
|
|
||||||
[# Add a system to this blacklist if
|
|
||||||
# mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a
|
|
||||||
# memory area containing the same data that you'd get if you applied
|
|
||||||
# read() to the same fd. The only system known to have a problem here
|
|
||||||
# is VMS, where text files have record structure.
|
|
||||||
case "$host_os" in
|
|
||||||
vms* | ultrix*)
|
|
||||||
ac_cv_func_mmap_file=no ;;
|
|
||||||
*)
|
|
||||||
ac_cv_func_mmap_file=yes;;
|
|
||||||
esac])
|
|
||||||
AC_CACHE_CHECK([whether mmap from /dev/zero works],
|
|
||||||
ac_cv_func_mmap_dev_zero,
|
|
||||||
[# Add a system to this blacklist if it has mmap() but /dev/zero
|
|
||||||
# does not exist, or if mmapping /dev/zero does not give anonymous
|
|
||||||
# zeroed pages with both the following properties:
|
|
||||||
# 1. If you map N consecutive pages in with one call, and then
|
|
||||||
# unmap any subset of those pages, the pages that were not
|
|
||||||
# explicitly unmapped remain accessible.
|
|
||||||
# 2. If you map two adjacent blocks of memory and then unmap them
|
|
||||||
# both at once, they must both go away.
|
|
||||||
# Systems known to be in this category are Windows (all variants),
|
|
||||||
# VMS, and Darwin.
|
|
||||||
case "$host_os" in
|
|
||||||
vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00)
|
|
||||||
ac_cv_func_mmap_dev_zero=no ;;
|
|
||||||
*)
|
|
||||||
ac_cv_func_mmap_dev_zero=yes;;
|
|
||||||
esac])
|
|
||||||
|
|
||||||
# Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for.
|
|
||||||
AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon,
|
|
||||||
[AC_TRY_COMPILE(
|
|
||||||
[#include <sys/types.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#ifndef MAP_ANONYMOUS
|
|
||||||
#define MAP_ANONYMOUS MAP_ANON
|
|
||||||
#endif
|
|
||||||
],
|
|
||||||
[int n = MAP_ANONYMOUS;],
|
|
||||||
ac_cv_decl_map_anon=yes,
|
|
||||||
ac_cv_decl_map_anon=no)])
|
|
||||||
|
|
||||||
if test $ac_cv_decl_map_anon = no; then
|
|
||||||
ac_cv_func_mmap_anon=no
|
|
||||||
else
|
|
||||||
AC_CACHE_CHECK([whether mmap with MAP_ANON(YMOUS) works],
|
|
||||||
ac_cv_func_mmap_anon,
|
|
||||||
[# Add a system to this blacklist if it has mmap() and MAP_ANON or
|
|
||||||
# MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
|
|
||||||
# doesn't give anonymous zeroed pages with the same properties listed
|
|
||||||
# above for use of /dev/zero.
|
|
||||||
# Systems known to be in this category are Windows, VMS, and SCO Unix.
|
|
||||||
case "$host_os" in
|
|
||||||
vms* | cygwin* | pe | mingw* | sco* | udk* )
|
|
||||||
ac_cv_func_mmap_anon=no ;;
|
|
||||||
*)
|
|
||||||
ac_cv_func_mmap_anon=yes;;
|
|
||||||
esac])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $ac_cv_func_mmap_file = yes; then
|
|
||||||
AC_DEFINE(HAVE_MMAP_FILE, 1,
|
|
||||||
[Define if read-only mmap of a plain file works.])
|
|
||||||
fi
|
|
||||||
if test $ac_cv_func_mmap_dev_zero = yes; then
|
|
||||||
AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1,
|
|
||||||
[Define if mmap of /dev/zero works.])
|
|
||||||
fi
|
|
||||||
if test $ac_cv_func_mmap_anon = yes; then
|
|
||||||
AC_DEFINE(HAVE_MMAP_ANON, 1,
|
|
||||||
[Define if mmap with MAP_ANON(YMOUS) works.])
|
|
||||||
fi
|
|
||||||
])
|
|
1961
MovedRecipes/python3crystax/libffi/aclocal.m4
vendored
1961
MovedRecipes/python3crystax/libffi/aclocal.m4
vendored
File diff suppressed because it is too large
Load diff
|
@ -1,347 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
|
|
||||||
scriptversion=2012-10-14.11; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
|
|
||||||
# We need space, tab and new line, in precisely that order. Quoting is
|
|
||||||
# there to prevent tools from complaining about whitespace usage.
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
file_conv=
|
|
||||||
|
|
||||||
# func_file_conv build_file lazy
|
|
||||||
# Convert a $build file to $host form and store it in $file
|
|
||||||
# Currently only supports Windows hosts. If the determined conversion
|
|
||||||
# type is listed in (the comma separated) LAZY, no conversion will
|
|
||||||
# take place.
|
|
||||||
func_file_conv ()
|
|
||||||
{
|
|
||||||
file=$1
|
|
||||||
case $file in
|
|
||||||
/ | /[!/]*) # absolute file, and not a UNC file
|
|
||||||
if test -z "$file_conv"; then
|
|
||||||
# lazily determine how to convert abs files
|
|
||||||
case `uname -s` in
|
|
||||||
MINGW*)
|
|
||||||
file_conv=mingw
|
|
||||||
;;
|
|
||||||
CYGWIN*)
|
|
||||||
file_conv=cygwin
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
file_conv=wine
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
case $file_conv/,$2, in
|
|
||||||
*,$file_conv,*)
|
|
||||||
;;
|
|
||||||
mingw/*)
|
|
||||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
|
||||||
;;
|
|
||||||
cygwin/*)
|
|
||||||
file=`cygpath -m "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
wine/*)
|
|
||||||
file=`winepath -w "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashL linkdir
|
|
||||||
# Make cl look for libraries in LINKDIR
|
|
||||||
func_cl_dashL ()
|
|
||||||
{
|
|
||||||
func_file_conv "$1"
|
|
||||||
if test -z "$lib_path"; then
|
|
||||||
lib_path=$file
|
|
||||||
else
|
|
||||||
lib_path="$lib_path;$file"
|
|
||||||
fi
|
|
||||||
linker_opts="$linker_opts -LIBPATH:$file"
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashl library
|
|
||||||
# Do a library search-path lookup for cl
|
|
||||||
func_cl_dashl ()
|
|
||||||
{
|
|
||||||
lib=$1
|
|
||||||
found=no
|
|
||||||
save_IFS=$IFS
|
|
||||||
IFS=';'
|
|
||||||
for dir in $lib_path $LIB
|
|
||||||
do
|
|
||||||
IFS=$save_IFS
|
|
||||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.dll.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/$lib.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/lib$lib.a"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/lib$lib.a
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS=$save_IFS
|
|
||||||
|
|
||||||
if test "$found" != yes; then
|
|
||||||
lib=$lib.lib
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_wrapper cl arg...
|
|
||||||
# Adjust compile command to suit cl
|
|
||||||
func_cl_wrapper ()
|
|
||||||
{
|
|
||||||
# Assume a capable shell
|
|
||||||
lib_path=
|
|
||||||
shared=:
|
|
||||||
linker_opts=
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.[oO][bB][jJ])
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fo"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fe"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
-I)
|
|
||||||
eat=1
|
|
||||||
func_file_conv "$2" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-I*)
|
|
||||||
func_file_conv "${1#-I}" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashl "$2"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l*)
|
|
||||||
func_cl_dashl "${1#-l}"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-L)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashL "$2"
|
|
||||||
;;
|
|
||||||
-L*)
|
|
||||||
func_cl_dashL "${1#-L}"
|
|
||||||
;;
|
|
||||||
-static)
|
|
||||||
shared=false
|
|
||||||
;;
|
|
||||||
-Wl,*)
|
|
||||||
arg=${1#-Wl,}
|
|
||||||
save_ifs="$IFS"; IFS=','
|
|
||||||
for flag in $arg; do
|
|
||||||
IFS="$save_ifs"
|
|
||||||
linker_opts="$linker_opts $flag"
|
|
||||||
done
|
|
||||||
IFS="$save_ifs"
|
|
||||||
;;
|
|
||||||
-Xlinker)
|
|
||||||
eat=1
|
|
||||||
linker_opts="$linker_opts $2"
|
|
||||||
;;
|
|
||||||
-*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
|
||||||
func_file_conv "$1"
|
|
||||||
set x "$@" -Tp"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
|
||||||
func_file_conv "$1" mingw
|
|
||||||
set x "$@" "$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
if test -n "$linker_opts"; then
|
|
||||||
linker_opts="-link$linker_opts"
|
|
||||||
fi
|
|
||||||
exec "$@" $linker_opts
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
eat=
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
|
||||||
arguments, and rename the output as expected.
|
|
||||||
|
|
||||||
If you are trying to build a whole package this is not the
|
|
||||||
right script to run: please start by reading the file 'INSTALL'.
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "compile $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
|
|
||||||
func_cl_wrapper "$@" # Doesn't return...
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ofile=
|
|
||||||
cfile=
|
|
||||||
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
# So we strip '-o arg' only if arg is an object.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.obj)
|
|
||||||
ofile=$2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" -o "$2"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*.c)
|
|
||||||
cfile=$1
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$ofile" || test -z "$cfile"; then
|
|
||||||
# If no '-o' option was seen then we might have been invoked from a
|
|
||||||
# pattern rule where we don't need one. That is ok -- this is a
|
|
||||||
# normal compilation that the losing compiler can handle. If no
|
|
||||||
# '.c' file was seen then we are probably linking. That is also
|
|
||||||
# ok.
|
|
||||||
exec "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Name of file we expect compiler to create.
|
|
||||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
|
||||||
|
|
||||||
# Create the lock directory.
|
|
||||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
|
||||||
# that we are using for the .o file. Also, base the name on the expected
|
|
||||||
# object file name, since that is what matters with a parallel build.
|
|
||||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
|
||||||
while true; do
|
|
||||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
# FIXME: race condition here if user kills between mkdir and trap.
|
|
||||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
|
||||||
|
|
||||||
# Run the compile.
|
|
||||||
"$@"
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if test -f "$cofile"; then
|
|
||||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
|
||||||
elif test -f "${cofile}bj"; then
|
|
||||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
|
||||||
fi
|
|
||||||
|
|
||||||
rmdir "$lockdir"
|
|
||||||
exit $ret
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
1558
MovedRecipes/python3crystax/libffi/config.guess
vendored
1558
MovedRecipes/python3crystax/libffi/config.guess
vendored
File diff suppressed because it is too large
Load diff
1788
MovedRecipes/python3crystax/libffi/config.sub
vendored
1788
MovedRecipes/python3crystax/libffi/config.sub
vendored
File diff suppressed because it is too large
Load diff
21691
MovedRecipes/python3crystax/libffi/configure
vendored
21691
MovedRecipes/python3crystax/libffi/configure
vendored
File diff suppressed because it is too large
Load diff
|
@ -1,630 +0,0 @@
|
||||||
dnl Process this with autoconf to create configure
|
|
||||||
#
|
|
||||||
# file from libffi - slightly patched for Python's ctypes
|
|
||||||
#
|
|
||||||
|
|
||||||
AC_PREREQ(2.68)
|
|
||||||
|
|
||||||
AC_INIT([libffi], [3.1], [http://github.com/atgreen/libffi/issues])
|
|
||||||
AC_CONFIG_HEADERS([fficonfig.h])
|
|
||||||
|
|
||||||
AC_CANONICAL_SYSTEM
|
|
||||||
target_alias=${target_alias-$host_alias}
|
|
||||||
|
|
||||||
case "${host}" in
|
|
||||||
frv*-elf)
|
|
||||||
LDFLAGS=`echo $LDFLAGS | sed "s/\-B[^ ]*libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AX_ENABLE_BUILDDIR
|
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE
|
|
||||||
|
|
||||||
# The same as in boehm-gc and libstdc++. Have to borrow it from there.
|
|
||||||
# We must force CC to /not/ be precious variables; otherwise
|
|
||||||
# the wrong, non-multilib-adjusted value will be used in multilibs.
|
|
||||||
# As a side effect, we have to subst CFLAGS ourselves.
|
|
||||||
# Also save and restore CFLAGS, since AC_PROG_CC will come up with
|
|
||||||
# defaults of its own if none are provided.
|
|
||||||
|
|
||||||
m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
|
|
||||||
m4_define([_AC_ARG_VAR_PRECIOUS],[])
|
|
||||||
save_CFLAGS=$CFLAGS
|
|
||||||
AC_PROG_CC
|
|
||||||
AC_PROG_CXX
|
|
||||||
CFLAGS=$save_CFLAGS
|
|
||||||
m4_undefine([_AC_ARG_VAR_PRECIOUS])
|
|
||||||
m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
|
|
||||||
|
|
||||||
AC_SUBST(CFLAGS)
|
|
||||||
|
|
||||||
AM_PROG_AS
|
|
||||||
AM_PROG_CC_C_O
|
|
||||||
AC_PROG_LIBTOOL
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
|
||||||
|
|
||||||
# Test for 64-bit build.
|
|
||||||
AC_CHECK_SIZEOF([size_t])
|
|
||||||
|
|
||||||
AX_COMPILER_VENDOR
|
|
||||||
AX_CC_MAXOPT
|
|
||||||
# The AX_CFLAGS_WARN_ALL macro doesn't currently work for sunpro
|
|
||||||
# compiler.
|
|
||||||
if test "$ax_cv_c_compiler_vendor" != "sun"; then
|
|
||||||
AX_CFLAGS_WARN_ALL
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$GCC" = "xyes"; then
|
|
||||||
CFLAGS="$CFLAGS -fexceptions"
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat > local.exp <<EOF
|
|
||||||
set CC_FOR_TARGET "$CC"
|
|
||||||
set CXX_FOR_TARGET "$CXX"
|
|
||||||
EOF
|
|
||||||
|
|
||||||
AM_MAINTAINER_MODE
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS(sys/mman.h)
|
|
||||||
AC_CHECK_FUNCS(mmap)
|
|
||||||
AC_FUNC_MMAP_BLACKLIST
|
|
||||||
|
|
||||||
dnl The -no-testsuite modules omit the test subdir.
|
|
||||||
AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite)
|
|
||||||
|
|
||||||
TARGETDIR="unknown"
|
|
||||||
HAVE_LONG_DOUBLE_VARIANT=0
|
|
||||||
case "$host" in
|
|
||||||
aarch64*-*-*)
|
|
||||||
TARGET=AARCH64; TARGETDIR=aarch64
|
|
||||||
;;
|
|
||||||
|
|
||||||
alpha*-*-*)
|
|
||||||
TARGET=ALPHA; TARGETDIR=alpha;
|
|
||||||
# Support 128-bit long double, changeable via command-line switch.
|
|
||||||
HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
|
|
||||||
;;
|
|
||||||
|
|
||||||
arc*-*-*)
|
|
||||||
TARGET=ARC; TARGETDIR=arc
|
|
||||||
;;
|
|
||||||
|
|
||||||
arm*-*-*)
|
|
||||||
TARGET=ARM; TARGETDIR=arm
|
|
||||||
;;
|
|
||||||
|
|
||||||
amd64-*-freebsd* | amd64-*-openbsd*)
|
|
||||||
TARGET=X86_64; TARGETDIR=x86
|
|
||||||
;;
|
|
||||||
|
|
||||||
amd64-*-freebsd*)
|
|
||||||
TARGET=X86_64; TARGETDIR=x86
|
|
||||||
;;
|
|
||||||
|
|
||||||
amd64-*-freebsd*)
|
|
||||||
TARGET=X86_64; TARGETDIR=x86
|
|
||||||
;;
|
|
||||||
|
|
||||||
avr32*-*-*)
|
|
||||||
TARGET=AVR32; TARGETDIR=avr32
|
|
||||||
;;
|
|
||||||
|
|
||||||
bfin*)
|
|
||||||
TARGET=BFIN; TARGETDIR=bfin
|
|
||||||
;;
|
|
||||||
|
|
||||||
cris-*-*)
|
|
||||||
TARGET=LIBFFI_CRIS; TARGETDIR=cris
|
|
||||||
;;
|
|
||||||
|
|
||||||
frv-*-*)
|
|
||||||
TARGET=FRV; TARGETDIR=frv
|
|
||||||
;;
|
|
||||||
|
|
||||||
hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*)
|
|
||||||
TARGET=PA_LINUX; TARGETDIR=pa
|
|
||||||
;;
|
|
||||||
hppa*64-*-hpux*)
|
|
||||||
TARGET=PA64_HPUX; TARGETDIR=pa
|
|
||||||
;;
|
|
||||||
hppa*-*-hpux*)
|
|
||||||
TARGET=PA_HPUX; TARGETDIR=pa
|
|
||||||
;;
|
|
||||||
|
|
||||||
i?86-*-freebsd* | i?86-*-openbsd*)
|
|
||||||
TARGET=X86_FREEBSD; TARGETDIR=x86
|
|
||||||
;;
|
|
||||||
i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*)
|
|
||||||
TARGET=X86_WIN32; TARGETDIR=x86
|
|
||||||
# All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
|
|
||||||
# We must also check with_cross_host to decide if this is a native
|
|
||||||
# or cross-build and select where to install dlls appropriately.
|
|
||||||
if test -n "$with_cross_host" &&
|
|
||||||
test x"$with_cross_host" != x"no"; then
|
|
||||||
AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"';
|
|
||||||
else
|
|
||||||
AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"';
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
i*86-*-nto-qnx*)
|
|
||||||
TARGET=X86; TARGETDIR=x86
|
|
||||||
;;
|
|
||||||
i?86-*-darwin*)
|
|
||||||
TARGET=X86_DARWIN; TARGETDIR=x86
|
|
||||||
;;
|
|
||||||
i?86-*-solaris2.1[[0-9]]*)
|
|
||||||
TARGETDIR=x86
|
|
||||||
if test $ac_cv_sizeof_size_t = 4; then
|
|
||||||
TARGET=X86;
|
|
||||||
else
|
|
||||||
TARGET=X86_64;
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
x86_64-*-darwin*)
|
|
||||||
TARGET=X86_DARWIN; TARGETDIR=x86
|
|
||||||
;;
|
|
||||||
|
|
||||||
x86_64-*-cygwin* | x86_64-*-mingw*)
|
|
||||||
TARGET=X86_WIN64; TARGETDIR=x86
|
|
||||||
# All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
|
|
||||||
# We must also check with_cross_host to decide if this is a native
|
|
||||||
# or cross-build and select where to install dlls appropriately.
|
|
||||||
if test -n "$with_cross_host" &&
|
|
||||||
test x"$with_cross_host" != x"no"; then
|
|
||||||
AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"';
|
|
||||||
else
|
|
||||||
AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"';
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
i?86-*-* | x86_64-*-*)
|
|
||||||
TARGETDIR=x86
|
|
||||||
if test $ac_cv_sizeof_size_t = 4; then
|
|
||||||
case "$host" in
|
|
||||||
*-gnux32)
|
|
||||||
TARGET=X86_64
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
TARGET=X86
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
TARGET=X86_64;
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
ia64*-*-*)
|
|
||||||
TARGET=IA64; TARGETDIR=ia64
|
|
||||||
;;
|
|
||||||
|
|
||||||
m32r*-*-*)
|
|
||||||
TARGET=M32R; TARGETDIR=m32r
|
|
||||||
;;
|
|
||||||
|
|
||||||
m68k-*-*)
|
|
||||||
TARGET=M68K; TARGETDIR=m68k
|
|
||||||
;;
|
|
||||||
|
|
||||||
m88k-*-*)
|
|
||||||
TARGET=M88K; TARGETDIR=m88k
|
|
||||||
;;
|
|
||||||
|
|
||||||
microblaze*-*-*)
|
|
||||||
TARGET=MICROBLAZE; TARGETDIR=microblaze
|
|
||||||
;;
|
|
||||||
|
|
||||||
moxie-*-*)
|
|
||||||
TARGET=MOXIE; TARGETDIR=moxie
|
|
||||||
;;
|
|
||||||
|
|
||||||
metag-*-*)
|
|
||||||
TARGET=METAG; TARGETDIR=metag
|
|
||||||
;;
|
|
||||||
|
|
||||||
mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*)
|
|
||||||
TARGET=MIPS_IRIX; TARGETDIR=mips
|
|
||||||
;;
|
|
||||||
mips*-*linux* | mips*-*-openbsd*)
|
|
||||||
# Support 128-bit long double for NewABI.
|
|
||||||
HAVE_LONG_DOUBLE='defined(__mips64)'
|
|
||||||
TARGET=MIPS_LINUX; TARGETDIR=mips
|
|
||||||
;;
|
|
||||||
|
|
||||||
nios2*-linux*)
|
|
||||||
TARGET=NIOS2; TARGETDIR=nios2
|
|
||||||
;;
|
|
||||||
|
|
||||||
powerpc*-*-linux* | powerpc-*-sysv*)
|
|
||||||
TARGET=POWERPC; TARGETDIR=powerpc
|
|
||||||
HAVE_LONG_DOUBLE_VARIANT=1
|
|
||||||
;;
|
|
||||||
powerpc-*-amigaos*)
|
|
||||||
TARGET=POWERPC; TARGETDIR=powerpc
|
|
||||||
;;
|
|
||||||
powerpc-*-beos*)
|
|
||||||
TARGET=POWERPC; TARGETDIR=powerpc
|
|
||||||
;;
|
|
||||||
powerpc-*-darwin* | powerpc64-*-darwin*)
|
|
||||||
TARGET=POWERPC_DARWIN; TARGETDIR=powerpc
|
|
||||||
;;
|
|
||||||
powerpc-*-aix* | rs6000-*-aix*)
|
|
||||||
TARGET=POWERPC_AIX; TARGETDIR=powerpc
|
|
||||||
;;
|
|
||||||
powerpc-*-freebsd* | powerpc-*-openbsd*)
|
|
||||||
TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
|
|
||||||
HAVE_LONG_DOUBLE_VARIANT=1
|
|
||||||
;;
|
|
||||||
powerpc64-*-freebsd*)
|
|
||||||
TARGET=POWERPC; TARGETDIR=powerpc
|
|
||||||
;;
|
|
||||||
powerpc*-*-rtems*)
|
|
||||||
TARGET=POWERPC; TARGETDIR=powerpc
|
|
||||||
;;
|
|
||||||
|
|
||||||
s390-*-* | s390x-*-*)
|
|
||||||
TARGET=S390; TARGETDIR=s390
|
|
||||||
;;
|
|
||||||
|
|
||||||
sh-*-* | sh[[34]]*-*-*)
|
|
||||||
TARGET=SH; TARGETDIR=sh
|
|
||||||
;;
|
|
||||||
sh64-*-* | sh5*-*-*)
|
|
||||||
TARGET=SH64; TARGETDIR=sh64
|
|
||||||
;;
|
|
||||||
|
|
||||||
sparc*-*-*)
|
|
||||||
TARGET=SPARC; TARGETDIR=sparc
|
|
||||||
;;
|
|
||||||
|
|
||||||
tile*-*)
|
|
||||||
TARGET=TILE; TARGETDIR=tile
|
|
||||||
;;
|
|
||||||
|
|
||||||
vax-*-*)
|
|
||||||
TARGET=VAX; TARGETDIR=vax
|
|
||||||
;;
|
|
||||||
|
|
||||||
xtensa*-*)
|
|
||||||
TARGET=XTENSA; TARGETDIR=xtensa
|
|
||||||
;;
|
|
||||||
|
|
||||||
esac
|
|
||||||
|
|
||||||
AC_SUBST(AM_RUNTESTFLAGS)
|
|
||||||
AC_SUBST(AM_LTLDFLAGS)
|
|
||||||
|
|
||||||
if test $TARGETDIR = unknown; then
|
|
||||||
AC_MSG_ERROR(["libffi has not been ported to $host."])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AM_CONDITIONAL(MIPS,[expr x$TARGET : 'xMIPS' > /dev/null])
|
|
||||||
AM_CONDITIONAL(BFIN, test x$TARGET = xBFIN)
|
|
||||||
AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
|
|
||||||
AM_CONDITIONAL(X86, test x$TARGET = xX86)
|
|
||||||
AM_CONDITIONAL(X86_FREEBSD, test x$TARGET = xX86_FREEBSD)
|
|
||||||
AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32)
|
|
||||||
AM_CONDITIONAL(X86_WIN64, test x$TARGET = xX86_WIN64)
|
|
||||||
AM_CONDITIONAL(X86_DARWIN, test x$TARGET = xX86_DARWIN)
|
|
||||||
AM_CONDITIONAL(X86_DARWIN32, test x$TARGET = xX86_DARWIN && test $ac_cv_sizeof_size_t = 4)
|
|
||||||
AM_CONDITIONAL(X86_DARWIN64, test x$TARGET = xX86_DARWIN && test $ac_cv_sizeof_size_t = 8)
|
|
||||||
AM_CONDITIONAL(ALPHA, test x$TARGET = xALPHA)
|
|
||||||
AM_CONDITIONAL(IA64, test x$TARGET = xIA64)
|
|
||||||
AM_CONDITIONAL(M32R, test x$TARGET = xM32R)
|
|
||||||
AM_CONDITIONAL(M68K, test x$TARGET = xM68K)
|
|
||||||
AM_CONDITIONAL(M88K, test x$TARGET = xM88K)
|
|
||||||
AM_CONDITIONAL(MICROBLAZE, test x$TARGET = xMICROBLAZE)
|
|
||||||
AM_CONDITIONAL(METAG, test x$TARGET = xMETAG)
|
|
||||||
AM_CONDITIONAL(MOXIE, test x$TARGET = xMOXIE)
|
|
||||||
AM_CONDITIONAL(NIOS2, test x$TARGET = xNIOS2)
|
|
||||||
AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
|
|
||||||
AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
|
|
||||||
AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
|
|
||||||
AM_CONDITIONAL(POWERPC_FREEBSD, test x$TARGET = xPOWERPC_FREEBSD)
|
|
||||||
AM_CONDITIONAL(AARCH64, test x$TARGET = xAARCH64)
|
|
||||||
AM_CONDITIONAL(ARC, test x$TARGET = xARC)
|
|
||||||
AM_CONDITIONAL(ARM, test x$TARGET = xARM)
|
|
||||||
AM_CONDITIONAL(AVR32, test x$TARGET = xAVR32)
|
|
||||||
AM_CONDITIONAL(LIBFFI_CRIS, test x$TARGET = xLIBFFI_CRIS)
|
|
||||||
AM_CONDITIONAL(FRV, test x$TARGET = xFRV)
|
|
||||||
AM_CONDITIONAL(S390, test x$TARGET = xS390)
|
|
||||||
AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64)
|
|
||||||
AM_CONDITIONAL(SH, test x$TARGET = xSH)
|
|
||||||
AM_CONDITIONAL(SH64, test x$TARGET = xSH64)
|
|
||||||
AM_CONDITIONAL(PA_LINUX, test x$TARGET = xPA_LINUX)
|
|
||||||
AM_CONDITIONAL(PA_HPUX, test x$TARGET = xPA_HPUX)
|
|
||||||
AM_CONDITIONAL(PA64_HPUX, test x$TARGET = xPA64_HPUX)
|
|
||||||
AM_CONDITIONAL(TILE, test x$TARGET = xTILE)
|
|
||||||
AM_CONDITIONAL(VAX, test x$TARGET = xVAX)
|
|
||||||
AM_CONDITIONAL(XTENSA, test x$TARGET = xXTENSA)
|
|
||||||
|
|
||||||
AC_HEADER_STDC
|
|
||||||
AC_CHECK_FUNCS(memcpy)
|
|
||||||
AC_FUNC_ALLOCA
|
|
||||||
|
|
||||||
AC_CHECK_SIZEOF(double)
|
|
||||||
AC_CHECK_SIZEOF(long double)
|
|
||||||
|
|
||||||
# Also AC_SUBST this variable for ffi.h.
|
|
||||||
if test -z "$HAVE_LONG_DOUBLE"; then
|
|
||||||
HAVE_LONG_DOUBLE=0
|
|
||||||
if test $ac_cv_sizeof_long_double != 0; then
|
|
||||||
if test $HAVE_LONG_DOUBLE_VARIANT != 0; then
|
|
||||||
AC_DEFINE(HAVE_LONG_DOUBLE_VARIANT, 1, [Define if you support more than one size of the long double type])
|
|
||||||
HAVE_LONG_DOUBLE=1
|
|
||||||
else
|
|
||||||
if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then
|
|
||||||
HAVE_LONG_DOUBLE=1
|
|
||||||
AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the long double type and it is bigger than a double])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_SUBST(HAVE_LONG_DOUBLE)
|
|
||||||
AC_SUBST(HAVE_LONG_DOUBLE_VARIANT)
|
|
||||||
|
|
||||||
AC_C_BIGENDIAN
|
|
||||||
|
|
||||||
GCC_AS_CFI_PSEUDO_OP
|
|
||||||
|
|
||||||
if test x$TARGET = xSPARC; then
|
|
||||||
AC_CACHE_CHECK([assembler and linker support unaligned pc related relocs],
|
|
||||||
libffi_cv_as_sparc_ua_pcrel, [
|
|
||||||
save_CFLAGS="$CFLAGS"
|
|
||||||
save_LDFLAGS="$LDFLAGS"
|
|
||||||
CFLAGS="$CFLAGS -fpic"
|
|
||||||
LDFLAGS="$LDFLAGS -shared"
|
|
||||||
AC_TRY_LINK([asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");],,
|
|
||||||
[libffi_cv_as_sparc_ua_pcrel=yes],
|
|
||||||
[libffi_cv_as_sparc_ua_pcrel=no])
|
|
||||||
CFLAGS="$save_CFLAGS"
|
|
||||||
LDFLAGS="$save_LDFLAGS"])
|
|
||||||
if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then
|
|
||||||
AC_DEFINE(HAVE_AS_SPARC_UA_PCREL, 1,
|
|
||||||
[Define if your assembler and linker support unaligned PC relative relocs.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([assembler .register pseudo-op support],
|
|
||||||
libffi_cv_as_register_pseudo_op, [
|
|
||||||
libffi_cv_as_register_pseudo_op=unknown
|
|
||||||
# Check if we have .register
|
|
||||||
AC_TRY_COMPILE(,[asm (".register %g2, #scratch");],
|
|
||||||
[libffi_cv_as_register_pseudo_op=yes],
|
|
||||||
[libffi_cv_as_register_pseudo_op=no])
|
|
||||||
])
|
|
||||||
if test "x$libffi_cv_as_register_pseudo_op" = xyes; then
|
|
||||||
AC_DEFINE(HAVE_AS_REGISTER_PSEUDO_OP, 1,
|
|
||||||
[Define if your assembler supports .register.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then
|
|
||||||
AC_CACHE_CHECK([assembler supports pc related relocs],
|
|
||||||
libffi_cv_as_x86_pcrel, [
|
|
||||||
libffi_cv_as_x86_pcrel=no
|
|
||||||
echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
|
|
||||||
if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then
|
|
||||||
libffi_cv_as_x86_pcrel=yes
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
if test "x$libffi_cv_as_x86_pcrel" = xyes; then
|
|
||||||
AC_DEFINE(HAVE_AS_X86_PCREL, 1,
|
|
||||||
[Define if your assembler supports PC relative relocs.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([assembler .ascii pseudo-op support],
|
|
||||||
libffi_cv_as_ascii_pseudo_op, [
|
|
||||||
libffi_cv_as_ascii_pseudo_op=unknown
|
|
||||||
# Check if we have .ascii
|
|
||||||
AC_TRY_COMPILE(,[asm (".ascii \\"string\\"");],
|
|
||||||
[libffi_cv_as_ascii_pseudo_op=yes],
|
|
||||||
[libffi_cv_as_ascii_pseudo_op=no])
|
|
||||||
])
|
|
||||||
if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then
|
|
||||||
AC_DEFINE(HAVE_AS_ASCII_PSEUDO_OP, 1,
|
|
||||||
[Define if your assembler supports .ascii.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([assembler .string pseudo-op support],
|
|
||||||
libffi_cv_as_string_pseudo_op, [
|
|
||||||
libffi_cv_as_string_pseudo_op=unknown
|
|
||||||
# Check if we have .string
|
|
||||||
AC_TRY_COMPILE(,[asm (".string \\"string\\"");],
|
|
||||||
[libffi_cv_as_string_pseudo_op=yes],
|
|
||||||
[libffi_cv_as_string_pseudo_op=no])
|
|
||||||
])
|
|
||||||
if test "x$libffi_cv_as_string_pseudo_op" = xyes; then
|
|
||||||
AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1,
|
|
||||||
[Define if your assembler supports .string.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC.
|
|
||||||
AC_ARG_ENABLE(pax_emutramp,
|
|
||||||
[ --enable-pax_emutramp enable pax emulated trampolines, for we can't use PROT_EXEC],
|
|
||||||
if test "$enable_pax_emutramp" = "yes"; then
|
|
||||||
AC_DEFINE(FFI_MMAP_EXEC_EMUTRAMP_PAX, 1,
|
|
||||||
[Define this if you want to enable pax emulated trampolines])
|
|
||||||
fi)
|
|
||||||
|
|
||||||
LT_SYS_SYMBOL_USCORE
|
|
||||||
if test "x$sys_symbol_underscore" = xyes; then
|
|
||||||
AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
FFI_EXEC_TRAMPOLINE_TABLE=0
|
|
||||||
case "$target" in
|
|
||||||
*arm*-apple-darwin*)
|
|
||||||
FFI_EXEC_TRAMPOLINE_TABLE=1
|
|
||||||
AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1,
|
|
||||||
[Cannot use PROT_EXEC on this target, so, we revert to
|
|
||||||
alternative means])
|
|
||||||
;;
|
|
||||||
*-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*)
|
|
||||||
AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1,
|
|
||||||
[Cannot use malloc on this target, so, we revert to
|
|
||||||
alternative means])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1)
|
|
||||||
AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE)
|
|
||||||
|
|
||||||
if test x$TARGET = xX86_64; then
|
|
||||||
AC_CACHE_CHECK([toolchain supports unwind section type],
|
|
||||||
libffi_cv_as_x86_64_unwind_section_type, [
|
|
||||||
cat > conftest1.s << EOF
|
|
||||||
.text
|
|
||||||
.globl foo
|
|
||||||
foo:
|
|
||||||
jmp bar
|
|
||||||
.section .eh_frame,"a",@unwind
|
|
||||||
bar:
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat > conftest2.c << EOF
|
|
||||||
extern void foo();
|
|
||||||
int main(){foo();}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
libffi_cv_as_x86_64_unwind_section_type=no
|
|
||||||
# we ensure that we can compile _and_ link an assembly file containing an @unwind section
|
|
||||||
# since the compiler can support it and not the linker (ie old binutils)
|
|
||||||
if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \
|
|
||||||
$CC conftest2.c conftest1.o > /dev/null 2>&1 ; then
|
|
||||||
libffi_cv_as_x86_64_unwind_section_type=yes
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then
|
|
||||||
AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1,
|
|
||||||
[Define if your assembler supports unwind section type.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$GCC" = "xyes"; then
|
|
||||||
AC_CACHE_CHECK([whether .eh_frame section should be read-only],
|
|
||||||
libffi_cv_ro_eh_frame, [
|
|
||||||
libffi_cv_ro_eh_frame=no
|
|
||||||
echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
|
|
||||||
if $CC $CFLAGS -c -fpic -fexceptions -o conftest.o conftest.c > /dev/null 2>&1; then
|
|
||||||
objdump -h conftest.o > conftest.dump 2>&1
|
|
||||||
libffi_eh_frame_line=`grep -n eh_frame conftest.dump | cut -d: -f 1`
|
|
||||||
libffi_test_line=`expr $libffi_eh_frame_line + 1`p
|
|
||||||
sed -n $libffi_test_line conftest.dump > conftest.line
|
|
||||||
if grep READONLY conftest.line > /dev/null; then
|
|
||||||
libffi_cv_ro_eh_frame=yes
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
rm -f conftest.*
|
|
||||||
])
|
|
||||||
if test "x$libffi_cv_ro_eh_frame" = xyes; then
|
|
||||||
AC_DEFINE(HAVE_RO_EH_FRAME, 1,
|
|
||||||
[Define if .eh_frame sections should be read-only.])
|
|
||||||
AC_DEFINE(EH_FRAME_FLAGS, "a",
|
|
||||||
[Define to the flags needed for the .section .eh_frame directive. ])
|
|
||||||
else
|
|
||||||
AC_DEFINE(EH_FRAME_FLAGS, "aw",
|
|
||||||
[Define to the flags needed for the .section .eh_frame directive. ])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([for __attribute__((visibility("hidden")))],
|
|
||||||
libffi_cv_hidden_visibility_attribute, [
|
|
||||||
echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c
|
|
||||||
libffi_cv_hidden_visibility_attribute=no
|
|
||||||
if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then
|
|
||||||
if grep '\.hidden.*foo' conftest.s >/dev/null; then
|
|
||||||
libffi_cv_hidden_visibility_attribute=yes
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
rm -f conftest.*
|
|
||||||
])
|
|
||||||
if test $libffi_cv_hidden_visibility_attribute = yes; then
|
|
||||||
AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1,
|
|
||||||
[Define if __attribute__((visibility("hidden"))) is supported.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AH_BOTTOM([
|
|
||||||
#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
|
|
||||||
#ifdef LIBFFI_ASM
|
|
||||||
#define FFI_HIDDEN(name) .hidden name
|
|
||||||
#else
|
|
||||||
#define FFI_HIDDEN __attribute__ ((visibility ("hidden")))
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#ifdef LIBFFI_ASM
|
|
||||||
#define FFI_HIDDEN(name)
|
|
||||||
#else
|
|
||||||
#define FFI_HIDDEN
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_SUBST(TARGET)
|
|
||||||
AC_SUBST(TARGETDIR)
|
|
||||||
|
|
||||||
AC_SUBST(SHELL)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(debug,
|
|
||||||
[ --enable-debug debugging mode],
|
|
||||||
if test "$enable_debug" = "yes"; then
|
|
||||||
AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.])
|
|
||||||
fi)
|
|
||||||
AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes")
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(structs,
|
|
||||||
[ --disable-structs omit code for struct support],
|
|
||||||
if test "$enable_structs" = "no"; then
|
|
||||||
AC_DEFINE(FFI_NO_STRUCTS, 1, [Define this if you do not want support for aggregate types.])
|
|
||||||
fi)
|
|
||||||
AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes")
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(raw-api,
|
|
||||||
[ --disable-raw-api make the raw api unavailable],
|
|
||||||
if test "$enable_raw_api" = "no"; then
|
|
||||||
AC_DEFINE(FFI_NO_RAW_API, 1, [Define this if you do not want support for the raw API.])
|
|
||||||
fi)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(purify-safety,
|
|
||||||
[ --enable-purify-safety purify-safe mode],
|
|
||||||
if test "$enable_purify_safety" = "yes"; then
|
|
||||||
AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.])
|
|
||||||
fi)
|
|
||||||
|
|
||||||
# These variables are only ever used when we cross-build to X86_WIN32.
|
|
||||||
# And we only support this with GCC, so...
|
|
||||||
if test "x$GCC" = "xyes"; then
|
|
||||||
if test -n "$with_cross_host" &&
|
|
||||||
test x"$with_cross_host" != x"no"; then
|
|
||||||
toolexecdir='$(exec_prefix)/$(target_alias)'
|
|
||||||
toolexeclibdir='$(toolexecdir)/lib'
|
|
||||||
else
|
|
||||||
toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
|
|
||||||
toolexeclibdir='$(libdir)'
|
|
||||||
fi
|
|
||||||
multi_os_directory=`$CC $CFLAGS -print-multi-os-directory`
|
|
||||||
case $multi_os_directory in
|
|
||||||
.) ;; # Avoid trailing /.
|
|
||||||
../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
|
|
||||||
esac
|
|
||||||
AC_SUBST(toolexecdir)
|
|
||||||
else
|
|
||||||
toolexeclibdir='$(libdir)'
|
|
||||||
fi
|
|
||||||
AC_SUBST(toolexeclibdir)
|
|
||||||
|
|
||||||
AC_CONFIG_COMMANDS(include, [test -d include || mkdir include])
|
|
||||||
AC_CONFIG_COMMANDS(src, [
|
|
||||||
test -d src || mkdir src
|
|
||||||
test -d src/$TARGETDIR || mkdir src/$TARGETDIR
|
|
||||||
], [TARGETDIR="$TARGETDIR"])
|
|
||||||
|
|
||||||
AC_CONFIG_LINKS(include/ffitarget.h:src/$TARGETDIR/ffitarget.h)
|
|
||||||
|
|
||||||
AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc)
|
|
||||||
|
|
||||||
AC_CONFIG_LINKS(include/ffi_common.h:include/ffi_common.h)
|
|
||||||
|
|
||||||
AC_CONFIG_FILES(fficonfig.py)
|
|
||||||
|
|
||||||
AC_OUTPUT
|
|
|
@ -1,791 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
|
||||||
|
|
||||||
scriptversion=2013-05-30.07; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
|
||||||
as side-effects.
|
|
||||||
|
|
||||||
Environment variables:
|
|
||||||
depmode Dependency tracking mode.
|
|
||||||
source Source file read by 'PROGRAMS ARGS'.
|
|
||||||
object Object file output by 'PROGRAMS ARGS'.
|
|
||||||
DEPDIR directory where to store dependencies.
|
|
||||||
depfile Dependency file to output.
|
|
||||||
tmpdepfile Temporary file to use when outputting dependencies.
|
|
||||||
libtool Whether libtool is used (yes/no).
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "depcomp $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Get the directory component of the given path, and save it in the
|
|
||||||
# global variables '$dir'. Note that this directory component will
|
|
||||||
# be either empty or ending with a '/' character. This is deliberate.
|
|
||||||
set_dir_from ()
|
|
||||||
{
|
|
||||||
case $1 in
|
|
||||||
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
|
||||||
*) dir=;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# Get the suffix-stripped basename of the given path, and save it the
|
|
||||||
# global variable '$base'.
|
|
||||||
set_base_from ()
|
|
||||||
{
|
|
||||||
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
|
||||||
}
|
|
||||||
|
|
||||||
# If no dependency file was actually created by the compiler invocation,
|
|
||||||
# we still have to create a dummy depfile, to avoid errors with the
|
|
||||||
# Makefile "include basename.Plo" scheme.
|
|
||||||
make_dummy_depfile ()
|
|
||||||
{
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Factor out some common post-processing of the generated depfile.
|
|
||||||
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
|
||||||
aix_post_process_depfile ()
|
|
||||||
{
|
|
||||||
# If the compiler actually managed to produce a dependency file,
|
|
||||||
# post-process it.
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
# Each line is of the form 'foo.o: dependency.h'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# $object: dependency.h
|
|
||||||
# and one to simply output
|
|
||||||
# dependency.h:
|
|
||||||
# which is needed to avoid the deleted-header problem.
|
|
||||||
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
|
||||||
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
|
||||||
} > "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
else
|
|
||||||
make_dummy_depfile
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# A tabulation character.
|
|
||||||
tab=' '
|
|
||||||
# A newline character.
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
# Character ranges might be problematic outside the C locale.
|
|
||||||
# These definitions help.
|
|
||||||
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
|
||||||
lower=abcdefghijklmnopqrstuvwxyz
|
|
||||||
digits=0123456789
|
|
||||||
alpha=${upper}${lower}
|
|
||||||
|
|
||||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
|
||||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
|
||||||
depfile=${depfile-`echo "$object" |
|
|
||||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
|
||||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
|
||||||
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
|
|
||||||
# Avoid interferences from the environment.
|
|
||||||
gccflag= dashmflag=
|
|
||||||
|
|
||||||
# Some modes work just like other modes, but use different flags. We
|
|
||||||
# parameterize here, but still list the modes in the big case below,
|
|
||||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
|
||||||
# here, because this file can only contain one case statement.
|
|
||||||
if test "$depmode" = hp; then
|
|
||||||
# HP compiler uses -M and no extra arg.
|
|
||||||
gccflag=-M
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = dashXmstdout; then
|
|
||||||
# This is just like dashmstdout with a different argument.
|
|
||||||
dashmflag=-xM
|
|
||||||
depmode=dashmstdout
|
|
||||||
fi
|
|
||||||
|
|
||||||
cygpath_u="cygpath -u -f -"
|
|
||||||
if test "$depmode" = msvcmsys; then
|
|
||||||
# This is just like msvisualcpp but w/o cygpath translation.
|
|
||||||
# Just convert the backslash-escaped backslashes to single forward
|
|
||||||
# slashes to satisfy depend.m4
|
|
||||||
cygpath_u='sed s,\\\\,/,g'
|
|
||||||
depmode=msvisualcpp
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = msvc7msys; then
|
|
||||||
# This is just like msvc7 but w/o cygpath translation.
|
|
||||||
# Just convert the backslash-escaped backslashes to single forward
|
|
||||||
# slashes to satisfy depend.m4
|
|
||||||
cygpath_u='sed s,\\\\,/,g'
|
|
||||||
depmode=msvc7
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = xlc; then
|
|
||||||
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
|
||||||
gccflag=-qmakedep=gcc,-MF
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$depmode" in
|
|
||||||
gcc3)
|
|
||||||
## gcc 3 implements dependency tracking that does exactly what
|
|
||||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
|
||||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
|
||||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
|
||||||
## the command line argument order; so add the flags where they
|
|
||||||
## appear in depend2.am. Note that the slowdown incurred here
|
|
||||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
|
||||||
*) set fnord "$@" "$arg" ;;
|
|
||||||
esac
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
done
|
|
||||||
"$@"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
mv "$tmpdepfile" "$depfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
gcc)
|
|
||||||
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
|
||||||
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
|
||||||
## (see the conditional assignment to $gccflag above).
|
|
||||||
## There are various ways to get dependency output from gcc. Here's
|
|
||||||
## why we pick this rather obscure method:
|
|
||||||
## - Don't want to use -MD because we'd like the dependencies to end
|
|
||||||
## up in a subdir. Having to rename by hand is ugly.
|
|
||||||
## (We might end up doing this anyway to support other compilers.)
|
|
||||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
|
||||||
## -MM, not -M (despite what the docs say). Also, it might not be
|
|
||||||
## supported by the other compilers which use the 'gcc' depmode.
|
|
||||||
## - Using -M directly means running the compiler twice (even worse
|
|
||||||
## than renaming).
|
|
||||||
if test -z "$gccflag"; then
|
|
||||||
gccflag=-MD,
|
|
||||||
fi
|
|
||||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
# The second -e expression handles DOS-style file names with drive
|
|
||||||
# letters.
|
|
||||||
sed -e 's/^[^:]*: / /' \
|
|
||||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
|
||||||
## This next piece of magic avoids the "deleted header file" problem.
|
|
||||||
## The problem is that when a header file which appears in a .P file
|
|
||||||
## is deleted, the dependency causes make to die (because there is
|
|
||||||
## typically no way to rebuild the header). We avoid this by adding
|
|
||||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
|
||||||
## this for us directly.
|
|
||||||
## Some versions of gcc put a space before the ':'. On the theory
|
|
||||||
## that the space means something, we add a space to the output as
|
|
||||||
## well. hp depmode also adds that space, but also prefixes the VPATH
|
|
||||||
## to the object. Take care to not repeat it in the output.
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
sgi)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
|
||||||
else
|
|
||||||
"$@" -MDupdate "$tmpdepfile"
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
# Clip off the initial element (the dependent). Don't try to be
|
|
||||||
# clever and replace this with sed code, as IRIX sed won't handle
|
|
||||||
# lines with more than a fixed number of characters (4096 in
|
|
||||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
|
||||||
# the IRIX cc adds comments like '#:fec' to the end of the
|
|
||||||
# dependency line.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
|
||||||
| tr "$nl" ' ' >> "$depfile"
|
|
||||||
echo >> "$depfile"
|
|
||||||
# The second pass generates a dummy entry for each header file.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
|
||||||
>> "$depfile"
|
|
||||||
else
|
|
||||||
make_dummy_depfile
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
xlc)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
|
||||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
|
||||||
# in a .u file. In older versions, this file always lives in the
|
|
||||||
# current directory. Also, the AIX compiler puts '$object:' at the
|
|
||||||
# start of each line; $object doesn't have directory information.
|
|
||||||
# Version 6 uses the directory in both cases.
|
|
||||||
set_dir_from "$object"
|
|
||||||
set_base_from "$object"
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$base.u
|
|
||||||
tmpdepfile3=$dir.libs/$base.u
|
|
||||||
"$@" -Wc,-M
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$dir$base.u
|
|
||||||
tmpdepfile3=$dir$base.u
|
|
||||||
"$@" -M
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
aix_post_process_depfile
|
|
||||||
;;
|
|
||||||
|
|
||||||
tcc)
|
|
||||||
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
|
||||||
# FIXME: That version still under development at the moment of writing.
|
|
||||||
# Make that this statement remains true also for stable, released
|
|
||||||
# versions.
|
|
||||||
# It will wrap lines (doesn't matter whether long or short) with a
|
|
||||||
# trailing '\', as in:
|
|
||||||
#
|
|
||||||
# foo.o : \
|
|
||||||
# foo.c \
|
|
||||||
# foo.h \
|
|
||||||
#
|
|
||||||
# It will put a trailing '\' even on the last line, and will use leading
|
|
||||||
# spaces rather than leading tabs (at least since its commit 0394caf7
|
|
||||||
# "Emit spaces for -MD").
|
|
||||||
"$@" -MD -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
|
||||||
# We have to change lines of the first kind to '$object: \'.
|
|
||||||
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
|
||||||
# And for each line of the second kind, we have to emit a 'dep.h:'
|
|
||||||
# dummy dependency, to avoid the deleted-header problem.
|
|
||||||
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
## The order of this option in the case statement is important, since the
|
|
||||||
## shell code in configure will try each of these formats in the order
|
|
||||||
## listed in this file. A plain '-MD' option would be understood by many
|
|
||||||
## compilers, so we must ensure this comes after the gcc and icc options.
|
|
||||||
pgcc)
|
|
||||||
# Portland's C compiler understands '-MD'.
|
|
||||||
# Will always output deps to 'file.d' where file is the root name of the
|
|
||||||
# source file under compilation, even if file resides in a subdirectory.
|
|
||||||
# The object file name does not affect the name of the '.d' file.
|
|
||||||
# pgcc 10.2 will output
|
|
||||||
# foo.o: sub/foo.c sub/foo.h
|
|
||||||
# and will wrap long lines using '\' :
|
|
||||||
# foo.o: sub/foo.c ... \
|
|
||||||
# sub/foo.h ... \
|
|
||||||
# ...
|
|
||||||
set_dir_from "$object"
|
|
||||||
# Use the source, not the object, to determine the base name, since
|
|
||||||
# that's sadly what pgcc will do too.
|
|
||||||
set_base_from "$source"
|
|
||||||
tmpdepfile=$base.d
|
|
||||||
|
|
||||||
# For projects that build the same source file twice into different object
|
|
||||||
# files, the pgcc approach of using the *source* file root name can cause
|
|
||||||
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
|
||||||
# the same $tmpdepfile.
|
|
||||||
lockdir=$base.d-lock
|
|
||||||
trap "
|
|
||||||
echo '$0: caught signal, cleaning up...' >&2
|
|
||||||
rmdir '$lockdir'
|
|
||||||
exit 1
|
|
||||||
" 1 2 13 15
|
|
||||||
numtries=100
|
|
||||||
i=$numtries
|
|
||||||
while test $i -gt 0; do
|
|
||||||
# mkdir is a portable test-and-set.
|
|
||||||
if mkdir "$lockdir" 2>/dev/null; then
|
|
||||||
# This process acquired the lock.
|
|
||||||
"$@" -MD
|
|
||||||
stat=$?
|
|
||||||
# Release the lock.
|
|
||||||
rmdir "$lockdir"
|
|
||||||
break
|
|
||||||
else
|
|
||||||
# If the lock is being held by a different process, wait
|
|
||||||
# until the winning process is done or we timeout.
|
|
||||||
while test -d "$lockdir" && test $i -gt 0; do
|
|
||||||
sleep 1
|
|
||||||
i=`expr $i - 1`
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
i=`expr $i - 1`
|
|
||||||
done
|
|
||||||
trap - 1 2 13 15
|
|
||||||
if test $i -le 0; then
|
|
||||||
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
|
||||||
echo "$0: check lockdir '$lockdir'" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each line is of the form `foo.o: dependent.h',
|
|
||||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp2)
|
|
||||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
|
||||||
# compilers, which have integrated preprocessors. The correct option
|
|
||||||
# to use with these is +Maked; it writes dependencies to a file named
|
|
||||||
# 'foo.d', which lands next to the object file, wherever that
|
|
||||||
# happens to be.
|
|
||||||
# Much of this is similar to the tru64 case; see comments there.
|
|
||||||
set_dir_from "$object"
|
|
||||||
set_base_from "$object"
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir.libs/$base.d
|
|
||||||
"$@" -Wc,+Maked
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
"$@" +Maked
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
|
||||||
# Add 'dependent.h:' lines.
|
|
||||||
sed -ne '2,${
|
|
||||||
s/^ *//
|
|
||||||
s/ \\*$//
|
|
||||||
s/$/:/
|
|
||||||
p
|
|
||||||
}' "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
make_dummy_depfile
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
|
||||||
;;
|
|
||||||
|
|
||||||
tru64)
|
|
||||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
|
||||||
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
|
||||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
|
||||||
# dependencies in 'foo.d' instead, so we check for that too.
|
|
||||||
# Subdirectories are respected.
|
|
||||||
set_dir_from "$object"
|
|
||||||
set_base_from "$object"
|
|
||||||
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
# Libtool generates 2 separate objects for the 2 libraries. These
|
|
||||||
# two compilations output dependencies in $dir.libs/$base.o.d and
|
|
||||||
# in $dir$base.o.d. We have to check for both files, because
|
|
||||||
# one of the two compilations can be disabled. We should prefer
|
|
||||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
|
||||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
|
||||||
# the former would cause a distcleancheck panic.
|
|
||||||
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
|
||||||
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
|
||||||
"$@" -Wc,-MD
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
tmpdepfile3=$dir$base.d
|
|
||||||
"$@" -MD
|
|
||||||
fi
|
|
||||||
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
# Same post-processing that is required for AIX mode.
|
|
||||||
aix_post_process_depfile
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvc7)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
showIncludes=-Wc,-showIncludes
|
|
||||||
else
|
|
||||||
showIncludes=-showIncludes
|
|
||||||
fi
|
|
||||||
"$@" $showIncludes > "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
grep -v '^Note: including file: ' "$tmpdepfile"
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
# The first sed program below extracts the file names and escapes
|
|
||||||
# backslashes for cygpath. The second sed program outputs the file
|
|
||||||
# name when reading, but also accumulates all include files in the
|
|
||||||
# hold buffer in order to output them again at the end. This only
|
|
||||||
# works with sed implementations that can handle large buffers.
|
|
||||||
sed < "$tmpdepfile" -n '
|
|
||||||
/^Note: including file: *\(.*\)/ {
|
|
||||||
s//\1/
|
|
||||||
s/\\/\\\\/g
|
|
||||||
p
|
|
||||||
}' | $cygpath_u | sort -u | sed -n '
|
|
||||||
s/ /\\ /g
|
|
||||||
s/\(.*\)/'"$tab"'\1 \\/p
|
|
||||||
s/.\(.*\) \\/\1:/
|
|
||||||
H
|
|
||||||
$ {
|
|
||||||
s/.*/'"$tab"'/
|
|
||||||
G
|
|
||||||
p
|
|
||||||
}' >> "$depfile"
|
|
||||||
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvc7msys)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
#nosideeffect)
|
|
||||||
# This comment above is used by automake to tell side-effect
|
|
||||||
# dependency tracking mechanisms from slower ones.
|
|
||||||
|
|
||||||
dashmstdout)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove '-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
test -z "$dashmflag" && dashmflag=-M
|
|
||||||
# Require at least two characters before searching for ':'
|
|
||||||
# in the target name. This is to cope with DOS-style filenames:
|
|
||||||
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
|
||||||
"$@" $dashmflag |
|
|
||||||
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
dashXmstdout)
|
|
||||||
# This case only exists to satisfy depend.m4. It is never actually
|
|
||||||
# run, as this mode is specially recognized in the preamble.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
makedepend)
|
|
||||||
"$@" || exit $?
|
|
||||||
# Remove any Libtool call
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
# X makedepend
|
|
||||||
shift
|
|
||||||
cleared=no eat=no
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $cleared in
|
|
||||||
no)
|
|
||||||
set ""; shift
|
|
||||||
cleared=yes ;;
|
|
||||||
esac
|
|
||||||
if test $eat = yes; then
|
|
||||||
eat=no
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
case "$arg" in
|
|
||||||
-D*|-I*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
# Strip any option that makedepend may not understand. Remove
|
|
||||||
# the object too, otherwise makedepend will parse it as a source file.
|
|
||||||
-arch)
|
|
||||||
eat=yes ;;
|
|
||||||
-*|$object)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
|
||||||
touch "$tmpdepfile"
|
|
||||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
|
||||||
rm -f "$depfile"
|
|
||||||
# makedepend may prepend the VPATH from the source file name to the object.
|
|
||||||
# No need to regex-escape $object, excess matching of '.' is harmless.
|
|
||||||
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed '1,2d' "$tmpdepfile" \
|
|
||||||
| tr ' ' "$nl" \
|
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
|
||||||
;;
|
|
||||||
|
|
||||||
cpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove '-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
"$@" -E \
|
|
||||||
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
| sed '$ s: \\$::' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
cat < "$tmpdepfile" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvisualcpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case "$arg" in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
|
||||||
set fnord "$@"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
"$@" -E 2>/dev/null |
|
|
||||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
|
||||||
echo "$tab" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvcmsys)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
none)
|
|
||||||
exec "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Unknown depmode $depmode" 1>&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
|
@ -1,618 +0,0 @@
|
||||||
This is libffi.info, produced by makeinfo version 5.1 from libffi.texi.
|
|
||||||
|
|
||||||
This manual is for Libffi, a portable foreign-function interface
|
|
||||||
library.
|
|
||||||
|
|
||||||
Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
|
|
||||||
|
|
||||||
Permission is granted to copy, distribute and/or modify this
|
|
||||||
document under the terms of the GNU General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2, or (at
|
|
||||||
your option) any later version. A copy of the license is included
|
|
||||||
in the section entitled "GNU General Public License".
|
|
||||||
|
|
||||||
INFO-DIR-SECTION Development
|
|
||||||
START-INFO-DIR-ENTRY
|
|
||||||
* libffi: (libffi). Portable foreign-function interface library.
|
|
||||||
END-INFO-DIR-ENTRY
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Top, Next: Introduction, Up: (dir)
|
|
||||||
|
|
||||||
libffi
|
|
||||||
******
|
|
||||||
|
|
||||||
This manual is for Libffi, a portable foreign-function interface
|
|
||||||
library.
|
|
||||||
|
|
||||||
Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
|
|
||||||
|
|
||||||
Permission is granted to copy, distribute and/or modify this
|
|
||||||
document under the terms of the GNU General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2, or (at
|
|
||||||
your option) any later version. A copy of the license is included
|
|
||||||
in the section entitled "GNU General Public License".
|
|
||||||
|
|
||||||
* Menu:
|
|
||||||
|
|
||||||
* Introduction:: What is libffi?
|
|
||||||
* Using libffi:: How to use libffi.
|
|
||||||
* Missing Features:: Things libffi can't do.
|
|
||||||
* Index:: Index.
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Introduction, Next: Using libffi, Prev: Top, Up: Top
|
|
||||||
|
|
||||||
1 What is libffi?
|
|
||||||
*****************
|
|
||||||
|
|
||||||
Compilers for high level languages generate code that follow certain
|
|
||||||
conventions. These conventions are necessary, in part, for separate
|
|
||||||
compilation to work. One such convention is the "calling convention".
|
|
||||||
The calling convention is a set of assumptions made by the compiler
|
|
||||||
about where function arguments will be found on entry to a function. A
|
|
||||||
calling convention also specifies where the return value for a function
|
|
||||||
is found. The calling convention is also sometimes called the "ABI" or
|
|
||||||
"Application Binary Interface".
|
|
||||||
|
|
||||||
Some programs may not know at the time of compilation what arguments
|
|
||||||
are to be passed to a function. For instance, an interpreter may be
|
|
||||||
told at run-time about the number and types of arguments used to call a
|
|
||||||
given function. 'Libffi' can be used in such programs to provide a
|
|
||||||
bridge from the interpreter program to compiled code.
|
|
||||||
|
|
||||||
The 'libffi' library provides a portable, high level programming
|
|
||||||
interface to various calling conventions. This allows a programmer to
|
|
||||||
call any function specified by a call interface description at run time.
|
|
||||||
|
|
||||||
FFI stands for Foreign Function Interface. A foreign function
|
|
||||||
interface is the popular name for the interface that allows code written
|
|
||||||
in one language to call code written in another language. The 'libffi'
|
|
||||||
library really only provides the lowest, machine dependent layer of a
|
|
||||||
fully featured foreign function interface. A layer must exist above
|
|
||||||
'libffi' that handles type conversions for values passed between the two
|
|
||||||
languages.
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Using libffi, Next: Missing Features, Prev: Introduction, Up: Top
|
|
||||||
|
|
||||||
2 Using libffi
|
|
||||||
**************
|
|
||||||
|
|
||||||
* Menu:
|
|
||||||
|
|
||||||
* The Basics:: The basic libffi API.
|
|
||||||
* Simple Example:: A simple example.
|
|
||||||
* Types:: libffi type descriptions.
|
|
||||||
* Multiple ABIs:: Different passing styles on one platform.
|
|
||||||
* The Closure API:: Writing a generic function.
|
|
||||||
* Closure Example:: A closure example.
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: The Basics, Next: Simple Example, Up: Using libffi
|
|
||||||
|
|
||||||
2.1 The Basics
|
|
||||||
==============
|
|
||||||
|
|
||||||
'Libffi' assumes that you have a pointer to the function you wish to
|
|
||||||
call and that you know the number and types of arguments to pass it, as
|
|
||||||
well as the return type of the function.
|
|
||||||
|
|
||||||
The first thing you must do is create an 'ffi_cif' object that
|
|
||||||
matches the signature of the function you wish to call. This is a
|
|
||||||
separate step because it is common to make multiple calls using a single
|
|
||||||
'ffi_cif'. The "cif" in 'ffi_cif' stands for Call InterFace. To
|
|
||||||
prepare a call interface object, use the function 'ffi_prep_cif'.
|
|
||||||
|
|
||||||
-- Function: ffi_status ffi_prep_cif (ffi_cif *CIF, ffi_abi ABI,
|
|
||||||
unsigned int NARGS, ffi_type *RTYPE, ffi_type **ARGTYPES)
|
|
||||||
This initializes CIF according to the given parameters.
|
|
||||||
|
|
||||||
ABI is the ABI to use; normally 'FFI_DEFAULT_ABI' is what you want.
|
|
||||||
*note Multiple ABIs:: for more information.
|
|
||||||
|
|
||||||
NARGS is the number of arguments that this function accepts.
|
|
||||||
|
|
||||||
RTYPE is a pointer to an 'ffi_type' structure that describes the
|
|
||||||
return type of the function. *Note Types::.
|
|
||||||
|
|
||||||
ARGTYPES is a vector of 'ffi_type' pointers. ARGTYPES must have
|
|
||||||
NARGS elements. If NARGS is 0, this argument is ignored.
|
|
||||||
|
|
||||||
'ffi_prep_cif' returns a 'libffi' status code, of type
|
|
||||||
'ffi_status'. This will be either 'FFI_OK' if everything worked
|
|
||||||
properly; 'FFI_BAD_TYPEDEF' if one of the 'ffi_type' objects is
|
|
||||||
incorrect; or 'FFI_BAD_ABI' if the ABI parameter is invalid.
|
|
||||||
|
|
||||||
If the function being called is variadic (varargs) then
|
|
||||||
'ffi_prep_cif_var' must be used instead of 'ffi_prep_cif'.
|
|
||||||
|
|
||||||
-- Function: ffi_status ffi_prep_cif_var (ffi_cif *CIF, ffi_abi varabi,
|
|
||||||
unsigned int NFIXEDARGS, unsigned int varntotalargs, ffi_type
|
|
||||||
*RTYPE, ffi_type **ARGTYPES)
|
|
||||||
This initializes CIF according to the given parameters for a call
|
|
||||||
to a variadic function. In general it's operation is the same as
|
|
||||||
for 'ffi_prep_cif' except that:
|
|
||||||
|
|
||||||
NFIXEDARGS is the number of fixed arguments, prior to any variadic
|
|
||||||
arguments. It must be greater than zero.
|
|
||||||
|
|
||||||
NTOTALARGS the total number of arguments, including variadic and
|
|
||||||
fixed arguments.
|
|
||||||
|
|
||||||
Note that, different cif's must be prepped for calls to the same
|
|
||||||
function when different numbers of arguments are passed.
|
|
||||||
|
|
||||||
Also note that a call to 'ffi_prep_cif_var' with
|
|
||||||
NFIXEDARGS=NOTOTALARGS is NOT equivalent to a call to
|
|
||||||
'ffi_prep_cif'.
|
|
||||||
|
|
||||||
To call a function using an initialized 'ffi_cif', use the 'ffi_call'
|
|
||||||
function:
|
|
||||||
|
|
||||||
-- Function: void ffi_call (ffi_cif *CIF, void *FN, void *RVALUE, void
|
|
||||||
**AVALUES)
|
|
||||||
This calls the function FN according to the description given in
|
|
||||||
CIF. CIF must have already been prepared using 'ffi_prep_cif'.
|
|
||||||
|
|
||||||
RVALUE is a pointer to a chunk of memory that will hold the result
|
|
||||||
of the function call. This must be large enough to hold the
|
|
||||||
result, no smaller than the system register size (generally 32 or
|
|
||||||
64 bits), and must be suitably aligned; it is the caller's
|
|
||||||
responsibility to ensure this. If CIF declares that the function
|
|
||||||
returns 'void' (using 'ffi_type_void'), then RVALUE is ignored.
|
|
||||||
|
|
||||||
AVALUES is a vector of 'void *' pointers that point to the memory
|
|
||||||
locations holding the argument values for a call. If CIF declares
|
|
||||||
that the function has no arguments (i.e., NARGS was 0), then
|
|
||||||
AVALUES is ignored. Note that argument values may be modified by
|
|
||||||
the callee (for instance, structs passed by value); the burden of
|
|
||||||
copying pass-by-value arguments is placed on the caller.
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Simple Example, Next: Types, Prev: The Basics, Up: Using libffi
|
|
||||||
|
|
||||||
2.2 Simple Example
|
|
||||||
==================
|
|
||||||
|
|
||||||
Here is a trivial example that calls 'puts' a few times.
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ffi.h>
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
ffi_cif cif;
|
|
||||||
ffi_type *args[1];
|
|
||||||
void *values[1];
|
|
||||||
char *s;
|
|
||||||
ffi_arg rc;
|
|
||||||
|
|
||||||
/* Initialize the argument info vectors */
|
|
||||||
args[0] = &ffi_type_pointer;
|
|
||||||
values[0] = &s;
|
|
||||||
|
|
||||||
/* Initialize the cif */
|
|
||||||
if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
|
||||||
&ffi_type_sint, args) == FFI_OK)
|
|
||||||
{
|
|
||||||
s = "Hello World!";
|
|
||||||
ffi_call(&cif, puts, &rc, values);
|
|
||||||
/* rc now holds the result of the call to puts */
|
|
||||||
|
|
||||||
/* values holds a pointer to the function's arg, so to
|
|
||||||
call puts() again all we need to do is change the
|
|
||||||
value of s */
|
|
||||||
s = "This is cool!";
|
|
||||||
ffi_call(&cif, puts, &rc, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Types, Next: Multiple ABIs, Prev: Simple Example, Up: Using libffi
|
|
||||||
|
|
||||||
2.3 Types
|
|
||||||
=========
|
|
||||||
|
|
||||||
* Menu:
|
|
||||||
|
|
||||||
* Primitive Types:: Built-in types.
|
|
||||||
* Structures:: Structure types.
|
|
||||||
* Type Example:: Structure type example.
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Primitive Types, Next: Structures, Up: Types
|
|
||||||
|
|
||||||
2.3.1 Primitive Types
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
'Libffi' provides a number of built-in type descriptors that can be used
|
|
||||||
to describe argument and return types:
|
|
||||||
|
|
||||||
'ffi_type_void'
|
|
||||||
The type 'void'. This cannot be used for argument types, only for
|
|
||||||
return values.
|
|
||||||
|
|
||||||
'ffi_type_uint8'
|
|
||||||
An unsigned, 8-bit integer type.
|
|
||||||
|
|
||||||
'ffi_type_sint8'
|
|
||||||
A signed, 8-bit integer type.
|
|
||||||
|
|
||||||
'ffi_type_uint16'
|
|
||||||
An unsigned, 16-bit integer type.
|
|
||||||
|
|
||||||
'ffi_type_sint16'
|
|
||||||
A signed, 16-bit integer type.
|
|
||||||
|
|
||||||
'ffi_type_uint32'
|
|
||||||
An unsigned, 32-bit integer type.
|
|
||||||
|
|
||||||
'ffi_type_sint32'
|
|
||||||
A signed, 32-bit integer type.
|
|
||||||
|
|
||||||
'ffi_type_uint64'
|
|
||||||
An unsigned, 64-bit integer type.
|
|
||||||
|
|
||||||
'ffi_type_sint64'
|
|
||||||
A signed, 64-bit integer type.
|
|
||||||
|
|
||||||
'ffi_type_float'
|
|
||||||
The C 'float' type.
|
|
||||||
|
|
||||||
'ffi_type_double'
|
|
||||||
The C 'double' type.
|
|
||||||
|
|
||||||
'ffi_type_uchar'
|
|
||||||
The C 'unsigned char' type.
|
|
||||||
|
|
||||||
'ffi_type_schar'
|
|
||||||
The C 'signed char' type. (Note that there is not an exact
|
|
||||||
equivalent to the C 'char' type in 'libffi'; ordinarily you should
|
|
||||||
either use 'ffi_type_schar' or 'ffi_type_uchar' depending on
|
|
||||||
whether 'char' is signed.)
|
|
||||||
|
|
||||||
'ffi_type_ushort'
|
|
||||||
The C 'unsigned short' type.
|
|
||||||
|
|
||||||
'ffi_type_sshort'
|
|
||||||
The C 'short' type.
|
|
||||||
|
|
||||||
'ffi_type_uint'
|
|
||||||
The C 'unsigned int' type.
|
|
||||||
|
|
||||||
'ffi_type_sint'
|
|
||||||
The C 'int' type.
|
|
||||||
|
|
||||||
'ffi_type_ulong'
|
|
||||||
The C 'unsigned long' type.
|
|
||||||
|
|
||||||
'ffi_type_slong'
|
|
||||||
The C 'long' type.
|
|
||||||
|
|
||||||
'ffi_type_longdouble'
|
|
||||||
On platforms that have a C 'long double' type, this is defined. On
|
|
||||||
other platforms, it is not.
|
|
||||||
|
|
||||||
'ffi_type_pointer'
|
|
||||||
A generic 'void *' pointer. You should use this for all pointers,
|
|
||||||
regardless of their real type.
|
|
||||||
|
|
||||||
Each of these is of type 'ffi_type', so you must take the address
|
|
||||||
when passing to 'ffi_prep_cif'.
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Structures, Next: Type Example, Prev: Primitive Types, Up: Types
|
|
||||||
|
|
||||||
2.3.2 Structures
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Although 'libffi' has no special support for unions or bit-fields, it is
|
|
||||||
perfectly happy passing structures back and forth. You must first
|
|
||||||
describe the structure to 'libffi' by creating a new 'ffi_type' object
|
|
||||||
for it.
|
|
||||||
|
|
||||||
-- Data type: ffi_type
|
|
||||||
The 'ffi_type' has the following members:
|
|
||||||
'size_t size'
|
|
||||||
This is set by 'libffi'; you should initialize it to zero.
|
|
||||||
|
|
||||||
'unsigned short alignment'
|
|
||||||
This is set by 'libffi'; you should initialize it to zero.
|
|
||||||
|
|
||||||
'unsigned short type'
|
|
||||||
For a structure, this should be set to 'FFI_TYPE_STRUCT'.
|
|
||||||
|
|
||||||
'ffi_type **elements'
|
|
||||||
This is a 'NULL'-terminated array of pointers to 'ffi_type'
|
|
||||||
objects. There is one element per field of the struct.
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Type Example, Prev: Structures, Up: Types
|
|
||||||
|
|
||||||
2.3.3 Type Example
|
|
||||||
------------------
|
|
||||||
|
|
||||||
The following example initializes a 'ffi_type' object representing the
|
|
||||||
'tm' struct from Linux's 'time.h'.
|
|
||||||
|
|
||||||
Here is how the struct is defined:
|
|
||||||
|
|
||||||
struct tm {
|
|
||||||
int tm_sec;
|
|
||||||
int tm_min;
|
|
||||||
int tm_hour;
|
|
||||||
int tm_mday;
|
|
||||||
int tm_mon;
|
|
||||||
int tm_year;
|
|
||||||
int tm_wday;
|
|
||||||
int tm_yday;
|
|
||||||
int tm_isdst;
|
|
||||||
/* Those are for future use. */
|
|
||||||
long int __tm_gmtoff__;
|
|
||||||
__const char *__tm_zone__;
|
|
||||||
};
|
|
||||||
|
|
||||||
Here is the corresponding code to describe this struct to 'libffi':
|
|
||||||
|
|
||||||
{
|
|
||||||
ffi_type tm_type;
|
|
||||||
ffi_type *tm_type_elements[12];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
tm_type.size = tm_type.alignment = 0;
|
|
||||||
tm_type.type = FFI_TYPE_STRUCT;
|
|
||||||
tm_type.elements = &tm_type_elements;
|
|
||||||
|
|
||||||
for (i = 0; i < 9; i++)
|
|
||||||
tm_type_elements[i] = &ffi_type_sint;
|
|
||||||
|
|
||||||
tm_type_elements[9] = &ffi_type_slong;
|
|
||||||
tm_type_elements[10] = &ffi_type_pointer;
|
|
||||||
tm_type_elements[11] = NULL;
|
|
||||||
|
|
||||||
/* tm_type can now be used to represent tm argument types and
|
|
||||||
return types for ffi_prep_cif() */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Multiple ABIs, Next: The Closure API, Prev: Types, Up: Using libffi
|
|
||||||
|
|
||||||
2.4 Multiple ABIs
|
|
||||||
=================
|
|
||||||
|
|
||||||
A given platform may provide multiple different ABIs at once. For
|
|
||||||
instance, the x86 platform has both 'stdcall' and 'fastcall' functions.
|
|
||||||
|
|
||||||
'libffi' provides some support for this. However, this is
|
|
||||||
necessarily platform-specific.
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: The Closure API, Next: Closure Example, Prev: Multiple ABIs, Up: Using libffi
|
|
||||||
|
|
||||||
2.5 The Closure API
|
|
||||||
===================
|
|
||||||
|
|
||||||
'libffi' also provides a way to write a generic function - a function
|
|
||||||
that can accept and decode any combination of arguments. This can be
|
|
||||||
useful when writing an interpreter, or to provide wrappers for arbitrary
|
|
||||||
functions.
|
|
||||||
|
|
||||||
This facility is called the "closure API". Closures are not supported
|
|
||||||
on all platforms; you can check the 'FFI_CLOSURES' define to determine
|
|
||||||
whether they are supported on the current platform.
|
|
||||||
|
|
||||||
Because closures work by assembling a tiny function at runtime, they
|
|
||||||
require special allocation on platforms that have a non-executable heap.
|
|
||||||
Memory management for closures is handled by a pair of functions:
|
|
||||||
|
|
||||||
-- Function: void *ffi_closure_alloc (size_t SIZE, void **CODE)
|
|
||||||
Allocate a chunk of memory holding SIZE bytes. This returns a
|
|
||||||
pointer to the writable address, and sets *CODE to the
|
|
||||||
corresponding executable address.
|
|
||||||
|
|
||||||
SIZE should be sufficient to hold a 'ffi_closure' object.
|
|
||||||
|
|
||||||
-- Function: void ffi_closure_free (void *WRITABLE)
|
|
||||||
Free memory allocated using 'ffi_closure_alloc'. The argument is
|
|
||||||
the writable address that was returned.
|
|
||||||
|
|
||||||
Once you have allocated the memory for a closure, you must construct
|
|
||||||
a 'ffi_cif' describing the function call. Finally you can prepare the
|
|
||||||
closure function:
|
|
||||||
|
|
||||||
-- Function: ffi_status ffi_prep_closure_loc (ffi_closure *CLOSURE,
|
|
||||||
ffi_cif *CIF, void (*FUN) (ffi_cif *CIF, void *RET, void
|
|
||||||
**ARGS, void *USER_DATA), void *USER_DATA, void *CODELOC)
|
|
||||||
Prepare a closure function.
|
|
||||||
|
|
||||||
CLOSURE is the address of a 'ffi_closure' object; this is the
|
|
||||||
writable address returned by 'ffi_closure_alloc'.
|
|
||||||
|
|
||||||
CIF is the 'ffi_cif' describing the function parameters.
|
|
||||||
|
|
||||||
USER_DATA is an arbitrary datum that is passed, uninterpreted, to
|
|
||||||
your closure function.
|
|
||||||
|
|
||||||
CODELOC is the executable address returned by 'ffi_closure_alloc'.
|
|
||||||
|
|
||||||
FUN is the function which will be called when the closure is
|
|
||||||
invoked. It is called with the arguments:
|
|
||||||
CIF
|
|
||||||
The 'ffi_cif' passed to 'ffi_prep_closure_loc'.
|
|
||||||
|
|
||||||
RET
|
|
||||||
A pointer to the memory used for the function's return value.
|
|
||||||
FUN must fill this, unless the function is declared as
|
|
||||||
returning 'void'.
|
|
||||||
|
|
||||||
ARGS
|
|
||||||
A vector of pointers to memory holding the arguments to the
|
|
||||||
function.
|
|
||||||
|
|
||||||
USER_DATA
|
|
||||||
The same USER_DATA that was passed to 'ffi_prep_closure_loc'.
|
|
||||||
|
|
||||||
'ffi_prep_closure_loc' will return 'FFI_OK' if everything went ok,
|
|
||||||
and something else on error.
|
|
||||||
|
|
||||||
After calling 'ffi_prep_closure_loc', you can cast CODELOC to the
|
|
||||||
appropriate pointer-to-function type.
|
|
||||||
|
|
||||||
You may see old code referring to 'ffi_prep_closure'. This function
|
|
||||||
is deprecated, as it cannot handle the need for separate writable and
|
|
||||||
executable addresses.
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Closure Example, Prev: The Closure API, Up: Using libffi
|
|
||||||
|
|
||||||
2.6 Closure Example
|
|
||||||
===================
|
|
||||||
|
|
||||||
A trivial example that creates a new 'puts' by binding 'fputs' with
|
|
||||||
'stdout'.
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ffi.h>
|
|
||||||
|
|
||||||
/* Acts like puts with the file given at time of enclosure. */
|
|
||||||
void puts_binding(ffi_cif *cif, void *ret, void* args[],
|
|
||||||
void *stream)
|
|
||||||
{
|
|
||||||
*(ffi_arg *)ret = fputs(*(char **)args[0], (FILE *)stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef int (*puts_t)(char *);
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
ffi_cif cif;
|
|
||||||
ffi_type *args[1];
|
|
||||||
ffi_closure *closure;
|
|
||||||
|
|
||||||
void *bound_puts;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
/* Allocate closure and bound_puts */
|
|
||||||
closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);
|
|
||||||
|
|
||||||
if (closure)
|
|
||||||
{
|
|
||||||
/* Initialize the argument info vectors */
|
|
||||||
args[0] = &ffi_type_pointer;
|
|
||||||
|
|
||||||
/* Initialize the cif */
|
|
||||||
if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
|
||||||
&ffi_type_sint, args) == FFI_OK)
|
|
||||||
{
|
|
||||||
/* Initialize the closure, setting stream to stdout */
|
|
||||||
if (ffi_prep_closure_loc(closure, &cif, puts_binding,
|
|
||||||
stdout, bound_puts) == FFI_OK)
|
|
||||||
{
|
|
||||||
rc = ((puts_t)bound_puts)("Hello World!");
|
|
||||||
/* rc now holds the result of the call to fputs */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Deallocate both closure, and bound_puts */
|
|
||||||
ffi_closure_free(closure);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Missing Features, Next: Index, Prev: Using libffi, Up: Top
|
|
||||||
|
|
||||||
3 Missing Features
|
|
||||||
******************
|
|
||||||
|
|
||||||
'libffi' is missing a few features. We welcome patches to add support
|
|
||||||
for these.
|
|
||||||
|
|
||||||
* Variadic closures.
|
|
||||||
|
|
||||||
* There is no support for bit fields in structures.
|
|
||||||
|
|
||||||
* The closure API is
|
|
||||||
|
|
||||||
* The "raw" API is undocumented.
|
|
||||||
|
|
||||||
Note that variadic support is very new and tested on a relatively
|
|
||||||
small number of platforms.
|
|
||||||
|
|
||||||
|
|
||||||
File: libffi.info, Node: Index, Prev: Missing Features, Up: Top
|
|
||||||
|
|
||||||
Index
|
|
||||||
*****
|
|
||||||
|
|
||||||
|