aboutsummaryrefslogtreecommitdiff
path: root/make.c
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-06-21 23:36:36 +0200
committerThomas Voss <mail@thomasvoss.com> 2024-06-21 23:42:26 +0200
commita89a14ef5da44684a16b204e7a70460cc8c4922a (patch)
treeb23b4c6b155977909ef508fdae2f48d33d802813 /make.c
parent1db63fcedab0b288820d66e100b1877b1a5a8851 (diff)
Basic constant folding implementation
Diffstat (limited to 'make.c')
-rw-r--r--make.c71
1 files changed, 65 insertions, 6 deletions
diff --git a/make.c b/make.c
index 4a21735..caeff2a 100644
--- a/make.c
+++ b/make.c
@@ -11,6 +11,7 @@
#include "cbs.h"
#define TARGET "oryx"
+#define GMPDIR "vendor/gmp-6.3.0"
enum {
SIMD_AVX2 = 1 << 0,
@@ -19,6 +20,7 @@ enum {
};
static char *cflags_all[] = {
+ "-I" GMPDIR,
"-pipe",
"-std=c11",
"-Wall",
@@ -49,12 +51,13 @@ static char *cflags_rls[] = {
};
static char *argv0;
-static bool fflag, rflag, Sflag;
+static bool fflag, Fflag, rflag, Sflag;
static int simd_flags;
static void cc(void *);
static void gperf(void *);
static void ld(void);
+static void mkgmp(int);
static bool tagvalid(const char *);
static void chk_cpu_flags(void);
static int globerr(const char *, int);
@@ -78,8 +81,11 @@ main(int argc, char **argv)
argv0 = argv[0];
int opt;
- while ((opt = getopt(argc, argv, "frS")) != -1) {
+ while ((opt = getopt(argc, argv, "fFrS")) != -1) {
switch (opt) {
+ case 'F':
+ Fflag = true;
+ /* fallthrough */
case 'f':
fflag = true;
break;
@@ -101,16 +107,24 @@ main(int argc, char **argv)
if (argc > 0) {
if (strcmp("clean", *argv) == 0) {
- strspushl(&cmd, "find", ".", "-name", TARGET, "-or", "-name", "*.o",
- "-or", "-name", "*.gen.c", "-delete");
+ strspushl(&cmd, "find", ".", "(", "-name", TARGET, "-or", "-name",
+ "*.o", "-or", "-name", "*.gen.c", ")", "-delete");
+ cmdput(cmd);
+ return cmdexec(cmd);
+ } else if (strcmp("distclean", *argv) == 0) {
+ strspushl(&cmd, "find", ".", "(", "-name", TARGET, "-or", "-name",
+ "*.o", "-or", "-name", "*.gen.c", ")", "-delete");
cmdput(cmd);
cmdexec(cmd);
+ assert(chdir(GMPDIR) != -1);
+ strszero(&cmd);
+ strspushl(&cmd, "make", "distclean");
+ cmdput(cmd);
+ return cmdexec(cmd);
} else {
fprintf(stderr, "%s: invalid subcommand — ‘%s’\n", argv0, *argv);
usage();
}
-
- return EXIT_SUCCESS;
}
chk_cpu_flags();
@@ -119,6 +133,8 @@ main(int argc, char **argv)
if (procs == -1)
procs = 8;
+ mkgmp(procs);
+
tpool tp;
tpinit(&tp, procs);
@@ -222,6 +238,9 @@ ld(void)
strspushl(&cmd, g.gl_pathv[i]);
}
+ /* Important! GCC wants this last? */
+ strspushl(&cmd, GMPDIR "/.libs/libgmp.a");
+
if (dobuild) {
cmdput(cmd);
cmdexec(cmd);
@@ -231,6 +250,46 @@ ld(void)
strsfree(&cmd);
}
+void
+mkgmp(int nprocs)
+{
+ int ret;
+ /* Fork a child process so that we don’t mess up the parent’s
+ working directory */
+ pid_t pid = fork();
+ assert(pid != -1);
+
+ if (pid == 0) {
+ struct strs cmd = {0};
+ assert(chdir(GMPDIR) != -1);
+
+ if (!Fflag && fexists("./.libs/libgmp.a"))
+ exit(EXIT_SUCCESS);
+
+ strspushl(&cmd, "./configure", "--disable-shared");
+ cmdput(cmd);
+ if ((ret = cmdexec(cmd)) != EXIT_SUCCESS)
+ exit(ret);
+ strszero(&cmd);
+
+ if (Fflag) {
+ strspushl(&cmd, "make", "distclean");
+ cmdput(cmd);
+ if ((ret = cmdexec(cmd)) != EXIT_SUCCESS)
+ exit(ret);
+ strszero(&cmd);
+ }
+
+ char flags[64];
+ sprintf(flags, "-j%d", nprocs);
+ assert(setenv("MAKEFLAGS", flags, true) != -1);
+ strspushl(&cmd, "make");
+ cmdput(cmd);
+ exit(cmdexec(cmd));
+ } else if ((ret = cmdwait(pid)) != EXIT_SUCCESS)
+ exit(ret);
+}
+
bool
tagvalid(const char *file)
{