script/common.py (75 lines of code) (raw):
#! /usr/bin/env python3
import argparse, contextlib, os, pathlib, platform, re, shutil, subprocess, sys, time, urllib.request, zipfile
arch = {'AMD64': 'x64', 'x86_64': 'x64', 'arm64': 'arm64'}[platform.machine()]
parser = argparse.ArgumentParser()
parser.add_argument('--arch', default=arch)
(args, _) = parser.parse_known_args()
arch = args.arch
system = {'Darwin': 'macos', 'Linux': 'linux', 'Windows': 'windows'}[platform.system()]
classpath_separator = ';' if system == 'windows' else ':'
mvn = "mvn.cmd" if system == "windows" else "mvn"
space_skija = 'https://packages.jetbrains.team/maven/p/skija/maven'
classifier = ('macos-' + arch if system == 'macos' else system)
module = 'org.jetbrains.skija.' + ('macos.' + arch if system == 'macos' else system)
verbose = '--verbose' in sys.argv
root = os.path.abspath(os.path.dirname(__file__) + '/..')
def check_call(args, **kwargs):
t0 = time.time()
res = subprocess.check_call(args, **kwargs)
if verbose:
print('[', round((time.time() - t0) * 1000), 'ms', ']', ' '.join(args))
return res
def check_output(args, **kwargs):
kwargs['stdout'] = subprocess.PIPE
return check_call(args, **kwargs).stdout
def fetch(url, file):
if not os.path.exists(file):
print('Downloading', url)
if os.path.dirname(file):
os.makedirs(os.path.dirname(file), exist_ok = True)
# if url.startswith('https://packages.jetbrains.team/'):
# check_call(["curl", "--fail", "--location", '--show-error', url, '--output', file])
# else:
with open(file, 'wb') as f:
f.write(urllib.request.urlopen(url).read())
def fetch_maven(group, name, version, classifier=None, repo='https://repo1.maven.org/maven2'):
path = '/'.join([group.replace('.', '/'), name, version, name + '-' + version + ('-' + classifier if classifier else '') + '.jar'])
file = os.path.join(os.path.expanduser('~'), '.m2', 'repository', path)
fetch(repo + '/' + path, file)
return file
def deps():
return [
fetch_maven('org.projectlombok', 'lombok', '1.18.20'),
fetch_maven('org.jetbrains', 'annotations', '20.1.0'),
]
def javac(sources, target, classpath = [], modulepath = [], add_modules = [], release = '11', opts = []):
classes = {path.stem: path.stat().st_mtime for path in pathlib.Path(target).rglob('*.class') if '$' not in path.stem}
newer = lambda path: path.stem not in classes or path.stat().st_mtime > classes.get(path.stem)
new_sources = [path for path in sources if newer(pathlib.Path(path))]
if new_sources:
print('Compiling', len(new_sources), 'java files to', target)
check_call([
'javac',
'-encoding', 'UTF8',
'--release', release] + opts + [
# '-J--illegal-access=permit',
# '-Xlint:deprecation',
# '-Xlint:unchecked',
'--class-path', classpath_separator.join(classpath + [target])] +
(['--module-path', classpath_separator.join(modulepath)] if modulepath else []) +
(['--add-modules', ','.join(add_modules)] if add_modules else []) +
['-d', target] + new_sources)
def glob(dir, pattern):
return [str(x) for x in pathlib.Path(dir).rglob(pattern)]
@contextlib.contextmanager
def replaced(filename, replacements):
with open(filename, 'r') as f:
original = f.read()
try:
updated = original
for key, value in replacements.items():
updated = updated.replace(key, value)
with open(filename, 'w') as f:
f.write(updated)
yield f
finally:
with open(filename, 'w') as f:
f.write(original)
def copy_newer(src, dst):
if not os.path.exists(dst) or os.path.getmtime(src) > os.path.getmtime(dst):
if os.path.exists(dst):
os.remove(dst)
shutil.copy2(src, dst)