Apply pyformat
Test: None
Change-Id: I9f4d9260cc2c04ffe21304a83fb6a5378629e5e1
diff --git a/build.py b/build.py
index 7b7c7d1..ecc829b 100755
--- a/build.py
+++ b/build.py
@@ -105,8 +105,8 @@
def clang_prebuilt_base_dir():
- return utils.android_path('prebuilts/clang/host', utils.build_os_type(),
- clang_prebuilt_version())
+ return utils.android_path('prebuilts/clang/host',
+ utils.build_os_type(), clang_prebuilt_version())
def clang_prebuilt_bin_dir():
@@ -185,25 +185,23 @@
configs = [
# Bug: http://b/35404115: Switch to armv7-linux-android once armv5 is
# deprecated from the NDK
- ('arm', 'arm',
- 'arm/arm-linux-androideabi-4.9/arm-linux-androideabi',
- 'arm-linux-android', ''),
+ ('arm', 'arm', 'arm/arm-linux-androideabi-4.9/arm-linux-androideabi',
+ 'arm-linux-android', ''),
('aarch64', 'arm64',
- 'aarch64/aarch64-linux-android-4.9/aarch64-linux-android',
- 'aarch64-linux-android', ''),
+ 'aarch64/aarch64-linux-android-4.9/aarch64-linux-android',
+ 'aarch64-linux-android', ''),
('x86_64', 'x86_64',
- 'x86/x86_64-linux-android-4.9/x86_64-linux-android',
- 'x86_64-linux-android', ''),
- ('i386', 'x86',
- 'x86/x86_64-linux-android-4.9/x86_64-linux-android',
- 'i686-linux-android', '-m32'),
+ 'x86/x86_64-linux-android-4.9/x86_64-linux-android',
+ 'x86_64-linux-android', ''),
+ ('i386', 'x86', 'x86/x86_64-linux-android-4.9/x86_64-linux-android',
+ 'i686-linux-android', '-m32'),
('mips', 'mips',
- 'mips/mips64el-linux-android-4.9/mips64el-linux-android',
- 'mipsel-linux-android', '-m32'),
+ 'mips/mips64el-linux-android-4.9/mips64el-linux-android',
+ 'mipsel-linux-android', '-m32'),
('mips64', 'mips64',
- 'mips/mips64el-linux-android-4.9/mips64el-linux-android',
- 'mips64el-linux-android', '-m64'),
- ]
+ 'mips/mips64el-linux-android-4.9/mips64el-linux-android',
+ 'mips64el-linux-android', '-m64'),
+ ]
cc = os.path.join(stage2_install, 'bin', 'clang')
cxx = os.path.join(stage2_install, 'bin', 'clang++')
@@ -231,10 +229,9 @@
defines['COMPILER_RT_BUILD_BUILTINS'] = 'OFF'
# Include the directory with libgcc.a to the linker search path.
- toolchain_builtins = os.path.join(toolchain_root, toolchain_path, '..',
- 'lib', 'gcc',
- os.path.basename(toolchain_path),
- '4.9.x')
+ toolchain_builtins = os.path.join(
+ toolchain_root, toolchain_path, '..', 'lib', 'gcc',
+ os.path.basename(toolchain_path), '4.9.x')
# The 32-bit libgcc.a is sometimes in a separate subdir
if arch == 'i386':
toolchain_builtins = os.path.join(toolchain_builtins, '32')
@@ -260,20 +257,24 @@
toolchain_lib = ndk_toolchain_lib(arch, llvm_triple + '-4.9',
llvm_triple)
- ldflags = ['-L' + toolchain_builtins, '-Wl,-z,defs', '-L' + libcxx_libs,
- '-L' + toolchain_lib, '--sysroot=%s' % sysroot_libs]
+ ldflags = [
+ '-L' + toolchain_builtins, '-Wl,-z,defs', '-L' + libcxx_libs,
+ '-L' + toolchain_lib,
+ '--sysroot=%s' % sysroot_libs
+ ]
defines['CMAKE_EXE_LINKER_FLAGS'] = ' '.join(ldflags)
defines['CMAKE_SHARED_LINKER_FLAGS'] = ' '.join(ldflags)
defines['CMAKE_MODULE_LINKER_FLAGS'] = ' '.join(ldflags)
defines['CMAKE_SYSROOT'] = sysroot
defines['CMAKE_SYSROOT_COMPILE'] = sysroot
- cflags = ['--target=%s' % llvm_triple,
- '-B%s' % toolchain_bin,
- '-isystem %s' % sysroot_headers,
- '-D__ANDROID_API__=%s' % android_api(arch),
- extra_flags,
- ]
+ cflags = [
+ '--target=%s' % llvm_triple,
+ '-B%s' % toolchain_bin,
+ '-isystem %s' % sysroot_headers,
+ '-D__ANDROID_API__=%s' % android_api(arch),
+ extra_flags,
+ ]
yield (arch, llvm_triple, defines, cflags)
@@ -289,7 +290,8 @@
def build_libcxx(stage2_install, clang_version):
- for (arch, llvm_triple, libcxx_defines, cflags) in cross_compile_configs(stage2_install):
+ for (arch, llvm_triple, libcxx_defines,
+ cflags) in cross_compile_configs(stage2_install):
logger().info('Building libcxx for %s', arch)
libcxx_path = utils.android_path('out', 'lib', 'libcxx-' + arch)
@@ -302,9 +304,12 @@
libcxx_cmake_path = utils.llvm_path('projects', 'libcxx')
rm_cmake_cache(libcxx_path)
- invoke_cmake(out_path=libcxx_path, defines=libcxx_defines,
- env=libcxx_env, cmake_path=libcxx_cmake_path,
- install=False)
+ invoke_cmake(
+ out_path=libcxx_path,
+ defines=libcxx_defines,
+ env=libcxx_env,
+ cmake_path=libcxx_cmake_path,
+ install=False)
# We need to install libcxx manually.
libcxx_install = os.path.join(stage2_install, 'lib64', 'clang',
clang_version.short_version(), 'lib',
@@ -319,7 +324,8 @@
def build_crts(stage2_install, clang_version):
llvm_config = os.path.join(stage2_install, 'bin', 'llvm-config')
# Now build compiler-rt for each arch
- for (arch, llvm_triple, crt_defines, cflags) in cross_compile_configs(stage2_install):
+ for (arch, llvm_triple, crt_defines,
+ cflags) in cross_compile_configs(stage2_install):
logger().info('Building compiler-rt for %s', arch)
crt_path = utils.android_path('out', 'lib', 'clangrt-' + arch)
crt_install = os.path.join(stage2_install, 'lib64', 'clang',
@@ -349,13 +355,17 @@
crt_cmake_path = utils.llvm_path('projects', 'compiler-rt')
rm_cmake_cache(crt_path)
- invoke_cmake(out_path=crt_path, defines=crt_defines, env=crt_env,
- cmake_path=crt_cmake_path)
+ invoke_cmake(
+ out_path=crt_path,
+ defines=crt_defines,
+ env=crt_env,
+ cmake_path=crt_cmake_path)
def build_libfuzzers(stage2_install, clang_version):
- for (arch, llvm_triple, libfuzzer_defines, cflags) in cross_compile_configs(stage2_install):
+ for (arch, llvm_triple, libfuzzer_defines,
+ cflags) in cross_compile_configs(stage2_install):
logger().info('Building libfuzzer for %s', arch)
libfuzzer_path = utils.android_path('out', 'lib', 'libfuzzer-' + arch)
libfuzzer_defines['CMAKE_BUILD_TYPE'] = 'Release'
@@ -363,9 +373,11 @@
libfuzzer_defines['LLVM_USE_SANITIZE_COVERAGE'] = 'YES'
libfuzzer_defines['CMAKE_CXX_STANDARD'] = '11'
- cflags.extend(['-isystem %s' % libcxx_headers(),
- '-isystem %s' % libcxxabi_headers(),
- '-isystem %s' % support_headers()])
+ cflags.extend([
+ '-isystem %s' % libcxx_headers(),
+ '-isystem %s' % libcxxabi_headers(),
+ '-isystem %s' % support_headers()
+ ])
libfuzzer_defines['CMAKE_C_FLAGS'] = ' '.join(cflags)
libfuzzer_defines['CMAKE_CXX_FLAGS'] = ' '.join(cflags)
@@ -378,28 +390,34 @@
libfuzzer_cmake_path = utils.llvm_path('lib', 'Fuzzer')
libfuzzer_env = dict(ORIG_ENV)
rm_cmake_cache(libfuzzer_path)
- invoke_cmake(out_path=libfuzzer_path, defines=libfuzzer_defines,
- env=libfuzzer_env, cmake_path=libfuzzer_cmake_path,
- install=False)
+ invoke_cmake(
+ out_path=libfuzzer_path,
+ defines=libfuzzer_defines,
+ env=libfuzzer_env,
+ cmake_path=libfuzzer_cmake_path,
+ install=False)
# We need to install libfuzzer manually.
static_lib = os.path.join(libfuzzer_path, 'libLLVMFuzzer.a')
lib_dir = os.path.join(stage2_install, 'lib64', 'clang',
- clang_version.short_version(), 'lib',
- 'linux', arch)
+ clang_version.short_version(), 'lib', 'linux',
+ arch)
check_create_path(lib_dir)
shutil.copy2(static_lib, os.path.join(lib_dir, 'libFuzzer.a'))
# Install libfuzzer headers.
header_src = utils.llvm_path('lib', 'Fuzzer')
- header_dst = os.path.join(stage2_install, 'prebuilt_include', 'llvm',
- 'lib', 'Fuzzer')
+ header_dst = os.path.join(stage2_install, 'prebuilt_include', 'llvm', 'lib',
+ 'Fuzzer')
check_create_path(header_dst)
for f in os.listdir(header_src):
if f.endswith('.h') or f.endswith('.def'):
shutil.copy2(os.path.join(header_src, f), header_dst)
-def build_llvm(targets, build_dir, install_dir, extra_defines=None,
+def build_llvm(targets,
+ build_dir,
+ install_dir,
+ extra_defines=None,
extra_env=None):
cmake_defines = base_cmake_defines()
cmake_defines['CMAKE_INSTALL_PREFIX'] = install_dir
@@ -416,12 +434,19 @@
if extra_env is not None:
env.update(extra_env)
- invoke_cmake(out_path=build_dir, defines=cmake_defines, env=env,
- cmake_path=utils.llvm_path())
+ invoke_cmake(
+ out_path=build_dir,
+ defines=cmake_defines,
+ env=env,
+ cmake_path=utils.llvm_path())
-def build_llvm_for_windows(targets, enable_assertions, build_dir, install_dir,
- native_clang_install, is_32_bit=False):
+def build_llvm_for_windows(targets,
+ enable_assertions,
+ build_dir,
+ install_dir,
+ native_clang_install,
+ is_32_bit=False):
mingw_path = utils.android_path('prebuilts', 'gcc', 'linux-x86', 'host',
'x86_64-w64-mingw32-4.8')
@@ -435,10 +460,9 @@
native_clang_cxx = os.path.join(native_clang_install, 'bin', 'clang++')
check_create_path(build_dir)
native_cmake_file_path = os.path.join(build_dir, 'NATIVE.cmake')
- native_cmake_text = (
- 'set(CMAKE_C_COMPILER {cc})\n'
- 'set(CMAKE_CXX_COMPILER {cxx})\n'
- ).format(cc=native_clang_cc, cxx=native_clang_cxx)
+ native_cmake_text = ('set(CMAKE_C_COMPILER {cc})\n'
+ 'set(CMAKE_CXX_COMPILER {cxx})\n').format(
+ cc=native_clang_cc, cxx=native_clang_cxx)
with open(native_cmake_file_path, 'w') as native_cmake_file:
native_cmake_file.write(native_cmake_text)
@@ -483,8 +507,11 @@
windows_extra_defines['CMAKE_SHARED_LINKER_FLAGS'] = ' '.join(ldflags)
windows_extra_defines['CMAKE_MODULE_LINKER_FLAGS'] = ' '.join(ldflags)
- build_llvm(targets=targets, build_dir=build_dir, install_dir=install_dir,
- extra_defines=windows_extra_defines)
+ build_llvm(
+ targets=targets,
+ build_dir=build_dir,
+ install_dir=install_dir,
+ extra_defines=windows_extra_defines)
def build_stage1(stage1_install, build_llvm_tools=False):
@@ -497,9 +524,9 @@
stage1_extra_defines['CLANG_ENABLE_ARCMT'] = 'OFF'
stage1_extra_defines['CLANG_ENABLE_STATIC_ANALYZER'] = 'OFF'
stage1_extra_defines['CMAKE_C_COMPILER'] = os.path.join(
- clang_prebuilt_bin_dir(), 'clang')
+ clang_prebuilt_bin_dir(), 'clang')
stage1_extra_defines['CMAKE_CXX_COMPILER'] = os.path.join(
- clang_prebuilt_bin_dir(), 'clang++')
+ clang_prebuilt_bin_dir(), 'clang++')
stage1_extra_defines['LLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD'] = 'OFF'
stage1_extra_defines['LLVM_TOOL_OPENMP_BUILD'] = 'OFF'
@@ -531,14 +558,21 @@
# Darwin and fail compilation due to us using the bionic version of
# stdatomic.h.
if utils.host_is_darwin():
- stage1_extra_defines['LLVM_BUILD_EXTERNAL_COMPILER_RT'] = 'ON'
+ stage1_extra_defines['LLVM_BUILD_EXTERNAL_COMPILER_RT'] = 'ON'
- build_llvm(targets=stage1_targets, build_dir=stage1_path,
- install_dir=stage1_install, extra_defines=stage1_extra_defines)
+ build_llvm(
+ targets=stage1_targets,
+ build_dir=stage1_path,
+ install_dir=stage1_install,
+ extra_defines=stage1_extra_defines)
-def build_stage2(stage1_install, stage2_install, stage2_targets, use_lld=False,
- enable_assertions=False, build_instrumented=False):
+def build_stage2(stage1_install,
+ stage2_install,
+ stage2_targets,
+ use_lld=False,
+ enable_assertions=False,
+ build_instrumented=False):
# TODO(srhines): Build LTO plugin (Chromium folks say ~10% perf speedup)
# Build/install the stage2 toolchain
@@ -595,9 +629,12 @@
stage2_extra_env = dict()
stage2_extra_env['LD_LIBRARY_PATH'] = os.path.join(stage1_install, 'lib64')
- build_llvm(targets=stage2_targets, build_dir=stage2_path,
- install_dir=stage2_install, extra_defines=stage2_extra_defines,
- extra_env=stage2_extra_env)
+ build_llvm(
+ targets=stage2_targets,
+ build_dir=stage2_path,
+ install_dir=stage2_install,
+ extra_defines=stage2_extra_defines,
+ extra_env=stage2_extra_env)
def build_runtimes(stage2_install):
@@ -656,22 +693,22 @@
# Next, we remove unnecessary binaries.
necessary_bin_files = [
- 'clang' + ext,
- 'clang++' + ext,
- 'clang-5.0' + ext,
- 'clang-format' + ext,
- 'clang-tidy' + ext,
- 'git-clang-format', # No extension here
- 'llvm-ar' + ext,
- 'llvm-as' + ext,
- 'llvm-dis' + ext,
- 'llvm-link' + ext,
- 'llvm-profdata' + ext,
- 'llvm-symbolizer' + ext,
- 'sancov' + ext,
- 'sanstats' + ext,
- 'LLVMgold' + shlib_ext,
- ]
+ 'clang' + ext,
+ 'clang++' + ext,
+ 'clang-5.0' + ext,
+ 'clang-format' + ext,
+ 'clang-tidy' + ext,
+ 'git-clang-format', # No extension here
+ 'llvm-ar' + ext,
+ 'llvm-as' + ext,
+ 'llvm-dis' + ext,
+ 'llvm-link' + ext,
+ 'llvm-profdata' + ext,
+ 'llvm-symbolizer' + ext,
+ 'sancov' + ext,
+ 'sanstats' + ext,
+ 'LLVMgold' + shlib_ext,
+ ]
bin_dir = os.path.join(install_dir, 'bin')
bin_files = os.listdir(bin_dir)
for bin_filename in bin_files:
@@ -705,9 +742,7 @@
tarball_name = package_name + '-' + host
package_path = os.path.join(dist_dir, tarball_name) + '.tar.bz2'
logger().info('Packaging %s', package_path)
- args = [
- 'tar', '-cjC', install_host_dir, '-f', package_path, package_name
- ]
+ args = ['tar', '-cjC', install_host_dir, '-f', package_path, package_name]
check_call(args)
@@ -716,34 +751,53 @@
parser = argparse.ArgumentParser()
parser.add_argument(
- '-v', '--verbose', action='count', default=0,
+ '-v',
+ '--verbose',
+ action='count',
+ default=0,
help='Increase log level. Defaults to logging.INFO.')
parser.add_argument(
'--build-name', default='dev', help='Release name for the package.')
- parser.add_argument('--use-lld', action='store_true', default=False,
- help='Use lld for linking (only affects stage2)')
+ parser.add_argument(
+ '--use-lld',
+ action='store_true',
+ default=False,
+ help='Use lld for linking (only affects stage2)')
- parser.add_argument('--enable-assertions', action='store_true',
- default=False,
- help='Enable assertions (only affects stage2)')
+ parser.add_argument(
+ '--enable-assertions',
+ action='store_true',
+ default=False,
+ help='Enable assertions (only affects stage2)')
- parser.add_argument('--build-instrumented', action='store_true',
- default=False,
- help='Build LLVM tools with PGO instrumentation')
+ parser.add_argument(
+ '--build-instrumented',
+ action='store_true',
+ default=False,
+ help='Build LLVM tools with PGO instrumentation')
# Options to skip build or packaging (can't skip both, or the script does
# nothing).
build_package_group = parser.add_mutually_exclusive_group()
- build_package_group.add_argument('--skip-build', '-sb',
- action='store_true', default=False,
+ build_package_group.add_argument(
+ '--skip-build',
+ '-sb',
+ action='store_true',
+ default=False,
help='Skip the build, and only do the packaging step')
- build_package_group.add_argument('--skip-package', '-sp',
- action='store_true', default=False,
+ build_package_group.add_argument(
+ '--skip-package',
+ '-sp',
+ action='store_true',
+ default=False,
help='Skip the packaging, and only do the build step')
- parser.add_argument('--no-strip', action='store_true',
- default=False, help='Don\t strip binaries/libraries')
+ parser.add_argument(
+ '--no-strip',
+ action='store_true',
+ default=False,
+ help='Don\t strip binaries/libraries')
return parser.parse_args()
@@ -781,33 +835,47 @@
# Build 64-bit clang for Windows
windows64_path = utils.android_path('out', 'windows-x86')
- build_llvm_for_windows(targets=windows_targets,
- enable_assertions=args.enable_assertions,
- build_dir=windows64_path,
- install_dir=windows64_install,
- native_clang_install=stage2_install)
+ build_llvm_for_windows(
+ targets=windows_targets,
+ enable_assertions=args.enable_assertions,
+ build_dir=windows64_path,
+ install_dir=windows64_install,
+ native_clang_install=stage2_install)
# Build 32-bit clang for Windows
windows32_path = utils.android_path('out', 'windows-i386')
- build_llvm_for_windows(targets=windows_targets,
- enable_assertions=args.enable_assertions,
- build_dir=windows32_path,
- install_dir=windows32_install,
- native_clang_install=stage2_install,
- is_32_bit=True)
+ build_llvm_for_windows(
+ targets=windows_targets,
+ enable_assertions=args.enable_assertions,
+ build_dir=windows32_path,
+ install_dir=windows32_install,
+ native_clang_install=stage2_install,
+ is_32_bit=True)
if do_package:
# TODO(srhines): This only packages builds for the host OS. It needs
# to be extended to package up the Windows build as well.
dist_dir = ORIG_ENV.get('DIST_DIR', utils.android_path('out'))
- package_toolchain(stage2_install, args.build_name,
- utils.build_os_type(), dist_dir, strip=do_strip)
+ package_toolchain(
+ stage2_install,
+ args.build_name,
+ utils.build_os_type(),
+ dist_dir,
+ strip=do_strip)
if utils.host_is_linux():
- package_toolchain(windows32_install, args.build_name,
- 'windows-i386', dist_dir, strip=do_strip)
- package_toolchain(windows64_install, args.build_name,
- 'windows-x86', dist_dir, strip=do_strip)
+ package_toolchain(
+ windows32_install,
+ args.build_name,
+ 'windows-i386',
+ dist_dir,
+ strip=do_strip)
+ package_toolchain(
+ windows64_install,
+ args.build_name,
+ 'windows-x86',
+ dist_dir,
+ strip=do_strip)
return 0
diff --git a/compiler_wrapper.py b/compiler_wrapper.py
index ed0dbdd..362a1b3 100755
--- a/compiler_wrapper.py
+++ b/compiler_wrapper.py
@@ -38,8 +38,10 @@
# We may introduce some new warnings after rebasing and we need to disable
# them before we fix those warnings.
-DISABLED_WARNINGS = ['-Wno-error=zero-as-null-pointer-constant',
- '-Wno-error=unknown-warning-option']
+DISABLED_WARNINGS = [
+ '-Wno-error=zero-as-null-pointer-constant',
+ '-Wno-error=unknown-warning-option'
+]
def process_arg_file(arg_file):
@@ -66,6 +68,7 @@
class CompilerWrapper():
+
def __init__(self, argv):
self.argv0_current = argv[0]
self.args = argv[1:]
@@ -74,9 +77,7 @@
self.argv0 = None
self.append_flags = []
self.prepend_flags = []
- self.custom_flags = {
- '--gomacc-path': None
- }
+ self.custom_flags = {'--gomacc-path': None}
def set_real_compiler(self):
"""Find the real compiler with the absolute path."""
@@ -85,9 +86,7 @@
compiler = os.path.basename(os.readlink(__file__))
else:
compiler = os.path.basename(os.path.abspath(__file__))
- self.real_compiler = os.path.join(
- compiler_path,
- compiler + '.real')
+ self.real_compiler = os.path.join(compiler_path, compiler + '.real')
self.argv0 = self.real_compiler
def process_gomacc_command(self):
@@ -126,9 +125,8 @@
def exec_clang_with_fallback(self):
# We only want to pass extra flags to clang and clang++.
if os.path.basename(__file__) in ['clang', 'clang++']:
- self.execargs += ["-fno-color-diagnostics"] + DISABLED_WARNINGS
- p = subprocess.Popen(self.execargs,
- stderr=subprocess.PIPE)
+ self.execargs += ['-fno-color-diagnostics'] + DISABLED_WARNINGS
+ p = subprocess.Popen(self.execargs, stderr=subprocess.PIPE)
(_, err) = p.communicate()
sys.stderr.write(err)
if p.returncode != 0:
@@ -136,8 +134,7 @@
write_log(redirect_path, self.execargs, err)
fallback_arg0 = os.path.join(os.environ[PREBUILT_COMPILER_PATH_KEY],
os.path.basename(__file__))
- os.execv(fallback_arg0,
- [fallback_arg0] + self.execargs[1:])
+ os.execv(fallback_arg0, [fallback_arg0] + self.execargs[1:])
def invoke_compiler(self):
enable_fallback = PREBUILT_COMPILER_PATH_KEY in os.environ
diff --git a/merge_from_upstream.py b/merge_from_upstream.py
index c8ec1f5..16d04c5 100755
--- a/merge_from_upstream.py
+++ b/merge_from_upstream.py
@@ -31,18 +31,20 @@
('libcxx', llvm_path('projects/libcxx')),
('libcxxabi', llvm_path('projects/libcxxabi')),
('lld', llvm_path('tools/lld')),
- ('openmp', llvm_path('projects/openmp')),
-)
+ ('openmp', llvm_path('projects/openmp')),)
def parse_args():
- parser = argparse.ArgumentParser()
- parser.add_argument('revision', help='Revision number of llvm source.',
- type=int)
- parser.add_argument('--create-new-branch', action='store_true', default=False,
- help='Create new branch using `repo start` before '
- 'merging from upstream.')
- return parser.parse_args()
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ 'revision', help='Revision number of llvm source.', type=int)
+ parser.add_argument(
+ '--create-new-branch',
+ action='store_true',
+ default=False,
+ help='Create new branch using `repo start` before '
+ 'merging from upstream.')
+ return parser.parse_args()
def sync_upstream_branch(path):
@@ -58,22 +60,27 @@
if sha is None:
return
project_sha_dict[project] = sha
- print("Project %s git hash: %s" % (project, sha))
+ print('Project %s git hash: %s' % (project, sha))
for (project, path) in PROJECT_PATH:
sha = project_sha_dict[project]
if create_new_branch:
branch_name = 'merge-upstream-r%s' % revision
subprocess.check_call(['repo', 'start', branch_name, '.'], cwd=path)
- subprocess.check_call(['git', 'merge', sha, '-m',
- 'Merge %s for LLVM update to %d' % (sha, revision)], cwd=path)
+ subprocess.check_call(
+ [
+ 'git', 'merge', sha, '-m',
+ 'Merge %s for LLVM update to %d' % (sha, revision)
+ ],
+ cwd=path)
def get_commit_hash(revision, path):
# Get sha and commit message body for each log.
- p = subprocess.Popen(['git', 'log', 'aosp/upstream-master',
- '--format=%h%x1f%B%x1e'], stdout=subprocess.PIPE,
- cwd=path)
+ p = subprocess.Popen(
+ ['git', 'log', 'aosp/upstream-master', '--format=%h%x1f%B%x1e'],
+ stdout=subprocess.PIPE,
+ cwd=path)
(log, _) = p.communicate()
if p.returncode != 0:
print('git log for path: %s failed!' % path)
@@ -86,7 +93,7 @@
low, high = 0, len(log) - 1
while low < high:
pos = (low + high) // 2
- (sha, cur_revision) = parse_log(log[pos])
+ (sha, cur_revision) = parse_log(log[pos])
if cur_revision == revision:
return sha
elif cur_revision < revision:
diff --git a/test_compiler.py b/test_compiler.py
index 31f1055..60d0ca4 100755
--- a/test_compiler.py
+++ b/test_compiler.py
@@ -25,16 +25,13 @@
import subprocess
TARGETS = ('aosp_angler-eng', 'aosp_bullhead-eng', 'aosp_marlin-eng')
-DEFAULT_TIDY_CHECKS = ('*',
- '-readability-*',
- '-google-readability-*',
- '-google-runtime-references',
- '-cppcoreguidelines-*',
- '-modernize-*',
- '-clang-analyzer-alpha*')
+DEFAULT_TIDY_CHECKS = ('*', '-readability-*', '-google-readability-*',
+ '-google-runtime-references', '-cppcoreguidelines-*',
+ '-modernize-*', '-clang-analyzer-alpha*')
class ClangProfileHandler(object):
+
def __init__(self):
self.out_dir = os.environ.get('OUT_DIR', utils.android_path('out'))
self.profiles_dir = os.path.join(self.out_dir, 'clang-profiles')
@@ -56,50 +53,85 @@
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('android_path', help='Android source directory.')
- parser.add_argument('clang_path', nargs='?', help='Clang toolchain '
- 'directory. If not specified, a new toolchain will '
- 'be built from scratch.')
- parser.add_argument('-k', '--keep-going', action='store_true',
- default=False, help='Keep going when some targets '
- 'cannot be built.')
- parser.add_argument('-j', action='store', dest='jobs', type=int,
- default=multiprocessing.cpu_count(),
- help='Number of executed jobs.')
- parser.add_argument('--build-only', action='store_true',
- default=False, help='Build default targets only.')
- parser.add_argument('--flashall-path', nargs='?', help='Use internal '
- 'flashall tool if the path is set.')
- parser.add_argument('-t', '--target', nargs='?', help='Build for specified '
- 'target. This will work only when --build-only is '
- 'enabled.')
- parser.add_argument('--with-tidy', action='store_true', default=False,
- help='Enable clang tidy for Android build.')
+ parser.add_argument(
+ 'clang_path',
+ nargs='?',
+ help='Clang toolchain '
+ 'directory. If not specified, a new toolchain will '
+ 'be built from scratch.')
+ parser.add_argument(
+ '-k',
+ '--keep-going',
+ action='store_true',
+ default=False,
+ help='Keep going when some targets '
+ 'cannot be built.')
+ parser.add_argument(
+ '-j',
+ action='store',
+ dest='jobs',
+ type=int,
+ default=multiprocessing.cpu_count(),
+ help='Number of executed jobs.')
+ parser.add_argument(
+ '--build-only',
+ action='store_true',
+ default=False,
+ help='Build default targets only.')
+ parser.add_argument(
+ '--flashall-path',
+ nargs='?',
+ help='Use internal '
+ 'flashall tool if the path is set.')
+ parser.add_argument(
+ '-t',
+ '--target',
+ nargs='?',
+ help='Build for specified '
+ 'target. This will work only when --build-only is '
+ 'enabled.')
+ parser.add_argument(
+ '--with-tidy',
+ action='store_true',
+ default=False,
+ help='Enable clang tidy for Android build.')
clean_built_target_group = parser.add_mutually_exclusive_group()
clean_built_target_group.add_argument(
- '--clean-built-target', action='store_true', default=True,
+ '--clean-built-target',
+ action='store_true',
+ default=True,
help='Clean output for each target that is built.')
clean_built_target_group.add_argument(
- '--no-clean-built-target', action='store_false',
- dest='clean_built_target', help='Do not remove target output.')
+ '--no-clean-built-target',
+ action='store_false',
+ dest='clean_built_target',
+ help='Do not remove target output.')
redirect_stderr_group = parser.add_mutually_exclusive_group()
redirect_stderr_group.add_argument(
- '--redirect-stderr', action='store_true', default=True,
+ '--redirect-stderr',
+ action='store_true',
+ default=True,
help='Redirect clang stderr to $OUT/clang-error.log.')
redirect_stderr_group.add_argument(
- '--no-redirect-stderr', action='store_false',
- dest='redirect_stderr', help='Do not redirect clang stderr.')
+ '--no-redirect-stderr',
+ action='store_false',
+ dest='redirect_stderr',
+ help='Do not redirect clang stderr.')
- parser.add_argument('--generate-clang-profile', action='store_true',
- default=False, dest='profile',
- help='Build instrumented compiler and gather profiles')
+ parser.add_argument(
+ '--generate-clang-profile',
+ action='store_true',
+ default=False,
+ dest='profile',
+ help='Build instrumented compiler and gather profiles')
return parser.parse_args()
def link_clang(android_base, clang_path):
- android_clang_path = os.path.join(android_base, 'prebuilts', 'clang',
- 'host', utils.build_os_type(),
- 'clang-dev')
+ android_clang_path = os.path.join(android_base, 'prebuilts',
+ 'clang', 'host',
+ utils.build_os_type(), 'clang-dev')
utils.remove(android_clang_path)
os.symlink(os.path.abspath(clang_path), android_clang_path)
@@ -108,7 +140,7 @@
try:
# Get current connected device list.
out = subprocess.check_output(['adb', 'devices', '-l'])
- devices = [x.split() for x in out.strip().split('\n')[1:]]
+ devices = [x.split() for x in out.strip().split('\n')[1:]]
return devices
except subprocess.CalledProcessError:
# If adb is not working properly. Return empty list.
@@ -120,14 +152,17 @@
utils.remove(os.environ['ANDROID_PRODUCT_OUT'])
-def build_target(android_base, clang_version, target, max_jobs,
- redirect_stderr, with_tidy, profiler):
- jobs = '-j{}'.format(
- max(1, min(max_jobs, multiprocessing.cpu_count())))
+def build_target(android_base, clang_version, target, max_jobs, redirect_stderr,
+ with_tidy, profiler):
+ jobs = '-j{}'.format(max(1, min(max_jobs, multiprocessing.cpu_count())))
result = True
- env_out = subprocess.Popen(['bash', '-c', '. ./build/envsetup.sh;'
- 'lunch ' + target + ' >/dev/null && env'],
- cwd=android_base, stdout=subprocess.PIPE )
+ env_out = subprocess.Popen(
+ [
+ 'bash', '-c', '. ./build/envsetup.sh;'
+ 'lunch ' + target + ' >/dev/null && env'
+ ],
+ cwd=android_base,
+ stdout=subprocess.PIPE)
env = {}
for line in env_out.stdout:
(key, _, value) = line.partition('=')
@@ -141,8 +176,8 @@
redirect_path = os.path.join(env['DIST_DIR'], 'logs',
'clang-error.log')
else:
- redirect_path = os.path.abspath(os.path.join(android_base, 'out',
- 'clang-error.log'))
+ redirect_path = os.path.abspath(
+ os.path.join(android_base, 'out', 'clang-error.log'))
utils.remove(redirect_path)
env[redirect_key] = redirect_path
fallback_path = build.clang_prebuilt_bin_dir()
@@ -154,20 +189,20 @@
# http://b/62869798, we need to invoke cpp-define-generator manually to
# avoid potential build failure. This should be removed when
# art/runtime/generated/asm_support_gen.h is updated.
- subprocess.check_call(['/bin/bash', '-c', 'make cpp-define-generator-data '
- + jobs + ' dist'],
- cwd=android_base, env=env)
+ subprocess.check_call(
+ ['/bin/bash', '-c', 'make cpp-define-generator-data ' + jobs + ' dist'],
+ cwd=android_base,
+ env=env)
asm_support_path = os.path.join(android_base, 'art', 'tools',
'cpp-define-generator')
- subprocess.check_call(['./generate-asm-support'], cwd=asm_support_path,
- env=env)
+ subprocess.check_call(
+ ['./generate-asm-support'], cwd=asm_support_path, env=env)
if with_tidy:
env['WITH_TIDY'] = '1'
if 'DEFAULT_GLOBAL_TIDY_CHECKS' not in env:
env['DEFAULT_GLOBAL_TIDY_CHECKS'] = ','.join(DEFAULT_TIDY_CHECKS)
-
modules = ['dist']
if profiler is not None:
# Build only a subset of targets and collect profiles
@@ -178,8 +213,10 @@
modules = ' '.join(modules)
print('Start building target %s and modules %s.' % (target, modules))
- subprocess.check_call(['/bin/bash', '-c', 'make ' + jobs + ' ' + modules],
- cwd=android_base, env=env)
+ subprocess.check_call(
+ ['/bin/bash', '-c', 'make ' + jobs + ' ' + modules],
+ cwd=android_base,
+ env=env)
def test_device(android_base, clang_version, device, max_jobs, clean_output,
@@ -197,10 +234,11 @@
if flashall_path is None:
bin_path = os.path.join(android_base, 'out', 'host',
utils.build_os_type(), 'bin')
- subprocess.check_call(['./adb', '-s', device[0], 'reboot',
- 'bootloader'], cwd=bin_path)
- subprocess.check_call(['./fastboot', '-s', device[0], 'flashall'],
- cwd=bin_path)
+ subprocess.check_call(
+ ['./adb', '-s', device[0], 'reboot', 'bootloader'],
+ cwd=bin_path)
+ subprocess.check_call(
+ ['./fastboot', '-s', device[0], 'flashall'], cwd=bin_path)
else:
os.environ['ANDROID_SERIAL'] = device[0]
subprocess.check_call(['./flashall'], cwd=flashall_path)
@@ -220,7 +258,6 @@
clangxx_path = os.path.join(bin_path, 'clang++')
clang_tidy_path = os.path.join(bin_path, 'clang-tidy')
-
# Rename clang and clang++ to clang.real and clang++.real.
# clang and clang-tidy may already be moved by this script if we use a
# prebuilt clang. So we only move them if clang.real and clang-tidy.real
@@ -247,8 +284,12 @@
# LLVM tool llvm-profdata from stage1 is needed to merge the collected
# profiles
build.build_stage1(stage1_install, build_llvm_tools=True)
- build.build_stage2(stage1_install, stage2_install, build.STAGE2_TARGETS,
- use_lld=False, build_instrumented=instrumented)
+ build.build_stage2(
+ stage1_install,
+ stage2_install,
+ build.STAGE2_TARGETS,
+ use_lld=False,
+ build_instrumented=instrumented)
build.build_runtimes(stage2_install)
version = build.extract_clang_version(stage2_install)
return stage2_install, version
@@ -269,9 +310,8 @@
targets = [args.target] if args.target else TARGETS
for target in targets:
- build_target(args.android_path, clang_version, target,
- args.jobs, args.redirect_stderr, args.with_tidy,
- profiler)
+ build_target(args.android_path, clang_version, target, args.jobs,
+ args.redirect_stderr, args.with_tidy, profiler)
if profiler is not None:
profiler.mergeProfiles()
diff --git a/utils.py b/utils.py
index 8f14148..94e64b4 100644
--- a/utils.py
+++ b/utils.py
@@ -33,11 +33,13 @@
def rm_tree(dir):
+
def chmod_and_retry(func, path, _):
if not os.access(path, os.W_OK):
os.chmod(path, stat.S_IWUSR)
return func(path)
raise
+
shutil.rmtree(dir, onerror=chmod_and_retry)