119987Sdist /* 219987Sdist * Copyright (c) 1980 Regents of the University of California. 334131Sbostic * All rights reserved. 434131Sbostic * 5*42795Sbostic * %sccs.include.redist.c% 619987Sdist */ 719987Sdist 814557Ssam #ifndef lint 919987Sdist char copyright[] = 1019987Sdist "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 1119987Sdist All rights reserved.\n"; 1234131Sbostic #endif /* not lint */ 132653Stoy 1419987Sdist #ifndef lint 15*42795Sbostic static char sccsid[] = "@(#)main.c 5.12 (Berkeley) 06/01/90"; 1634131Sbostic #endif /* not lint */ 1719987Sdist 1834109Sbostic #include <sys/types.h> 1934109Sbostic #include <sys/stat.h> 2034109Sbostic #include <sys/file.h> 212653Stoy #include <stdio.h> 222653Stoy #include <ctype.h> 232653Stoy #include "y.tab.h" 242653Stoy #include "config.h" 252653Stoy 2634109Sbostic static char *PREFIX; 2734109Sbostic 288892Sroot /* 298892Sroot * Config builds a set of files for building a UNIX 308892Sroot * system given a description of the desired system. 318892Sroot */ 322653Stoy main(argc, argv) 338892Sroot int argc; 348892Sroot char **argv; 352653Stoy { 368892Sroot 3734109Sbostic extern char *optarg; 3834109Sbostic extern int optind; 3934109Sbostic struct stat buf; 4034109Sbostic int ch; 4134109Sbostic char *p; 4234109Sbostic 4342110Smckusick while ((ch = getopt(argc, argv, "gp")) != EOF) 4434109Sbostic switch((char)ch) { 4542110Smckusick case 'g': 4642110Smckusick debugging++; 4742110Smckusick break; 4834109Sbostic case 'p': 4934109Sbostic profiling++; 5034109Sbostic break; 5134109Sbostic case '?': 5234109Sbostic default: 5334109Sbostic goto usage; 5434109Sbostic } 5534109Sbostic argc -= optind; 5634109Sbostic argv += optind; 5734109Sbostic 5834109Sbostic if (argc != 1) { 5942110Smckusick usage: fputs("usage: config [-gp] sysname\n", stderr); 608892Sroot exit(1); 618892Sroot } 6234109Sbostic 6334109Sbostic if (freopen(PREFIX = *argv, "r", stdin) == NULL) { 6434109Sbostic perror(PREFIX); 658892Sroot exit(2); 668892Sroot } 6734109Sbostic if (stat(p = path((char *)NULL), &buf)) { 6842110Smckusick if (mkdir(p, 0777)) { 6934109Sbostic perror(p); 7034109Sbostic exit(2); 7134109Sbostic } 7234109Sbostic } 7334109Sbostic else if ((buf.st_mode & S_IFMT) != S_IFDIR) { 7434109Sbostic fprintf(stderr, "config: %s isn't a directory.\n", p); 7534109Sbostic exit(2); 7634109Sbostic } 7734109Sbostic 788892Sroot dtab = NULL; 7912487Ssam confp = &conf_list; 808892Sroot if (yyparse()) 818892Sroot exit(3); 828892Sroot switch (machine) { 838892Sroot 848892Sroot case MACHINE_VAX: 858892Sroot vax_ioconf(); /* Print ioconf.c */ 868892Sroot ubglue(); /* Create ubglue.s */ 878892Sroot break; 888892Sroot 8929841Ssam case MACHINE_TAHOE: 9029841Ssam tahoe_ioconf(); 9129841Ssam vbglue(); 928892Sroot break; 938892Sroot 9442110Smckusick case MACHINE_HP300: 9542110Smckusick hp300_ioconf(); 9642110Smckusick hpglue(); 9742110Smckusick break; 9842110Smckusick 998892Sroot default: 1008892Sroot printf("Specify machine type, e.g. ``machine vax''\n"); 1018892Sroot exit(1); 1028892Sroot } 10330379Skarels /* 10430379Skarels * make symbolic links in compilation directory 10530379Skarels * for "sys" (to make genassym.c work along with #include <sys/xxx>) 10630379Skarels * and similarly for "machine". 10730379Skarels */ 10830379Skarels { 10930379Skarels char xxx[80]; 11030379Skarels 11137541Smckusick (void) symlink("../sys", path("sys")); 11232458Sbostic (void) sprintf(xxx, "../%s", machinename); 11330379Skarels (void) symlink(xxx, path("machine")); 11430379Skarels } 1152653Stoy makefile(); /* build Makefile */ 1162653Stoy headers(); /* make a lot of .h files */ 11712487Ssam swapconf(); /* swap config files */ 1183156Stoy printf("Don't forget to run \"make depend\"\n"); 11932605Sbostic exit(0); 1202653Stoy } 1212653Stoy 1222653Stoy /* 1232653Stoy * get_word 1242653Stoy * returns EOF on end of file 1252653Stoy * NULL on end of line 1262653Stoy * pointer to the word otherwise 1272653Stoy */ 1288892Sroot char * 1298892Sroot get_word(fp) 1308892Sroot register FILE *fp; 1312653Stoy { 1328892Sroot static char line[80]; 1338892Sroot register int ch; 1348892Sroot register char *cp; 1352653Stoy 1368892Sroot while ((ch = getc(fp)) != EOF) 1378892Sroot if (ch != ' ' && ch != '\t') 1388892Sroot break; 1398892Sroot if (ch == EOF) 1408900Sroot return ((char *)EOF); 1418892Sroot if (ch == '\n') 1428892Sroot return (NULL); 1438892Sroot cp = line; 1442653Stoy *cp++ = ch; 1458892Sroot while ((ch = getc(fp)) != EOF) { 1468892Sroot if (isspace(ch)) 1478892Sroot break; 1488892Sroot *cp++ = ch; 1498892Sroot } 1508892Sroot *cp = 0; 1518892Sroot if (ch == EOF) 1528900Sroot return ((char *)EOF); 1538900Sroot (void) ungetc(ch, fp); 1548892Sroot return (line); 1552653Stoy } 1562682Stoy 1572682Stoy /* 1588892Sroot * prepend the path to a filename 1592682Stoy */ 1608900Sroot char * 1612682Stoy path(file) 1628892Sroot char *file; 1632682Stoy { 1648892Sroot register char *cp; 1652682Stoy 1668900Sroot cp = malloc((unsigned)(strlen(PREFIX)+strlen(file)+5)); 1678900Sroot (void) strcpy(cp, "../"); 1688900Sroot (void) strcat(cp, PREFIX); 16934109Sbostic if (file) { 17034109Sbostic (void) strcat(cp, "/"); 17134109Sbostic (void) strcat(cp, file); 17234109Sbostic } 1738892Sroot return (cp); 1742682Stoy } 175