diff options
Diffstat (limited to 'infra/bots/recipe_modules/build/default.py')
-rw-r--r-- | infra/bots/recipe_modules/build/default.py | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/infra/bots/recipe_modules/build/default.py b/infra/bots/recipe_modules/build/default.py new file mode 100644 index 0000000000..e781a5e863 --- /dev/null +++ b/infra/bots/recipe_modules/build/default.py @@ -0,0 +1,280 @@ +# Copyright 2018 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + + +from . import util + + +def build_command_buffer(api): + api.run(api.python, 'build command_buffer', + script=api.vars.skia_dir.join('tools', 'build_command_buffer.py'), + args=[ + '--chrome-dir', api.vars.checkout_root, + '--output-dir', api.vars.skia_out.join(api.vars.configuration), + '--no-sync', '--no-hooks', '--make-output-dir']) + + +def compile_swiftshader(api, swiftshader_root, cc, cxx, out): + """Build SwiftShader with CMake. + + Building SwiftShader works differently from any other Skia third_party lib. + See discussion in skia:7671 for more detail. + + Args: + swiftshader_root: root of the SwiftShader checkout. + cc, cxx: compiler binaries to use + out: target directory for libEGL.so and libGLESv2.so + """ + cmake_bin = str(api.vars.slave_dir.join('cmake_linux', 'bin')) + env = { + 'CC': cc, + 'CXX': cxx, + 'PATH': '%%(PATH)s:%s' % cmake_bin + } + api.file.ensure_directory('makedirs swiftshader_out', out) + with api.context(cwd=out, env=env): + api.run(api.step, 'swiftshader cmake', + cmd=['cmake', swiftshader_root, '-GNinja']) + api.run(api.step, 'swiftshader ninja', + cmd=['ninja', '-C', out, 'libEGL.so', 'libGLESv2.so']) + + +def compile_fn(api, out_dir): + compiler = api.vars.builder_cfg.get('compiler', '') + configuration = api.vars.builder_cfg.get('configuration', '') + extra_tokens = api.vars.extra_tokens + os = api.vars.builder_cfg.get('os', '') + target_arch = api.vars.builder_cfg.get('target_arch', '') + + clang_linux = str(api.vars.slave_dir.join('clang_linux')) + emscripten_sdk = str(api.vars.slave_dir.join('emscripten_sdk')) + linux_vulkan_sdk = str(api.vars.slave_dir.join('linux_vulkan_sdk')) + win_toolchain = str(api.vars.slave_dir.join( + 't', 'depot_tools', 'win_toolchain', 'vs_files', + 'a9e1098bba66d2acccc377d5ee81265910f29272')) + win_vulkan_sdk = str(api.vars.slave_dir.join('win_vulkan_sdk')) + + cc, cxx = None, None + extra_cflags = [] + extra_ldflags = [] + args = {} + env = {} + + if compiler == 'Clang' and api.vars.is_linux: + cc = clang_linux + '/bin/clang' + cxx = clang_linux + '/bin/clang++' + extra_cflags .append('-B%s/bin' % clang_linux) + extra_ldflags.append('-B%s/bin' % clang_linux) + extra_ldflags.append('-fuse-ld=lld') + extra_cflags.append('-DDUMMY_clang_linux_version=%s' % + api.run.asset_version('clang_linux')) + if os == 'Ubuntu14': + extra_ldflags.extend(['-static-libstdc++', '-static-libgcc']) + + elif compiler == 'Clang': + cc, cxx = 'clang', 'clang++' + elif compiler == 'GCC': + if target_arch in ['mips64el', 'loongson3a']: + mips64el_toolchain_linux = str(api.vars.slave_dir.join( + 'mips64el_toolchain_linux')) + cc = mips64el_toolchain_linux + '/bin/mips64el-linux-gnuabi64-gcc-7' + cxx = mips64el_toolchain_linux + '/bin/mips64el-linux-gnuabi64-g++-7' + env['LD_LIBRARY_PATH'] = ( + mips64el_toolchain_linux + '/lib/x86_64-linux-gnu/') + extra_ldflags.append('-L' + mips64el_toolchain_linux + + '/mips64el-linux-gnuabi64/lib') + extra_cflags.extend([ + '-Wno-format-truncation', + '-Wno-uninitialized', + ('-DDUMMY_mips64el_toolchain_linux_version=%s' % + api.run.asset_version('mips64el_toolchain_linux')) + ]) + if configuration == 'Release': + # This warning is only triggered when fuzz_canvas is inlined. + extra_cflags.append('-Wno-strict-overflow') + args.update({ + 'skia_use_system_freetype2': 'false', + 'skia_use_fontconfig': 'false', + 'skia_enable_gpu': 'false', + }) + else: + cc, cxx = 'gcc', 'g++' + elif compiler == 'EMCC': + cc = emscripten_sdk + '/emscripten/incoming/emcc' + cxx = emscripten_sdk + '/emscripten/incoming/em++' + extra_cflags.append('-Wno-unknown-warning-option') + extra_cflags.append('-DDUMMY_emscripten_sdk_version=%s' % + api.run.asset_version('emscripten_sdk')) + if 'Coverage' in extra_tokens: + # See https://clang.llvm.org/docs/SourceBasedCodeCoverage.html for + # more info on using llvm to gather coverage information. + extra_cflags.append('-fprofile-instr-generate') + extra_cflags.append('-fcoverage-mapping') + extra_ldflags.append('-fprofile-instr-generate') + extra_ldflags.append('-fcoverage-mapping') + + if compiler != 'MSVC' and configuration == 'Debug': + extra_cflags.append('-O1') + + if 'Exceptions' in extra_tokens: + extra_cflags.append('/EHsc') + if 'Fast' in extra_tokens: + extra_cflags.extend(['-march=native', '-fomit-frame-pointer', '-O3', + '-ffp-contract=off']) + + if len(extra_tokens) == 1 and extra_tokens[0].startswith('SK'): + extra_cflags.append('-D' + extra_tokens[0]) + # If we're limiting Skia at all, drop skcms to portable code. + if 'SK_CPU_LIMIT' in extra_tokens[0]: + extra_cflags.append('-DSKCMS_PORTABLE') + + + if 'MSAN' in extra_tokens: + extra_ldflags.append('-L' + clang_linux + '/msan') + + if configuration != 'Debug': + args['is_debug'] = 'false' + if 'ANGLE' in extra_tokens: + args['skia_use_angle'] = 'true' + if 'SwiftShader' in extra_tokens: + swiftshader_root = api.vars.skia_dir.join('third_party', 'externals', + 'swiftshader') + swiftshader_out = api.vars.skia_out.join('swiftshader_out') + compile_swiftshader(api, swiftshader_root, cc, cxx, swiftshader_out) + args['skia_use_egl'] = 'true' + extra_cflags.extend([ + '-DGR_EGL_TRY_GLES3_THEN_GLES2', + # TODO(dogben): Use headers from Khronos rather than SwiftShader's + # copy. + '-I%s' % swiftshader_root.join('include'), + ]) + extra_ldflags.extend([ + '-L%s' % swiftshader_out, + ]) + if 'CommandBuffer' in extra_tokens: + api.run.run_once(build_command_buffer, api) + if 'MSAN' in extra_tokens: + args['skia_enable_gpu'] = 'false' + args['skia_use_fontconfig'] = 'false' + if 'ASAN' in extra_tokens or 'UBSAN' in extra_tokens: + args['skia_enable_spirv_validation'] = 'false' + if 'Mini' in extra_tokens: + args.update({ + 'is_component_build': 'true', # Proves we can link a coherent .so. + 'is_official_build': 'true', # No debug symbols, no tools. + 'skia_enable_effects': 'false', + 'skia_enable_gpu': 'true', + 'skia_enable_pdf': 'false', + 'skia_use_expat': 'false', + 'skia_use_libjpeg_turbo': 'false', + 'skia_use_libpng': 'false', + 'skia_use_libwebp': 'false', + 'skia_use_zlib': 'false', + }) + if 'NoDEPS' in extra_tokens: + args.update({ + 'is_official_build': 'true', + 'skia_enable_fontmgr_empty': 'true', + 'skia_enable_gpu': 'true', + + 'skia_enable_effects': 'false', + 'skia_enable_pdf': 'false', + 'skia_use_expat': 'false', + 'skia_use_freetype': 'false', + 'skia_use_libjpeg_turbo': 'false', + 'skia_use_libpng': 'false', + 'skia_use_libwebp': 'false', + 'skia_use_vulkan': 'false', + 'skia_use_zlib': 'false', + }) + if 'NoGPU' in extra_tokens: + args['skia_enable_gpu'] = 'false' + if 'EmbededResouces' in extra_tokens: + args['skia_embed_resoucres'] = 'true' + if 'Shared' in extra_tokens: + args['is_component_build'] = 'true' + if 'Vulkan' in extra_tokens and not 'Android' in extra_tokens: + args['skia_enable_vulkan_debug_layers'] = 'false' + if api.vars.is_linux: + args['skia_vulkan_sdk'] = '"%s"' % linux_vulkan_sdk + if 'Win' in os: + args['skia_vulkan_sdk'] = '"%s"' % win_vulkan_sdk + if 'Metal' in extra_tokens: + args['skia_use_metal'] = 'true' + if 'iOS' in extra_tokens: + # Bots use Chromium signing cert. + args['skia_ios_identity'] = '".*GS9WA.*"' + args['skia_ios_profile'] = '"Upstream Testing Provisioning Profile"' + if 'CheckGeneratedFiles' in extra_tokens: + args['skia_compile_processors'] = 'true' + args['skia_generate_workarounds'] = 'true' + if compiler == 'Clang' and 'Win' in os: + args['clang_win'] = '"%s"' % api.vars.slave_dir.join('clang_win') + extra_cflags.append('-DDUMMY_clang_win_version=%s' % + api.run.asset_version('clang_win')) + if target_arch == 'wasm': + args.update({ + 'skia_use_freetype': 'false', + 'skia_use_fontconfig': 'false', + 'skia_use_dng_sdk': 'false', + 'skia_use_icu': 'false', + 'skia_enable_gpu': 'false', + }) + + sanitize = '' + for t in extra_tokens: + if t.endswith('SAN'): + sanitize = t + if 'SafeStack' in extra_tokens: + assert sanitize == '' + sanitize = 'safe-stack' + + for (k,v) in { + 'cc': cc, + 'cxx': cxx, + 'sanitize': sanitize, + 'target_cpu': target_arch, + 'target_os': 'ios' if 'iOS' in extra_tokens else '', + 'win_sdk': win_toolchain + '/win_sdk' if 'Win' in os else '', + 'win_vc': win_toolchain + '/VC' if 'Win' in os else '', + }.iteritems(): + if v: + args[k] = '"%s"' % v + if extra_cflags: + args['extra_cflags'] = repr(extra_cflags).replace("'", '"') + if extra_ldflags: + args['extra_ldflags'] = repr(extra_ldflags).replace("'", '"') + + gn_args = ' '.join('%s=%s' % (k,v) for (k,v) in sorted(args.iteritems())) + + gn = 'gn.exe' if 'Win' in os else 'gn' + ninja = 'ninja.exe' if 'Win' in os else 'ninja' + gn = api.vars.skia_dir.join('bin', gn) + + with api.context(cwd=api.vars.skia_dir): + api.run(api.python, + 'fetch-gn', + script=api.vars.skia_dir.join('bin', 'fetch-gn'), + infra_step=True) + if 'CheckGeneratedFiles' in extra_tokens: + env['PATH'] = '%s:%%(PATH)s' % api.vars.skia_dir.join('bin') + api.run(api.python, + 'fetch-clang-format', + script=api.vars.skia_dir.join('bin', 'fetch-clang-format'), + infra_step=True) + if target_arch == 'wasm': + fastcomp = emscripten_sdk + '/clang/fastcomp/build_incoming_64/bin' + env['PATH'] = '%s:%%(PATH)s' % fastcomp + + with api.env(env): + api.run(api.step, 'gn gen', + cmd=[gn, 'gen', out_dir, '--args=' + gn_args]) + api.run(api.step, 'ninja', cmd=[ninja, '-k', '0', '-C', out_dir]) + + +def copy_extra_build_products(api, src, dst): + if 'SwiftShader' in api.vars.extra_tokens: + util.copy_whitelisted_build_products(api, + api.vars.skia_out.join('swiftshader_out'), + api.vars.swarming_out_dir.join('out', 'swiftshader_out')) |