1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/env vpython3 2*8975f5c5SAndroid Build Coastguard Worker# 3*8975f5c5SAndroid Build Coastguard Worker# Copyright 2022 The ANGLE Project Authors. All rights reserved. 4*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file. 6*8975f5c5SAndroid Build Coastguard Worker# 7*8975f5c5SAndroid Build Coastguard Worker# mesa_build.py: 8*8975f5c5SAndroid Build Coastguard Worker# Helper script for building Mesa in an ANGLE checkout. 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Workerimport argparse 11*8975f5c5SAndroid Build Coastguard Workerimport json 12*8975f5c5SAndroid Build Coastguard Workerimport logging 13*8975f5c5SAndroid Build Coastguard Workerimport os 14*8975f5c5SAndroid Build Coastguard Workerimport shutil 15*8975f5c5SAndroid Build Coastguard Workerimport subprocess 16*8975f5c5SAndroid Build Coastguard Workerimport sys 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard WorkerSCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) 19*8975f5c5SAndroid Build Coastguard WorkerANGLE_DIR = os.path.dirname(os.path.dirname(SCRIPT_DIR)) 20*8975f5c5SAndroid Build Coastguard WorkerDEFAULT_LOG_LEVEL = 'info' 21*8975f5c5SAndroid Build Coastguard WorkerEXIT_SUCCESS = 0 22*8975f5c5SAndroid Build Coastguard WorkerEXIT_FAILURE = 1 23*8975f5c5SAndroid Build Coastguard WorkerMESON = os.path.join(ANGLE_DIR, 'third_party', 'meson', 'meson.py') 24*8975f5c5SAndroid Build Coastguard WorkerMESA_SOURCE_DIR = os.path.join(ANGLE_DIR, 'third_party', 'mesa', 'src') 25*8975f5c5SAndroid Build Coastguard WorkerLIBDRM_SOURCE_DIR = os.path.join(ANGLE_DIR, 'third_party', 'libdrm') 26*8975f5c5SAndroid Build Coastguard WorkerLIBDRM_BUILD_DIR = os.path.join(ANGLE_DIR, 'out', 'libdrm-build') 27*8975f5c5SAndroid Build Coastguard WorkerMESA_STAMP = 'mesa.stamp' 28*8975f5c5SAndroid Build Coastguard WorkerLIBDRM_STAMP = 'libdrm.stamp' 29*8975f5c5SAndroid Build Coastguard Worker 30*8975f5c5SAndroid Build Coastguard WorkerMESA_OPTIONS = [ 31*8975f5c5SAndroid Build Coastguard Worker '-Dzstd=disabled', 32*8975f5c5SAndroid Build Coastguard Worker '-Dplatforms=x11', 33*8975f5c5SAndroid Build Coastguard Worker '-Dgallium-drivers=zink', 34*8975f5c5SAndroid Build Coastguard Worker '-Dvulkan-drivers=', 35*8975f5c5SAndroid Build Coastguard Worker '-Dvalgrind=disabled', 36*8975f5c5SAndroid Build Coastguard Worker] 37*8975f5c5SAndroid Build Coastguard WorkerLIBDRM_OPTIONS = [ 38*8975f5c5SAndroid Build Coastguard Worker '-Dtests=false', 39*8975f5c5SAndroid Build Coastguard Worker '-Dintel=disabled', 40*8975f5c5SAndroid Build Coastguard Worker '-Dnouveau=disabled', 41*8975f5c5SAndroid Build Coastguard Worker '-Damdgpu=disabled', 42*8975f5c5SAndroid Build Coastguard Worker '-Dradeon=disabled', 43*8975f5c5SAndroid Build Coastguard Worker '-Dvmwgfx=disabled', 44*8975f5c5SAndroid Build Coastguard Worker '-Dvalgrind=disabled', 45*8975f5c5SAndroid Build Coastguard Worker '-Dman-pages=disabled', 46*8975f5c5SAndroid Build Coastguard Worker] 47*8975f5c5SAndroid Build Coastguard Worker 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard Workerdef main(raw_args): 50*8975f5c5SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 51*8975f5c5SAndroid Build Coastguard Worker parser.add_argument( 52*8975f5c5SAndroid Build Coastguard Worker '-l', 53*8975f5c5SAndroid Build Coastguard Worker '--log', 54*8975f5c5SAndroid Build Coastguard Worker '--log-level', 55*8975f5c5SAndroid Build Coastguard Worker help='Logging level. Default is %s.' % DEFAULT_LOG_LEVEL, 56*8975f5c5SAndroid Build Coastguard Worker default=DEFAULT_LOG_LEVEL) 57*8975f5c5SAndroid Build Coastguard Worker 58*8975f5c5SAndroid Build Coastguard Worker subparser = parser.add_subparsers(dest='command') 59*8975f5c5SAndroid Build Coastguard Worker 60*8975f5c5SAndroid Build Coastguard Worker mesa = subparser.add_parser('mesa') 61*8975f5c5SAndroid Build Coastguard Worker mesa.add_argument('build_dir', help='Target build directory.') 62*8975f5c5SAndroid Build Coastguard Worker mesa.add_argument('-j', '--jobs', help='Compile jobs.') 63*8975f5c5SAndroid Build Coastguard Worker 64*8975f5c5SAndroid Build Coastguard Worker compile_parser = subparser.add_parser('compile') 65*8975f5c5SAndroid Build Coastguard Worker compile_parser.add_argument('-j', '--jobs', help='Compile jobs.') 66*8975f5c5SAndroid Build Coastguard Worker compile_parser.add_argument('build_dir', help='Target build directory.') 67*8975f5c5SAndroid Build Coastguard Worker 68*8975f5c5SAndroid Build Coastguard Worker gni = subparser.add_parser('gni') 69*8975f5c5SAndroid Build Coastguard Worker gni.add_argument('output', help='Output location for gni file.') 70*8975f5c5SAndroid Build Coastguard Worker gni.add_argument('mesa_build_dir', help='Target Mesa build directory.') 71*8975f5c5SAndroid Build Coastguard Worker gni.add_argument('libdrm_build_dir', help='Target libdrm build directory.') 72*8975f5c5SAndroid Build Coastguard Worker 73*8975f5c5SAndroid Build Coastguard Worker libdrm = subparser.add_parser('libdrm') 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker runhook_parser = subparser.add_parser('runhook') 76*8975f5c5SAndroid Build Coastguard Worker runhook_parser.add_argument( 77*8975f5c5SAndroid Build Coastguard Worker '-o', '--output', help='Output location for stamp sha1 file.', default=MESA_STAMP) 78*8975f5c5SAndroid Build Coastguard Worker 79*8975f5c5SAndroid Build Coastguard Worker setup_parser = subparser.add_parser('setup') 80*8975f5c5SAndroid Build Coastguard Worker setup_parser.add_argument('target', help='Project: mesa or libdrm.') 81*8975f5c5SAndroid Build Coastguard Worker setup_parser.add_argument('build_dir', help='Target build directory.') 82*8975f5c5SAndroid Build Coastguard Worker setup_parser.add_argument('-w', '--wipe', help='Wipe output directory.', action='store_true') 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker args, extra_args = parser.parse_known_args(raw_args) 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker logging.basicConfig(level=args.log.upper()) 87*8975f5c5SAndroid Build Coastguard Worker 88*8975f5c5SAndroid Build Coastguard Worker assert os.path.exists(MESON), 'Could not find meson.py: %s' % MESON 89*8975f5c5SAndroid Build Coastguard Worker 90*8975f5c5SAndroid Build Coastguard Worker if args.command == 'mesa': 91*8975f5c5SAndroid Build Coastguard Worker SetupBuild(args.build_dir, MESA_SOURCE_DIR, MESA_OPTIONS) 92*8975f5c5SAndroid Build Coastguard Worker Compile(args, args.build_dir) 93*8975f5c5SAndroid Build Coastguard Worker elif args.command == 'compile': 94*8975f5c5SAndroid Build Coastguard Worker Compile(args, args.build_dir) 95*8975f5c5SAndroid Build Coastguard Worker elif args.command == 'gni': 96*8975f5c5SAndroid Build Coastguard Worker GenerateGni(args) 97*8975f5c5SAndroid Build Coastguard Worker elif args.command == 'libdrm': 98*8975f5c5SAndroid Build Coastguard Worker SetupBuild(args.build_dir, LIBDRM_SOURCE_DIR, LIBDRM_OPTIONS) 99*8975f5c5SAndroid Build Coastguard Worker Compile(args, args.build_dir) 100*8975f5c5SAndroid Build Coastguard Worker elif args.command == 'runhook': 101*8975f5c5SAndroid Build Coastguard Worker RunHook(args) 102*8975f5c5SAndroid Build Coastguard Worker elif args.command == 'setup': 103*8975f5c5SAndroid Build Coastguard Worker LazySetup(args, args.build_dir) 104*8975f5c5SAndroid Build Coastguard Worker 105*8975f5c5SAndroid Build Coastguard Worker return EXIT_SUCCESS 106*8975f5c5SAndroid Build Coastguard Worker 107*8975f5c5SAndroid Build Coastguard Worker 108*8975f5c5SAndroid Build Coastguard Workerdef SetupBuild(build_dir, source_dir, options, pkg_config_paths=[]): 109*8975f5c5SAndroid Build Coastguard Worker if not os.path.exists(build_dir): 110*8975f5c5SAndroid Build Coastguard Worker os.mkdir(build_dir) 111*8975f5c5SAndroid Build Coastguard Worker 112*8975f5c5SAndroid Build Coastguard Worker sysroot_dir = os.path.join(ANGLE_DIR, 'build', 'linux', 'debian_bullseye_amd64-sysroot') 113*8975f5c5SAndroid Build Coastguard Worker 114*8975f5c5SAndroid Build Coastguard Worker cflags = ' '.join([ 115*8975f5c5SAndroid Build Coastguard Worker '--sysroot=%s' % sysroot_dir, 116*8975f5c5SAndroid Build Coastguard Worker '-Wno-constant-conversion', 117*8975f5c5SAndroid Build Coastguard Worker '-Wno-deprecated-builtins', 118*8975f5c5SAndroid Build Coastguard Worker '-Wno-deprecated-declarations', 119*8975f5c5SAndroid Build Coastguard Worker '-Wno-deprecated-non-prototype', 120*8975f5c5SAndroid Build Coastguard Worker '-Wno-enum-compare-conditional', 121*8975f5c5SAndroid Build Coastguard Worker '-Wno-enum-conversion', 122*8975f5c5SAndroid Build Coastguard Worker '-Wno-implicit-const-int-float-conversion', 123*8975f5c5SAndroid Build Coastguard Worker '-Wno-implicit-function-declaration', 124*8975f5c5SAndroid Build Coastguard Worker '-Wno-initializer-overrides', 125*8975f5c5SAndroid Build Coastguard Worker '-Wno-sometimes-uninitialized', 126*8975f5c5SAndroid Build Coastguard Worker '-Wno-unused-but-set-variable', 127*8975f5c5SAndroid Build Coastguard Worker '-Wno-unused-function', 128*8975f5c5SAndroid Build Coastguard Worker ]) 129*8975f5c5SAndroid Build Coastguard Worker 130*8975f5c5SAndroid Build Coastguard Worker pkg_config_paths += [ 131*8975f5c5SAndroid Build Coastguard Worker '%s/usr/share/pkgconfig' % sysroot_dir, 132*8975f5c5SAndroid Build Coastguard Worker '%s/usr/lib/pkgconfig' % sysroot_dir 133*8975f5c5SAndroid Build Coastguard Worker ] 134*8975f5c5SAndroid Build Coastguard Worker 135*8975f5c5SAndroid Build Coastguard Worker extra_env = { 136*8975f5c5SAndroid Build Coastguard Worker 'CC': 'clang', 137*8975f5c5SAndroid Build Coastguard Worker 'CC_LD': 'lld', 138*8975f5c5SAndroid Build Coastguard Worker 'CXX': 'clang++', 139*8975f5c5SAndroid Build Coastguard Worker 'CXX_LD': 'lld', 140*8975f5c5SAndroid Build Coastguard Worker 'CFLAGS': cflags, 141*8975f5c5SAndroid Build Coastguard Worker 'CXXFLAGS': cflags, 142*8975f5c5SAndroid Build Coastguard Worker 'PKG_CONFIG_PATH': ':'.join(pkg_config_paths), 143*8975f5c5SAndroid Build Coastguard Worker } 144*8975f5c5SAndroid Build Coastguard Worker 145*8975f5c5SAndroid Build Coastguard Worker args = [source_dir, build_dir, '--cross-file', 146*8975f5c5SAndroid Build Coastguard Worker os.path.join(SCRIPT_DIR, 'angle_cross.ini')] + options 147*8975f5c5SAndroid Build Coastguard Worker if os.path.isdir(os.path.join(build_dir, 'meson-info')): 148*8975f5c5SAndroid Build Coastguard Worker args += ['--wipe'] 149*8975f5c5SAndroid Build Coastguard Worker 150*8975f5c5SAndroid Build Coastguard Worker return Meson(build_dir, 'setup', args, extra_env) 151*8975f5c5SAndroid Build Coastguard Worker 152*8975f5c5SAndroid Build Coastguard Worker 153*8975f5c5SAndroid Build Coastguard Workerdef Compile(args, build_dir): 154*8975f5c5SAndroid Build Coastguard Worker return Meson(build_dir, 'compile', ['-C', build_dir]) 155*8975f5c5SAndroid Build Coastguard Worker 156*8975f5c5SAndroid Build Coastguard Worker 157*8975f5c5SAndroid Build Coastguard Workerdef MakeEnv(): 158*8975f5c5SAndroid Build Coastguard Worker clang_dir = os.path.join(ANGLE_DIR, 'third_party', 'llvm-build', 'Release+Asserts', 'bin') 159*8975f5c5SAndroid Build Coastguard Worker flex_bison_dir = os.path.join(ANGLE_DIR, 'tools', 'flex-bison') 160*8975f5c5SAndroid Build Coastguard Worker 161*8975f5c5SAndroid Build Coastguard Worker # TODO: Windows 162*8975f5c5SAndroid Build Coastguard Worker flex_bison_platform = 'linux' 163*8975f5c5SAndroid Build Coastguard Worker flex_bison_bin_dir = os.path.join(flex_bison_dir, flex_bison_platform) 164*8975f5c5SAndroid Build Coastguard Worker 165*8975f5c5SAndroid Build Coastguard Worker depot_tools_dir = os.path.join(ANGLE_DIR, 'third_party', 'depot_tools') 166*8975f5c5SAndroid Build Coastguard Worker 167*8975f5c5SAndroid Build Coastguard Worker env = os.environ.copy() 168*8975f5c5SAndroid Build Coastguard Worker paths = [clang_dir, flex_bison_bin_dir, depot_tools_dir, env['PATH']] 169*8975f5c5SAndroid Build Coastguard Worker env['PATH'] = ':'.join(paths) 170*8975f5c5SAndroid Build Coastguard Worker env['BISON_PKGDATADIR'] = os.path.join(flex_bison_dir, 'third_party') 171*8975f5c5SAndroid Build Coastguard Worker return env 172*8975f5c5SAndroid Build Coastguard Worker 173*8975f5c5SAndroid Build Coastguard Worker 174*8975f5c5SAndroid Build Coastguard WorkerGNI_TEMPLATE = """\ 175*8975f5c5SAndroid Build Coastguard Worker# GENERATED FILE - DO NOT EDIT. 176*8975f5c5SAndroid Build Coastguard Worker# Generated by {script_name} 177*8975f5c5SAndroid Build Coastguard Worker# 178*8975f5c5SAndroid Build Coastguard Worker# Copyright 2022 The ANGLE Project Authors. All rights reserved. 179*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 180*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file. 181*8975f5c5SAndroid Build Coastguard Worker# 182*8975f5c5SAndroid Build Coastguard Worker# {filename}: ANGLE build information for Mesa. 183*8975f5c5SAndroid Build Coastguard Worker 184*8975f5c5SAndroid Build Coastguard Workerangle_mesa_outputs = [ 185*8975f5c5SAndroid Build Coastguard Worker{angle_mesa_outputs}] 186*8975f5c5SAndroid Build Coastguard Worker 187*8975f5c5SAndroid Build Coastguard Workerangle_mesa_sources = [ 188*8975f5c5SAndroid Build Coastguard Worker{angle_mesa_sources}] 189*8975f5c5SAndroid Build Coastguard Worker 190*8975f5c5SAndroid Build Coastguard Workerangle_libdrm_outputs = [ 191*8975f5c5SAndroid Build Coastguard Worker{angle_libdrm_outputs}] 192*8975f5c5SAndroid Build Coastguard Worker 193*8975f5c5SAndroid Build Coastguard Workerangle_libdrm_sources = [ 194*8975f5c5SAndroid Build Coastguard Worker{angle_libdrm_sources}] 195*8975f5c5SAndroid Build Coastguard Worker""" 196*8975f5c5SAndroid Build Coastguard Worker 197*8975f5c5SAndroid Build Coastguard Worker 198*8975f5c5SAndroid Build Coastguard Workerdef GenerateGni(args): 199*8975f5c5SAndroid Build Coastguard Worker mesa_sources_filter = lambda target: target['type'] != 'shared library' 200*8975f5c5SAndroid Build Coastguard Worker mesa_outputs_filter = lambda target: target['type'] == 'shared library' 201*8975f5c5SAndroid Build Coastguard Worker mesa_sources, mesa_outputs = GetMesonSourcesAndOutputs(args.mesa_build_dir, 202*8975f5c5SAndroid Build Coastguard Worker mesa_sources_filter, 203*8975f5c5SAndroid Build Coastguard Worker mesa_outputs_filter) 204*8975f5c5SAndroid Build Coastguard Worker 205*8975f5c5SAndroid Build Coastguard Worker libdrm_sources_filter = lambda target: True 206*8975f5c5SAndroid Build Coastguard Worker libdrm_outputs_filter = lambda target: target['type'] == 'shared library' 207*8975f5c5SAndroid Build Coastguard Worker libdrm_sources, libdrm_outputs = GetMesonSourcesAndOutputs(args.libdrm_build_dir, 208*8975f5c5SAndroid Build Coastguard Worker libdrm_sources_filter, 209*8975f5c5SAndroid Build Coastguard Worker libdrm_outputs_filter) 210*8975f5c5SAndroid Build Coastguard Worker 211*8975f5c5SAndroid Build Coastguard Worker fmt_list = lambda l, rp: ''.join( 212*8975f5c5SAndroid Build Coastguard Worker sorted(list(set([' "%s",\n' % os.path.relpath(li, rp) for li in l])))) 213*8975f5c5SAndroid Build Coastguard Worker 214*8975f5c5SAndroid Build Coastguard Worker format_args = { 215*8975f5c5SAndroid Build Coastguard Worker 'script_name': os.path.basename(__file__), 216*8975f5c5SAndroid Build Coastguard Worker 'filename': os.path.basename(args.output), 217*8975f5c5SAndroid Build Coastguard Worker 'angle_mesa_outputs': fmt_list(mesa_outputs, args.mesa_build_dir), 218*8975f5c5SAndroid Build Coastguard Worker 'angle_mesa_sources': fmt_list(mesa_sources, MESA_SOURCE_DIR), 219*8975f5c5SAndroid Build Coastguard Worker 'angle_libdrm_outputs': fmt_list(libdrm_outputs, args.libdrm_build_dir), 220*8975f5c5SAndroid Build Coastguard Worker 'angle_libdrm_sources': fmt_list(libdrm_sources, LIBDRM_SOURCE_DIR), 221*8975f5c5SAndroid Build Coastguard Worker } 222*8975f5c5SAndroid Build Coastguard Worker 223*8975f5c5SAndroid Build Coastguard Worker gni_text = GNI_TEMPLATE.format(**format_args) 224*8975f5c5SAndroid Build Coastguard Worker 225*8975f5c5SAndroid Build Coastguard Worker with open(args.output, 'w') as outf: 226*8975f5c5SAndroid Build Coastguard Worker outf.write(gni_text) 227*8975f5c5SAndroid Build Coastguard Worker outf.close() 228*8975f5c5SAndroid Build Coastguard Worker logging.info('Saved GNI data to %s' % args.output) 229*8975f5c5SAndroid Build Coastguard Worker 230*8975f5c5SAndroid Build Coastguard Worker 231*8975f5c5SAndroid Build Coastguard Workerdef GetMesonSourcesAndOutputs(build_dir, sources_filter, output_filter): 232*8975f5c5SAndroid Build Coastguard Worker text_data = Meson(build_dir, 'introspect', [build_dir, '--targets'], stdout=subprocess.PIPE) 233*8975f5c5SAndroid Build Coastguard Worker json_data = json.loads(text_data) 234*8975f5c5SAndroid Build Coastguard Worker outputs = [] 235*8975f5c5SAndroid Build Coastguard Worker all_sources = [] 236*8975f5c5SAndroid Build Coastguard Worker generated = [] 237*8975f5c5SAndroid Build Coastguard Worker for target in json_data: 238*8975f5c5SAndroid Build Coastguard Worker generated += target['filename'] 239*8975f5c5SAndroid Build Coastguard Worker if output_filter(target): 240*8975f5c5SAndroid Build Coastguard Worker outputs += target['filename'] 241*8975f5c5SAndroid Build Coastguard Worker if sources_filter(target): 242*8975f5c5SAndroid Build Coastguard Worker for target_source in target['target_sources']: 243*8975f5c5SAndroid Build Coastguard Worker all_sources += target_source['sources'] 244*8975f5c5SAndroid Build Coastguard Worker 245*8975f5c5SAndroid Build Coastguard Worker sources = list(filter(lambda s: (s not in generated), all_sources)) 246*8975f5c5SAndroid Build Coastguard Worker 247*8975f5c5SAndroid Build Coastguard Worker for source in sources: 248*8975f5c5SAndroid Build Coastguard Worker assert os.path.exists(source), '%s does not exist' % source 249*8975f5c5SAndroid Build Coastguard Worker 250*8975f5c5SAndroid Build Coastguard Worker return sources, outputs 251*8975f5c5SAndroid Build Coastguard Worker 252*8975f5c5SAndroid Build Coastguard Worker 253*8975f5c5SAndroid Build Coastguard Workerdef Meson(build_dir, command, args, extra_env={}, stdout=None): 254*8975f5c5SAndroid Build Coastguard Worker meson_cmd = [MESON, command] + args 255*8975f5c5SAndroid Build Coastguard Worker env = MakeEnv() 256*8975f5c5SAndroid Build Coastguard Worker for k, v in extra_env.items(): 257*8975f5c5SAndroid Build Coastguard Worker env[k] = v 258*8975f5c5SAndroid Build Coastguard Worker # TODO: Remove when crbug.com/1373441 is fixed. 259*8975f5c5SAndroid Build Coastguard Worker env['VPYTHON_DEFAULT_SPEC'] = os.path.join(ANGLE_DIR, '.vpython3') 260*8975f5c5SAndroid Build Coastguard Worker logging.info(' '.join(['%s=%s' % (k, v) for (k, v) in extra_env.items()] + meson_cmd)) 261*8975f5c5SAndroid Build Coastguard Worker completed = subprocess.run(meson_cmd, env=env, stdout=stdout) 262*8975f5c5SAndroid Build Coastguard Worker if completed.returncode != EXIT_SUCCESS: 263*8975f5c5SAndroid Build Coastguard Worker logging.fatal('Got error from meson:') 264*8975f5c5SAndroid Build Coastguard Worker with open(os.path.join(build_dir, 'meson-logs', 'meson-log.txt')) as logf: 265*8975f5c5SAndroid Build Coastguard Worker lines = logf.readlines() 266*8975f5c5SAndroid Build Coastguard Worker for line in lines[-10:]: 267*8975f5c5SAndroid Build Coastguard Worker logging.fatal(' %s' % line.strip()) 268*8975f5c5SAndroid Build Coastguard Worker sys.exit(EXIT_FAILURE) 269*8975f5c5SAndroid Build Coastguard Worker if stdout: 270*8975f5c5SAndroid Build Coastguard Worker return completed.stdout 271*8975f5c5SAndroid Build Coastguard Worker 272*8975f5c5SAndroid Build Coastguard Worker 273*8975f5c5SAndroid Build Coastguard Workerdef RunHook(args): 274*8975f5c5SAndroid Build Coastguard Worker output = os.path.join(SCRIPT_DIR, args.output) 275*8975f5c5SAndroid Build Coastguard Worker Stamp(args, MESA_SOURCE_DIR, output) 276*8975f5c5SAndroid Build Coastguard Worker libdrm_out = os.path.join(SCRIPT_DIR, LIBDRM_STAMP) 277*8975f5c5SAndroid Build Coastguard Worker Stamp(args, LIBDRM_SOURCE_DIR, libdrm_out) 278*8975f5c5SAndroid Build Coastguard Worker 279*8975f5c5SAndroid Build Coastguard Worker 280*8975f5c5SAndroid Build Coastguard Workerdef Stamp(args, source_dir, output): 281*8975f5c5SAndroid Build Coastguard Worker commit_id = GrabOutput('git rev-parse HEAD', source_dir) 282*8975f5c5SAndroid Build Coastguard Worker with open(output, 'w') as outf: 283*8975f5c5SAndroid Build Coastguard Worker outf.write(commit_id) 284*8975f5c5SAndroid Build Coastguard Worker outf.close() 285*8975f5c5SAndroid Build Coastguard Worker logging.info('Saved git hash data to %s' % output) 286*8975f5c5SAndroid Build Coastguard Worker 287*8975f5c5SAndroid Build Coastguard Worker 288*8975f5c5SAndroid Build Coastguard Workerdef GrabOutput(command, cwd): 289*8975f5c5SAndroid Build Coastguard Worker return subprocess.Popen( 290*8975f5c5SAndroid Build Coastguard Worker command, stdout=subprocess.PIPE, shell=True, cwd=cwd).communicate()[0].strip().decode() 291*8975f5c5SAndroid Build Coastguard Worker 292*8975f5c5SAndroid Build Coastguard Worker 293*8975f5c5SAndroid Build Coastguard Workerdef LazySetup(args, build_dir): 294*8975f5c5SAndroid Build Coastguard Worker stamp = args.target + '.stamp' 295*8975f5c5SAndroid Build Coastguard Worker in_stamp = os.path.join(SCRIPT_DIR, stamp) 296*8975f5c5SAndroid Build Coastguard Worker out_stamp = os.path.join(build_dir, args.target, stamp) 297*8975f5c5SAndroid Build Coastguard Worker if not args.wipe and SameStamps(in_stamp, out_stamp): 298*8975f5c5SAndroid Build Coastguard Worker logging.info('%s setup up-to-date.' % args.target) 299*8975f5c5SAndroid Build Coastguard Worker sys.exit(EXIT_SUCCESS) 300*8975f5c5SAndroid Build Coastguard Worker 301*8975f5c5SAndroid Build Coastguard Worker if args.target == 'mesa': 302*8975f5c5SAndroid Build Coastguard Worker source_dir = MESA_SOURCE_DIR 303*8975f5c5SAndroid Build Coastguard Worker options = MESA_OPTIONS 304*8975f5c5SAndroid Build Coastguard Worker pkg_config_paths = [os.path.join(build_dir, 'libdrm', 'meson-uninstalled')] 305*8975f5c5SAndroid Build Coastguard Worker else: 306*8975f5c5SAndroid Build Coastguard Worker assert (args.target == 'libdrm') 307*8975f5c5SAndroid Build Coastguard Worker source_dir = LIBDRM_SOURCE_DIR 308*8975f5c5SAndroid Build Coastguard Worker options = LIBDRM_OPTIONS 309*8975f5c5SAndroid Build Coastguard Worker pkg_config_paths = [] 310*8975f5c5SAndroid Build Coastguard Worker 311*8975f5c5SAndroid Build Coastguard Worker SetupBuild(os.path.join(build_dir, args.target), source_dir, options, pkg_config_paths) 312*8975f5c5SAndroid Build Coastguard Worker shutil.copyfile(in_stamp, out_stamp) 313*8975f5c5SAndroid Build Coastguard Worker logging.info('Finished setup and updated %s.' % out_stamp) 314*8975f5c5SAndroid Build Coastguard Worker 315*8975f5c5SAndroid Build Coastguard Worker 316*8975f5c5SAndroid Build Coastguard Workerdef SameStamps(in_stamp, out_stamp): 317*8975f5c5SAndroid Build Coastguard Worker assert os.path.exists(in_stamp) 318*8975f5c5SAndroid Build Coastguard Worker if not os.path.exists(out_stamp): 319*8975f5c5SAndroid Build Coastguard Worker return False 320*8975f5c5SAndroid Build Coastguard Worker in_data = ReadFile(in_stamp) 321*8975f5c5SAndroid Build Coastguard Worker out_data = ReadFile(out_stamp) 322*8975f5c5SAndroid Build Coastguard Worker return in_data == out_data 323*8975f5c5SAndroid Build Coastguard Worker 324*8975f5c5SAndroid Build Coastguard Worker 325*8975f5c5SAndroid Build Coastguard Workerdef ReadFile(path): 326*8975f5c5SAndroid Build Coastguard Worker with open(path, 'rt') as inf: 327*8975f5c5SAndroid Build Coastguard Worker all_data = inf.read() 328*8975f5c5SAndroid Build Coastguard Worker inf.close() 329*8975f5c5SAndroid Build Coastguard Worker return all_data 330*8975f5c5SAndroid Build Coastguard Worker 331*8975f5c5SAndroid Build Coastguard Worker 332*8975f5c5SAndroid Build Coastguard Workerif __name__ == "__main__": 333*8975f5c5SAndroid Build Coastguard Worker sys.exit(main(sys.argv[1:])) 334