This commit is contained in:
jacob 2024-05-25 19:25:21 -05:00
parent 9131431144
commit 7e19a1c169

97
build.c
View File

@ -11,7 +11,7 @@ void Error(String msg)
} }
/* ========================== * /* ========================== *
* Compile command * Step
* ========================== */ * ========================== */
typedef struct StepListNode StepListNode; typedef struct StepListNode StepListNode;
@ -68,6 +68,47 @@ void RcIncludeListAppend(Arena *arena, RcIncludeList *l, D_Tag tag, String rc_ty
++l->count; ++l->count;
} }
/* ========================== *
* Depfile
*
* TODO: Migrate this to buildit
* ========================== */
void AddDependenciesFromDepFile(Arena *arena, D_Tag file, D_Tag dep_file)
{
TempArena scratch = ScratchBegin(arena);
D_AddDependency(file, dep_file);
{
String dep_file_data = D_ReadAll(scratch.arena, dep_file);
StringList patterns = { 0 };
StringListAppend(scratch.arena, &patterns, Lit("\r\n"));
StringListAppend(scratch.arena, &patterns, Lit("\n"));
StringList lines = StringSplit(scratch.arena, dep_file_data, patterns);
for (StringListNode *dn = lines.first; dn; dn = dn->next) {
String line = dn->string;
line = StringReplace(scratch.arena, line, Lit("\\ "), Lit(" "));
if (StringEndsWith(line, Lit(" \\"))) {
line.len -= 2;
}
if (StringBeginsWith(line, Lit(" "))) {
line.len -= 2;
line.text += 2;
}
if (!StringEndsWith(line, Lit(":"))) {
D_Tag tag = D_FileTagFromPath(scratch.arena, line);
if (!D_TagEqual(tag, file)) {
String line_copy = StringCopy(arena, line);
D_Tag tag_copy = D_FileTagFromPath(arena, line_copy);
D_AddDependency(file, tag_copy);
}
}
}
}
ScratchEnd(scratch);
}
/* ========================== * /* ========================== *
* Build * Build
* ========================== */ * ========================== */
@ -76,6 +117,8 @@ void OnBuild(StringList cli_args)
{ {
Arena arena = ArenaAlloc(Gigabyte(64)); Arena arena = ArenaAlloc(Gigabyte(64));
OS_TimeStamp start = OS_GetTimeStamp();
/* ========================== * /* ========================== *
* Read args * Read args
* ========================== */ * ========================== */
@ -126,6 +169,7 @@ void OnBuild(StringList cli_args)
} }
String hist_path = OS_GetAbsPath(&arena, StringF(&arena, Lit("%F/.dephist"), FmtStr(arg_outdir))); String hist_path = OS_GetAbsPath(&arena, StringF(&arena, Lit("%F/.dephist"), FmtStr(arg_outdir)));
String out_dep_dir_path = OS_GetAbsPath(&arena, StringF(&arena, Lit("%F/dep/"), FmtStr(arg_outdir)));
String out_obj_dir_path = OS_GetAbsPath(&arena, StringF(&arena, Lit("%F/obj/"), FmtStr(arg_outdir))); String out_obj_dir_path = OS_GetAbsPath(&arena, StringF(&arena, Lit("%F/obj/"), FmtStr(arg_outdir)));
String out_inc_dir_path = OS_GetAbsPath(&arena, StringF(&arena, Lit("%F/inc/"), FmtStr(arg_outdir))); String out_inc_dir_path = OS_GetAbsPath(&arena, StringF(&arena, Lit("%F/inc/"), FmtStr(arg_outdir)));
String out_bin_dir_path = OS_GetAbsPath(&arena, StringF(&arena, Lit("%F/bin/"), FmtStr(arg_outdir))); String out_bin_dir_path = OS_GetAbsPath(&arena, StringF(&arena, Lit("%F/bin/"), FmtStr(arg_outdir)));
@ -232,16 +276,16 @@ void OnBuild(StringList cli_args)
StringListAppend(&arena, &compile_args, StringF(&arena, Lit("/Fd\"%F\\\""), FmtStr(out_bin_dir_path))); StringListAppend(&arena, &compile_args, StringF(&arena, Lit("/Fd\"%F\\\""), FmtStr(out_bin_dir_path)));
} else { } else {
/* Clang */ /* Clang */
StringListAppend(&arena, &c_compile_args, Lit("clang -xc -std=c99 -c %F -o %F -MD")); StringListAppend(&arena, &c_compile_args, Lit("clang -xc -std=c99 -c \"%F\" -o \"%F\""));
StringListAppend(&arena, &cpp_compile_args, Lit("clang -xc++ -std=c++20 -c %F -o %F -MD")); StringListAppend(&arena, &cpp_compile_args, Lit("clang -xc++ -std=c++20 -c \"%F\" -o \"%F\""));
StringListAppend(&arena, &pch_c_compile_args, Lit("clang -xc-header -std=c99 -c %F -o %F -MD")); StringListAppend(&arena, &pch_c_compile_args, Lit("clang -xc-header -std=c99 -c \"%F\" -o \"%F\""));
StringListAppend(&arena, &pch_cpp_compile_args, Lit("clang -xc++-header -std=c++20 -c %F -o %F -MD")); StringListAppend(&arena, &pch_cpp_compile_args, Lit("clang -xc++-header -std=c++20 -c \"%F\" -o \"%F\""));
StringListAppend(&arena, &rc_compile_args, Lit("llvm-rc /fo\"%F\" \"%F\"")); StringListAppend(&arena, &rc_compile_args, Lit("llvm-rc /fo\"%F\" \"%F\""));
#if 0 StringListAppend(&arena, &c_compile_args, StringF(&arena, Lit("-MD -MF \"%F\""), FmtStr(out_dep_dir_path)));
StringListAppend(&arena, &c_compile_args, StringF(&arena, Lit("-include-pch %F"), FmtStr(pch_c_file.full_path))); StringListAppend(&arena, &cpp_compile_args, StringF(&arena, Lit("-MD -MF \"%F\""), FmtStr(out_dep_dir_path)));
StringListAppend(&arena, &cpp_compile_args, StringF(&arena, Lit("-include-pch %F"), FmtStr(pch_cpp_file.full_path))); StringListAppend(&arena, &pch_c_compile_args, StringF(&arena, Lit("-MD -MF \"%F\""), FmtStr(out_dep_dir_path)));
#endif StringListAppend(&arena, &pch_cpp_compile_args, StringF(&arena, Lit("-MD -MF \"%F\""), FmtStr(out_dep_dir_path)));
StringListAppend(&arena, &link_args, Lit("clang %F")); StringListAppend(&arena, &link_args, Lit("clang %F"));
@ -475,32 +519,7 @@ void OnBuild(StringList cli_args)
String dep_file_path = StringF(&arena, Lit("%F/%F.%F"), FmtStr(out_obj_dir_path), FmtStr(name_no_extension), FmtStr(dep_file_extension)); String dep_file_path = StringF(&arena, Lit("%F/%F.%F"), FmtStr(out_obj_dir_path), FmtStr(name_no_extension), FmtStr(dep_file_extension));
dep_file = D_FileTagFromPath(&arena, dep_file_path); dep_file = D_FileTagFromPath(&arena, dep_file_path);
} }
D_AddDependency(file, dep_file); AddDependenciesFromDepFile(&arena, file, dep_file);
{
String dep_file_data = D_ReadAll(&arena, dep_file);
StringList patterns = { 0 };
StringListAppend(&arena, &patterns, Lit("\r\n"));
StringListAppend(&arena, &patterns, Lit("\n"));
StringList lines = StringSplit(&arena, dep_file_data, patterns);
for (StringListNode *dn = lines.first; dn; dn = dn->next) {
String line = dn->string;
line = StringReplace(&arena, line, Lit("\\ "), Lit(" "));
if (StringEndsWith(line, Lit(" \\"))) {
line.len -= 2;
}
if (StringBeginsWith(line, Lit(" "))) {
line.len -= 2;
line.text += 2;
}
if (!StringEndsWith(line, Lit(":"))) {
D_Tag tag = D_FileTagFromPath(&arena, line);
if (!D_TagEqual(tag, file)) {
D_AddDependency(file, tag);
}
}
}
}
} }
} }
} }
@ -665,10 +684,10 @@ void OnBuild(StringList cli_args)
} }
} }
} else { } else {
SH_Print(Lit("Nothing to build")); SH_Print(Lit("No work to do\n"));
} }
if (!success) { if (!success) {
Error(Lit("Build failed")); Error(Lit("Build failed\n"));
OS_Exit(1); OS_Exit(1);
} }
} }
@ -679,6 +698,10 @@ void OnBuild(StringList cli_args)
D_WriteStateToHistFile(hist_path); D_WriteStateToHistFile(hist_path);
OS_TimeStamp end = OS_GetTimeStamp();
F64 seconds = OS_SecondsFromTimeStamp(end - start);
SH_PrintF(Lit("Finished in %F seconds\n"), FmtF64P(seconds, 5));
#if 0 #if 0
#if Rtc #if Rtc
getchar(); getchar();