import os,subprocess,time,glob,statistics
ROOT="/Users/oscar/.worktree/hot-reload/labs/hot-reload"; DEPS=f"{ROOT}/target/debug/deps"
LD="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld"
STD=sorted(glob.glob(os.path.expanduser("~/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libstd-*.dylib")))[0]
TLIB=os.path.dirname(STD); lib=os.path.basename(STD)[3:-6]
rlibs=[sorted(glob.glob(f"{DEPS}/libapi_common-*.rlib"))[-1], sorted(glob.glob(f"{DEPS}/libapi-*.rlib"))[-1]]
BASE="/private/var/folders/ft/fkt3bwqd01g7f54wvyz9wgjc0000gn/T/opencode/pipe/link2"; os.makedirs(BASE,exist_ok=True)
baseflags=["-dylib","-arch","arm64","-platform_version","macos","11.0","0.0","-undefined","dynamic_lookup","-dead_strip","-no_function_starts","-x"]
def cmd(flags,out):
    c=[LD]+flags
    for r in rlibs: c+=["-force_load",r]
    c+=["-o",out,"-L",TLIB,f"-l{lib}","-rpath",TLIB]
    return c
variants={
 "base":baseflags,
 "nodead": [f for f in baseflags if f!="-dead_strip"],
 "nodup": baseflags+["-no_deduplicate"],
 "nodead_nodup": [f for f in baseflags if f!="-dead_strip"]+["-no_deduplicate"],
 "dead_dylibs": baseflags+["-dead_strip_dylibs"],
 "no_uuid": baseflags+["-no_uuid"],
}
outs={}
res={k:[] for k in variants}
for rnd in range(10):
    for k,fl in variants.items():
        out=f"{BASE}/{k}.dylib"
        if os.path.exists(out): os.remove(out)
        s=time.monotonic(); p=subprocess.run(cmd(fl,out),stdout=subprocess.DEVNULL,stderr=subprocess.PIPE); dt=(time.monotonic()-s)*1000
        if p.returncode: print(k,"FAIL",p.stderr[:200]); break
        res[k].append(dt); outs[k]=os.path.getsize(out)
for k,xs in res.items():
    if xs: print(f"{k:14s} med={statistics.median(xs):.1f} min={min(xs):.1f} size={outs.get(k)}")
