27 lines
2 KiB
Python
27 lines
2 KiB
Python
import pathlib, subprocess, json, os, resource, hashlib
|
|
R=pathlib.Path(__file__).resolve().parent
|
|
records=[]
|
|
def run(name,args,env=None):
|
|
def limit():resource.setrlimit(resource.RLIMIT_CORE,(0,0))
|
|
p=subprocess.run(args,cwd=R,capture_output=True,env=env,preexec_fn=limit)
|
|
(R/(name+'.stdout')).write_bytes(p.stdout);(R/(name+'.stderr')).write_bytes(p.stderr)
|
|
records.append(dict(name=name,argv=args,returncode=p.returncode,core_limit=0,environment_overrides={} if env is None else {k:v for k,v in env.items() if k in ('ASAN_OPTIONS','UBSAN_OPTIONS')}))
|
|
return p.returncode
|
|
assert run('extract',['python3','extract.py'])==0
|
|
run('compiler-version',['cc','--version'])
|
|
assert run('pkg-config',['pkg-config','--cflags','--libs','wayland-server','pixman-1'])==0
|
|
pkg=(R/'pkg-config.stdout').read_text().split()
|
|
assert run('library-versions',['pkg-config','--modversion','wayland-server','pixman-1'])==0
|
|
assert run('compile-pixman-diagnostic',['cc','-std=c17','pixman-diagnostic.c',*pkg,'-o','pixman-diagnostic'])==0
|
|
assert run('pixman-diagnostic',['./pixman-diagnostic'])==0
|
|
for variant,flags in [('normal',[]),('ubsan',['-fsanitize=undefined','-fno-sanitize-recover=all']),('asan',['-fsanitize=address'])]:
|
|
args=['cc','-std=c17','-g','-O1','-Wall','-Wextra','-Wno-unused-function','-Wno-unused-parameter','-fno-omit-frame-pointer',*flags,'scene.c','lifecycle.c',*pkg,'-o','lifecycle-'+variant]
|
|
rc=run('compile-'+variant,args)
|
|
if rc==0:
|
|
env=os.environ.copy();env.update(ASAN_OPTIONS='detect_leaks=1:abort_on_error=1',UBSAN_OPTIONS='halt_on_error=1:print_stacktrace=1')
|
|
run(variant+'-defined',['./lifecycle-'+variant],env)
|
|
run(variant+'-allocation-unavailable',['./lifecycle-'+variant,'--allocation-unavailable'],env)
|
|
(R/'commands.json').write_text(json.dumps(records,indent=2)+'\n')
|
|
print(json.dumps([{k:r[k] for k in ("name","returncode")} for r in records],indent=2))
|
|
failed=[r for r in records if r["returncode"] != (-6 if r["name"].endswith("-allocation-unavailable") else 0)]
|
|
raise SystemExit(bool(failed))
|