From c7315327f41e943873469efae5256c4598e02070 Mon Sep 17 00:00:00 2001 From: jacob Date: Tue, 11 Feb 2025 11:45:35 -0600 Subject: [PATCH] clean build.c output to exclude note src locations --- build.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 9 deletions(-) diff --git a/build.c b/build.c index ee1006e8..ab504760 100644 --- a/build.c +++ b/build.c @@ -114,6 +114,80 @@ void ExecuteSteps(void) T_Execute(&sl->tq); } +/* ========================== * + * Clean result output + * ========================== */ + +/* TODO: Move to buildit */ +Size StringFind(String s, String pattern) +{ + Size pos = -1; + for (Size i = 0; i < s.len; ++i) { + if ((s.len - i) >= pattern.len) { + String cmp = { 0 }; + cmp.text = s.text + i; + cmp.len = pattern.len; + if (StringEqual(cmp, pattern)) { + pos = i; + break; + } + } else { + break; + } + } + return pos; +} + +String CleanResultOutput(Arena *arena, String output) +{ + TempArena scratch = ScratchBegin(arena); + StringList res_lines = { 0 }; + + StringList patterns = { 0 }; + StringListAppend(scratch.arena, &patterns, Lit("\r\n")); + StringListAppend(scratch.arena, &patterns, Lit("\r\n")); + StringListAppend(scratch.arena, &patterns, Lit("\n")); + StringList lines = StringSplit(scratch.arena, output, patterns); + for (StringListNode *n = lines.first; n; n = n->next) { + String line = n->string; + String line_cleaned = line; + + /* Ignore MSVC header include messages */ + if (StringContains(line, Lit("Note: including file"))) { + line_cleaned.len = 0; + } + + /* Truncate note src locations. + * This is a hack to get around visual studio's "GoToNextLocation" + * picking up noise from clang & msvc notes since src location + * info is present, rather than going to the next error. */ + if (StringContains(line_cleaned, Lit(": note: "))) { + String trunc = Lit("power_play\\src\\"); + Size pos = StringFind(line_cleaned, trunc); + if (pos < 0) { + trunc = Lit("power_play\\src/"); + pos = StringFind(line_cleaned, trunc); + } + String line_trunced = line_cleaned; + if (pos >= 0) { + line_trunced.text += pos + trunc.len; + line_trunced.len -= pos + trunc.len; + line_cleaned = StringCopy(scratch.arena, Lit("[note]: ")); + line_cleaned.len += StringCopy(scratch.arena, line_trunced).len; + } + } + + if (line_cleaned.len > 0) { + StringListAppend(scratch.arena, &res_lines, line_cleaned); + } + } + + String res = StringFromStringList(arena, Lit("\n"), res_lines); + ScratchEnd(scratch); + + return res; +} + /* ========================== * * Build steps * ========================== */ @@ -141,14 +215,16 @@ void BuildStepSimpleCommand(void *arg_raw) { OS_Lock res_lock = OS_MutexLockE(&s->res_mutex); - if (result.output.len > 0) { + + String result_output_cleaned = CleanResultOutput(scratch.arena, result.output); + if (result_output_cleaned.len > 0) { OS_Lock sl_lock = OS_MutexLockE(&sl->mutex); { - s->res_output.text = ArenaPushArrayNoZero(&sl->arena, Byte, result.output.len); + s->res_output.text = ArenaPushArrayNoZero(&sl->arena, Byte, result_output_cleaned.len); } OS_MutexUnlock(&sl_lock); - s->res_output.len = result.output.len; - MemoryCopy(s->res_output.text, result.output.text, result.output.len); + s->res_output.len = result_output_cleaned.len; + MemoryCopy(s->res_output.text, result_output_cleaned.text, result_output_cleaned.len); } s->res_status = result.error ? StepStatus_Failure : StepStatus_Success; OS_ConditionVariableBroadcast(&s->res_cv); @@ -171,16 +247,17 @@ void BuildStepMsvcCompileCommand(void *arg_raw) D_ClearWrite(arg->output_depfile, depfile_data); } + String result_output_cleaned = CleanResultOutput(scratch.arena, result.output); { OS_Lock res_lock = OS_MutexLockE(&s->res_mutex); - if (result.output.len > 0) { + if (result_output_cleaned.len > 0) { OS_Lock sl_lock = OS_MutexLockE(&sl->mutex); { - s->res_output.text = ArenaPushArrayNoZero(&sl->arena, Byte, result.output.len); + s->res_output.text = ArenaPushArrayNoZero(&sl->arena, Byte, result_output_cleaned.len); } OS_MutexUnlock(&sl_lock); - s->res_output.len = result.output.len; - MemoryCopy(s->res_output.text, result.output.text, result.output.len); + s->res_output.len = result_output_cleaned.len; + MemoryCopy(s->res_output.text, result_output_cleaned.text, result_output_cleaned.len); } s->res_status = result.error ? StepStatus_Failure : StepStatus_Success; OS_ConditionVariableBroadcast(&s->res_cv); @@ -855,7 +932,7 @@ void OnBuild(StringList cli_args) if (s->res_status != StepStatus_Success) { Assert(false); success = false; - SH_PrintF(Lit("%F\n"), FmtStr(output)); + SH_PrintF(Lit("%F\n\n"), FmtStr(output)); } s = s->next;