shithub: mc

Download patch

ref: 7db9cba7d973325a4a0ed2d3d75a81c690667a22
parent: 4ff9f95d84eb12bbbb0895669cc888eea1867bf5
author: Ori Bernstein <ori@eigenstate.org>
date: Fri Sep 28 08:31:40 EDT 2012

Build tool is complete now.

--- a/configure
+++ b/configure
@@ -33,7 +33,7 @@
 OS=`uname`
 
 echo export INST_ROOT=$prefix > config.mk
-echo '#define Instroot "' $prefix '"' > config.h
+echo '#define Instroot "'$prefix'"' > config.h
 
 case $OS in
     *Linux*)
--- a/libstd/bld.sh
+++ b/libstd/bld.sh
@@ -57,7 +57,7 @@
 USE="$(echo $MYR | sed 's/\.myr/.use /g' | sed "s/-$SYS//g")"
 if [ "$1" = "clean" ]; then
     echo rm -f $OBJ test libstd.a
-    rm -f $OBJ test libstd.a
+    rm -f $OBJ $USE test libstd.a
 else
     assem $ASM
     use $MYR
--- a/myrbuild/myrbuild.c
+++ b/myrbuild/myrbuild.c
@@ -10,6 +10,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <regex.h>
+#include <err.h>
 
 #include "parse.h"
 
@@ -67,32 +68,44 @@
     return strdup(buf);
 }
 
-int run(char *bin, char **inc, size_t ninc, char *file)
+void printl(char **lst)
 {
-    char **args;
-    size_t i, nargs;
-    pid_t pid;
-    int status;
+    printf("\t");
+    printf("%s\t", *lst++);
+    while (*lst)
+        printf("%s ", *lst++);
+    printf("\n");
+}
 
-    nargs = 0;
-    args = NULL;
-    
-    lappend(&args, &nargs, bin);
+void gencmd(char ***cmd, size_t *ncmd, char *bin, char *file, char **extra, size_t nextra)
+{
+    size_t i;
+
+    *cmd = NULL;
+    *ncmd = 0;
+    lappend(cmd, ncmd, bin);
     for (i = 0; i < nincpaths; i++) {
-        lappend(&args, &nargs, "-I");
-        lappend(&args, &nargs, incpaths[i]);
+        lappend(cmd, ncmd, "-I");
+        lappend(cmd, ncmd, incpaths[i]);
     }
-    lappend(&args, &nargs, file);
-    lappend(&args, &nargs, NULL); 
-    for (i = 0; args[i]; i++)
-        printf("%s\t", args[i]);
-    printf("\n");
+    for (i = 0; i < nextra; i++)
+        lappend(cmd, ncmd, extra[i]);
+    lappend(cmd, ncmd, file);
+    lappend(cmd, ncmd, NULL); 
+}
+
+int run(char **cmd)
+{
+    pid_t pid;
+    int status;
+
+    printl(cmd);
     pid = fork();
     if (pid == -1) {
         die("Could not fork\n");
     } else if (pid == 0) {
-        if (execvp(bin, args) == -1)
-            die("Failed to exec %s\n", bin);
+        if (execvp(cmd[0], cmd) == -1)
+            err(1, "Failed to exec %s", cmd[0]);
     } else {
         waitpid(pid, &status, 0);
     }
@@ -137,9 +150,12 @@
 void compile(char *file)
 {
     size_t i, ndeps;
+    char **cmd;
+    size_t ncmd;
     char *localdep;
     char *deps[512];
     char buf[1024];
+    char *extra[2] = {"-o", "" /* filename */};
 
     if (hassuffix(file, ".myr")) {
         getdeps(file, deps, 512, &ndeps);
@@ -153,16 +169,128 @@
             }
         }
         swapsuffix(buf, sizeof buf, file, ".myr", ".use");
-        if (isfresh(file, buf))
-            run("muse", incpaths, nincpaths, file);
+        if (isfresh(file, buf)) {
+            gencmd(&cmd, &ncmd, "muse", file, NULL, 0);
+            run(cmd);
+        }
 
         swapsuffix(buf, sizeof buf, file, ".myr", ".o");
-        if (isfresh(file, buf))
-            run("6m", incpaths, nincpaths, file);
+        if (isfresh(file, buf)) {
+            gencmd(&cmd, &ncmd, "6m", file, NULL, 0);
+            run(cmd);
+        }
     } else if (hassuffix(file, ".s")) {
+        swapsuffix(buf, sizeof buf, file, ".s", ".o");
+        if (isfresh(file, buf)) {
+            extra[1] = buf;
+            gencmd(&cmd, &ncmd, "as", file, extra, 2);
+            run(cmd);
+        }
     }
 }
 
