0hmX/pcbgolf-routing-checkpoint-20261012
A PCBGolf assembly combining a modeled PCB with copper/component bodies and seven native connector housings.
- Version
- 0.0.3
- License
- unset
- Stars
- 0
firmware-support/build.py
#!/usr/bin/env python3
"""Object compile + host conversion tests; intentionally does not link a firmware image."""
import hashlib,json,os,pathlib,shutil,subprocess
H=pathlib.Path(__file__).resolve().parent;ROOT=H.parents[3]
inc=pathlib.Path(os.environ.get('PCBGOLF_CMSIS_INCLUDE',ROOT/'work/agents/firmware/sources/panda/board/stm32h7/inc'))
clang=shutil.which('clang');assert clang and (inc/'stm32h725xx.h').is_file()
commands=[]
def run(cmd,cwd=H):
p=subprocess.run([str(x) for x in cmd],cwd=cwd,capture_output=True,text=True);commands.append({'command':[str(x) for x in cmd],'exit_code':p.returncode,'stdout':p.stdout,'stderr':p.stderr});assert p.returncode==0,p.stderr
run(['python3',H/'build_map.py']);run(['python3',H/'prepare_smps_patch.py'])
check=H/'patch-check/board/stm32h7';check.mkdir(parents=True,exist_ok=True)
shutil.copyfile(ROOT/'work/agents/firmware/sources/panda/board/stm32h7/clock.h',check/'clock.h')
run(['git','apply','--check',H/'direct-smps.patch'],H/'patch-check')
run(['git','apply',H/'direct-smps.patch'],H/'patch-check')
assert (check/'clock.h').read_bytes()==(H/'predecessor-patch/board/stm32h7/clock.h').read_bytes()
flags=[clang,'--target=arm-none-eabi','-mcpu=cortex-m7','-mthumb','-mfpu=fpv5-d16','-mfloat-abi=hard','-ffreestanding','-std=c11','-Wall','-Wextra','-Werror','-DSTM32H725xx','-I'+str(inc)]
for source in ['pcbgolf_board.c','pcbgolf_imon.c']:run(flags+['-c',source,'-o',source.replace('.c','.o')])
for phase in ['bootstub','app']:run(flags+['-DPCBGOLF_H725100']+(['-DBOOTSTUB'] if phase=='bootstub' else [])+['-c','compile_clock.c','-o','clock-'+phase+'.o'])
run([clang,'-std=c11','-Wall','-Wextra','-Werror','pcbgolf_imon.c','test_imon.c','-lm','-o','test_imon']);run([H/'test_imon'])
run(['file','pcbgolf_board.o','pcbgolf_imon.o','clock-bootstub.o','clock-app.o'])
report={'status':'CORTEX_M7_OBJECT_COMPILE_AND_HOST_SCALE_TESTS_PASS','full_application_linked':False,'flashed':False,'hardware_tested':False,'toolchain':subprocess.check_output([clang,'--version'],text=True),'cmsis_include':str(inc),'stm32h725xx_h_sha256':hashlib.sha256((inc/'stm32h725xx.h').read_bytes()).hexdigest(),'commands':commands,'artifacts_sha256':{p.name:hashlib.sha256(p.read_bytes()).hexdigest() for p in H.glob('*.o')},'source_sha256':{p.name:hashlib.sha256(p.read_bytes()).hexdigest() for ext in ['*.c','*.h','*.inc'] for p in H.glob(ext)},'not_available':['arm-none-eabi-gcc','scons'],'limitations':['Exact original PCBGolf application firmware is not supplied.','No complete application link, USB enumeration, SD read/write, CAN bus, ADC hardware, power sequencing or recovery test.','Existing six-port predecessor requires additional PCBGolf-specific application and peripheral driver work.']}
(H/'build-evidence.json').write_text(json.dumps(report,indent=2)+'\n');print(json.dumps({'status':report['status'],'objects':len(report['artifacts_sha256']),'host_test':commands[-2]['stdout'],'linked':False,'hardware_tested':False},indent=2))