# Copyright 2016 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. # Recipe module for compiling Skia when we need to get a full Skia checkout. PYTHON_VERSION_COMPATIBILITY = "PY3" DEPS = [ 'build', 'checkout', 'infra', 'recipe_engine/context', 'recipe_engine/file', 'recipe_engine/json', 'recipe_engine/path', 'recipe_engine/platform', 'recipe_engine/properties', 'recipe_engine/step', 'depot_tools/gitiles', 'run', 'vars', ] def RunSteps(api): api.vars.setup() # Check out code. bot_update = True checkout_root = api.checkout.default_checkout_root skip_patch = False revision = api.properties['revision'] if 'NoDEPS' in api.properties['buildername']: bot_update = False checkout_root = api.path.start_dir if 'NoPatch' in api.vars.builder_name: skip_patch = True checkout_root = api.path.start_dir # If we are running on the CI (post submit), we want to do a diff with the # previous commit. To do this, we use gitiles to look up the current # git revision, and find its parent. In the unlikely event of there being # multiple parents, we pick the first one arbitrarily. if not api.vars.is_trybot: # Fetches something like # https://skia.googlesource.com/skia.git/+log/b44572fbfeb669998053b023f473b9c274f2f2cf?format=JSON # # https://chromium.googlesource.com/chromium/tools/depot_tools/+/dca14bc463857bd2a0fee59c86ffa289b535d5d3/recipes/recipe_modules/gitiles/api.py#75 response, _ = api.gitiles.log( url = api.properties['repository'], ref = api.properties['revision'], limit = 1) # Response looks like: # [{ # 'parents': [''], # ... # }] revision = response[0]['parents'][0] if bot_update: api.checkout.bot_update( checkout_root=checkout_root, skip_patch=skip_patch, override_revision=revision) if 'NoPatch' in api.vars.builder_name: # The CodeSize-* family of tasks compute size diffs between the binaries produced by # Build--NoPatch tasks and those produced by Build- tasks. Some debug strings # in said binaries might contain relative paths from the output directory to the sources # directory (e.g. "../../../dm/DM.cpp"). In order to prevent spurious deltas, we must make # the Build--NoPatch tasks match the paths used by Build- tasks. For example, # Build- tasks place the Skia checkout at /mnt/pd0/s/w/ir/skia, so # Build--NoPatch tasks must do the same. # # For some reason api.checkout.bot_update places the Skia checkout at /mnt/pd0/s/w/ir/k # even though we specified /mnt/pd0/s/w/ir as the checkout root. As a workaround, we manually # copy the Skia checkout to the intended location. # # An inline Python script is necessary here because api.file.copytree[1] does not pipe # through the dirs_exist_ok argument to the underlying shutil.copytree[2] call. # # [1] https://chromium.googlesource.com/infra/luci/recipes-py.git/+/cfdb92cc6933d8f72c2340233ba03b602b447507/recipe_modules/file/api.py#146 # [2] https://docs.python.org/3/library/shutil.html#shutil.copytree src = api.path.start_dir.joinpath('k', 'skia') dst = api.path.start_dir.joinpath('skia') script = api.infra.resource('copytree.py') api.step( name='copy Skia repository checkout from %s to %s' % (src, dst), cmd=['python3', script, src, dst]) api.file.rmtree('remove %s' % src, src) else: api.checkout.git(checkout_root=checkout_root) api.file.ensure_directory('makedirs tmp_dir', api.vars.tmp_dir) out_dir = checkout_root.joinpath( 'skia', 'out', api.vars.builder_name, api.vars.configuration) if 'NoPatch' in api.vars.builder_name: # Similarly as with the checkout root, we use the same output directory in # Build--NoPatch tasks as we do on Build- tasks to prevent spurious deltas. out_dir = api.vars.cache_dir.joinpath( 'work', 'skia', 'out', api.vars.builder_name, api.vars.configuration) try: api.build(checkout_root=checkout_root, out_dir=out_dir) # TODO(borenet): Move this out of the try/finally. dst = api.vars.swarming_out_dir api.build.copy_build_products(out_dir=out_dir, dst=dst) finally: if 'Win' in api.vars.builder_cfg.get('os', ''): script = api.build.resource('cleanup_win_processes.py') api.step( name='cleanup', cmd=['vpython3', script], infra_step=True) api.run.check_failure() def GenTests(api): yield ( api.test('Build-Win10-Clang-x86_64-Release-NoDEPS') + api.properties(buildername='Build-Win10-Clang-x86_64-Release-NoDEPS', repository='https://skia.googlesource.com/skia.git', revision='abc123', path_config='kitchen', swarm_out_dir='[SWARM_OUT_DIR]') + api.platform('win', 64) ) yield ( # git revisions based off of real data api.test('Build-Debian10-Clang-arm-Release-NoPatch') + api.properties(buildername='Build-Debian10-Clang-arm-Release-NoPatch', repository='https://skia.googlesource.com/skia.git', revision='b44572fbfeb669998053b023f473b9c274f2f2cf', path_config='kitchen', swarm_out_dir='[SWARM_OUT_DIR]') + # This tells recipes to use this fake data for a step with the given # name. Inspired by # https://chromium.googlesource.com/chromium/tools/depot_tools/+/dca14bc463857bd2a0fee59c86ffa289b535d5d3/recipes/recipe_modules/gitiles/examples/full.py#62 # Even though we use the commit 6e0e0... as the "seed string", the actual # commit (and parent commit) returned from make_log_test_data is # different. Mocked commit is 188e23c7abc4b205f0f80fb345ff63ec5b716be8 # and parent commit is d2231a340fd47b47d61d0f99a188e46e6aabba0a api.step_data( 'gitiles log: b44572fbfeb669998053b023f473b9c274f2f2cf', api.gitiles.make_log_test_data('6e0e0a9f6cbf09078aa4730d1a0dc0aa722ddc11'), ) ) yield ( api.test('Build-Debian10-Clang-arm-Release-NoPatch (tryjob)') + api.properties(buildername='Build-Debian10-Clang-arm-Release-NoPatch', repository='https://skia.googlesource.com/skia.git', revision='abc123', path_config='kitchen', swarm_out_dir='[SWARM_OUT_DIR]', patch_issue=123, patch_set=123, patch_ref=123) )