1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
# -*- Mode: Python -*- vi:si:et:sw=4:sts=4:ts=4:syntax=python
import shutil
from cerbero.tools.libtool import LibtoolLibrary
from cerbero.tools.pkgconfig import PkgConfigWritter
class Recipe(recipe.Recipe):
name = 'gnustl'
version = '0.1'
licenses = [License.LGPLv2_1Plus]
stype = SourceType.CUSTOM
btype = BuildType.CUSTOM
runtime_dep = True
files_stl = [
'lib/libc++_shared.so']
files_devel= [
'lib/pkgconfig/gnustl.pc',
'lib/libgnustl.la',
'lib/libandroid_support.a'
]
def prepare(self):
if self.config.target_platform != Platform.ANDROID:
raise InvalidRecipeError(self, "Invalid platform")
v = DistroVersion.get_android_api_version(self.config.target_distro_version)
async def compile(self):
libdir = os.path.join(self.config.prefix, 'lib')
if not os.path.exists(libdir):
os.makedirs(libdir)
# Generate libraries that aren't copied from the NDK
v = DistroVersion.get_android_api_version(self.config.target_distro_version)
if v >= 21:
shell.new_call([self.get_env('AR'), 'rc', os.path.join(libdir, 'libandroid_support.a')], env=self.env)
if self.config.target_arch != Architecture.ARMv7:
shell.new_call([self.get_env('AR'), 'rc', os.path.join(libdir, 'libunwind.a')], env=self.env)
async def install(self):
stl_prefix = os.path.join(self.config.toolchain_prefix, 'sources',
'cxx-stl', 'llvm-libc++')
if self.config.target_arch == Architecture.X86:
libarch = 'x86'
elif self.config.target_arch == Architecture.X86_64:
libarch = 'x86_64'
elif self.config.target_arch == Architecture.ARMv7:
libarch = 'armeabi-v7a'
elif self.config.target_arch == Architecture.ARM64:
libarch = 'arm64-v8a'
elif self.config.target_arch == Architecture.ARM:
libarch = 'armeabi'
else:
raise FatalError("Unsupported Android architecture %s" % self.config.target_arch)
stl_libdir = os.path.join(stl_prefix, 'libs', libarch)
libdir = os.path.join(self.config.prefix, 'lib')
if not os.path.exists(libdir):
os.makedirs(libdir)
# Copies libraries to the prefix
shutil.copy(os.path.join(stl_libdir, 'libc++_shared.so'),
os.path.join(libdir, 'libc++_shared.so'))
v = DistroVersion.get_android_api_version(self.config.target_distro_version)
if v < 21:
shutil.copy(os.path.join(stl_libdir, 'libandroid_support.a'),
os.path.join(libdir, 'libandroid_support.a'))
if self.config.target_arch == Architecture.ARMv7:
shutil.copy(os.path.join(stl_libdir, 'libunwind.a'),
os.path.join(libdir, 'libunwind.a'))
# Create a libtool library for gnustl (libgnustl.la)
lib = LibtoolLibrary('gnustl', None, None, None, libdir,
self.config.target_platform)
lib.change_value('dlname', 'libc++_shared.so')
lib.change_value('library_names', 'libc++_shared.so libc++_shared.so libc++_shared.so')
lib.change_value('old_library', '')
lib.change_value('dependency_libs', '-lc++_shared' +
(' %s/libandroid_support.a' % (libdir) if v < 21 else '') +
(' %s/libunwind.a' % (libdir) if self.config.target_arch == Architecture.ARMv7 else ''))
lib.save()
# Create pkg-config file (gnustl.pc)
pkgdir = os.path.join(self.config.prefix, 'lib', 'pkgconfig')
if not os.path.exists(pkgdir):
os.makedirs(pkgdir)
stl_pc = PkgConfigWritter('gnustl', 'gnustl', '2.0',
'', '-L${libdir} ${libdir}/libc++_shared.so' +
(' ${libdir}/libandroid_support.a ' if v < 21 else '') +
(' ${libdir}/libunwind.a ' if self.config.target_arch == Architecture.ARMv7 else '') +
'',
# FIXME: slurp these headers into the cerbero directory somehow so that they are usable from c++ applications
'-I%s/include' % (stl_prefix) +
(' -I%s/sources/android/support/include ' % self.config.toolchain_prefix if v < 21 else ''),
self.config.prefix)
stl_pc.rel_incldir = 'include'
stl_pc.save('gnustl', pkgdir)
|