/*************************************************************** * * * PDMAKE, Atari ST version * * * * Adapted from mod.sources Vol 7 Issue 71, 1986-12-03. * * * * This port makes extensive use of the original net.sources * * port by Jwahar Bammi. * * * * Ton van Overbeek * * Email: TPC862@ESTEC.BITNET * * TPC862%ESTEC.BITNET@WISCVM.WISC.EDU (ARPA) * * ...!mcvax!tpc862%estec.bitnet (UUCP Europe) * * ...!ucbvax!tpc862%estec.bitnet (UUCP U.S.A.) * * 71450,3537 (CompuServe) * * * \***************************************************************/ /* * make [-f makefile] [-ins] [target(s) ...] * * (Better than EON mk but not quite as good as UNIX make) * * -f makefile name * -i ignore exit status * -n Pretend to make * -p Print all macros & targets * -q Question up-to-dateness of target. Return exit status 1 if not * -r Don't not use inbuilt rules * -s Make silently * -t Touch files instead of making them * -m Change memory requirements (EON only) * * -e Don't read the environment to set marcros (tony) * -c dir chdir to 'dir' before running... */ long _BLKSIZ = 4096; /* don't grab too much memory */ #include #include "h.h" #include "astat.h" long _STKSIZ = 16 * 1024L; char *myname; char *makefile = ""; /* The make file */ FILE *ifd; /* Input file desciptor */ bool domake = TRUE; /* Go through the motions option */ bool ignore = FALSE; /* Ignore exit status option */ bool silent = FALSE; /* Silent option */ bool print = FALSE; /* Print debuging information */ bool rules = TRUE; /* Use inbuilt rules */ bool dotouch = FALSE; /* Touch files instead of making */ bool quest = FALSE; /* Question up-to-dateness of file */ bool doenv = FALSE; /* macros in the env. take precendence */ char *dir = NULL; /* 'cd' here before starting */ main(argc, argv) int argc; char *argv[]; { register char *p; /* For argument processing */ int estat = 0; /* For question */ register struct name *np; myname = "make"; /* TOS doesn't pass argv[0] */ argc--; argv++; while ((argc > 0) && (**argv == '-')) { argc--; /* One less to process */ p = *argv++; /* Now processing this one */ while (*++p != '\0') { switch (*p) { case 'f': /* Alternate file name */ case 'F': if (*++p == '\0') { if (argc-- <= 0) usage(); p = *argv++; } makefile = p; goto end_of_args; case 'c': case 'C': if (*++p == '\0') { if (argc-- <= 0) usage(); p = *argv++; } dir = p; goto end_of_args; break; case 'n': /* Pretend mode */ case 'N': domake = FALSE; break; case 'i': /* Ignore fault mode */ case 'I': ignore = TRUE; break; case 's': /* Silent about commands */ case 'S': silent = TRUE; break; case 'p': case 'P': print = TRUE; break; case 'r': case 'R': rules = FALSE; break; case 't': case 'T': dotouch = TRUE; break; case 'q': case 'Q': quest = TRUE; break; case 'e': case 'E': doenv = TRUE; break; default: /* Wrong option */ usage(); } } end_of_args: ; } if (dir != NULL) { if (chdir(dir) != 0) fatal("Can't chdir to %s", dir); } if (strcmp(makefile, "-") == 0) /* Can use stdin as makefile */ ifd = stdin; else if (*makefile == '\0') /* If no file, then use default */ ifd = fopen(DEFN1, "r"); else if ((ifd = fopen(makefile, "r")) == (FILE * )0) fatal("Can't open %s", makefile); makerules(); setmacro("$", "$"); while (argc && (p = strchr(*argv, '='))) { char c; c = *p; *p = '\0'; setmacro(*argv, p + 1); *p = c; argv++; argc--; } /* * By default macro values are read from the environment before * the makefile is scanned. That way, the makefile overrides any * values set in the environment. */ if (!doenv) readenv(); if (ifd != NULL) { input(ifd); /* Input all the gunga */ fclose(ifd); /* Finished with makefile */ } /* * If the environment takes precedence, read it last. */ if (doenv) readenv(); lineno = 0; /* Any calls to error now print no line number */ if (print) prt(); /* Print out structures */ np = newname(".SILENT"); if (np->n_flag & N_TARG) silent = TRUE; np = newname(".IGNORE"); if (np->n_flag & N_TARG) ignore = TRUE; precious(); if (!firstname && ifd != NULL) fatal("No targets defined"); circh(); /* Check circles in target definitions */ if (!argc) { if (firstname) estat = make(firstname, 0); else fatal("No target or makefile"); } else while (argc--) { if (!print && !silent && strcmp(*argv, "love") == 0) printf("Not war!\n"); estat |= make(newname(*argv++), 0); } if (quest) exit(estat); else exit(0); } usage() { fprintf(stderr, "Usage: %s [-f makefile] [-inpqrst] [macro=val ...] [target(s) ...]\n", myname); exit(1); } void fatal(msg, a1, a2, a3, a4, a5, a6) char *msg; { fprintf(stderr, "%s: ", myname); fprintf(stderr, msg, a1, a2, a3, a4, a5, a6); fputc('\n', stderr); exit(1); }