remove(p->outpath);
/* compile the object file now */
- char* as_cmd = strmcat("cc -c -o \"", obj_path, "\" \"", asm_path, "\"", 0);
+ char* as_cmd = strmcat("clang -c -o \"", obj_path, "\" \"", asm_path, "\"", 0);
printf("%s\n", as_cmd);
if (system(as_cmd) != 0)
{
}
}
-void add_module(Parser* p, char* modname)
+void add_module(Parser* p, char* modname, char* modpath)
{
bool found = false;
for (size_t i = 0; !found && i < p->nmods; i++)
{
- found = !strcmp(p->mods[i], modname);
+ found = !strcmp(p->mods[i].name, modname);
}
if (!found)
if (p->nmods == p->mmods)
{
p->mmods = (p->mmods ? (p->mmods << 1) : 8u);
- p->mods = realloc(p->mods, p->mmods * sizeof(char*));
+ p->mods = realloc(p->mods, p->mmods * sizeof(Module));
}
- p->mods[p->nmods++] = modname;
+ p->mods[p->nmods].name = modname;
+ p->mods[p->nmods].path = modpath;
+ p->nmods++;
}
}
/* copy module references over */
for (size_t i = 0; i < p.nmods; i++)
{
- add_module(curr, p.mods[i]);
+ add_module(curr, p.mods[i].name, p.mods[i].path);
}
/* copy exported symbols to our symbol table */
}
else if (p.syms[i].class == SYM_MODULE)
{
- add_module(curr, p.syms[i].name);
+ add_module(
+ curr,
+ p.syms[i].name,
+ fs_modfind(curr, p.syms[i].name));
}
}
}
{
Parser p = {0};
compile_module(&p, path, true);
+ char* link_cmd = strmcat("clang -o ", p.name, " ", 0);
+ for (size_t i = 0; i < p.nmods; i++)
+ {
+ char* object = strdup(p.mods[i].path);
+ object[strlen(object)-1] = 'o';
+ link_cmd = strmcat(link_cmd, "\"", object, "\" ", 0);
+ }
+ char* object = strdup(p.outpath);
+ object[strlen(object)-1] = 'o';
+ link_cmd = strmcat(link_cmd, "\"", object, "\" ", "-lm", 0);
+ puts(link_cmd);
+ if (system(link_cmd) != 0)
+ {
+ fatal("linker failed");
+ }
}