Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (06/04/90)
Submitted-by: huver@amgraf.uucp Posting-number: Volume 90, Issue 178 Archive-name: unix/pdmake/part02 #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 2)." # Contents: make.c rules.c # Wrapped by tadguy@xanth on Sun Jun 3 20:20:43 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'make.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'make.c'\" else echo shar: Extracting \"'make.c'\" \(12008 characters\) sed "s/^X//" >'make.c' <<'END_OF_FILE' X/* X * Do the actual making for make X */ X X#include <stdio.h> X#ifdef unix X#include <sys/types.h> X#include <sys/stat.h> X#include <sys/errno.h> X#endif X#ifdef eon X#include <sys/stat.h> X#include <sys/err.h> X#endif X#ifdef os9 X#include <time.h> X#include <os9.h> X#include <modes.h> X#include <direct.h> X#include <errno.h> X#endif X#ifdef amiga X#include <ctype.h> X#include <errno.h> X#include <libraries/dosextens.h> X#include <exec/memory.h> X#include <exec/io.h> X#include <exec/ports.h> X#include <functions.h> X#undef TRUE /*OIS*0.80*/ X#undef FALSE /*OIS*0.80*/ X/*#define ACTION_SET_DATE 34L /*OIS*0.80*/ X#endif X#include "h.h" X X X X/* X * Exec a shell that returns exit status correctly (/bin/esh). X * The standard EON shell returns the process number of the last X * async command, used by the debugger (ugg). X * [exec on eon is like a fork+exec on unix] X */ Xint Xdosh(string, shell) X char *string; X char *shell; X{ X int number; X X#ifdef amiga X char *av[3], *s, *p; X int i; X X fflush(stdout); /*OIS*0.80*/ X if ((p = s = malloc((unsigned) strlen(string) + 1)) == NULL) X fatal("No memory for command '%s'", string); X strcpy(p, string); /* make a copy of the string */ X i = 0; X av[0] = gettok(&p); /* get first argument */ X av[1] = p; /* get rest of command line */ X av[2] = NULL; X if (fexecv(av[0], av) == -1) X fatal("couldn't execute command '%s', error return %02x\n", X av[0], errno); X number = wait(); X free(s); X return number; X#endif X X#ifdef unix X return system(string); X#endif X#ifdef eon X return ((number = execl(shell, shell, "-c", string, 0)) == -1) ? X -1 : /* couldn't start the shell */ X wait(number); /* return its exit status */ X#endif X#ifdef os9 X int status, pid; X X strcat(string, "\n"); X if ((number = os9fork(shell, strlen(string), string, 0, 0, 0)) == -1) X return -1; /* Couldn't start a shell */ X do { X if ((pid = wait(&status)) == -1) X return -1; /* child already died!?!? */ X } while (pid != number); X X return status; X#endif X} X X X/* X * Do commands to make a target X */ Xvoid Xdocmds1(np, lp) X struct name *np; X struct line *lp; X{ X bool ssilent; X bool signore; X int estat; X register char *q; X register char *p; X char *shell; X register struct cmd *cp; X#ifdef amiga X long SetSignal(); X#endif X X#ifndef amiga X if (*(shell = getmacro("SHELL")) == '\0') X#ifdef eon X shell = ":bin/esh"; X#endif X#ifdef unix X shell = "/bin/sh"; X#endif X#ifdef os9 X shell = "shell"; X#endif X#else /* for amiga */ X shell = NULL; X#endif X X for (cp = lp->l_cmd; cp; cp = cp->c_next) { X strcpy(str1, cp->c_cmd); X expand(str1); X q = str1; X ssilent = silent; X signore = ignore; X while ((*q == '@') || (*q == '-')) { X if (*q == '@') /* Specific silent */ X ssilent = TRUE; X else /* Specific ignore */ X signore = TRUE; X q++; /* Not part of the command */ X } X X if (!domake) X ssilent = 0; X X if (!ssilent) X fputs(" ", stdout); X X for (p = q; *p; p++) { X if (*p == '\n' && p[1] != '\0') { X *p = ' '; X if (!ssilent) X fputs("\\\n", stdout); X } else if (!ssilent) X putchar(*p); X } X if (!ssilent) X putchar('\n'); X X if (domake) { /* Get the shell to execute it */ X if ((estat = dosh(q, shell)) != 0) { X if (estat == -1) X fatal("Couldn't execute %s", shell); X else { X printf("%s: Error code %d", myname, estat); X if (signore) X fputs(" (Ignored)\n", stdout); X else { X putchar('\n'); X if (!(np->n_flag & N_PREC)) X if (unlink(np->n_name) == 0) X printf("%s: '%s' removed.\n", X myname, np->n_name); X exit(estat); X } X } X } X#ifdef amiga X if ((SetSignal(0L, SIGBREAKF_CTRL_D) & SIGBREAKF_CTRL_D) != 0) { X fatal("Abort due to ^D"); /*OIS*0.80*/ X } X#endif X } X } X} X X Xdocmds(np) X struct name *np; X{ X register struct line *lp; X X X for (lp = np->n_line; lp; lp = lp->l_next) X docmds1(np, lp); X} X X X#ifdef os9 X/* X * Some stuffing around to get the modified time of a file X * in an os9 file system X */ Xgetmdate(fd, tbp) X struct sgtbuf *tbp; X{ X struct registers regs; X static struct fildes fdbuf; X X X regs.rg_a = fd; X regs.rg_b = SS_FD; X regs.rg_x = &fdbuf; X regs.rg_y = sizeof(fdbuf); X X if (_os9(I_GETSTT, ®s) == -1) { X errno = regs.rg_b & 0xff; X return -1; X } X if (tbp) { X _strass(tbp, fdbuf.fd_date, sizeof(fdbuf.fd_date)); X tbp->t_second = 0; /* Files are only acurate to mins */ X } X return 0; X} X X X/* X * Kludge routine to return an aproximation of how many X * seconds since 1980. Dates will be in order, but will not X * be lineer X */ Xtime_t Xcnvtime(tbp) X struct sgtbuf *tbp; X{ X long acc; X X X acc = tbp->t_year - 80; /* Baseyear is 1980 */ X acc = acc * 12 + tbp->t_month; X acc = acc * 31 + tbp->t_day; X acc = acc * 24 + tbp->t_hour; X acc = acc * 60 + tbp->t_minute; X acc = acc * 60 + tbp->t_second; X X return acc; X} X X X/* X * Get the current time in the internal format X */ Xtime(tp) X time_t *tp; X{ X struct sgtbuf tbuf; X X X if (getime(&tbuf) < 0) X return -1; X X if (tp) X *tp = cnvtime(&tbuf); X X return 0; X} X#endif X X X/* X * Get the modification time of a file. If the first X * doesn't exist, it's modtime is set to 0. X */ Xvoid Xmodtime(np) X struct name *np; X{ X#ifdef unix X struct stat info; X int fd; X X X if (stat(np->n_name, &info) < 0) { X if (errno != ENOENT) X fatal("Can't open %s; error %d", np->n_name, errno); X X np->n_time = 0L; X } else X np->n_time = info.st_mtime; X#endif X#ifdef eon X struct stat info; X int fd; X X X if ((fd = open(np->n_name, 0)) < 0) { X if (errno != ER_NOTF) X fatal("Can't open %s; error %02x", np->n_name, errno); X X np->n_time = 0L; X } else if (getstat(fd, &info) < 0) X fatal("Can't getstat %s; error %02x", np->n_name, errno); X else X np->n_time = info.st_mod; X X close(fd); X#endif X#ifdef os9 X struct sgtbuf info; X int fd; X X X if ((fd = open(np->n_name, 0)) < 0) { X if (errno != E_PNNF) X fatal("Can't open %s; error %02x", np->n_name, errno); X X np->n_time = 0L; X } else if (getmdate(fd, &info) < 0) X fatal("Can't getstat %s; error %02x", np->n_name, errno); X else X np->n_time = cnvtime(&info); X X close(fd); X#endif X#ifdef amiga X struct FileInfoBlock *fib; X struct FileLock *myLock; X long ioErr; X X fib = (struct FileInfoBlock *) malloc((unsigned) sizeof(struct FileInfoBlock)); X if ((myLock = Lock(np->n_name, ACCESS_READ)) == NULL) { X if ((ioErr = IoErr()) != ERROR_OBJECT_NOT_FOUND) X fatal("Can't Lock '%s'; error %3ld", np->n_name, ioErr); X np->n_time = 0L; X } else if (!Examine(myLock, fib)) { X UnLock(myLock); X fatal("Can't Examine '%s'; error %3ld", np->n_name, IoErr()); X } else { X np->n_time = fib->fib_Date.ds_Tick/TICKS_PER_SECOND + X 60*fib->fib_Date.ds_Minute + 86400*fib->fib_Date.ds_Days; X UnLock(myLock); X } X free((char *) fib); X#endif X X} X X#ifdef amiga Xchar * Xnametail(name) Xregister char *name; X{ X register char *tail; X X if ((tail = index(name, ':')) == NULL) /* strip device name */ X tail = name; X if ((name = rindex(tail, '/')) == NULL) /* strip directories */ X name = tail; X X return name; X} X#endif X X X/* X * Update the mod time of a file to now. X */ Xvoid Xtouch(np) X struct name *np; X{ X char c; X int fd; X X X if (!domake || !silent) X printf(" touch(%s)\n", np->n_name); X X if (domake) { X#ifdef unix X long a[2]; X X a[0] = a[1] = time(0); X if (utime(np->n_name, &a[0]) < 0) X printf("%s: '%s' not touched - non-existant\n", X myname, np->n_name); X#endif X#ifdef eon X if ((fd = open(np->n_name, 0)) < 0) X printf("%s: '%s' not touched - non-existant\n", X myname, np->n_name); X else { X uread(fd, &c, 1, 0); X uwrite(fd, &c, 1); X } X close(fd); X#endif X#ifdef os9 X /* X * Strange that something almost as totally useless as this is easy X * to do in os9! X */ X if ((fd = open(np->n_name, S_IWRITE)) < 0) X printf("%s: '%s' not touched - non-existant\n", X myname, np->n_name); X close(fd); X#endif X#ifdef amiga X struct MsgPort *task; X ULONG dateStamp[3]; X struct FileLock *lock, *plock; X UBYTE *bcplstring; X X if(!(bcplstring = (UBYTE *)AllocMem(64L, MEMF_PUBLIC))) X fatal("Can't get 64 bytes for bcplstring"); X if(!(task=(struct MsgPort *)DeviceProc(np->n_name))) { X printf("%s: can't get MsgPort for '%s'\n", myname, np->n_name); X goto abort; X } X if(!(lock = Lock(np->n_name, SHARED_LOCK))) { X printf("%s: '%s' not touched - non-existant\n", X myname, np->n_name); X goto abort; X } X plock = ParentDir(lock); X UnLock(lock); X X /* Strip pathnames first */ X strcpy((bcplstring + 1), nametail(np->n_name)); X *bcplstring = strlen(bcplstring + 1); X X dos_packet(task, ACTION_SET_DATE, NULL, plock, (ULONG)bcplstring >> 2, X (ULONG) DateStamp(dateStamp), 0L, 0L, 0L); X X UnLock(plock); Xabort: X FreeMem((void *) bcplstring, 64L); X#endif X } X} X X/* X * Recursive routine to make a target. X */ Xint Xmake(np, level) X struct name *np; X int level; X{ X register struct depend *dp; X register struct line *lp; X register struct depend *qdp; X time_t dtime = 1, time(); X bool didsomething = 0; X char * basename = (char *) 0; X char * inputname = (char *) 0; X X X if (np->n_flag & N_DONE) X return 0; X X if (!np->n_time) X modtime(np); /* Gets modtime of this file */ X X if (rules) { X for (lp = np->n_line; lp; lp = lp->l_next) X if (lp->l_cmd) break; X X if (!lp) dyndep(np, &basename, &inputname); X } X X if (!(np->n_flag & N_TARG) && np->n_time == 0L) { X#if 0 X fatal("Don't know how to make %s", np->n_name); X#endif X fprintf(stderr,"%s: ", myname); X fprintf(stderr,"Don't know how to make %s\n", np->n_name); X return 0; X } X X for (qdp = (struct depend *) 0, lp = np->n_line; lp; lp = lp->l_next) { X for (dp = lp->l_dep; dp; dp = dp->d_next) { X make(dp->d_name, level + 1); X if (np->n_time < dp->d_name->n_time) X qdp = newdep(dp->d_name, qdp); X dtime = max(dtime, dp->d_name->n_time); X } X if (!quest && (np->n_flag & N_DOUBLE) && (np->n_time < dtime)) { X make1(np, lp, qdp, basename, inputname); /* free()'s qdp */ X dtime = 1; X qdp = (struct depend *) 0; X didsomething++; X } X } X X np->n_flag |= N_DONE; X X if (quest) { X long t; X X t = np->n_time; X time(&np->n_time); X if (basename) X free(basename); X X return t < dtime; X } else if (np->n_time < dtime && !(np->n_flag & N_DOUBLE)) { X make1(np, (struct line *)0, qdp, basename, inputname);/* free()'s qdp */ X time(&np->n_time); X } else if (level == 0 && !didsomething) X printf("%s: '%s' is up to date\n", myname, np->n_name); X X if (basename) X free(basename); X X return 0; X} X X Xmake1(np, lp, qdp, basename, inputname) X register struct depend *qdp; X struct line *lp; X struct name *np; X char *basename; X char *inputname; X{ X register struct depend *dp; X X X if (dotouch) X touch(np); X else { X strcpy(str1, ""); X if (!basename) X basename = str1; X setmacro("*", basename); /* $* = file */ X if (!inputname) X inputname = str1; X setmacro("<", inputname); /* $< = path/file.c or file.c */ X for (dp = qdp; dp; dp = qdp) { X if (strlen(str1)) X strcat(str1, " "); X strcat(str1, dp->d_name->n_name); X qdp = dp->d_next; X free(dp); X } X setmacro("?", str1); /* $? = file.c file1.h file2.h */ X setmacro("@", np->n_name); /* $@ = file.o */ X if (lp) /* lp set if doing a :: rule */ X docmds1(np, lp); X else X docmds(np); X } X} X#ifdef amiga X/* X * Replace the Aztec-provided time function with one which returns something X * easy to find and compare, namely the number of seconds since the Amiga's X * reference date. This is the same thing returned by modtime() above. X */ Xtime_t Xtime(v) X time_t *v; X{ X long t[3]; X X DateStamp(t); X t[0] = t[2]/TICKS_PER_SECOND + 60*t[1] + 86400*t[0]; X if (v) X *v = t[0]; X return t[0]; X} X#endif END_OF_FILE if test 12008 -ne `wc -c <'make.c'`; then echo shar: \"'make.c'\" unpacked with wrong size! fi # end of 'make.c' fi if test -f 'rules.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'rules.c'\" else echo shar: Extracting \"'rules.c'\" \(10453 characters\) sed "s/^X//" >'rules.c' <<'END_OF_FILE' X/* X * Control of the implicit suffix rules X */ X X X#include "h.h" X#ifndef NULL X#define NULL ((void *) 0) X#endif X X/* -- hu: define the fake target suffix .~ if we will not see any suffix */ Xstatic char *dot_out = ".~"; X X/* X * Dynamic dependency. This routine applies the suffix rules X * to try and find a source and a set of rules for a missing X * target. If found, np is made into a target with the implicit X * source name, and rules. Returns TRUE if np was made into X * a target. X */ Xbool Xdyndep(np, pbasename, pinputname) X struct name *np; X char **pbasename; /* Name without suffix */ X char **pinputname; X{ X register char *p; X register char *q; X register char *suff; /* Old suffix */ X register char *basename; /* Name without suffix */ X struct name *op; /* New dependent */ X struct name *sp; /* Suffix */ X struct line *lp; X struct depend *dp; X struct name *pathnp; /* .PATH */ X struct line *pathlp; X struct depend *pathdp; X struct depend *pathdp1; X char *newsuff; X char *path; X void modtime(); X X X p = str1; X q = np->n_name; X X /* -- hu: if no suffix, pretend the suffix is dot_out */ X if ((suff = rindex(q, '.')) == NULL) { X strcpy (p, q); X suff = dot_out; X } X else { X while (q < suff) *p++ = *q++; X *p = '\0'; X } X X if ((*pbasename = basename = malloc(strlen(str1)+1)) == NULL) X fatal("No memory for basename"); X strcpy(*pbasename, str1); X X if (!((sp = newname(".SUFFIXES"))->n_flag & N_TARG)) X return FALSE; X X if (!((pathnp = newname(".PATH"))->n_flag & N_TARG)) X pathnp = NULL; X X if ((pathnp) && (pathlp = pathnp->n_line)) X pathdp = pathlp->l_dep; X else X pathdp = NULL; X X for (lp = sp->n_line; lp; lp = lp->l_next) X for (dp = lp->l_dep; dp; dp = dp->d_next) { X newsuff = dp->d_name->n_name; /* .c .o .asm etc */ X X if (strlen(suff) + strlen(newsuff) + 1 >= LZ) X fatal("Suffix rule too long"); X p = str1; X q = newsuff; X while (*p++ = *q++); X p--; X q = suff; X while (*p++ = *q++); X X sp = newname(str1); /* Form for example .c.o */ X if (sp->n_flag & N_TARG) { X path = ""; X pathdp1 = pathdp; X nextpath: X p = str1; X if (strlen(path) + strlen(basename) + strlen(newsuff) + 2 >= LZ) X fatal("Implicit name too long"); X q = path; X while (*p++ = *q++); /* copy path */ X p--; X q = basename; X while (*p++ = *q++); /* copy basename */ X p--; X q = newsuff; X while (*p++ = *q++); /* copy new suffix */ X op = newname(str1); X X if (!op->n_line && !op->n_time) X modtime(op); X if (op->n_line || op->n_time) { /* file exists? */ X dp = newdep(op, NULL); X newline(np, dp, sp->n_line->l_cmd, 0); X *pinputname = op->n_name; /* $< = path/basename.suffix */ X return TRUE; X } else { X delname(op); /* Forget non-existing file */ X if (pathdp1) { /* But is there a path? */ X path = pathdp1->d_name->n_name; X pathdp1 = pathdp1->d_next; X goto nextpath; X } X } X } X } X return FALSE; X} X X X/* X * Make the default rules X */ Xvoid Xmakerules() X{ X register struct cmd *cp; /*OIS*0.80*/ X register struct name *np; /*OIS*0.80*/ X register struct depend *dp; /*OIS*0.80*/ X X#ifdef eon X setmacro("BDSCC", "asm"); X /* setmacro("BDSCFLAGS", ""); */ X cp = newcmd("$(BDSCC) $(BDSCFLAGS) -n $<", 0); X np = newname(".c.o"); X newline(np, 0, cp, 0); X X setmacro("CC", "c"); X setmacro("CFLAGS", "-O"); X cp = newcmd("$(CC) $(CFLAGS) -c $<", 0); X np = newname(".c.obj"); X newline(np, 0, cp, 0); X X setmacro("M80", "asm -n"); X /* setmacro("M80FLAGS", ""); */ X cp = newcmd("$(M80) $(M80FLAGS) $<", 0); X np = newname(".mac.o"); X newline(np, 0, cp, 0); X X setmacro("AS", "zas"); X /* setmacro("ASFLAGS", ""); */ X cp = newcmd("$(ZAS) $(ASFLAGS) -o $@ $<", 0); X np = newname(".as.obj"); X newline(np, 0, cp, 0); X X np = newname(".as"); X dp = newdep(np, 0); X np = newname(".obj"); X dp = newdep(np, dp); X np = newname(".c"); X dp = newdep(np, dp); X np = newname(".o"); X dp = newdep(np, dp); X np = newname(".mac"); X dp = newdep(np, dp); X np = newname(".SUFFIXES"); X newline(np, dp, 0, 0); X#endif X X/* X * Some of the UNIX implicit rules X */ X#ifdef unix X setmacro("CC", "cc"); X setmacro("CFLAGS", "-O"); X#ifdef MINIXPC X cp = newcmd("$(CC) $(CFLAGS) -S $<", (struct cmd *)0); X np = newname(".c.s"); X#else X cp = newcmd("$(CC) $(CFLAGS) -c $<", (struct cmd *)0); X np = newname(".c.o"); X#endif MINIXPC X newline(np, (struct depend *)0, cp, 0); X X setmacro("AS", "as"); X cp = newcmd("$(AS) -o $@ $<", (struct cmd *)0); X np = newname(".s.o"); X newline(np, (struct depend *)0, cp, 0); X X setmacro("YACC", "yacc"); X /* setmacro("YFLAGS", ""); */ X cp = newcmd("$(YACC) $(YFLAGS) $<", (struct cmd *)0); X cp = newcmd("mv y.tab.c $@", cp); X np = newname(".y.c"); X newline(np, (struct depend *)0, cp, 0); X X cp = newcmd("$(YACC) $(YFLAGS) $<", (struct cmd *)0); X#ifdef MINIXPC X cp = newcmd("$(CC) $(CFLAGS) -S y.tab.c", cp); X cp = newcmd("mv y.tab.s $@", cp); X np = newname(".y.s"); X#else X cp = newcmd("$(CC) $(CFLAGS) -c y.tab.c", cp); X cp = newcmd("mv y.tab.o $@", cp); X np = newname(".y.o"); X#endif MINIXPC X cp = newcmd("rm y.tab.c", cp); X newline(np, (struct depend *)0, cp, 0); X X setmacro("FLEX", "flex"); X cp = newcmd("$(FLEX) $(FLEX_FLAGS) $<", (struct cmd *)0); X cp = newcmd("mv lex.yy.c $@", cp); X np = newname(".l.c"); X newline(np, (struct depend *)0, cp, 0); X X cp = newcmd("$(FLEX) $(FLEX_FLAGS) $<", (struct cmd *)0); X#ifdef MINIXPC X cp = newcmd("$(CC) $(CFLAGS) -S lex.yy.s", cp); X cp = newcmd("mv lex.yy.s $@", cp); X np = newname(".l.s"); X#else X cp = newcmd("$(CC) $(CFLAGS) -c lex.yy.c", cp); X cp = newcmd("mv lex.yy.o $@", cp); X np = newname(".l.o"); X#endif MINIXPC X cp = newcmd("rm lex.yy.c", cp); X newline(np, (struct depend *)0, cp, 0); X X np = newname(".o"); X dp = newdep(np, (struct depend *)0); X np = newname(".s"); X dp = newdep(np, dp); X np = newname(".c"); X dp = newdep(np, dp); X np = newname(".y"); X dp = newdep(np, dp); X np = newname(".l"); X dp = newdep(np, dp); X np = newname(".SUFFIXES"); X newline(np, dp, (struct cmd *)0, 0); X#endif X X#ifdef os9 X/* X * Fairlight use an enhanced version of the C sub-system. X * They have a specialised macro pre-processor. X */ X setmacro("CC", "cc"); X setmacro("CFLAGS", "-z"); X cp = newcmd("$(CC) $(CFLAGS) -r $<", 0); X X np = newname(".c.r"); X newline(np, 0, cp, 0); X np = newname(".ca.r"); X newline(np, 0, cp, 0); X np = newname(".a.r"); X newline(np, 0, cp, 0); X np = newname(".o.r"); X newline(np, 0, cp, 0); X np = newname(".mc.r"); X newline(np, 0, cp, 0); X np = newname(".mca.r"); X newline(np, 0, cp, 0); X np = newname(".ma.r"); X newline(np, 0, cp, 0); X np = newname(".mo.r"); X newline(np, 0, cp, 0); X X np = newname(".r"); X dp = newdep(np, 0); X np = newname(".mc"); X dp = newdep(np, dp); X np = newname(".mca"); X dp = newdep(np, dp); X np = newname(".c"); X dp = newdep(np, dp); X np = newname(".ca"); X dp = newdep(np, dp); X np = newname(".ma"); X dp = newdep(np, dp); X np = newname(".mo"); X dp = newdep(np, dp); X np = newname(".o"); X dp = newdep(np, dp); X np = newname(".a"); X dp = newdep(np, dp); X np = newname(".SUFFIXES"); X newline(np, dp, 0, 0); X#endif X X#ifdef amiga X X#ifdef pdc /*OIS*0.80*/ X static char ccx_c[] = "ccx -c"; X X setmacro("CC", ccx_c); X#else X setmacro("CC", "cc"); X#endif X cp = newcmd("$(CC) $(CFLAGS) $<", NULL); X np = newname(".c.o"); X newline(np, NULL, cp, 0); X X#ifdef pdc /*OIS*0.80*/ X setmacro("AS", ccx_c); X cp = newcmd("$(AS) $(AFLAGS) $<", NULL); /*OIS*0.80*/ X#else X setmacro("AS", "as"); X cp = newcmd("$(AS) $(AFLAGS) -o $@ $<", NULL); /*OIS*0.80*/ X#endif X np = newname(".s.o"); X newline(np, NULL, cp, NULL); X np = newname(".a.o"); X newline(np, NULL, cp, NULL); X X /* -- hu: provide .asm suffix recognition -- */ X np = newname(".asm.o"); X newline(np, NULL, cp, NULL); X X /* -- hu: add definitions to call the linker, and generate executable X * from .o file. This is done by using fake suffix `dot_out' X * to qualify the target executable. Setup for MANX 3.6 only, X * but you can easily see what I'm doing here and add for X * other "brands". X */ X#ifdef pdc X/* X*/ X#endif X#ifdef manx X setmacro("LD", "ln"); X setmacro("LDLIBS", "-lc"); X cp = newcmd("$(LD) $(LDFLAGS) -o $@ $< $(LDLIBS)", NULL); X#endif X np = newname(".o.~"); X newline(np, NULL, cp, NULL); X X /* -- hu: add rules for making executable from source. This is not X * pretty (two-step approach) but is easier. X */ X /* -- hu: from .c to .~ */ X np = newname(".c.~"); X cp = newcmd("$(CC) $(CFLAGS) $<", NULL); X#ifdef pdc X/* X*/ X#endif X#ifdef manx X cp = newcmd("$(LD) $(LDFLAGS) -o $@ $@.o $(LDLIBS)", cp); X#endif X newline(np, NULL, cp, NULL); X X /* -- hu: from .a to .~ */ X np = newname(".a.~"); X#ifdef pdc /*OIS*0.80*/ X/* X*/ X#endif X#ifdef manx X cp = newcmd("$(AS) $(AFLAGS) -o $@ $<", NULL); X cp = newcmd("$(LD) $(LDFLAGS) -o $@ $@.o $(LDLIBS)", cp); X#endif X newline(np, NULL, cp, NULL); X X /* -- hu: from .s to .~ */ X np = newname(".s.~"); X#ifdef pdc /*OIS*0.80*/ X/* X*/ X#endif X#ifdef mnax X cp = newcmd("$(AS) $(AFLAGS) -o $@ $<", NULL); X cp = newcmd("$(LD) $(LDFLAGS) -o $@ $@.o $(LDLIBS)", cp); X#endif X newline(np, NULL, cp, NULL); X X /* -- hu: and from .asm to .~ */ X np = newname(".asm.~"); X#ifdef pdc /*OIS*0.80*/ X/* X*/ X#endif X#ifdef manx X cp = newcmd("$(AS) $(AFLAGS) -o $@ $<", NULL); X cp = newcmd("$(LD) $(LDFLAGS) -o $@ $@.o $(LDLIBS)", cp); X#endif X newline(np, NULL, cp, NULL); X X /* -- hu: insert .~ in the .SUFFIX list; also changed dependency X * order to be: .~ .o .a .asm .s .c X */ X np = newname(".~"); X dp = newdep(np, NULL); X np = newname(".o"); X dp = newdep(np, NULL); X dp = newdep(np, dp); X np = newname(".a"); X dp = newdep(np, dp); X np = newname(".asm"); X dp = newdep(np, dp); X np = newname(".s"); X dp = newdep(np, dp); X np = newname(".c"); X dp = newdep(np, dp); X np = newname(".SUFFIXES"); X newline(np, dp, NULL, 0); X#endif X} END_OF_FILE if test 10453 -ne `wc -c <'rules.c'`; then echo shar: \"'rules.c'\" unpacked with wrong size! fi # end of 'rules.c' fi echo shar: End of archive 2 \(of 2\). cp /dev/null ark2isdone MISSING="" for I in 1 2 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked both archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@cs.odu.edu>. Mail comments to the moderator at <amiga-request@cs.odu.edu>. Post requests for sources, and general discussion to comp.sys.amiga.