setup: various fix for OS X / El Capitan

- add /Library/Frameworks as path for framework headers/link (it wasn’t
included anymore)
- fix i386 issue with GStreamer framework by limiting the compilation
on x86_64 only if frameworks are used
- fixes the issue where smpeg2 use @executable_path that leads to an
issue when trying to import anything related to SDL2. CF:

[CRITICAL] [Window      ] Unable to find any valuable Window provider
at all!
sdl2 - ImportError:
dlopen(/Users/tito/code/kivy/kivy/core/window/_window_sdl2.so, 2):
Library not loaded:
@executable_path/../Frameworks/SDL2.framework/Versions/A/SDL2
  Referenced from:
/Library/Frameworks/SDL2_mixer.framework/Versions/A/Frameworks/smpeg2.fr
amework/Versions/A/smpeg2
  Reason: unsafe use of @executable_path in
/Library/Frameworks/SDL2_mixer.framework/Versions/A/Frameworks/smpeg2.fr
amework/Versions/A/smpeg2 with restricted binary
  File "/Users/tito/code/kivy/kivy/core/__init__.py", line 59, in
core_select_lib
    fromlist=[modulename], level=0)
  File "/Users/tito/code/kivy/kivy/core/window/window_sdl2.py", line
26, in <module>
    from kivy.core.window._window_sdl2 import _WindowSDL2Storage
This commit is contained in:
Mathieu Virbel 2015-11-29 19:04:10 +01:00
parent 123c2658b4
commit d6deccac5a
1 changed files with 46 additions and 2 deletions

View File

@ -12,7 +12,6 @@ from os.path import join, dirname, sep, exists, basename, isdir, abspath
from os import walk, environ, makedirs, listdir from os import walk, environ, makedirs, listdir
from distutils.version import LooseVersion from distutils.version import LooseVersion
from collections import OrderedDict from collections import OrderedDict
from subprocess import check_output
from time import sleep from time import sleep
if environ.get('KIVY_USE_SETUPTOOLS'): if environ.get('KIVY_USE_SETUPTOOLS'):
@ -278,6 +277,33 @@ class KivyBuildExt(build_ext):
return need_update return need_update
def _check_and_fix_sdl2_mixer(f_path):
print("Check if SDL2_mixer smpeg2 have an @executable_path")
rpath_from = "@executable_path/../Frameworks/SDL2.framework/Versions/A/SDL2"
rpath_to = "@rpath/../../../../SDL2.framework/Versions/A/SDL2"
smpeg2_path = ("{}/Versions/A/Frameworks/smpeg2.framework"
"/Versions/A/smpeg2").format(f_path)
output = getoutput(("otool -L '{}'").format(smpeg2_path))
if "@executable_path" not in output:
return
print("WARNING: Your SDL2_mixer version is invalid")
print("WARNING: The smpeg2 framework embedded in SDL2_mixer contains a")
print("WARNING: reference to @executable_path that will fail the")
print("WARNING: execution of your application.")
print("WARNING: We are going to change:")
print("WARNING: from: {}".format(rpath_from))
print("WARNING: to: {}".format(rpath_to))
getoutput("install_name_tool -change {} {} {}".format(
rpath_from, rpath_to, smpeg2_path))
output = getoutput(("otool -L '{}'").format(smpeg2_path))
if "@executable_path" not in output:
print("WARNING: Change successfully applied!")
print("WARNING: You'll never see this message again.")
else:
print("WARNING: Unable to apply the changes, sorry.")
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# extract version (simulate doc generation, kivy will be not imported) # extract version (simulate doc generation, kivy will be not imported)
environ['KIVY_DOC_INCLUDE'] = '1' environ['KIVY_DOC_INCLUDE'] = '1'
@ -347,6 +373,15 @@ if platform == 'ios':
c_options['use_ios'] = True c_options['use_ios'] = True
c_options['use_sdl2'] = True c_options['use_sdl2'] = True
elif platform == 'darwin':
if c_options['use_osx_frameworks']:
if osx_arch == "i386":
print("Warning: building with frameworks fail on i386")
else:
print("OSX framework used, force to x86_64 only")
environ["ARCHFLAGS"] = environ.get("ARCHFLAGS", "-arch x86_64")
print("OSX ARCHFLAGS are: {}".format(environ["ARCHFLAGS"]))
# detect gstreamer, only on desktop # detect gstreamer, only on desktop
# works if we forced the options or in autodetection # works if we forced the options or in autodetection
if platform not in ('ios', 'android') and (c_options['use_gstreamer'] if platform not in ('ios', 'android') and (c_options['use_gstreamer']
@ -361,6 +396,9 @@ if platform not in ('ios', 'android') and (c_options['use_gstreamer']
c_options['use_gstreamer'] = True c_options['use_gstreamer'] = True
gst_flags = { gst_flags = {
'extra_link_args': [ 'extra_link_args': [
'-F/Library/Frameworks',
'-Xlinker', '-rpath',
'-Xlinker', '/Library/Frameworks',
'-Xlinker', '-headerpad', '-Xlinker', '-headerpad',
'-Xlinker', '190', '-Xlinker', '190',
'-framework', 'GStreamer'], '-framework', 'GStreamer'],
@ -384,9 +422,13 @@ if c_options['use_sdl2'] or (
sdl2_valid = True sdl2_valid = True
sdl2_flags = { sdl2_flags = {
'extra_link_args': [ 'extra_link_args': [
'-F/Library/Frameworks',
'-Xlinker', '-rpath',
'-Xlinker', '/Library/Frameworks',
'-Xlinker', '-headerpad', '-Xlinker', '-headerpad',
'-Xlinker', '190'], '-Xlinker', '190'],
'include_dirs': [] 'include_dirs': [],
'extra_compile_args': ['-F/Library/Frameworks']
} }
for name in ('SDL2', 'SDL2_ttf', 'SDL2_image', 'SDL2_mixer'): for name in ('SDL2', 'SDL2_ttf', 'SDL2_image', 'SDL2_mixer'):
f_path = '/Library/Frameworks/{}.framework'.format(name) f_path = '/Library/Frameworks/{}.framework'.format(name)
@ -397,6 +439,8 @@ if c_options['use_sdl2'] or (
sdl2_flags['extra_link_args'] += ['-framework', name] sdl2_flags['extra_link_args'] += ['-framework', name]
sdl2_flags['include_dirs'] += [join(f_path, 'Headers')] sdl2_flags['include_dirs'] += [join(f_path, 'Headers')]
print('Found sdl2 frameworks: {}'.format(f_path)) print('Found sdl2 frameworks: {}'.format(f_path))
if name == 'SDL2_mixer':
_check_and_fix_sdl2_mixer(f_path)
if not sdl2_valid: if not sdl2_valid:
c_options['use_sdl2'] = False c_options['use_sdl2'] = False