]> git.saurik.com Git - apple/xnu.git/blobdiff - SETUP/config/main.c
xnu-1699.22.73.tar.gz
[apple/xnu.git] / SETUP / config / main.c
diff --git a/SETUP/config/main.c b/SETUP/config/main.c
new file mode 100644 (file)
index 0000000..024b17b
--- /dev/null
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 1999-2009 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.0 (the 'License').  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License."
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * Copyright (c) 1988 Carnegie-Mellon University
+ * Copyright (c) 1987 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] __attribute__((used)) = "@(#)main.c       5.9 (Berkeley) 6/18/88";
+#endif /* not lint */
+
+#include <stdio.h>
+#include <ctype.h>
+#include "parser.h"
+#include "config.h"
+
+/*
+ * Config builds a set of files for building a UNIX
+ * system given a description of the desired system.
+ */
+int
+main(int argc, char *argv[])
+{
+
+       source_directory = "..";        /* default */
+       object_directory = "..";
+       config_directory = (char *) 0;
+       while ((argc > 1) && (argv[1][0] == '-')) {
+               char            *c;
+
+               argv++; argc--;
+               for (c = &argv[0][1]; *c ; c++) {
+                       switch (*c) {
+                               case 'b':
+                                       build_directory = argv[1];
+                                       goto check_arg;
+
+                               case 'd':
+                                       source_directory = argv[1];
+                                       goto check_arg;
+
+                               case 'o':
+                                       object_directory = argv[1];
+                                       goto check_arg;
+
+                               case 'c':
+                                       config_directory = argv[1];
+
+                                check_arg:
+                                       if (argv[1] == (char *) 0)
+                                               goto usage_error;
+                                       argv++; argc--;
+                                       break;
+
+                               case 'p':
+                                       profiling++;
+                                       break;
+                               default:
+                                       goto usage_error;
+                       }
+               }
+       }
+       if (config_directory == (char *) 0) {
+               config_directory =
+                       malloc((unsigned) strlen(source_directory) + 6);
+               (void) sprintf(config_directory, "%s/conf", source_directory);
+       }
+       if (argc != 2) {
+               usage_error: ;
+               fprintf(stderr, "usage: config [ -bcdo dir ] [ -p ] sysname\n");
+               exit(1);
+       }
+       if (!build_directory)
+               build_directory = argv[1];
+       if (freopen(argv[1], "r", stdin) == NULL) {
+               perror(argv[1]);
+               exit(2);
+       }
+       dtab = NULL;
+       confp = &conf_list;
+       opt = 0;
+       if (yyparse())
+               exit(3);
+       switch (machine) {
+
+       case MACHINE_VAX:
+               vax_ioconf();           /* Print ioconf.c */
+               ubglue();               /* Create ubglue.s */
+               break;
+
+       case MACHINE_SUN:
+               sun_ioconf();
+               break;
+
+       case MACHINE_SUN2:
+       case MACHINE_SUN3:
+       case MACHINE_SUN4:
+               sun_ioconf();           /* Print ioconf.c */
+               mbglue();               /* Create mbglue.s */
+               break;
+
+       case MACHINE_ROMP:
+               romp_ioconf();
+               break;
+
+       case MACHINE_MMAX:
+               mmax_ioconf();
+               break;
+
+       case MACHINE_SQT:
+               sqt_ioconf();
+               break;
+
+       case MACHINE_I386:
+       case MACHINE_IX:
+               i386_ioconf();
+               break;
+
+       case MACHINE_MIPSY:
+       case MACHINE_MIPS:
+               mips_ioconf();
+               break;
+
+       case MACHINE_I860:
+               /* i860_ioconf(); */
+               break;
+
+       case MACHINE_M68K:
+               m68k_ioconf();
+               break;
+
+       case MACHINE_M88K:
+               m88k_ioconf();
+               break;
+
+       case MACHINE_M98K:
+               m98k_ioconf();
+               break;
+
+       case MACHINE_HPPA:
+               hppa_ioconf();
+               break;
+
+       case MACHINE_SPARC:
+               sparc_ioconf();
+               break;
+
+       case MACHINE_PPC:
+               ppc_ioconf();
+               break;
+
+       case MACHINE_ARM:
+               arm_ioconf();
+               break;
+
+       case MACHINE_X86_64:
+               x86_64_ioconf();
+               break;
+
+       default:
+               printf("Specify machine type, e.g. ``machine vax''\n");
+               exit(1);
+       }
+
+       makefile();                     /* build Makefile */
+       headers();                      /* make a lot of .h files */
+       swapconf();                     /* swap config files */
+
+       return 0;
+}
+
+/*
+ * get_word
+ *     returns EOF on end of file
+ *     NULL on end of line
+ *     pointer to the word otherwise
+ */
+const char *
+get_word(FILE *fp)
+{
+       static char line[80];
+       register int ch;
+       register char *cp;
+
+       while ((ch = getc(fp)) != EOF)
+               if (ch != ' ' && ch != '\t')
+                       break;
+       if (ch == EOF)
+               return ((char *)EOF);
+       if (ch == '\n')
+               return (NULL);
+       if (ch == '|')
+               return( "|");
+       cp = line;
+       *cp++ = ch;
+       while ((ch = getc(fp)) != EOF) {
+               if (isspace(ch))
+                       break;
+               *cp++ = ch;
+       }
+       *cp = 0;
+       if (ch == EOF)
+               return ((char *)EOF);
+       (void) ungetc(ch, fp);
+       return (line);
+}
+
+/*
+ * get_rest
+ *     returns EOF on end of file
+ *     NULL on end of line
+ *     pointer to the word otherwise
+ */
+char *
+get_rest(FILE *fp)
+{
+       static char line[80];
+       register int ch;
+       register char *cp;
+
+       cp = line;
+       while ((ch = getc(fp)) != EOF) {
+               if (ch == '\n')
+                       break;
+               *cp++ = ch;
+       }
+       *cp = 0;
+       if (ch == EOF)
+               return ((char *)EOF);
+       return (line);
+}
+
+/*
+ * prepend the path to a filename
+ */
+char *
+path(const char *file)
+{
+       register char *cp;
+
+       cp = malloc((unsigned)(strlen(build_directory)+
+                              strlen(file)+
+                              strlen(object_directory)+
+                              3));
+       (void) sprintf(cp, "%s/%s/%s", object_directory, build_directory, file);
+       return (cp);
+}