From 8646e6f693fd935c6cb81e776a6c92a3fd093a33 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 23 Aug 2025 17:41:23 +0900 Subject: feat: output executable using gcc --- main.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index f34baf1..434f304 100644 --- a/main.c +++ b/main.c @@ -9,15 +9,35 @@ #include "src/ast.c" #include "src/parse.c" #include "src/codegen.c" +#include "src/cli.c" // clang-format on int main(int argc, char** argv) { - if (argc == 1) { - fatal_error("usage: ducc "); - } - InFile* source = infile_open(argv[1]); + CliArgs* cli_args = parse_cli_args(argc, argv); + InFile* source = infile_open(cli_args->input_filename); TokenArray* pp_tokens = preprocess(source); TokenArray* tokens = tokenize(pp_tokens); Program* prog = parse(tokens); - codegen(prog); + + const char* assembly_filename; + if (cli_args->output_executable) { + char* temp_filename = calloc(19, sizeof(char)); + temp_filename = strdup("/tmp/ducc-XXXXXX.s"); + mkstemps(temp_filename, strlen(".s")); + assembly_filename = temp_filename; + } else { + assembly_filename = cli_args->output_filename; + } + FILE* assembly_file = assembly_filename ? fopen(assembly_filename, "wb") : stdout; + codegen(prog, assembly_file); + fclose(assembly_file); + + if (cli_args->output_executable) { + char cmd_buf[256]; + sprintf(cmd_buf, "gcc -s -o '%s' '%s'", cli_args->output_filename, assembly_filename); + int result = system(cmd_buf); + if (result != 0) { + fatal_error("gcc failed: %d", result); + } + } } -- cgit v1.2.3-70-g09d2