Feature: Add capability to build multiple files.

This commit is contained in:
0x221E
2026-01-18 16:43:23 +01:00
parent 5fd1f72624
commit abe970c173
7 changed files with 97 additions and 26 deletions

View File

@@ -12,31 +12,56 @@
// TODO: This file is UNSAFE. This file is purely here for MVP purposes, and to self-host this program itself.
Command command_create(Arena* a, Discovery* d, Configuration* c)
Command command_create_f_to_o(CommandOptions* co)
{
assert(d != NULL);
assert(a != NULL);
assert(c != NULL);
assert(co != NULL);
size_t len_args = 6;
size_t flag_count = 0;
StringView* dep_flags_buf = NULL;
Command cmd;
cmd.a = a;
cmd.app = d->cc;
size_t args_len = d->c_count + 2;
const char** args_buf = (const char**)arena_alloc(a, sizeof(const char*) * (args_len));
args_buf[0] = d->cc.buf;
for(size_t i = 0; i < d->c_count; i++)
switch(co->bp)
{
args_buf[i+1] = d->c_files[i]->path.buf;
LOG_DEBUG("File to build: %s", d->c_files[i]->path);
case B_DEBUG:
len_args += co->c->debug_compiler_flags_c;
flag_count = co->c->debug_compiler_flags_c;
dep_flags_buf = co->c->debug_compiler_flags;
break;
case B_PROD:
len_args += co->c->prod_compiler_flags_c;
flag_count = co->c->prod_compiler_flags_c;
dep_flags_buf = co->c->prod_compiler_flags;
break;
default:
DIE("No configuration was selected!");
}
const char** args_buf = (const char**)arena_alloc(co->a, sizeof(const char*) * len_args);
args_buf[0] = co->app.buf;
args_buf[1] = "-c";
args_buf[2] = co->files[0].buf;
args_buf[3] = "-o";
StringView o_ext = STR_LIT(co->sp, ".o");
StringView f_o = string_concat_ss(co->sp, &co->files[0], &o_ext);
args_buf[4] = f_o.buf;
args_buf[5] = "-MMD";
for (size_t i = 0; i < flag_count; i++)
{
args_buf[i + 5] = dep_flags_buf[i].buf;
}
args_buf[args_len - 1] = NULL;
cmd.args = args_buf;
return cmd;
args_buf[len_args] = NULL;
LOG_DEBUG("Command created, first 4 args: %s %s %s %s %s | total args: %d", args_buf[0], args_buf[1], args_buf[2], args_buf[3], args_buf[4], len_args);
return (Command){.a = co->a, .app = co->app, .args = args_buf};
}
// TODO: Add input sanitization to cmd->app and cmd->args
int command_run(Command* cmd)
{
assert(cmd != NULL);