forked from conan-io/conan
-
Notifications
You must be signed in to change notification settings - Fork 1
/
android.py
68 lines (56 loc) · 2.66 KB
/
android.py
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
import os
import textwrap
from conans.client.tools.files import which
from conans.errors import ConanException
from conan.tools.cmake.base import CMakeToolchainBase
class CMakeAndroidToolchain(CMakeToolchainBase):
_toolchain_tpl = textwrap.dedent("""
{% extends 'base_toolchain' %}
{% block before_try_compile %}
{{ super() }}
set(CMAKE_SYSTEM_NAME {{ CMAKE_SYSTEM_NAME }})
set(CMAKE_SYSTEM_VERSION {{ CMAKE_SYSTEM_VERSION }})
set(CMAKE_ANDROID_ARCH_ABI {{ CMAKE_ANDROID_ARCH_ABI }})
set(CMAKE_ANDROID_STL_TYPE {{ CMAKE_ANDROID_STL_TYPE }})
set(CMAKE_ANDROID_NDK {{ CMAKE_ANDROID_NDK }})
{% endblock %}
""")
# TODO: fPIC, fPIE
# TODO: RPATH, cross-compiling to Android?
# TODO: libcxx, only libc++ https://developer.android.com/ndk/guides/cpp-support
def __init__(self, conanfile, build_type=None, **kwargs):
super(CMakeAndroidToolchain, self).__init__(conanfile, build_type=build_type, **kwargs)
self.build_type = build_type or self._conanfile.settings.get_safe("build_type")
def _get_templates(self):
templates = super(CMakeAndroidToolchain, self)._get_templates()
templates.update({
CMakeToolchainBase.filename: self._toolchain_tpl,
})
return templates
def _get_android_abi(self):
return {"x86": "x86",
"x86_64": "x86_64",
"armv7": "armeabi-v7a",
"armv8": "arm64-v8a"}.get(str(self._conanfile.settings.arch))
def _get_android_stl(self):
libcxx_str = str(self._conanfile.settings.compiler.libcxx)
return libcxx_str # TODO: only 'c++_shared' y 'c++_static' supported?
def _guess_android_ndk(self):
# TODO: Do not use envvar! This has to be provided by the user somehow
android_ndk = os.getenv("CONAN_CMAKE_ANDROID_NDK")
if not android_ndk:
android_ndk = which('ndk-build')
android_ndk = os.path.dirname(android_ndk) if android_ndk else None
if not android_ndk:
raise ConanException('Cannot find ANDROID_NDK (ndk-build) in the PATH')
return android_ndk
def _get_template_context_data(self):
ctxt_toolchain = super(CMakeAndroidToolchain, self)._get_template_context_data()
ctxt_toolchain.update({
'CMAKE_SYSTEM_NAME': 'Android',
'CMAKE_SYSTEM_VERSION': self._conanfile.settings.os.api_level,
'CMAKE_ANDROID_ARCH_ABI': self._get_android_abi(),
'CMAKE_ANDROID_STL_TYPE': self._get_android_stl(),
'CMAKE_ANDROID_NDK': self._guess_android_ndk(),
})
return ctxt_toolchain