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