1cb93a386Sopenharmony_ci#!/usr/bin/env python
2cb93a386Sopenharmony_ci#
3cb93a386Sopenharmony_ci# Copyright 2017 Google Inc.
4cb93a386Sopenharmony_ci#
5cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be
6cb93a386Sopenharmony_ci# found in the LICENSE file.
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_ci"""Create the asset."""
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_cifrom __future__ import print_function
13cb93a386Sopenharmony_ciimport argparse
14cb93a386Sopenharmony_ciimport grp
15cb93a386Sopenharmony_ciimport os
16cb93a386Sopenharmony_ciimport pwd
17cb93a386Sopenharmony_ciimport shutil
18cb93a386Sopenharmony_ciimport subprocess
19cb93a386Sopenharmony_ciimport sys
20cb93a386Sopenharmony_ciimport tempfile
21cb93a386Sopenharmony_cifrom urllib.request import urlopen
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ciFILE_DIR = os.path.dirname(os.path.abspath(__file__))
24cb93a386Sopenharmony_ciINFRA_BOTS_DIR = os.path.realpath(os.path.join(FILE_DIR, os.pardir, os.pardir))
25cb93a386Sopenharmony_cisys.path.insert(0, INFRA_BOTS_DIR)
26cb93a386Sopenharmony_ciimport utils
27cb93a386Sopenharmony_ci
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ciVALGRIND = 'valgrind-3.15.0'
30cb93a386Sopenharmony_ciTARBALL = '%s.tar.bz2' % VALGRIND
31cb93a386Sopenharmony_ciDOWNLOAD_URL = 'ftp://sourceware.org/pub/valgrind/%s' % TARBALL
32cb93a386Sopenharmony_ciTEMP_DIR = os.path.join(tempfile.gettempdir(), 'skia-%s' % VALGRIND)
33cb93a386Sopenharmony_ciINSTALL_DIR = os.path.join(TEMP_DIR, 'valgrind_install')
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_cidef download_tarball():
37cb93a386Sopenharmony_ci  with utils.chdir(TEMP_DIR):
38cb93a386Sopenharmony_ci    if os.path.isfile(TARBALL):
39cb93a386Sopenharmony_ci      return
40cb93a386Sopenharmony_ci    with open(TARBALL, 'wb') as f:
41cb93a386Sopenharmony_ci      f.write(urlopen(DOWNLOAD_URL).read())
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ci
44cb93a386Sopenharmony_cidef unzip_tarball():
45cb93a386Sopenharmony_ci  with utils.chdir(TEMP_DIR):
46cb93a386Sopenharmony_ci    if os.path.isdir(VALGRIND):
47cb93a386Sopenharmony_ci      return
48cb93a386Sopenharmony_ci    subprocess.check_call(['tar', 'xvjf', TARBALL])
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_cidef create_install_dir():
52cb93a386Sopenharmony_ci  if os.path.isdir(INSTALL_DIR):
53cb93a386Sopenharmony_ci    return
54cb93a386Sopenharmony_ci  os.makedirs(INSTALL_DIR)
55cb93a386Sopenharmony_ci
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_cidef build_valgrind():
58cb93a386Sopenharmony_ci  if os.path.isfile(os.path.join(INSTALL_DIR, 'bin', 'valgrind')):
59cb93a386Sopenharmony_ci    return
60cb93a386Sopenharmony_ci  with utils.chdir(os.path.join(TEMP_DIR, VALGRIND)):
61cb93a386Sopenharmony_ci    subprocess.check_call(['./configure', '--prefix=%s' % INSTALL_DIR])
62cb93a386Sopenharmony_ci    subprocess.check_call(['make'])
63cb93a386Sopenharmony_ci    subprocess.check_call(['make', 'install'])
64cb93a386Sopenharmony_ci
65cb93a386Sopenharmony_ci
66cb93a386Sopenharmony_cidef copy_files(target_dir):
67cb93a386Sopenharmony_ci  with utils.chdir(os.path.join(TEMP_DIR, VALGRIND)):
68cb93a386Sopenharmony_ci    os.mkdir(os.path.join(target_dir, 'bin'))
69cb93a386Sopenharmony_ci    shutil.copy(os.path.join(INSTALL_DIR, 'bin', 'valgrind'),
70cb93a386Sopenharmony_ci                os.path.join(target_dir, 'bin', 'valgrind'))
71cb93a386Sopenharmony_ci    os.mkdir(os.path.join(target_dir, 'lib'))
72cb93a386Sopenharmony_ci    os.mkdir(os.path.join(target_dir, 'lib', 'valgrind'))
73cb93a386Sopenharmony_ci    for lib in ['memcheck-amd64-linux']:
74cb93a386Sopenharmony_ci      shutil.copy(os.path.join(INSTALL_DIR, 'lib', 'valgrind', lib),
75cb93a386Sopenharmony_ci                  os.path.join(target_dir, 'lib', 'valgrind', lib))
76cb93a386Sopenharmony_ci    for lib in ['core', 'memcheck']:
77cb93a386Sopenharmony_ci      libname = 'vgpreload_%s-amd64-linux.so' % lib
78cb93a386Sopenharmony_ci      shutil.copy(os.path.join(INSTALL_DIR, 'lib', 'valgrind', libname),
79cb93a386Sopenharmony_ci                  os.path.join(target_dir, 'lib', 'valgrind', libname))
80cb93a386Sopenharmony_ci
81cb93a386Sopenharmony_ci    shutil.copy('default.supp',
82cb93a386Sopenharmony_ci                os.path.join(target_dir, 'lib', 'valgrind', 'default.supp'))
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_ci
85cb93a386Sopenharmony_cidef create_asset(target_dir):
86cb93a386Sopenharmony_ci  """Create the asset."""
87cb93a386Sopenharmony_ci  if os.name == 'nt':
88cb93a386Sopenharmony_ci    print('This script does not run on Windows.')
89cb93a386Sopenharmony_ci    sys.exit(1)
90cb93a386Sopenharmony_ci
91cb93a386Sopenharmony_ci  create_install_dir()
92cb93a386Sopenharmony_ci  if not os.path.isdir(TEMP_DIR):
93cb93a386Sopenharmony_ci    os.makedirs(TEMP_DIR)
94cb93a386Sopenharmony_ci  download_tarball()
95cb93a386Sopenharmony_ci  unzip_tarball()
96cb93a386Sopenharmony_ci  build_valgrind()
97cb93a386Sopenharmony_ci  copy_files(target_dir)
98cb93a386Sopenharmony_ci
99cb93a386Sopenharmony_ci
100cb93a386Sopenharmony_cidef main():
101cb93a386Sopenharmony_ci  parser = argparse.ArgumentParser()
102cb93a386Sopenharmony_ci  parser.add_argument('--target_dir', '-t', required=True)
103cb93a386Sopenharmony_ci  args = parser.parse_args()
104cb93a386Sopenharmony_ci  create_asset(args.target_dir)
105cb93a386Sopenharmony_ci
106cb93a386Sopenharmony_ci
107cb93a386Sopenharmony_ciif __name__ == '__main__':
108cb93a386Sopenharmony_ci  main()
109