48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
#!/usr/bin/env python3
|
|
import os
|
|
import sys
|
|
import glob
|
|
import subprocess
|
|
import concurrent.futures
|
|
|
|
def main():
|
|
cc = sys.argv[1] if len(sys.argv) > 1 else "gcc"
|
|
cflags_str = sys.argv[2] if len(sys.argv) > 2 else ""
|
|
build_dir = sys.argv[3] if len(sys.argv) > 3 else "build"
|
|
|
|
cflags = [f for f in cflags_str.split() if f]
|
|
lvgl_obj_dir = os.path.join(build_dir, "lvgl")
|
|
target_lib = os.path.join(build_dir, "liblvgl.a")
|
|
|
|
srcs = sorted(glob.glob("lib/lvgl/src/**/*.c", recursive=True))
|
|
tasks = []
|
|
|
|
for src in srcs:
|
|
rel = os.path.relpath(src, "lib/lvgl")
|
|
obj = os.path.join(lvgl_obj_dir, os.path.splitext(rel)[0] + ".o")
|
|
os.makedirs(os.path.dirname(obj), exist_ok=True)
|
|
tasks.append((src, obj))
|
|
|
|
def compile_task(item):
|
|
src, obj = item
|
|
if not os.path.exists(obj) or os.path.getmtime(src) > os.path.getmtime(obj):
|
|
cmd = [cc] + cflags + ["-Ilib/lvgl", "-O2", "-c", src, "-o", obj]
|
|
res = subprocess.run(cmd, capture_output=True, text=True)
|
|
if res.returncode != 0:
|
|
print(f"[ERR] Failed to compile {src}:\n{res.stderr}", file=sys.stderr)
|
|
return False
|
|
return True
|
|
|
|
cpu_count = min(os.cpu_count() or 4, 16)
|
|
with concurrent.futures.ThreadPoolExecutor(max_workers=cpu_count) as ex:
|
|
results = list(ex.map(compile_task, tasks))
|
|
|
|
if not all(results):
|
|
sys.exit(1)
|
|
|
|
all_objs = [obj for _, obj in tasks]
|
|
subprocess.run(["ar", "rcs", target_lib] + all_objs, check=True)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|