[9] | 1 | /*************************************************************************
|
---|
| 2 | *
|
---|
| 3 | * m a k e : m a i n . c
|
---|
| 4 | *
|
---|
| 5 | *========================================================================
|
---|
| 6 | * Edition history
|
---|
| 7 | *
|
---|
| 8 | * # Date Comments By
|
---|
| 9 | * --- -------- ---------------------------------------------------- ---
|
---|
| 10 | * 1 ?? ??
|
---|
| 11 | * 2 01.07.89 strcmp(makefile,..) only if makefile a valid ptr. RAL
|
---|
| 12 | * 3 23.08.89 initname() added RAL
|
---|
| 13 | * 4 30.08.89 argument parsing impr., indention ch., macro fl. add.PSH,RAL
|
---|
| 14 | * 5 03.09.89 k-option added, initname -> init changed RAL
|
---|
| 15 | * 6 06.09.89 environment, MAKEFLAGS, e,d,a options added, RAL
|
---|
| 16 | * 7 09.09.89 tos support added, fatal args added, fopen makefile PHH,RAL
|
---|
| 17 | * 8 17.09.89 setoptions fixed for __STDC__ RAL
|
---|
| 18 | * ------------ Version 2.0 released ------------------------------- RAL
|
---|
| 19 | *
|
---|
| 20 | *************************************************************************/
|
---|
| 21 |
|
---|
| 22 | /*
|
---|
| 23 | * make:
|
---|
| 24 | *
|
---|
| 25 | * -a try to guess undefined ambiguous macros (*,<)
|
---|
| 26 | * -d print debugging info
|
---|
| 27 | * -e environment macro def. overwrite makefile def.
|
---|
| 28 | * -f makefile name
|
---|
| 29 | * -i ignore exit status
|
---|
| 30 | * -k continue on errors
|
---|
| 31 | * -n pretend to make
|
---|
| 32 | * -p print all macros & targets
|
---|
| 33 | * -q question up-to-dateness of target. Return exit status 1 if not
|
---|
| 34 | * -r don't not use inbuilt rules
|
---|
| 35 | * -s make silently
|
---|
| 36 | * -t touch files instead of making them
|
---|
| 37 | * -m Change memory requirements (EON only)
|
---|
| 38 | */
|
---|
| 39 |
|
---|
| 40 | #define EXTERN
|
---|
| 41 | #define INIT(x) = x
|
---|
| 42 | #define INITARRAY
|
---|
| 43 | #include "h.h"
|
---|
| 44 |
|
---|
| 45 | static char version[]= "2.0";
|
---|
| 46 |
|
---|
| 47 | static FILE *ifd; /* Input file desciptor */
|
---|
| 48 | static char *ptrmakeflags;
|
---|
| 49 |
|
---|
| 50 | /* There must be enough 'space' for all possible flags ! */
|
---|
| 51 | static char makeflags[] = "MAKEFLAGS= ";
|
---|
| 52 |
|
---|
| 53 | void main(argc, argv)
|
---|
| 54 | int argc;
|
---|
| 55 | char **argv;
|
---|
| 56 | {
|
---|
| 57 | register char *p; /* For argument processing */
|
---|
| 58 | int estat = 0; /* For question */
|
---|
| 59 | register struct name *np;
|
---|
| 60 | struct macro *mp;
|
---|
| 61 | int targc; /* temporary for multiple scans */
|
---|
| 62 | char **targv;
|
---|
| 63 | char **nargv; /* for removing items from argv */
|
---|
| 64 | char **envp; /* enivironment ptr */
|
---|
| 65 |
|
---|
| 66 |
|
---|
| 67 | ptrmakeflags = &makeflags[10];
|
---|
| 68 | myname = (argc-- < 1) ? "make" : *argv++;
|
---|
| 69 | #ifdef tos
|
---|
| 70 | myname = "Make";
|
---|
| 71 | #endif
|
---|
| 72 |
|
---|
| 73 | targc = argc;
|
---|
| 74 | targv = nargv = argv;
|
---|
| 75 | while (targc--) {
|
---|
| 76 | if((p = strchr(*targv, '=')) != (char *)NULL) {
|
---|
| 77 | *p = '\0';
|
---|
| 78 | mp = setmacro(*targv, p + 1);
|
---|
| 79 | mp->m_flag |= M_OVERRIDE;
|
---|
| 80 | --argc;
|
---|
| 81 | } else
|
---|
| 82 | *nargv++ = *targv;
|
---|
| 83 |
|
---|
| 84 | ++targv;
|
---|
| 85 | }
|
---|
| 86 |
|
---|
| 87 | targc = argc;
|
---|
| 88 | targv = nargv = argv;
|
---|
| 89 | while (targc--) {
|
---|
| 90 | if (**targv == '-') {
|
---|
| 91 | --argc;
|
---|
| 92 | p = *targv++;
|
---|
| 93 | while (*++p != '\0') {
|
---|
| 94 | switch(mylower(*p)) {
|
---|
| 95 | case 'f': /* Alternate file name */
|
---|
| 96 | if (*++p == '\0') {
|
---|
| 97 | --argc;
|
---|
| 98 | if (targc-- == 0)
|
---|
| 99 | usage();
|
---|
| 100 | p = *targv++;
|
---|
| 101 | }
|
---|
| 102 | makefile = p;
|
---|
| 103 | goto end_of_args;
|
---|
| 104 | #ifdef eon
|
---|
| 105 | case 'm': /* Change space requirements */
|
---|
| 106 | if (*++p == '\0') {
|
---|
| 107 | --argc;
|
---|
| 108 | if (targc-- <= 0)
|
---|
| 109 | usage();
|
---|
| 110 | p = *targv++;
|
---|
| 111 | }
|
---|
| 112 | memspace = atoi(p);
|
---|
| 113 | goto end_of_args;
|
---|
| 114 | #endif
|
---|
| 115 | default :
|
---|
| 116 | setoption(*p);
|
---|
| 117 | break;
|
---|
| 118 | }
|
---|
| 119 | }
|
---|
| 120 | end_of_args:;
|
---|
| 121 | } else
|
---|
| 122 | *nargv++ = *targv++;
|
---|
| 123 | }
|
---|
| 124 |
|
---|
| 125 | /* evaluate and update environment MAKEFLAGS */
|
---|
| 126 | if((p =getenv("MAKEFLAGS")) != (char *)0)
|
---|
| 127 | while(*p) setoption(*p++);
|
---|
| 128 | for( p = ptrmakeflags; !isspace((int)*p); p++) ;
|
---|
| 129 | *p = '\0';
|
---|
| 130 | putenv(makeflags);
|
---|
| 131 |
|
---|
| 132 |
|
---|
| 133 | #ifdef eon
|
---|
| 134 | if (initalloc(memspace) == 0xffff) /* Must get memory for alloc */
|
---|
| 135 | fatal("Cannot initalloc memory",(char *)0,0);
|
---|
| 136 | #endif
|
---|
| 137 |
|
---|
| 138 | if (makefile && strcmp(makefile, "-") == 0) /* use stdin as makefile */
|
---|
| 139 | ifd = stdin;
|
---|
| 140 | else if (!makefile) { /* If no file, then use default */
|
---|
| 141 | if ((ifd = fopen(makefile = DEFN1, "r")) == (FILE *)0) {
|
---|
| 142 | if (errno != MNOENT || !DEFN2)
|
---|
| 143 | fatal("Can't open %s: %s", DEFN1, errno);
|
---|
| 144 | else if ((ifd = fopen(makefile = DEFN2, "r")) == (FILE *)0)
|
---|
| 145 | fatal("Can't open %s: %s", DEFN2, errno);
|
---|
| 146 | }
|
---|
| 147 | }
|
---|
| 148 | else if ((ifd = fopen(makefile, "r")) == (FILE *)0)
|
---|
| 149 | fatal("Can't open %s: %s", makefile, errno);
|
---|
| 150 |
|
---|
| 151 | init();
|
---|
| 152 |
|
---|
| 153 | makerules();
|
---|
| 154 |
|
---|
| 155 | mp = setmacro("MAKE", myname);
|
---|
| 156 | mp->m_flag |= M_MAKE;
|
---|
| 157 | setmacro("$", "$");
|
---|
| 158 |
|
---|
| 159 | /* set environment macros */
|
---|
| 160 | envp = environ; /* get actual environment ptr. */
|
---|
| 161 | while (*envp) {
|
---|
| 162 | if((p = strchr(*envp, '=')) != (char *)NULL) {
|
---|
| 163 | *p = '\0';
|
---|
| 164 | mp = setmacro(*envp, p + 1);
|
---|
| 165 | *p = '=';
|
---|
| 166 | if (useenv) mp->m_flag |= M_OVERRIDE;
|
---|
| 167 | } else
|
---|
| 168 | fatal("invalid environment: %s",*envp,0);
|
---|
| 169 |
|
---|
| 170 | ++envp;
|
---|
| 171 | }
|
---|
| 172 |
|
---|
| 173 | input(ifd); /* Input all the gunga */
|
---|
| 174 | fclose(ifd); /* Finished with makefile */
|
---|
| 175 | lineno = 0; /* Any calls to error now print no line number */
|
---|
| 176 |
|
---|
| 177 | if (print)
|
---|
| 178 | prt(); /* Print out structures */
|
---|
| 179 |
|
---|
| 180 | np = newname(".SILENT");
|
---|
| 181 | if (np->n_flag & N_TARG) silent = TRUE;
|
---|
| 182 |
|
---|
| 183 | np = newname(".IGNORE");
|
---|
| 184 | if (np->n_flag & N_TARG) ignore = TRUE;
|
---|
| 185 |
|
---|
| 186 | precious();
|
---|
| 187 |
|
---|
| 188 | if (!firstname)
|
---|
| 189 | fatal("No targets defined",(char *)0,0);
|
---|
| 190 |
|
---|
| 191 | circh(); /* Check circles in target definitions */
|
---|
| 192 |
|
---|
| 193 | if (!argc)
|
---|
| 194 | estat = make(firstname, 0);
|
---|
| 195 | else
|
---|
| 196 | while (argc--) {
|
---|
| 197 | estat |= make(newname(*argv++), 0);
|
---|
| 198 | }
|
---|
| 199 |
|
---|
| 200 | if (quest)
|
---|
| 201 | exit(estat);
|
---|
| 202 | else
|
---|
| 203 | exit(0);
|
---|
| 204 | }
|
---|
| 205 |
|
---|
| 206 | #ifdef __STDC__
|
---|
| 207 | void setoption(char option)
|
---|
| 208 | #else
|
---|
| 209 | void setoption(option)
|
---|
| 210 | char option;
|
---|
| 211 | #endif
|
---|
| 212 | {
|
---|
| 213 | register char *c;
|
---|
| 214 |
|
---|
| 215 | option = mylower(option);
|
---|
| 216 | switch(option) {
|
---|
| 217 | case 'n': /* Pretend mode */
|
---|
| 218 | domake = FALSE;
|
---|
| 219 | break;
|
---|
| 220 | case 'i': /* Ignore fault mode */
|
---|
| 221 | ignore = TRUE;
|
---|
| 222 | break;
|
---|
| 223 | case 'k': /* Continue on errror */
|
---|
| 224 | conterr = TRUE;
|
---|
| 225 | break;
|
---|
| 226 | case 's': /* Silent about commands */
|
---|
| 227 | silent = TRUE;
|
---|
| 228 | break;
|
---|
| 229 | case 'p':
|
---|
| 230 | print = TRUE;
|
---|
| 231 | break;
|
---|
| 232 | case 'r':
|
---|
| 233 | rules = FALSE;
|
---|
| 234 | break;
|
---|
| 235 | case 't':
|
---|
| 236 | dotouch = TRUE;
|
---|
| 237 | break;
|
---|
| 238 | case 'q':
|
---|
| 239 | quest = TRUE;
|
---|
| 240 | break;
|
---|
| 241 | case 'e':
|
---|
| 242 | useenv = TRUE;
|
---|
| 243 | break;
|
---|
| 244 | case 'd':
|
---|
| 245 | dbginfo = TRUE;
|
---|
| 246 | break;
|
---|
| 247 | case 'a':
|
---|
| 248 | ambigmac = TRUE;
|
---|
| 249 | break;
|
---|
| 250 | default: /* Wrong option */
|
---|
| 251 | usage();
|
---|
| 252 | }
|
---|
| 253 | for( c = ptrmakeflags; !isspace((int)*c); c++)
|
---|
| 254 | if ( *c == option) return;
|
---|
| 255 | *c = option;
|
---|
| 256 | }
|
---|
| 257 |
|
---|
| 258 | void usage()
|
---|
| 259 | {
|
---|
| 260 | fprintf(stderr, "Syntax: %s [{options | macro=val | target}]\n", myname);
|
---|
| 261 | fprintf(stderr, "Function: maintaining computer programs V%s\n",version);
|
---|
| 262 | fprintf(stderr, "Options : -a : try to guess undefined ambiguous macros (*,<)\n");
|
---|
| 263 | fprintf(stderr, " -d : print debugging information\n");
|
---|
| 264 | fprintf(stderr, " -e : environment macro def. overwrite makefile def.\n");
|
---|
| 265 | fprintf(stderr, " -f filename : makefile name (default: makefile, Makefile)\n");
|
---|
| 266 | fprintf(stderr, " -i : ignore exit status of executed commands\n");
|
---|
| 267 | fprintf(stderr, " -k : continue with unrelated branches on errors\n");
|
---|
| 268 | fprintf(stderr, " -n : pretend to make\n");
|
---|
| 269 | fprintf(stderr, " -p : print all macros & targets\n");
|
---|
| 270 | fprintf(stderr, " -q : question up-to-dateness of target\n");
|
---|
| 271 | fprintf(stderr, " -r : don't use inbuilt rules\n");
|
---|
| 272 | fprintf(stderr, " -s : make silently\n");
|
---|
| 273 | fprintf(stderr, " -t : touch files instead of making them\n");
|
---|
| 274 | fprintf(stderr, "Environment: MAKEFLAGS\n");
|
---|
| 275 | exit(1);
|
---|
| 276 | }
|
---|
| 277 |
|
---|
| 278 |
|
---|
| 279 | void fatal(msg, a1, a2)
|
---|
| 280 | char *msg;
|
---|
| 281 | char *a1;
|
---|
| 282 | int a2;
|
---|
| 283 | {
|
---|
| 284 | fprintf(stderr, "%s: ", myname);
|
---|
| 285 | fprintf(stderr, msg, a1, strerror(a2));
|
---|
| 286 | fputc('\n', stderr);
|
---|
| 287 | exit(1);
|
---|
| 288 | }
|
---|