aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-03-13 23:59:36 -0400
committerAndrew Kelley <andrew@ziglang.org>2020-03-13 23:59:36 -0400
commit66d7370facc63648eb85fb7f1b94753ab0823ff3 (patch)
tree3b65163734d31ca35bdaee43d7bb95f916f39940 /src/codegen.cpp
parent66e76a0209586000a78fe896071e73202a80b81f (diff)
downloadzig-66d7370facc63648eb85fb7f1b94753ab0823ff3.tar.gz
zig-66d7370facc63648eb85fb7f1b94753ab0823ff3.zip
special case when doing build-obj with just one source file
When building an object file from only one source file, instead of having a two-stage cache system, we special case it and use the cache directory that the .o file is output to as the final cache directory for all the build artifacts. When there are more than 1 source file, the linker has to merge objects into one, and so the two stage approach makes sens. But in the case of only one source file, this prevents needlessly copying the object file. This commit fixes an issue with the previous one, where zig with cache enabled would print a directory that actually did not have any build artifacts in it.
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index aba8a49032..924ea9baa6 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -10482,10 +10482,6 @@ static void resolve_out_paths(CodeGen *g) {
case OutTypeUnknown:
zig_unreachable();
case OutTypeObj:
- if (g->enable_cache && g->link_objects.length == 1 && !need_llvm_module(g)) {
- buf_init_from_buf(&g->bin_file_output_path, g->link_objects.at(0));
- return;
- }
if (need_llvm_module(g) && g->link_objects.length != 0 && !g->enable_cache &&
buf_eql_buf(o_basename, out_basename))
{
@@ -10580,6 +10576,20 @@ static void output_type_information(CodeGen *g) {
}
}
+static bool main_output_dir_is_just_one_c_object(CodeGen *g) {
+ return g->enable_cache && g->link_objects.length == 1 && !need_llvm_module(g);
+}
+
+static void init_output_dir(CodeGen *g, Buf *digest) {
+ if (main_output_dir_is_just_one_c_object(g)) {
+ g->output_dir = buf_alloc();
+ os_path_dirname(g->link_objects.at(0), g->output_dir);
+ } else {
+ g->output_dir = buf_sprintf("%s" OS_SEP CACHE_OUT_SUBDIR OS_SEP "%s",
+ buf_ptr(g->cache_dir), buf_ptr(digest));
+ }
+}
+
void codegen_build_and_link(CodeGen *g) {
Error err;
assert(g->out_type != OutTypeUnknown);
@@ -10622,8 +10632,7 @@ void codegen_build_and_link(CodeGen *g) {
}
if (g->enable_cache && buf_len(&digest) != 0) {
- g->output_dir = buf_sprintf("%s" OS_SEP CACHE_OUT_SUBDIR OS_SEP "%s",
- buf_ptr(g->cache_dir), buf_ptr(&digest));
+ init_output_dir(g, &digest);
resolve_out_paths(g);
} else {
if (need_llvm_module(g)) {
@@ -10644,8 +10653,7 @@ void codegen_build_and_link(CodeGen *g) {
exit(1);
}
}
- g->output_dir = buf_sprintf("%s" OS_SEP CACHE_OUT_SUBDIR OS_SEP "%s",
- buf_ptr(g->cache_dir), buf_ptr(&digest));
+ init_output_dir(g, &digest);
if ((err = os_make_path(g->output_dir))) {
fprintf(stderr, "Unable to create output directory: %s\n", err_str(err));