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;
}
--
⑨