1
0
Fork 0
llvm-premerge-checks/scripts/run_ninja.py
2020-05-25 16:42:40 +02:00

64 lines
2.3 KiB
Python
Executable file

#!/usr/bin/env python3
# Copyright 2020 Google LLC
#
# Licensed under the the Apache License v2.0 with LLVM Exceptions (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://llvm.org/LICENSE.txt
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import os
import platform
import shutil
import subprocess
import sys
def check_sccache(dryrun: bool):
"""check if sccache can be started
Wipe local cache folder if it fails with a timeout.
This is based on the problem described here:
https://github.com/google/llvm-premerge-checks/wiki/LLVM-pre-merge-tests-operations-blog#2020-05-04
"""
if platform.system() != 'Windows':
return
if 'SCCACHE_DIR' not in os.environ:
return
sccache_dir = os.environ['SCCACHE_DIR']
result = subprocess.run('sccache --start-server', shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, text=True)
if result.returncode == 0:
return
if result.stderr is not None and 'Timed out waiting for server startup' in result.stderr:
print('sccache failed with timeout. Wiping local cache dir {}'.format(sccache_dir))
if dryrun:
print('Dryrun. Not deleting anything.')
else:
shutil.rmtree(sccache_dir)
def run_ninja(target: str, work_dir: str, *, dryrun: bool = False):
check_sccache(dryrun)
cmd = 'ninja {}'.format(target)
if dryrun:
print('Dryrun. Command would have been:\n{}'.format(cmd))
return 0
else:
return subprocess.call(cmd, shell=True, cwd=work_dir)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Run ninja for LLVM.')
parser.add_argument('target')
parser.add_argument('repo_path', type=str, nargs='?', default=os.getcwd())
parser.add_argument('--dryrun', action='store_true')
args = parser.parse_args()
sys.exit(run_ninja(args.target, os.path.join(args.repo_path, 'build'), dryrun=args.dryrun))