depfile stuff

This commit is contained in:
jacob 2024-05-26 14:14:37 -05:00
parent 7e19a1c169
commit ec6d2bc303

69
build.c
View File

@ -74,35 +74,34 @@ void RcIncludeListAppend(Arena *arena, RcIncludeList *l, D_Tag tag, String rc_ty
* TODO: Migrate this to buildit
* ========================== */
void AddDependenciesFromDepFile(Arena *arena, D_Tag file, D_Tag dep_file)
void AddDependenciesFromDepFile(D_Tag dep_file)
{
TempArena scratch = ScratchBegin(arena);
TempArena scratch = ScratchBeginNoConflict();
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);
}
}
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);
D_Tag file = { 0 };
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(":"))) {
line.len -= 1;
}
if (file.full_path.len == 0) {
file = D_FileTagFromPath(scratch.arena, line);
} else {
D_Tag dependency = D_FileTagFromPath(scratch.arena, line);
D_AddDependency(file, dependency);
}
}
@ -276,18 +275,12 @@ void OnBuild(StringList cli_args)
StringListAppend(&arena, &compile_args, StringF(&arena, Lit("/Fd\"%F\\\""), FmtStr(out_bin_dir_path)));
} else {
/* Clang */
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\""));
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\""));
StringListAppend(&arena, &c_compile_args, Lit("clang -xc -std=c99 -c \"%F\" -o \"%F\" -MD"));
StringListAppend(&arena, &cpp_compile_args, Lit("clang -xc++ -std=c++20 -c \"%F\" -o \"%F\" -MD"));
StringListAppend(&arena, &pch_c_compile_args, Lit("clang -xc-header -std=c99 -c \"%F\" -o \"%F\" -MD"));
StringListAppend(&arena, &pch_cpp_compile_args, Lit("clang -xc++-header -std=c++20 -c \"%F\" -o \"%F\" -MD"));
StringListAppend(&arena, &rc_compile_args, Lit("llvm-rc /fo\"%F\" \"%F\""));
StringListAppend(&arena, &c_compile_args, StringF(&arena, Lit("-MD -MF \"%F\""), FmtStr(out_dep_dir_path)));
StringListAppend(&arena, &cpp_compile_args, StringF(&arena, Lit("-MD -MF \"%F\""), FmtStr(out_dep_dir_path)));
StringListAppend(&arena, &pch_c_compile_args, StringF(&arena, Lit("-MD -MF \"%F\""), FmtStr(out_dep_dir_path)));
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, StringF(&arena, Lit("-o \"%F\""), FmtStr(executable_file.full_path)));
@ -519,7 +512,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));
dep_file = D_FileTagFromPath(&arena, dep_file_path);
}
AddDependenciesFromDepFile(&arena, file, dep_file);
AddDependenciesFromDepFile(dep_file);
}
}
}