diff --git a/build.c b/build.c index 02a593a1..2e476be0 100644 --- a/build.c +++ b/build.c @@ -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); } } }