Commit 0bdc85181c

Jay Weisskopf <jay@jayschwa.net>
2019-09-11 06:25:10
Create user-specified `output-dir`
Fixes #2637
1 parent 663e665
Changed files (2)
src/codegen.cpp
@@ -10238,8 +10238,13 @@ void codegen_build_and_link(CodeGen *g) {
     Error err;
     assert(g->out_type != OutTypeUnknown);
 
-    if (!g->enable_cache && g->output_dir == nullptr) {
-        g->output_dir = buf_create_from_str(".");
+    if (!g->enable_cache) {
+        if (g->output_dir == nullptr) {
+            g->output_dir = buf_create_from_str(".");
+        } else if ((err = os_make_path(g->output_dir))) {
+            fprintf(stderr, "Unable to create output directory: %s\n", err_str(err));
+            exit(1);
+        }
     }
 
     g->have_dynamic_link = detect_dynamic_link(g);
test/cli.zig
@@ -34,6 +34,7 @@ pub fn main() !void {
         testZigInitLib,
         testZigInitExe,
         testGodboltApi,
+        testMissingOutputPath,
     };
     for (test_fns) |testFn| {
         try fs.deleteTree(a, dir_path);
@@ -129,3 +130,12 @@ fn testGodboltApi(zig_exe: []const u8, dir_path: []const u8) anyerror!void {
     testing.expect(std.mem.indexOf(u8, out_asm, "mov\teax, edi") != null);
     testing.expect(std.mem.indexOf(u8, out_asm, "imul\teax, edi") != null);
 }
+
+fn testMissingOutputPath(zig_exe: []const u8, dir_path: []const u8) !void {
+    _ = try exec(dir_path, [_][]const u8{ zig_exe, "init-exe" });
+    const output_path = try fs.path.join(a, [_][]const u8{ "does", "not", "exist" });
+    const source_path = try fs.path.join(a, [_][]const u8{ "src", "main.zig" });
+    _ = try exec(dir_path, [_][]const u8{
+        zig_exe, "build-exe", source_path, "--output-dir", output_path
+    });
+}