summaryrefslogtreecommitdiffstats
path: root/utils/libcxx/android/compiler.py
blob: 16ed44a885e7e1305c7f1e0d7270b4c01457b54d (plain)
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
import copy
import os
import re
import shlex
import subprocess

import libcxx.compiler


class AndroidCXXCompiler(libcxx.compiler.CXXCompiler):
    def __init__(self, cxx_under_test, cxx_template, link_template):
        super(AndroidCXXCompiler, self).__init__(cxx_under_test)
        self.cxx_template = cxx_template
        self.link_template = link_template
        self.build_top = os.getenv('ANDROID_BUILD_TOP')

    def copy(self):
        return copy.deepcopy(self)

    def get_triple(self):
        if 'clang' in self.path:
            return self.get_clang_triple()
        else:
            return self.get_gcc_triple()

        raise RuntimeError('Could not determine target triple.')

    def get_clang_triple(self):
        match = re.search(r'-target\s+(\S+)', self.cxx_template)
        if match:
            return match.group(1)
        return None

    def get_gcc_triple(self):
        proc = subprocess.Popen([self.path, '-v'],
                                stderr=subprocess.PIPE)
        _, stderr = proc.communicate()
        for line in stderr.split('\n'):
            print 'Checking {}'.format(line)
            match = re.search(r'^Target: (.+)$', line)
            if match:
                return match.group(1)
        return None

    def compile(self, source_files, out=None, flags=None, cwd=None):
        flags = [] if flags is None else flags
        return super(AndroidCXXCompiler, self).compile(source_files, out, flags,
                                                       self.build_top)

    def link(self, source_files, out=None, flags=None, cwd=None):
        flags = [] if flags is None else flags
        return super(AndroidCXXCompiler, self).link(source_files, out, flags,
                                                    self.build_top)

    def compileCmd(self, source_files, out=None, flags=None):
        if out is None:
            raise RuntimeError('The Android compiler requires an out path.')

        if isinstance(source_files, str):
            source_files = [source_files]
        cxx_args = self.cxx_template.replace('%OUT%', out)
        cxx_args = cxx_args.replace('%SOURCE%', ' '.join(source_files))
        return [self.path] + shlex.split(cxx_args)

    def linkCmd(self, source_files, out=None, flags=None):
        if out is None:
            raise RuntimeError('The Android compiler requires an out path.')

        if isinstance(source_files, str):
            source_files = [source_files]
        link_args = self.link_template.replace('%OUT%', out)
        link_args = link_args.replace('%SOURCE%', ' '.join(source_files))
        return [self.path] + shlex.split(link_args)

    def _basicCmd(self, source_files, out, is_link=False, input_is_cxx=False):
        raise NotImplementedError()

    def _initTypeAndVersion(self):
        pass