+void mergeuse(char **files, size_t nfiles)
+{
+    char **args;
+    size_t i, nargs;
+    char buf[1024];
+
+    args = NULL;
+    nargs = 0;
+    lappend(&args, &nargs, strdup("muse "));
+    lappend(&args, &nargs, strdup("-mo"));
+    lappend(&args, &nargs, strdup(libname));
+    for (i = 0; i < nfiles; i++) {
+        if (hassuffix(files[i], ".myr"))
+            swapsuffix(buf, sizeof buf, files[i], ".myr", ".o");
+        else if (hassuffix(files[i], ".s"))
+            swapsuffix(buf, sizeof buf, files[i], ".s", ".o");
+        else
+            die("Unknown file type %s\n", files[i]);
+        lappend(&args, &nargs, strdup(buf));
+    }
+    lappend(&args, &nargs, NULL);
+
+    run(args);
+
+    for (i = 0; i < nargs; i++)
+        free(args[i]);
+    lfree(&args, &nargs);
+}
+
+void archive(char **files, size_t nfiles)
+{
+    char **args;
+    size_t i, nargs;
+    char buf[1024];
+
+    args = NULL;
+    nargs = 0;
+    snprintf(buf, sizeof buf, "lib%s.a", libname);
+    lappend(&args, &nargs, strdup("ar "));
+    lappend(&args, &nargs, strdup("-rcs"));
+    lappend(&args, &nargs, strdup(buf));
+    for (i = 0; i < nfiles; i++) {
+        if (hassuffix(files[i], ".myr"))
+            swapsuffix(buf, sizeof buf, files[i], ".myr", ".o");
+        else if (hassuffix(files[i], ".s"))
+            swapsuffix(buf, sizeof buf, files[i], ".s", ".o");
+        else
+            die("Unknown file type %s\n", files[i]);
+        lappend(&args, &nargs, strdup(buf));
+    }
+    lappend(&args, &nargs, NULL);
+
+    run(args);
+
+    for (i = 0; i < nargs; i++)
+        free(args[i]);
+    lfree(&args, &nargs);
+}
+
+void linkobj(char **files, size_t nfiles)
+{
+    char **args;
+    size_t i, nargs;
+    char buf[1024];
+
+    if (!binname)
+        binname = "a.out";
+
+    args = NULL;
+    nargs = 0;
+    lappend(&args, &nargs, strdup("ld"));
+    lappend(&args, &nargs, strdup("-o"));
+    lappend(&args, &nargs, strdup(binname));
+    for (i = 0; i < nfiles; i++) {
+        if (hassuffix(files[i], ".myr"))
+            swapsuffix(buf, sizeof buf, files[i], ".myr", ".o");
+        else if (hassuffix(files[i], ".s"))
+            swapsuffix(buf, sizeof buf, files[i], ".s", ".o");
+        else
+            die("Unknown file type %s\n", files[i]);
+        lappend(&args, &nargs, strdup(buf));
+    }
+    lappend(&args, &nargs, strdup("-L"));
+    snprintf(buf, sizeof buf, "%s%s", Instroot, "/myr/lib");
+    lappend(&args, &nargs, strdup(buf));
+    for (i = 0; i < nincpaths; i++) {
+        lappend(&args, &nargs, strdup("-L"));
+        lappend(&args, &nargs, strdup(incpaths[i]));
+    }
+    for (i = 0; i < nlibs; i++) {
+        lappend(&args, &nargs, strdup("-l"));
+        lappend(&args, &nargs, strdup(libs[i]));
+    }
+    lappend(&args, &nargs, NULL);
+
+    run(args);
+
+    for (i = 0; i < nargs; i++)
+        free(args[i]);
+    lfree(&args, &nargs);
+}
+
 int main(int argc, char **argv)
 {
     int opt;
@@ -196,6 +324,12 @@
     regcomp(&usepat, "^[[:space:]]*use[[:space:]]+([^[:space:]]+)", REG_EXTENDED);
     for (i = optind; i < argc; i++)
         compile(argv[i]);
+    if (libname) {
+        mergeuse(&argv[optind], argc - optind);
+        archive(&argv[optind], argc - optind);
+    } else {
+        linkobj(&argv[optind], argc - optind);
+    }
 
     return 0;
 }
--