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