[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 1/4] build: Kernel ohne libc bauen



+ build: Mit -k kann man -nostdinc und -nostdlib aktivieren

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/modules/c/build/build.c         |   16 ++++++++++++++--
 src/modules/c/build/include/build.h |    2 ++
 src/modules/c/build/main.c          |    7 ++++++-
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/modules/c/build/build.c b/src/modules/c/build/build.c
index ace3260..3319508 100644
--- a/src/modules/c/build/build.c
+++ b/src/modules/c/build/build.c
@@ -54,6 +54,9 @@ static const char* fpcflags = "-n -Cn -CX -Tlost";
 static const char* nasmflags = "-felf -O99";
 static const char* gasflags = "-m32 -c";
 
+static const char* c_compiler = "gcc";
+static const char* linker = "gcc";
+
 static char* root_path;
 
 /**
@@ -227,7 +230,7 @@ static void do_build(struct build_dir* dir, const char* parent_include,
     // TODO Pruefen, ob sich Abhaengigkeiten veraendert haben
     printf("%s: Kompilieren (C)...", dir->path);
     fflush(stdout);
-    compile(dir->path, dir->src_files[LANG_C], "gcc", cflags, include);
+    compile(dir->path, dir->src_files[LANG_C], c_compiler, cflags, include);
 
     printf("\r%s: Kompilieren (Pascal)...\033[K", dir->path);
     fflush(stdout);
@@ -247,7 +250,11 @@ static void do_build(struct build_dir* dir, const char* parent_include,
         fflush(stdout);
 
         objs = get_obj_files(dir->path);
-        do_command(".", "gcc", "-o %s/run %s %s", dir->path, lib, objs);
+        if (!standalone) {
+            do_command(".", linker, "-o %s/run %s %s", dir->path, lib, objs);
+        } else {
+            do_command(".", linker, "-o %s/run --start-group %s %s --end-group", dir->path, lib, objs);
+        }
         free(objs);
     }
 
@@ -262,9 +269,14 @@ static void do_build(struct build_dir* dir, const char* parent_include,
  * Bauen!
  *
  * @param root Wurzelverzeichnis des Projekts
+ * @param standalone Wenn != 0, wird die Standardbibliothek nicht benutzt
  */
 void build(struct build_dir* root)
 {
+    if (standalone) {
+        c_compiler = "gcc -nostdinc";
+        linker = "ld";
+    }
     root_path = getcwd(NULL, 0);
     do_build(root, "", "", 0);
     printf("Fertig gebaut.\n");
diff --git a/src/modules/c/build/include/build.h b/src/modules/c/build/include/build.h
index c7ee608..b1d7659 100644
--- a/src/modules/c/build/include/build.h
+++ b/src/modules/c/build/include/build.h
@@ -76,5 +76,7 @@ void build(struct build_dir* root);
 
 extern int dry_run;
 extern int verbose;
+extern int dont_compile;
+extern int standalone;
 
 #endif
diff --git a/src/modules/c/build/main.c b/src/modules/c/build/main.c
index d531db7..46f196f 100644
--- a/src/modules/c/build/main.c
+++ b/src/modules/c/build/main.c
@@ -72,9 +72,12 @@ int verbose = 0;
 int dry_run= 0;
 
 
+/// Keine Standardbibliotheken einbinden
+int standalone = 0;
+
 static void usage(char* binary)
 {
-    fprintf(stderr, "Aufruf: %s [-v] [--dry-run] [<Wurzelverzeichnis>]\n",
+    fprintf(stderr, "Aufruf: %s [-k] [-v] [--dry-run] [<Wurzelverzeichnis>]\n",
         binary);
     exit(1);
 }
@@ -96,6 +99,8 @@ int main(int argc, char** argv)
             verbose = 1;
         } else if (!strcmp(argv[i], "--dry-run")) {
             dry_run = 1;
+        } else if (!strcmp(argv[i], "-k")) {
+            standalone = 1;
         } else if (argv[i][0] == '-') {
             usage(argv[0]);
         } else if (rootdir_path) {
-- 
1.5.6.5