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