• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2018 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5DOCKER_IMAGE = 'gcr.io/skia-public/emsdk-release:1.38.16_v1'
6INNER_BUILD_SCRIPT = '/SRC/skia/infra/pathkit/build_pathkit.sh'
7
8BUILD_PRODUCTS_ISOLATE_WHITELIST_WASM = [
9  'pathkit.*'
10]
11
12
13def compile_fn(api, checkout_root, _ignore):
14  out_dir = api.vars.cache_dir.join('docker', 'pathkit')
15  configuration = api.vars.builder_cfg.get('configuration', '')
16  target_arch   = api.vars.builder_cfg.get('target_arch',   '')
17
18  # We want to make sure the directories exist and were created by chrome-bot,
19  # because if that isn't the case, docker will make them and they will be
20  # owned by root, which causes mysterious failures. To mitigate this risk
21  # further, we don't use the same out_dir as everyone else (thus the _ignore)
22  # param. Instead, we use a "pathkit" subdirectory in the "docker" named_cache.
23  api.file.ensure_directory('mkdirs out_dir', out_dir, mode=0777)
24
25  # This uses the emscriptem sdk docker image and says "run the
26  # build_pathkit.sh helper script in there". Additionally, it binds two
27  # folders: the Skia checkout to /SRC and the output directory to /OUT
28  # The called helper script will make the compile happen and put the
29  # output in the right spot.  The neat thing is that since the Skia checkout
30  # (and, by extension, the build script) is not a part of the image, but
31  # bound in at runtime, we don't have to re-build the image, except when the
32  # toolchain changes.
33  # Of note, the wasm build doesn't re-use any intermediate steps from the
34  # previous builds, so it's essentially a build from scratch every time.
35  cmd = ['docker', 'run', '--rm', '--volume', '%s:/SRC' % checkout_root,
36         '--volume', '%s:/OUT' % out_dir,
37         DOCKER_IMAGE, INNER_BUILD_SCRIPT]
38  if configuration == 'Debug':
39    cmd.append('debug') # It defaults to Release
40  if target_arch == 'asmjs':
41    cmd.append('asm.js') # It defaults to WASM
42  # Override DOCKER_CONFIG set by Kitchen.
43  env = {'DOCKER_CONFIG': '/home/chrome-bot/.docker'}
44  with api.env(env):
45    api.run(
46        api.step,
47        'Build PathKit with Docker',
48        cmd=cmd)
49
50
51def copy_extra_build_products(api, _ignore, dst):
52  out_dir = api.vars.cache_dir.join('docker', 'pathkit')
53  # We don't use the normal copy_build_products because it uses
54  # shutil.move, which attempts to delete the previous file, which
55  # doesn't work because the docker created outputs are read-only and
56  # owned by root (aka only docker images). It's likely safe to change
57  # the shutil.move in the original script to a non-deleting thing
58  # (like copy or copyfile), but there's some subtle behavior differences
59  # especially with directories, that kjlubick felt it best not to risk it.
60  api.python.inline(
61      name='copy wasm output',
62      program='''import errno
63import glob
64import os
65import shutil
66import sys
67
68src = sys.argv[1]
69dst = sys.argv[2]
70build_products_whitelist = %s
71
72try:
73  os.makedirs(dst)
74except OSError as e:
75  if e.errno != errno.EEXIST:
76    raise
77
78for pattern in build_products_whitelist:
79  path = os.path.join(src, pattern)
80  for f in glob.glob(path):
81    dst_path = os.path.join(dst, os.path.relpath(f, src))
82    if not os.path.isdir(os.path.dirname(dst_path)):
83      os.makedirs(os.path.dirname(dst_path))
84    print 'Copying build product %%s to %%s' %% (f, dst_path)
85    # Because Docker usually has some strange permissions (like root
86    # ownership), we'd rather not keep those around. copyfile doesn't
87    # keep the metadata around, so that helps us.
88    shutil.copyfile(f, dst_path)
89''' % str(BUILD_PRODUCTS_ISOLATE_WHITELIST_WASM),
90      args=[out_dir, dst],
91      infra_step=True)
92