xref: /aosp_15_r20/external/angle/third_party/mesa/mesa_build.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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