📄 spewmakeinc.c
字号:
#include "atlconf.h"void PrintUsage(char *name, int iarg, char *arg){ fprintf(stderr, "\nERROR around arg %d (%s).\n", iarg, arg ? arg : "unknown"); fprintf(stderr, "USAGE: %s [flags] where flags are:\n", name); fprintf(stderr, " -v <verb> : verbosity level\n"); fprintf(stderr, " -O <enum OSTYPE #> : set OS type\n"); fprintf(stderr, " -s <enum ASMDIA #> : set assembly dialect\n"); fprintf(stderr, " -A <enum MACHTYPE #> : set machine/architecture\n"); fprintf(stderr, " -V # # = ((1<<vecISA1) | (1<<vecISA2) | ... | (1<<vecISAN))\n"); fprintf(stderr, " -b <32/64> : set pointer bitwidth\n"); fprintf(stderr, " -o <outfile>\n"); fprintf(stderr, " -C [xc,ic,if,sk,dk,sm,dm,al,ac] <compiler>\n"); fprintf(stderr, " -F [xc,ic,if,sk,dk,sm,dm,al,ac,gc] '<comp flags>'\n"); fprintf(stderr, /* HERE */ " -Fa [xc,ic,if,sk,dk,sm,dm,al,ac,gc] '<comp flags to append>'\n"); fprintf(stderr, " al: append flags to all compilers\n"); fprintf(stderr, " ac: append flags to all C compilers\n"); fprintf(stderr, " gc: append flags to gcc compiler used in user-contributed index files.\n"); fprintf(stderr, " acg: append to all C compilers & the index gcc\n"); fprintf(stderr, " alg: append to all compilers & the index gcc\n"); fprintf(stderr, " -T <targ> : ssh target for cross-compilation (probably broken)\n"); fprintf(stderr, " -D [c,f] -D<mac>=<rep> : cpp #define to add to [CDEFS,F2CDEFS]\n"); fprintf(stderr, " eg. -D c -DL2SIZE=8388604 -D f -DADD__ -D f -DStringSunStyle\n"); fprintf(stderr, " -d [s,b] : set source/build directory\n"); fprintf(stderr, " -f <#> : size (in KB) to flush before timing\n"); fprintf(stderr, " -t <#> : set # of threads (-1: autodect; 0: no threading)\n"); fprintf(stderr, " -m <mhz> : set clock rate\n"); fprintf(stderr, " -S[i/s] <handle> <val> : special int/string arg\n"); fprintf(stderr, " -Si bozol1 <0/1> : supress/enable bozo L1 defaults\n"); fprintf(stderr, " -Si archdef <1/0> : enable/supress arch default use\n"); fprintf(stderr, " -Si nof77 <0/1> : Have/don't have fortran compiler\n"); fprintf(stderr, " -Ss kern <path to comp> : use comp for all kernel compilers\n"); fprintf(stderr, " -Ss pmake <parallel make invocation (eg '$(MAKE) -j 4')>\n"); fprintf(stderr," -Ss f77lib <path to f77 lib needed by C compiler>\n"); fprintf(stderr," -Ss flapack <path to netlib lapack>: used to build full lapack lib\n"); fprintf(stderr, " -Ss [s,d]maflags 'flags'\n"); fprintf(stderr, "NOTE: enum #s can be found by : make xprint_enums ; ./xprint_enums\n"); exit(iarg);}void GetFlags(int nargs, /* nargs as passed into main */ char **args, /* args as passed into main */ int *verb, /* verbosity setting */ enum OSTYPE *OS, /* OS to assume */ enum ASMDIA *asmb, /* assembly dialect to assume */ int *vec, /* Vector ISA extension bitfield */ enum MACHTYPE *mach, /* machine/arch to assume */ int *mhz, /* Clock rate in Mhz */ int *ptrbits /* # of bits in ptr: 32/64 */, int *nthreads, /* # of threads */ char **comps, char **gccflags, /* append flags for user-contrib gcc */ char **outfile, char **srcdir, /* path to top of source directory */ char **bindir, /* path to top of binary directory */ int *bozol1, /* Use untuned L1 */ int *UseArchDef, /* Use arch defaults */ int *NoF77, char **f2cdefs, /* F77-to-C interface defines */ char **ecdefs, /* extra cpp defines to add to CDEFS */ char **pmake, /* parallel make command */ char **flapack, /* netlib F77 LAPACK */ char **smaflags, /* single prec muladd flags */ char **dmaflags, /* double prec muladd flags */ char **f77lib, /* netlib F77 LAPACK */ int *flush, /* size in KB to flush */ char **targ /* mach to ssh to*/ ){ int i, k, k0, kn, DoInt; char *sp, *sp0; char *gcc3=NULL; char *cdefs=NULL, *fdefs=NULL; char ln[1024]; *verb = 0; *srcdir = *bindir = NULL; *bozol1 = 0; *UseArchDef = 1; *flapack = NULL; *f77lib = NULL; *smaflags = *dmaflags = NULL; *mhz = 0; *outfile = NULL; *targ = NULL; for (k=0; k < NCOMP*3; k++) comps[k] = NULL; *gccflags = NULL; *flush = 0; *nthreads = 0; *ptrbits = 0; *mhz = 0; *mach = 0; *vec = 0; *asmb = 0; *OS = 0; *verb = 0; *NoF77 = 0; *nthreads = -1; *pmake = NULL; for (i=1; i < nargs; i++) { if (args[i][0] != '-') PrintUsage(args[0], i, args[i]); switch(args[i][1]) { case 'f': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *flush = atoi(args[i]); break; case 't': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *nthreads = atoi(args[i]); break; case 'b': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *ptrbits = atoi(args[i]); break; case 'm': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *mhz = atoi(args[i]); break; case 'A': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *mach = atoi(args[i]); break; case 'V': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *vec = atoi(args[i]); break; case 's': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *asmb = atoi(args[i]); break; case 'O': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *OS = atoi(args[i]); break; case 'v': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *verb = atoi(args[i]); break; case 'T': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *targ = args[i]; break; case 'S': if (args[i][2] != 'i' && args[i][2] != 's') PrintUsage(args[0], i, "-S needs i or s suffix!"); DoInt = args[i][2] == 'i'; if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); sp0 = args[i]; if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); if (DoInt) k = atoi(args[i]); else sp = args[i]; if (!strcmp(sp0, "archdef")) *UseArchDef = k; else if (!strcmp(sp0, "bozol1")) *bozol1 = k; else if (!strcmp(sp0, "nof77")) *NoF77 = k; else if (!strcmp(sp0, "kern")) gcc3 = sp; else if (!strcmp(sp0, "pmake")) *pmake = sp; else if (!strcmp(sp0, "flapack")) *flapack = sp; else if (!strcmp(sp0, "f77lib")) *f77lib = sp; else if (!strcmp(sp0, "smaflags")) *smaflags = sp; else if (!strcmp(sp0, "dmaflags")) *dmaflags = sp; else PrintUsage(args[0], i-1, sp0); break; case 'o': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *outfile = args[i]; break; case 'D': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); if (args[i-1][0] == 'f') fdefs = NewAppendedString(fdefs, args[i]); else cdefs = NewAppendedString(cdefs, args[i]); break; case 'd': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); sp = args[i-1]; if (*sp == 's') *srcdir = args[i]; else if (*sp == 'b') *bindir = args[i]; break; case 'C': case 'F': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); sp = args[i]; k = -1; if (*sp == 'i' && sp[1] == 'c') k = ICC_; else if (*sp == 'i' && sp[1] == 'f') k = F77_; else if (*sp == 's' && sp[1] == 'k') k = SKC_; else if (*sp == 'd' && sp[1] == 'k') k = DKC_; else if (*sp == 's' && sp[1] == 'm') k = SMC_; else if (*sp == 'd' && sp[1] == 'm') k = DMC_; else if (*sp == 'x' && sp[1] == 'c') k = XCC_; if (*sp == 'a' && (sp[1] == 'l' || sp[1] == 'c')) { /* only appended flags can be applied to all compilers */ if (args[i-1][1] == 'F') { if (args[i-1][2] == 'a') { k0 = NCOMP+NCOMP; kn = k0 + NCOMP; } else { k0 = NCOMP; kn = NCOMP+NCOMP; } } else { k0 = 0; kn = NCOMP; } if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); for (k=k0; k < kn; k++) if (sp[1] == 'l' || k-2*NCOMP != F77_) comps[k] = args[i]; if (sp[2] == 'g' && args[i-2][1] == 'F') *gccflags = args[i]; } else if (*sp == 'g' && sp[1] == 'c') { if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *gccflags = args[i]; } else { if (k < 0) PrintUsage(args[0], i, args[i]); if (args[i-1][1] == 'F') { k += NCOMP; if (args[i-1][2] == 'a') k += NCOMP; } if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); comps[k] = args[i]; } break; default: PrintUsage(args[0], i, args[i]); } }/* * allocate these strings ourselves so we can free them later if necessary */ for (i=0; i < 3*NCOMP; i++) { if (comps[i]) { if (!strcmp(comps[i], "default")) comps[i] = NULL; else { sp = malloc(sizeof(char)*(strlen(comps[i])+1)); strcpy(sp, comps[i]); comps[i] = sp; } } }/* * If the special flag -Ss gcc3 is thrown, force gcc3's use for all kernel * compilers (standard gcc assumed to be gcc4) */ if (gcc3) { for (i=0; i < NCOMP; i++) { if (!comps[i] && (i == SMC_ || i == DMC_ || i == SKC_ || i == DKC_)) comps[i] = NewStringCopy(gcc3); } } *f2cdefs = fdefs; *ecdefs = cdefs; if (*ptrbits != 32 && *ptrbits != 64) *ptrbits = 0;}char *GetPtrbitsFlag(enum OSTYPE OS, enum MACHTYPE arch, int ptrbits, char *comp)/* * RETURNS: string forcing setting of ptrbits for gcc */{ char *sp = ""; int i, j, k; if (MachIsIA64(arch)) return(sp); if (MachIsMIPS(arch)) sp = (ptrbits == 64) ? "-mabi=64" : "-mabi=n32"; if (!CompIsGcc(comp)) {/* * Add correct 64/32 bit flags for Sun workshop compilers */ if (MachIsUS(arch) && CompIsSunWorkshop(comp)) { if (ptrbits == 64) sp = (arch == SunUSI || arch == SunUSII) ? "-xarch=v9" : "-xarch=v9b"; else sp = (arch == SunUSI || arch == SunUSII) ? "-xarch=v8plusa" : "-xarch=v8plusb"; } else if (CompIsIBMXL(comp)) /* IBM xl compilers */ sp = (ptrbits == 64) ? "-q64" : "-q32"; return(sp); } GetGccVers(comp, &k, &j, &k, &k); if ( !(j >= 3 && (OS != OSOSX || j > 3 || !CompIsAppleGcc(comp))) ) return(sp); else if (OS == OSAIX) sp = (ptrbits == 64) ? "-maix64" : "-maix32"; else if (ptrbits == 64) sp = "-m64"; else if (ptrbits == 32) sp = "-m32"; return(sp);}main(int nargs, char **args){ enum OSTYPE OS; enum MACHTYPE mach; int h, i, j, k, verb, asmb, nof77, mhz; int vecexts, ISAX; int ptrbits, l2size; int delay=0; /* change this to come from "special" ints in GetFlags */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -