@@ -171,45 +171,58 @@ def build_project(project_dir: Path) -> BuildResult:
171171
172172def print_results (results : list [BuildResult ], code_root : Path ) -> None :
173173 """Print build results summary."""
174+ in_ci = os .environ .get ('CI' ) is not None
174175 passed = [r for r in results if r .success ]
175176 failed = [r for r in results if not r .success ]
176177
177- print ()
178- print ("=" * 60 )
179- print ("Build Results" )
180- print ("=" * 60 )
178+ print (flush = True )
179+ print ("=" * 60 , flush = True )
180+ print ("Build Results" , flush = True )
181+ print ("=" * 60 , flush = True )
181182
182183 for r in results :
183184 status = "PASS" if r .success else "FAIL"
184185 rel = r .path .relative_to (code_root )
185- print (f" [{ status } ] { rel } - { r .duration :.1f} s" )
186+ print (f" [{ status } ] { rel } - { r .duration :.1f} s" , flush = True )
186187
187- print ()
188- print (f"Total: { len (results )} | Passed: { len (passed )} | Failed: { len (failed )} " )
188+ print (flush = True )
189+ print (f"Total: { len (results )} | Passed: { len (passed )} | Failed: { len (failed )} " , flush = True )
189190
190- if failed :
191- print ()
192- print ("Failed builds:" )
193- print ("-" * 60 )
194- for r in failed :
195- rel = r .path .relative_to (code_root )
196- print (f"\n { rel } :" )
197- # Show error lines from the output
191+ # Print detailed output for all builds, grouped in CI
192+ for r in results :
193+ if not r .output .strip ():
194+ continue
195+ rel = r .path .relative_to (code_root )
196+ status = "PASS" if r .success else "FAIL"
197+ if in_ci :
198+ print (f"\n ::group::[{ status } ] { rel } " , flush = True )
199+ else :
200+ print (f"\n --- [{ status } ] { rel } ---" , flush = True )
201+
202+ if r .success :
203+ # Passing builds: show last 5 lines (configure + build summary)
204+ lines = r .output .strip ().split ('\n ' )
205+ for line in lines [- 5 :]:
206+ print (f" { line } " , flush = True )
207+ else :
208+ # Failed builds: show error lines, fallback to last 20
198209 lines = r .output .strip ().split ('\n ' )
199210 error_lines = [l for l in lines if 'error:' in l .lower ()]
200211 if error_lines :
201212 for line in error_lines :
202- print (f" { line } " )
213+ print (f" { line } " , flush = True )
203214 else :
204- # No 'error:' found, show last 20 lines
205215 for line in lines [- 20 :]:
206- print (f" { line } " )
216+ print (f" { line } " , flush = True )
207217
208- print ()
218+ if in_ci :
219+ print ("::endgroup::" , flush = True )
220+
221+ print (flush = True )
209222 if failed :
210- print (f"FAILED: { len (failed )} build(s) failed" )
223+ print (f"FAILED: { len (failed )} build(s) failed" , flush = True )
211224 else :
212- print ("All builds passed!" )
225+ print ("All builds passed!" , flush = True )
213226
214227
215228def main ():
@@ -243,16 +256,16 @@ def main():
243256 print (f"No { target } projects found under { code_root } " )
244257 sys .exit (0 )
245258
246- print (f"Discovered { len (projects )} { target } project(s):" )
259+ print (f"Discovered { len (projects )} { target } project(s):" , flush = True )
247260 for p in projects :
248- print (f" { p .relative_to (code_root )} " )
261+ print (f" { p .relative_to (code_root )} " , flush = True )
249262
250263 if args .discover :
251264 sys .exit (0 )
252265
253266 print ()
254- print (f"Building { len (projects )} project(s) with { args .jobs } worker(s)..." )
255- print ()
267+ print (f"Building { len (projects )} project(s) with { args .jobs } worker(s)..." , flush = True )
268+ print (flush = True )
256269
257270 results_map : dict [Path , BuildResult ] = {}
258271 with ThreadPoolExecutor (max_workers = args .jobs ) as executor :
@@ -265,7 +278,7 @@ def main():
265278 result = future .result ()
266279 rel = result .path .relative_to (code_root )
267280 status = "OK" if result .success else "FAILED"
268- print (f"[{ done_count } /{ len (projects )} ] { rel } : { status } ({ result .duration :.1f} s)" )
281+ print (f"[{ done_count } /{ len (projects )} ] { rel } : { status } ({ result .duration :.1f} s)" , flush = True )
269282 results_map [futures [future ]] = result
270283
271284 results = [results_map [p ] for p in projects ]
0 commit comments