1bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert#
2bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert# Copyright (C) 2015 The Android Open Source Project
3bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert#
4bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert# Licensed under the Apache License, Version 2.0 (the "License");
5bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert# you may not use this file except in compliance with the License.
6bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert# You may obtain a copy of the License at
7bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert#
8bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert#      http://www.apache.org/licenses/LICENSE-2.0
9bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert#
10bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert# Unless required by applicable law or agreed to in writing, software
11bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert# distributed under the License is distributed on an "AS IS" BASIS,
12bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert# See the License for the specific language governing permissions and
14bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert# limitations under the License.
15bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert#
16bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albertimport os
17bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albertimport shutil
18bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albertimport site
19bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albertimport subprocess
20bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albertimport tempfile
21bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
22bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albertsite.addsitedir(os.path.join(os.environ['NDK'], 'build/lib'))
23bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
24bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albertimport build_support  # pylint: disable=import-error
25bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
26bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
27bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albertdef make_standalone_toolchain(arch, platform, toolchain, install_dir):
28bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    ndk_dir = os.environ['NDK']
29bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    make_standalone_toolchain_path = os.path.join(
30bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        ndk_dir, 'build/tools/make-standalone-toolchain.sh')
31bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
32bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    cmd = [make_standalone_toolchain_path, '--install-dir=' + install_dir]
33bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
34bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    if arch is not None:
35bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        cmd.append('--arch=' + arch)
36bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    if platform is not None:
37bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        cmd.append('--platform=' + platform)
38bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
39bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    if toolchain is not None:
40a929d28b42148cd16713540b53082b2f216c1463Dan Albert        toolchain_triple = build_support.arch_to_toolchain(arch)
41a929d28b42148cd16713540b53082b2f216c1463Dan Albert        name = '{}-{}'.format(toolchain_triple, toolchain)
42bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        cmd.append('--toolchain=' + name)
43bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
44bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    subprocess.check_call(cmd)
45bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
46bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
47bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albertdef test_standalone_toolchain(arch, toolchain, install_dir):
48bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    if toolchain == '4.9':
49bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        triple = build_support.arch_to_triple(arch)
50a929d28b42148cd16713540b53082b2f216c1463Dan Albert        # x86 toolchain names are dumb: http://b/25800583
51a929d28b42148cd16713540b53082b2f216c1463Dan Albert        if arch == 'x86':
52a929d28b42148cd16713540b53082b2f216c1463Dan Albert            triple = 'i686-linux-android'
53bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        compiler_name = triple + '-g++'
548cb89adf86d8070f89868cec0987fbe87df6f0e4Dan Albert    elif toolchain == 'clang':
55bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        compiler_name = 'clang++'
56bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    else:
57bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        raise ValueError
58bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
59bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    compiler = os.path.join(install_dir, 'bin', compiler_name)
60bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    test_source = 'foo.cpp'
61bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    proc = subprocess.Popen([compiler, '-shared', test_source],
62bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert                            stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
63bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    out, _ = proc.communicate()
64bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    return proc.returncode == 0, out
65bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
66bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
67bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albertdef run_test(abi=None, platform=None, toolchain=None,
68bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert             build_flags=None):  # pylint: disable=unused-argument
69bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    arch = 'arm'
70bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    if abi is not None:
71bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        arch = build_support.abi_to_arch(abi)
72bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert
73bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    install_dir = tempfile.mkdtemp()
74bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    try:
75bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        make_standalone_toolchain(arch, platform, toolchain, install_dir)
76bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        return test_standalone_toolchain(arch, toolchain, install_dir)
77bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert    finally:
78bacb89bfea749d6e110bd9d29b1c72daf955aab9Dan Albert        shutil.rmtree(install_dir)
79