瀏覽代碼

Add -keep-temp-files option

Ginger Bill 8 年之前
父節點
當前提交
9f4f5f9346
共有 3 個文件被更改,包括 44 次插入3 次删除
  1. 1 0
      src/build_settings.cpp
  2. 19 0
      src/gb/gb.h
  3. 24 3
      src/main.cpp

+ 1 - 0
src/build_settings.cpp

@@ -19,6 +19,7 @@ struct BuildContext {
 	bool   generate_docs;
 	i32    optimization_level;
 	bool   show_timings;
+	bool   keep_temp_files;
 
 	gbAffinity affinity;
 	isize      thread_count;

+ 19 - 0
src/gb/gb.h

@@ -2056,6 +2056,7 @@ GB_DEF b32        gb_file_exists         (char const *filepath);
 GB_DEF gbFileTime gb_file_last_write_time(char const *filepath);
 GB_DEF b32        gb_file_copy           (char const *existing_filename, char const *new_filename, b32 fail_if_exists);
 GB_DEF b32        gb_file_move           (char const *existing_filename, char const *new_filename);
+GB_DEF b32        gb_file_delete         (char const *filename);
 
 
 #ifndef GB_PATH_SEPARATOR
@@ -7977,6 +7978,19 @@ gb_inline b32 gb_file_move(char const *existing_filename, char const *new_filena
 	return result;
 }
 
+b32 gb_file_delete(char const *filename) {
+	wchar_t *w_filename = NULL;
+	gbAllocator a = gb_heap_allocator();
+	b32 result = false;
+	w_filename = gb__alloc_utf8_to_ucs2(a, filename, NULL);
+	if (w_filename == NULL) {
+		return false;
+	}
+	result = DeleteFileW(w_filename);
+	gb_free(a, w_filename);
+	return result;
+}
+
 
 
 #else
@@ -8022,6 +8036,11 @@ gb_inline b32 gb_file_move(char const *existing_filename, char const *new_filena
 	return false;
 }
 
+b32 gb_file_delete(char const *filename) {
+	return unlink(filename) != -1;
+}
+
+
 #endif
 
 

+ 24 - 3
src/main.cpp

@@ -174,6 +174,7 @@ enum BuildFlagKind {
 	BuildFlag_OptimizationLevel,
 	BuildFlag_ShowTimings,
 	BuildFlag_ThreadCount,
+	BuildFlag_KeepTempFiles,
 
 	BuildFlag_COUNT,
 };
@@ -204,9 +205,10 @@ void add_flag(Array<BuildFlag> *build_flags, BuildFlagKind kind, String name, Bu
 bool parse_build_flags(Array<String> args) {
 	Array<BuildFlag> build_flags = {};
 	array_init(&build_flags, heap_allocator(), BuildFlag_COUNT);
-	add_flag(&build_flags, BuildFlag_OptimizationLevel, str_lit("opt"),          BuildFlagParam_Integer);
-	add_flag(&build_flags, BuildFlag_ShowTimings,       str_lit("show-timings"), BuildFlagParam_None);
-	add_flag(&build_flags, BuildFlag_ThreadCount,       str_lit("thread-count"), BuildFlagParam_Integer);
+	add_flag(&build_flags, BuildFlag_OptimizationLevel, str_lit("opt"),             BuildFlagParam_Integer);
+	add_flag(&build_flags, BuildFlag_ShowTimings,       str_lit("show-timings"),    BuildFlagParam_None);
+	add_flag(&build_flags, BuildFlag_ThreadCount,       str_lit("thread-count"),    BuildFlagParam_Integer);
+	add_flag(&build_flags, BuildFlag_KeepTempFiles,     str_lit("keep-temp-files"), BuildFlagParam_None);
 
 
 	Array<String> flag_args = args;
@@ -350,6 +352,10 @@ bool parse_build_flags(Array<String> args) {
 								build_context.thread_count = count;
 							}
 						} break;
+						case BuildFlag_KeepTempFiles:
+							GB_ASSERT(value.kind == ExactValue_Invalid);
+							build_context.keep_temp_files = true;
+							break;
 						}
 					}
 
@@ -404,6 +410,18 @@ void show_timings(Checker *c, Timings *t) {
 	}
 }
 
+void remove_temp_files(String output_base) {
+	if (build_context.keep_temp_files) return;
+
+	gb_file_delete(gb_bprintf("%.*s.ll", LIT(output_base)));
+	gb_file_delete(gb_bprintf("%.*s.bc", LIT(output_base)));
+#if defined(GB_SYSTEM_WINDOWS)
+	gb_file_delete(gb_bprintf("%.*s.obj", LIT(output_base)));
+#else
+	gb_file_delete(gb_bprintf("%.*s.o", LIT(output_base)));
+#endif
+}
+
 int main(int arg_count, char **arg_ptr) {
 	if (arg_count < 2) {
 		usage(make_string_c(arg_ptr[0]));
@@ -642,6 +660,7 @@ int main(int arg_count, char **arg_ptr) {
 			show_timings(&checker, &timings);
 		}
 
+		remove_temp_files(output_base);
 
 		if (run_output) {
 			system_exec_command_line_app("odin run", false, "%.*s.exe", LIT(output_base));
@@ -748,6 +767,8 @@ int main(int arg_count, char **arg_ptr) {
 			show_timings(&checker, &timings);
 		}
 
+		remove_temp_files(output_base);
+
 		if (run_output) {
 			system_exec_command_line_app("odin run", false, "%.*s", LIT(output_base));
 		}