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

@@ -1 +1 @@
gcc -o ibuild src/main.c src/memory.c src/utils.c src/string.c src/discovery.c src/io.c src/command.c -fsanitize=address -g -DDEBUG -Wall -Wextra -Wpedantic -Wshadow gcc -o example/ibuild src/main.c src/memory.c src/utils.c src/string.c src/discovery.c src/io.c src/command.c src/build.c -fsanitize=address -g -DDEBUG -Wall -Wextra -Wpedantic -Wshadow

8
example/main.c Normal file
View File

@@ -0,0 +1,8 @@
#include <stdio.h>
int main(void)
{
printf("Hello world!\n");
printf("This is build 2!\n");
return 0;
}

1
example/test.c Normal file
View File

@@ -0,0 +1 @@

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. // 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(co != NULL);
assert(a != NULL);
assert(c != NULL);
Command cmd; size_t len_args = 6;
cmd.a = a;
cmd.app = d->cc;
size_t args_len = d->c_count + 2; size_t flag_count = 0;
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++) StringView* dep_flags_buf = NULL;
switch(co->bp)
{ {
args_buf[i+1] = d->c_files[i]->path.buf; case B_DEBUG:
LOG_DEBUG("File to build: %s", d->c_files[i]->path); 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!");
} }
args_buf[args_len - 1] = NULL; const char** args_buf = (const char**)arena_alloc(co->a, sizeof(const char*) * len_args);
cmd.args = args_buf; args_buf[0] = co->app.buf;
return cmd; 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[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) int command_run(Command* cmd)
{ {
assert(cmd != NULL); assert(cmd != NULL);

View File

@@ -2,11 +2,22 @@
#define COMMAND_H #define COMMAND_H
#include "string.h" #include "string.h"
#include "common.h"
typedef struct Arena Arena; typedef struct Arena Arena;
typedef struct Discovery Discovery; typedef struct Discovery Discovery;
typedef struct Configuration Configuration; typedef struct Configuration Configuration;
struct CommandOptions
{
Arena* a;
StringPool* sp;
BuildProfile bp;
Configuration* c;
StringView app;
StringView* files;
};
struct Command struct Command
{ {
Arena* a; Arena* a;
@@ -16,8 +27,9 @@ struct Command
typedef struct Argument Argument; typedef struct Argument Argument;
typedef struct Command Command; typedef struct Command Command;
typedef struct CommandOptions CommandOptions;
Command command_create(Arena* a, Discovery* d, Configuration* c); Command command_create_f_to_o(CommandOptions* co);
int command_run(Command* cmd); int command_run(Command* cmd);

View File

@@ -5,9 +5,24 @@
struct Configuration struct Configuration
{ {
StringView compiler_path; // C-Compiler Flags
StringView cc_compiler_path;
StringView src_dir; StringView src_dir;
StringView* src_files;
// General Flags
//StringView* src_files;
// Debug Profile
StringView* debug_compiler_flags;
size_t debug_compiler_flags_c;
// Production Profile
StringView* prod_compiler_flags;
size_t prod_compiler_flags_c;
// Linker arguments
StringView* linker_flags;
size_t linker_flags_c;
}; };
typedef struct Configuration Configuration; typedef struct Configuration Configuration;

View File

@@ -9,6 +9,7 @@
#include "discovery.h" #include "discovery.h"
#include "command.h" #include "command.h"
#include "config.h" #include "config.h"
#include "build.h"
int main(void) int main(void)
{ {
@@ -22,11 +23,20 @@ int main(void)
Discovery d = discovery_create(&a_d, &sp); Discovery d = discovery_create(&a_d, &sp);
discovery_discover(&d); discovery_discover(&d);
Arena a_cmd = arena_create(&b, MEM_ARENA_MAX_CAP);
Configuration sample_config; Configuration sample_config;
Command cmd = command_create(&a_cmd, &d, &sample_config); /* Command cmd = command_create(&a_cmd, &d, &sample_config); */
command_run(&cmd); /* command_run(&cmd); */
Arena a_b = arena_create(&b, 1024*1024*5);
BuildContext bc;
bc.build_profile = B_DEBUG;
bc.d = &d;
bc.c = &sample_config;
bc.a = &a_b;
bc.sp = &sp;
build(&bc);
return 0; return 0;
} }