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)  {  |