diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-06-21 23:36:36 +0200 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-06-21 23:42:26 +0200 |
commit | a89a14ef5da44684a16b204e7a70460cc8c4922a (patch) | |
tree | b23b4c6b155977909ef508fdae2f48d33d802813 /make.c | |
parent | 1db63fcedab0b288820d66e100b1877b1a5a8851 (diff) |
Basic constant folding implementation
Diffstat (limited to 'make.c')
-rw-r--r-- | make.c | 71 |
1 files changed, 65 insertions, 6 deletions
@@ -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) { |