+ Addition of function prototypes and include files.
+ Change function definitions to ANSI C style.
+ Initial support for CMake
--- /dev/null
+cmake_minimum_required (VERSION 2.6)
+project (ack-make)
+
+set(SRC
+ check.c
+ input.c
+ macro.c
+ make.c
+ main.c
+ reader.c
+ rules.c
+ h.h
+)
+
+# The following should be added if utime.h and unistd.h are
+# available.
+
+# add_definitions(-Dunix)
+
+add_executable(${PROJECT_NAME} ${SRC})
+
+install(TARGETS ${PROJECT_NAME} DESTINATION bin)
+
-Following is a repost of the public domain 'make' that I posted
-to net.sources a couple of months ago. I have fixed a few bugs, and
-added some more features, and the resulting changes amounted to
-about as much text as the whole program (hence the repost).
-
-For those that missed the net.sources posting, this is a public domain
-re-implementation of the UNIX make program. There is no manual included;
-for documentation, refer to a UNIX manual, or the source.
-
-Here is a list of the changes made:
-
-i) If '-' (ignore) or '@' (silent) where used at the start
- of a command, their effect was not turned off for the following
- commands.
-ii) A special target (.SUFFIXES, .PRECIOUS) or a rule (.c.o, .a.o),
- if first in the file would be taken as the default target.
- This resulted in error messages like "Don't know how to
- make .c", because things like .SUFFIXES were being made.
- This was further complicated by ---
-iii) Special target lines with no dependents (ie. .SUFFIXES:\n)
- were not clearing out the existing dependents like
- they should.
-iv) Default rules could not be redefined because of the error
- checking for commands being defined twice. Now you are
- allowed to define a target beinging with '.', having
- no dependents with commands.
-v) The -q option didn't do the time comparison correctly,
- or clear the variable used to keep track of this. Thus
- it didn't work very well.
-vi) The syntax ${..} for macro's supported by UNIX make was
- not supported.
-vii) There wuz a couple of spelling errors.
-viii) When make checked for implicit rules on targets without
- a suffix, there were problems. (Note: The ~ feature of
- UNIX make wasn't and still isn't supported)
-ix) The -n option did not print @ lines like it was supposed to.
-x) :: added. (See UNIX manual)
-xi) $? added. (see UNIX manual)
-
-Hacked further by Ceriel Jacobs to make it work better. Use this "make" to
-install ACK under Microsoft Xenix V3.2. Some of the makefiles are just too
-big for the Xenix "make". Strange, they work on a PDP-11 ...
+Following is a repost of the public domain 'make' that I posted\r
+to net.sources a couple of months ago. I have fixed a few bugs, and\r
+added some more features, and the resulting changes amounted to\r
+about as much text as the whole program (hence the repost).\r
+\r
+For those that missed the net.sources posting, this is a public domain\r
+re-implementation of the UNIX make program. There is no manual included;\r
+for documentation, refer to a UNIX manual, or the source.\r
+\r
+Here is a list of the changes made:\r
+\r
+i) If '-' (ignore) or '@' (silent) where used at the start\r
+ of a command, their effect was not turned off for the following\r
+ commands.\r
+ii) A special target (.SUFFIXES, .PRECIOUS) or a rule (.c.o, .a.o),\r
+ if first in the file would be taken as the default target.\r
+ This resulted in error messages like "Don't know how to\r
+ make .c", because things like .SUFFIXES were being made.\r
+ This was further complicated by ---\r
+iii) Special target lines with no dependents (ie. .SUFFIXES:\n)\r
+ were not clearing out the existing dependents like\r
+ they should.\r
+iv) Default rules could not be redefined because of the error\r
+ checking for commands being defined twice. Now you are\r
+ allowed to define a target beinging with '.', having\r
+ no dependents with commands.\r
+v) The -q option didn't do the time comparison correctly,\r
+ or clear the variable used to keep track of this. Thus\r
+ it didn't work very well.\r
+vi) The syntax ${..} for macro's supported by UNIX make was\r
+ not supported.\r
+vii) There wuz a couple of spelling errors.\r
+viii) When make checked for implicit rules on targets without\r
+ a suffix, there were problems. (Note: The ~ feature of\r
+ UNIX make wasn't and still isn't supported)\r
+ix) The -n option did not print @ lines like it was supposed to.\r
+x) :: added. (See UNIX manual)\r
+xi) $? added. (see UNIX manual)\r
+\r
+Hacked further by Ceriel Jacobs to make it work better. Use this "make" to\r
+install ACK under Microsoft Xenix V3.2. Some of the makefiles are just too\r
+big for the Xenix "make". Strange, they work on a PDP-11 ...\r
+\r
+Made it almost ISO C90 and POSIX portable by Carl Eric Codere, and \r
+also made it safer by using correct datatypes on some library calls.\r
#include <stdio.h>
#include "h.h"
+/*
+ * Recursive routine that does the actual checking.
+ */
+static void check(struct name *np)
+{
+ register struct depend * dp;
+ register struct line * lp;
+
+ if (np->n_flag & N_MARK)
+ fatal("Circular dependency from %s", np->n_name);
+
+ np->n_flag |= N_MARK;
+
+ for (lp = np->n_line; lp; lp = lp->l_next)
+ for (dp = lp->l_dep; dp; dp = dp->d_next)
+ check(dp->d_name);
+
+ np->n_flag &= (uchar)~N_MARK;
+}
+
/*
* Prints out the structures as defined in memory. Good for check
* that you make file does what you want (and for debugging make).
*/
-void
-prt()
+void prt(void)
{
- register struct name * np;
- register struct depend * dp;
- register struct line * lp;
- register struct cmd * cp;
- register struct macro * mp;
-
+ register struct name * np;
+ register struct depend * dp;
+ register struct line * lp;
+ register struct cmd * cp;
+ register struct macro * mp;
for (mp = macrohead; mp; mp = mp->m_next)
fprintf(stderr, "%s = %s\n", mp->m_name, mp->m_val);
{
if (np->n_flag & N_DOUBLE)
fprintf(stderr, "%s::\n", np->n_name);
- else
+ else
fprintf(stderr, "%s:\n", np->n_name);
- if (np == firstname)
+ if (np == firstname)
fprintf(stderr, "(MAIN NAME)\n");
- for (lp = np->n_line; lp; lp = lp->l_next)
- {
- fputc(':', stderr);
- for (dp = lp->l_dep; dp; dp = dp->d_next)
+ for (lp = np->n_line; lp; lp = lp->l_next)
+ {
+ fputc(':', stderr);
+ for (dp = lp->l_dep; dp; dp = dp->d_next)
fprintf(stderr, " %s", dp->d_name->n_name);
- fputc('\n', stderr);
+ fputc('\n', stderr);
- for (cp = lp->l_cmd; cp; cp = cp->c_next)
-#ifdef os9
- fprintf(stderr, "- %s\n", cp->c_cmd);
-#else
+ for (cp = lp->l_cmd; cp; cp = cp->c_next)
fprintf(stderr, "-\t%s\n", cp->c_cmd);
-#endif
+ fputc('\n', stderr);
+ }
fputc('\n', stderr);
}
- fputc('\n', stderr);
}
-}
-
-
-/*
- * Recursive routine that does the actual checking.
- */
-void
-check(np)
-struct name * np;
-{
- register struct depend * dp;
- register struct line * lp;
-
-
- if (np->n_flag & N_MARK)
- fatal("Circular dependency from %s", np->n_name);
-
- np->n_flag |= N_MARK;
-
- for (lp = np->n_line; lp; lp = lp->l_next)
- for (dp = lp->l_dep; dp; dp = dp->d_next)
- check(dp->d_name);
-
- np->n_flag &= ~N_MARK;
-}
/*
* b: a
* is a circular dep
*/
-void
-circh()
+void circh(void)
{
- register struct name * np;
-
+ register struct name * np;
for (np = namehead.n_next; np; np = np->n_next)
check(np);
}
-
/*
* Check the target .PRECIOUS, and mark its dependentd as precious
*/
-void
-precious()
+void precious(void)
{
- register struct depend * dp;
- register struct line * lp;
- register struct name * np;
-
+ register struct depend * dp;
+ register struct line * lp;
+ register struct name * np;
if (!((np = newname(".PRECIOUS"))->n_flag & N_TARG))
return;
/*
- * Include header for make
+ * Include header for make
*
- * $Header$
+ * $Header$
*/
#ifndef uchar
-#ifdef os9
-#define uchar char
-#define void int
-#define fputc putc
-#else
-#define uchar unsigned char
-#endif
+#define uchar unsigned char
#endif
-#define bool int
-#define time_t long
-#define TRUE (1)
-#define FALSE (0)
-#define max(a,b) ((a)>(b)?(a):(b))
+#include <time.h>
-#define DEFN1 "makefile" /* Default names */
-#ifdef unix
-#define DEFN2 "Makefile"
-#endif
-#ifdef eon
-#define DEFN2 "Makefile"
-#endif
-/* os9 is case insensitive */
+#define bool int
+#define TRUE (1)
+#define FALSE (0)
+
+#define DEFN1 "makefile" /* Default names */
+#define DEFN2 "Makefile"
-#define LZ (2048) /* Line size */
+#define LZ (2048) /* Line size */
/*
- * A name. This represents a file, either to be made, or existant
+ * A name. This represents a file, either to be made, or existant
*/
struct name
{
- struct name * n_next; /* Next in the list of names */
- char * n_name; /* Called */
- struct line * n_line; /* Dependencies */
- time_t n_time; /* Modify time of this name */
- uchar n_flag; /* Info about the name */
+ struct name * n_next; /* Next in the list of names */
+ char * n_name; /* Called */
+ struct line * n_line; /* Dependencies */
+ time_t n_time; /* Modify time of this name */
+ uchar n_flag; /* Info about the name */
};
-#define N_MARK 0x01 /* For cycle check */
-#define N_DONE 0x02 /* Name looked at */
-#define N_TARG 0x04 /* Name is a target */
-#define N_PREC 0x08 /* Target is precious */
-#define N_DOUBLE 0x10 /* Double colon target */
+#define N_MARK 0x01 /* For cycle check */
+#define N_DONE 0x02 /* Name looked at */
+#define N_TARG 0x04 /* Name is a target */
+#define N_PREC 0x08 /* Target is precious */
+#define N_DOUBLE 0x10 /* Double colon target */
/*
- * Definition of a target line.
+ * Definition of a target line.
*/
-struct line
+struct line
{
- struct line * l_next; /* Next line (for ::) */
- struct depend * l_dep; /* Dependents for this line */
- struct cmd * l_cmd; /* Commands for this line */
+ struct line * l_next; /* Next line (for ::) */
+ struct depend * l_dep; /* Dependents for this line */
+ struct cmd * l_cmd; /* Commands for this line */
};
/*
- * List of dependents for a line
+ * List of dependents for a line
*/
-struct depend
+struct depend
{
- struct depend * d_next; /* Next dependent */
- struct name * d_name; /* Name of dependent */
+ struct depend * d_next; /* Next dependent */
+ struct name * d_name; /* Name of dependent */
};
/*
- * Commands for a line
+ * Commands for a line
*/
-struct cmd
+struct cmd
{
- struct cmd * c_next; /* Next command line */
- char * c_cmd; /* Command line */
+ struct cmd * c_next; /* Next command line */
+ char * c_cmd; /* Command line */
};
/*
- * Macro storage
+ * Macro storage
*/
-struct macro
+struct macro
{
- struct macro * m_next; /* Next variable */
- char * m_name; /* Called ... */
- char * m_val; /* Its value */
- uchar m_flag; /* Infinite loop check */
- uchar m_prio; /* 5 levels:
- - 0 for internal ($(CC), etc)
- - 1 (reserved for environment)
- - 2 for makefile
- - 3 for command line
- - 4 for special ($*,$<, etc)
- */
+ struct macro * m_next; /* Next variable */
+ char * m_name; /* Called ... */
+ char * m_val; /* Its value */
+ uchar m_flag; /* Infinite loop check */
+ uchar m_prio; /* 5 levels:
+ - 0 for internal ($(CC), etc)
+ - 1 (reserved for environment)
+ - 2 for makefile
+ - 3 for command line
+ - 4 for special ($*,$<, etc)
+ */
};
-extern char * myname;
-extern struct name namehead;
-extern struct macro * macrohead;
-extern struct name * firstname;
-extern bool silent;
-extern bool ignore;
-extern bool rules;
-extern bool dotouch;
-extern bool quest;
-extern bool domake;
-extern char str1[];
-extern char str2[];
-extern int lineno;
-
-char * fgets();
-char * index();
-char * rindex();
-char * malloc();
-char * strcpy();
-char * strcat();
-extern int errno;
-
-void circh();
-char * getmacro();
-struct macro * setmacro();
-void input();
-void error();
-void expand();
-void fatal();
-int make();
-void modtime();
-struct name * newname();
-struct depend * newdep();
-struct cmd * newcmd();
-void newline();
-void prt();
-char * suffix();
-void touch();
-void makerules();
-char * gettok();
-void precious();
+extern char * myname;
+extern struct name namehead;
+extern struct macro * macrohead;
+extern struct name * firstname;
+extern bool silent;
+extern bool ignore;
+extern bool rules;
+extern bool dotouch;
+extern bool quest;
+extern bool domake;
+extern char str1[];
+extern char str2[];
+extern int lineno;
+
+void circh(void);
+char * getmacro(char* name);
+struct macro * setmacro(char* name, char* val, int prio);
+void input(FILE *fd);
+void error(char *msg, char* a1);
+void expand(char *str);
+void fatal(char* msg, char* value);
+bool dyndep(struct name *np);
+int make(struct name *np, int level);
+void modtime(struct name *np);
+struct name *newname(char *name);
+struct depend *newdep(struct name *np, struct depend *dp);
+struct cmd *newcmd(char *str, struct cmd *cp);
+void newline(struct name *np, struct depend *dp, struct cmd *cp, int flag);
+void prt(void);
+char *suffix(char *name);
+void touch(struct name *np);
+void makerules(void);
+char *gettok(char **ptr);
+void precious(void);
+bool mgetline(char* str, FILE* fd);
/*
- * Parse a makefile
+ * Parse a makefile
*
- * $Header$
+ * $Header$
*/
-
#include <stdio.h>
-#include <ctype.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
#include "h.h"
+struct name namehead;
+struct name * firstname;
-struct name namehead;
-struct name * firstname;
-
-char str1[LZ]; /* General store */
-char str2[LZ];
-
+char str1[LZ]; /* General store */
+char str2[LZ];
/*
- * Intern a name. Return a pointer to the name struct
+ * Intern a name. Return a pointer to the name struct
*/
-struct name *
-newname(name)
-char * name;
+struct name *newname(char *name)
{
- register struct name * rp;
- register struct name * rrp;
- register char * cp;
+ register struct name * rp;
+ register struct name * rrp;
+ register char * cp;
- for
- (
- rp = namehead.n_next, rrp = &namehead;
- rp;
- rp = rp->n_next, rrp = rrp->n_next
- )
+ for (rp = namehead.n_next, rrp = &namehead; rp;
+ rp = rp->n_next, rrp = rrp->n_next)
if (strcmp(name, rp->n_name) == 0)
return rp;
- if ((rp = (struct name *)malloc(sizeof (struct name)))
- == (struct name *)0)
- fatal("No memory for name");
+ if ((rp = (struct name *) malloc(sizeof(struct name))) == (struct name *) 0)
+ fatal("No memory for name",NULL);
rrp->n_next = rp;
- rp->n_next = (struct name *)0;
- if ((cp = malloc((unsigned)(strlen(name)+1))) == (char *)0)
- fatal("No memory for name");
+ rp->n_next = (struct name *) 0;
+ if ((cp = malloc((unsigned) (strlen(name) + 1))) == (char *) 0)
+ fatal("No memory for name",NULL);
strcpy(cp, name);
rp->n_name = cp;
- rp->n_line = (struct line *)0;
- rp->n_time = (time_t)0;
+ rp->n_line = (struct line *) 0;
+ rp->n_time = (time_t) 0;
rp->n_flag = 0;
return rp;
}
-
/*
- * Add a dependant to the end of the supplied list of dependants.
- * Return the new head pointer for that list.
+ * Add a dependant to the end of the supplied list of dependants.
+ * Return the new head pointer for that list.
*/
-struct depend *
-newdep(np, dp)
-struct name * np;
-struct depend * dp;
+struct depend *newdep(struct name *np, struct depend *dp)
{
- register struct depend * rp;
- register struct depend * rrp;
-
+ register struct depend * rp;
+ register struct depend * rrp;
- if ((rp = (struct depend *)malloc(sizeof (struct depend)))
- == (struct depend *)0)
- fatal("No memory for dependant");
- rp->d_next = (struct depend *)0;
+ if ((rp = (struct depend *) malloc(sizeof(struct depend)))
+ == (struct depend *) 0)
+ fatal("No memory for dependant",NULL);
+ rp->d_next = (struct depend *) 0;
rp->d_name = np;
- if (dp == (struct depend *)0)
+ if (dp == (struct depend *) 0)
return rp;
for (rrp = dp; rrp->d_next; rrp = rrp->d_next)
return dp;
}
-
/*
- * Add a command to the end of the supplied list of commands.
- * Return the new head pointer for that list.
+ * Add a command to the end of the supplied list of commands.
+ * Return the new head pointer for that list.
*/
-struct cmd *
-newcmd(str, cp)
-char * str;
-struct cmd * cp;
+struct cmd *newcmd(char *str, struct cmd *cp)
{
- register struct cmd * rp;
- register struct cmd * rrp;
- register char * rcp;
+ register struct cmd * rp;
+ register struct cmd * rrp;
+ register char * rcp;
-
- if (rcp = rindex(str, '\n'))
- *rcp = '\0'; /* Loose newline */
+ if ((rcp = strrchr(str, '\n')))
+ *rcp = '\0'; /* Loose newline */
while (isspace(*str))
str++;
- if (*str == '\0') /* If nothing left, the exit */
+ if (*str == '\0') /* If nothing left, the exit */
return 0;
- if ((rp = (struct cmd *)malloc(sizeof (struct cmd)))
- == (struct cmd *)0)
- fatal("No memory for command");
- rp->c_next = (struct cmd *)0;
- if ((rcp = malloc((unsigned)(strlen(str)+1))) == (char *)0)
- fatal("No memory for command");
+ if ((rp = (struct cmd *) malloc(sizeof(struct cmd))) == (struct cmd *) 0)
+ fatal("No memory for command",NULL);
+ rp->c_next = (struct cmd *) 0;
+ if ((rcp = malloc((unsigned) (strlen(str) + 1))) == (char *) 0)
+ fatal("No memory for command",NULL);
strcpy(rcp, str);
rp->c_cmd = rcp;
- if (cp == (struct cmd *)0)
+ if (cp == (struct cmd *) 0)
return rp;
for (rrp = cp; rrp->c_next; rrp = rrp->c_next)
return cp;
}
-
/*
- * Add a new 'line' of stuff to a target. This check to see
- * if commands already exist for the target. If flag is set,
- * the line is a double colon target.
+ * Add a new 'line' of stuff to a target. This check to see
+ * if commands already exist for the target. If flag is set,
+ * the line is a double colon target.
*
- * Kludges:
- * i) If the new name begins with a '.', and there are no dependents,
- * then the target must cease to be a target. This is for .SUFFIXES.
- * ii) If the new name begins with a '.', with no dependents and has
- * commands, then replace the current commands. This is for
- * redefining commands for a default rule.
- * Neither of these free the space used by dependents or commands,
- * since they could be used by another target.
+ * Kludges:
+ * i) If the new name begins with a '.', and there are no dependents,
+ * then the target must cease to be a target. This is for .SUFFIXES.
+ * ii) If the new name begins with a '.', with no dependents and has
+ * commands, then replace the current commands. This is for
+ * redefining commands for a default rule.
+ * Neither of these free the space used by dependents or commands,
+ * since they could be used by another target.
*/
-void
-newline(np, dp, cp, flag)
-struct name * np;
-struct depend * dp;
-struct cmd * cp;
+void newline(struct name *np, struct depend *dp, struct cmd *cp, int flag)
{
- bool hascmds = FALSE; /* Target has commands */
- register struct line * rp;
- register struct line * rrp;
-
+ bool hascmds = FALSE; /* Target has commands */
+ register struct line * rp;
+ register struct line * rrp;
/* Handle the .SUFFIXES case */
- if (! strcmp(np->n_name, ".SUFFIXES") && !dp && !cp)
+ if (!strcmp(np->n_name, ".SUFFIXES") && !dp && !cp)
{
for (rp = np->n_line; rp; rp = rrp)
{
rrp = rp->l_next;
- free((char *)rp);
+ free((char *) rp);
}
- np->n_line = (struct line *)0;
- np->n_flag &= ~N_TARG;
+ np->n_line = (struct line *) 0;
+ np->n_flag &= (uchar)~N_TARG;
return;
}
/* This loop must happen since rrp is used later. */
- for
- (
- rp = np->n_line, rrp = (struct line *)0;
- rp;
- rrp = rp, rp = rp->l_next
- )
+ for (rp = np->n_line, rrp = (struct line *) 0; rp;
+ rrp = rp, rp = rp->l_next)
if (rp->l_cmd)
hascmds = TRUE;
if (hascmds && cp && !(np->n_flag & N_DOUBLE))
/* Handle the implicit rules redefinition case */
- if (np->n_name[0] == '.' && dp == (struct depend *)0)
+ if (np->n_name[0] == '.' && dp == (struct depend *) 0)
{
np->n_line->l_cmd = cp;
return;
else
error("Commands defined twice for target %s", np->n_name);
if (np->n_flag & N_TARG)
- if (!(np->n_flag & N_DOUBLE) != !flag) /* like xor */
+ if (!(np->n_flag & N_DOUBLE) != !flag) /* like xor */
error("Inconsistent rules for target %s", np->n_name);
- if ((rp = (struct line *)malloc(sizeof (struct line)))
- == (struct line *)0)
- fatal("No memory for line");
- rp->l_next = (struct line *)0;
+ if ((rp = (struct line *) malloc(sizeof(struct line))) == (struct line *) 0)
+ fatal("No memory for line",NULL);
+ rp->l_next = (struct line *) 0;
rp->l_dep = dp;
rp->l_cmd = cp;
np->n_flag |= N_DOUBLE;
}
-
/*
- * Parse input from the makefile, and construct a tree structure
- * of it.
+ * Parse input from the makefile, and construct a tree structure
+ * of it.
*/
-void
-input(fd)
-FILE * fd;
+void input(FILE *fd)
{
- char * p; /* General */
- char * q;
- struct name * np;
- struct depend * dp;
- struct cmd * cp;
- bool dbl;
-
-
- if (getline(str1, fd)) /* Read the first line */
+ char * p; /* General */
+ char * q;
+ struct name * np;
+ struct depend * dp;
+ struct cmd * cp;
+ bool dbl;
+
+ if (mgetline(str1, fd)) /* Read the first line */
return;
- for(;;)
+ for (;;)
{
-#ifdef os9
- if (*str1 == ' ') /* Rules without targets */
-#else
- if (*str1 == '\t') /* Rules without targets */
-#endif
- error("Rules not allowed here");
+ if (*str1 == '\t') /* Rules without targets */
+ error("Rules not allowed here", NULL );
p = str1;
- while (isspace(*p)) /* Find first target */
+ while (isspace(*p)) /* Find first target */
p++;
- while (((q = index(p, '=')) != (char *)0) &&
- (p != q) && (q[-1] == '\\')) /* Find value */
+ while (((q = strchr(p, '=')) != (char *) 0) && (p != q)
+ && (q[-1] == '\\')) /* Find value */
{
- register char * a;
+ register char * a;
- a = q - 1; /* Del \ chr; move rest back */
+ a = q - 1; /* Del \ chr; move rest back */
p = q;
- while(*a++ = *q++)
+ while ((*a++ = *q++))
;
}
- if (q != (char *)0)
+ if (q != (char *) 0)
{
- register char * a;
+ register char * a;
- *q++ = '\0'; /* Separate name and val */
+ *q++ = '\0'; /* Separate name and val */
while (isspace(*q))
q++;
- if (p = rindex(q, '\n'))
+ if ((p = strrchr(q, '\n')))
*p = '\0';
p = str1;
- if ((a = gettok(&p)) == (char *)0)
- error("No macro name");
+ if ((a = gettok(&p)) == (char *) 0)
+ error("No macro name", NULL );
setmacro(a, q, 2);
- if (getline(str1, fd))
+ if (mgetline(str1, fd))
return;
continue;
}
expand(str1);
p = str1;
- while (((q = index(p, ':')) != (char *)0) &&
- (p != q) && (q[-1] == '\\')) /* Find dependents */
+ while (((q = strchr(p, ':')) != (char *) 0) && (p != q)
+ && (q[-1] == '\\')) /* Find dependents */
{
- register char * a;
+ register char * a;
- a = q - 1; /* Del \ chr; move rest back */
+ a = q - 1; /* Del \ chr; move rest back */
p = q;
- while(*a++ = *q++)
+ while ((*a++ = *q++))
;
}
- if (q == (char *)0)
- error("No targets provided");
+ if (q == (char *) 0)
+ error("No targets provided", NULL );
- *q++ = '\0'; /* Separate targets and dependents */
+ *q++ = '\0'; /* Separate targets and dependents */
- if (*q == ':') /* Double colon */
+ if (*q == ':') /* Double colon */
{
dbl = 1;
q++;
else
dbl = 0;
- for (dp = (struct depend *)0; ((p = gettok(&q)) != (char *)0);)
- /* get list of dep's */
+ for (dp = (struct depend *) 0; ((p = gettok(&q)) != (char *) 0);)
+ /* get list of dep's */
{
- np = newname(p); /* Intern name */
- dp = newdep(np, dp); /* Add to dep list */
+ np = newname(p); /* Intern name */
+ dp = newdep(np, dp); /* Add to dep list */
}
*((q = str1) + strlen(str1) + 1) = '\0';
- /* Need two nulls for gettok (Remember separation) */
+ /* Need two nulls for gettok (Remember separation) */
- cp = (struct cmd *)0;
- if (getline(str2, fd) == FALSE) /* Get commands */
+ cp = (struct cmd *) 0;
+ if (mgetline(str2, fd) == FALSE) /* Get commands */
{
-#ifdef os9
- while (*str2 == ' ')
-#else
while (*str2 == '\t')
-#endif
{
cp = newcmd(&str2[0], cp);
- if (getline(str2, fd))
+ if (mgetline(str2, fd))
break;
}
}
- while ((p = gettok(&q)) != (char *)0) /* Get list of targ's */
+ while ((p = gettok(&q)) != (char *) 0) /* Get list of targ's */
{
- np = newname(p); /* Intern name */
+ np = newname(p); /* Intern name */
newline(np, dp, cp, dbl);
if (!firstname && p[0] != '.')
firstname = np;
}
- if (feof(fd)) /* EOF? */
+ if (feof(fd)) /* EOF? */
return;
strcpy(str1, str2);
/*
- * Macro control for make
+ * Macro control for make
*
- * $Header$
+ * $Header$
*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
#include "h.h"
-struct macro * macrohead;
+struct macro * macrohead;
-struct macro *
-getmp(name)
-char * name;
+static struct macro *getmp(char *name)
{
- register struct macro * rp;
+ register struct macro * rp;
- for (rp = macrohead; rp; rp = rp->m_next)
- if (strcmp(name, rp->m_name) == 0)
- return rp;
- return (struct macro *)0;
+ for (rp = macrohead; rp; rp = rp->m_next)
+ if (strcmp(name, rp->m_name) == 0)
+ return rp;
+ return (struct macro *)0;
}
-char *
-getmacro(name)
-char * name;
+char * getmacro(char* name)
{
- struct macro * mp;
+ struct macro * mp;
- if (mp = getmp(name))
- return mp->m_val;
- else
- return "";
+ if ((mp = getmp(name)))
+ return mp->m_val;
+ else
+ return "";
}
-struct macro *
-setmacro(name, val, prio)
-char * name;
-char * val;
+struct macro * setmacro(char* name, char* val, int prio)
{
- register struct macro * rp;
- register char * cp;
-
-
- /* Replace macro definition if it exists */
- for (rp = macrohead; rp; rp = rp->m_next)
- if (strcmp(name, rp->m_name) == 0)
- {
- if (prio < rp->m_prio)
- return rp;
- free(rp->m_val); /* Free space from old */
- break;
- }
-
- if (!rp) /* If not defined, allocate space for new */
- {
- if ((rp = (struct macro *)malloc(sizeof (struct macro)))
- == (struct macro *)0)
- fatal("No memory for macro");
-
- rp->m_next = macrohead;
- macrohead = rp;
- rp->m_flag = FALSE;
-
- if ((cp = malloc((unsigned)(strlen(name)+1))) == (char *)0)
- fatal("No memory for macro");
- strcpy(cp, name);
- rp->m_name = cp;
- }
-
- if ((cp = malloc((unsigned)(strlen(val)+1))) == (char *)0)
- fatal("No memory for macro");
- strcpy(cp, val); /* Copy in new value */
- rp->m_val = cp;
- rp->m_prio = prio;
-
- return rp;
+ register struct macro * rp;
+ register char * cp;
+
+
+ /* Replace macro definition if it exists */
+ for (rp = macrohead; rp; rp = rp->m_next)
+ if (strcmp(name, rp->m_name) == 0)
+ {
+ if (prio < rp->m_prio)
+ return rp;
+ free(rp->m_val); /* Free space from old */
+ break;
+ }
+
+ if (!rp) /* If not defined, allocate space for new */
+ {
+ if ((rp = (struct macro *)malloc(sizeof (struct macro)))
+ == (struct macro *)0)
+ fatal("No memory for macro",NULL);
+
+ rp->m_next = macrohead;
+ macrohead = rp;
+ rp->m_flag = FALSE;
+
+ if ((cp = malloc((unsigned)(strlen(name)+1))) == (char *)0)
+ fatal("No memory for macro",NULL);
+ strcpy(cp, name);
+ rp->m_name = cp;
+ }
+
+ if ((cp = malloc((unsigned)(strlen(val)+1))) == (char *)0)
+ fatal("No memory for macro",NULL);
+ strcpy(cp, val); /* Copy in new value */
+ rp->m_val = cp;
+ rp->m_prio = (uchar)prio;
+
+ return rp;
}
-#define MBUFSIZ 128
+#define MBUFSIZ 128
/*
- * Do the dirty work for expand
+ * Do the dirty work for expand
*/
-void
-doexp(to, from, len, buf)
-char ** to;
-char * from;
-int * len;
-char * buf;
+static void doexp(char **to, char* from, int* len, char* buf)
{
- register char * rp;
- register char * p;
- register char * q;
- register struct macro * mp;
-
-
- rp = from;
- p = *to;
- while (*rp)
- {
- if (*rp != '$')
- {
- *p++ = *rp++;
- (*len)--;
- }
- else
- {
- q = buf;
- if (*++rp == '{')
- while (*++rp && *rp != '}') {
- if (q < &buf[MBUFSIZ-1]) *q++ = *rp;
- }
- else if (*rp == '(')
- while (*++rp && *rp != ')') {
- if (q < &buf[MBUFSIZ-1]) *q++ = *rp;
- }
- else if (!*rp)
- {
- *p++ = '$';
- break;
- }
- else
- *q++ = *rp;
- *q = '\0';
- if (*rp)
- rp++;
- if (!(mp = getmp(buf)))
- mp = setmacro(buf, "", 2);
- if (mp->m_flag)
- fatal("Infinitely recursive macro %s", mp->m_name);
- mp->m_flag = TRUE;
- *to = p;
- doexp(to, mp->m_val, len, buf);
- p = *to;
- mp->m_flag = FALSE;
- }
- if (*len <= 0)
- error("Expanded line too line");
- }
- *p = '\0';
- *to = p;
+ register char * rp;
+ register char * p;
+ register char * q;
+ register struct macro * mp;
+
+
+ rp = from;
+ p = *to;
+ while (*rp)
+ {
+ if (*rp != '$')
+ {
+ *p++ = *rp++;
+ (*len)--;
+ }
+ else
+ {
+ q = buf;
+ if (*++rp == '{')
+ while (*++rp && *rp != '}') {
+ if (q < &buf[MBUFSIZ-1]) *q++ = *rp;
+ }
+ else if (*rp == '(')
+ while (*++rp && *rp != ')') {
+ if (q < &buf[MBUFSIZ-1]) *q++ = *rp;
+ }
+ else if (!*rp)
+ {
+ *p++ = '$';
+ break;
+ }
+ else
+ *q++ = *rp;
+ *q = '\0';
+ if (*rp)
+ rp++;
+ if (!(mp = getmp(buf)))
+ mp = setmacro(buf, "", 2);
+ if (mp->m_flag)
+ fatal("Infinitely recursive macro %s", mp->m_name);
+ mp->m_flag = TRUE;
+ *to = p;
+ doexp(to, mp->m_val, len, buf);
+ p = *to;
+ mp->m_flag = FALSE;
+ }
+ if (*len <= 0)
+ error("Expanded line too line", NULL);
+ }
+ *p = '\0';
+ *to = p;
}
/*
- * Expand any macros in str.
+ * Expand any macros in str.
*/
-void
-expand(str)
-char * str;
+void expand(char *str)
{
- char *a;
- static char b[MBUFSIZ]; /* temp storage for macroname */
- char * p = str;
- int len = LZ-1;
-
- a = malloc((unsigned)(strlen(str)+1));
- if (!a) fatal("No memory for expand");
- strcpy(a, str);
- doexp(&p, a, &len, b);
- free(a);
+ char *a;
+ static char b[MBUFSIZ]; /* temp storage for macroname */
+ char * p = str;
+ int len = LZ-1;
+
+ a = malloc((unsigned)(strlen(str)+1));
+ if (!a) fatal("No memory for expand",NULL);
+ strcpy(a, str);
+ doexp(&p, a, &len, b);
+ free(a);
}
/*
- * make [-f makefile] [-ins] [target(s) ...]
+ * make [-f makefile] [-ins] [target(s) ...]
*
- * (Better than EON mk but not quite as good as UNIX make)
+ * (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)
- * -k For the time being: accept but ignore
+ * -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)
+ * -k For the time being: accept but ignore
*
- * $Header$
+ * $Header$
*/
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include "h.h"
-#ifdef unix
-#include <errno.h>
-#endif
+char * myname;
+char * makefile; /* The make file */
#ifdef eon
-#include <sys/err.h>
-#endif
-#ifdef os9
-#include <errno.h>
+unsigned memspace = MEMSPACE;
#endif
+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 */
-#ifdef eon
-#define MEMSPACE (16384)
-#endif
+static void usage(void);
-char * myname;
-char * makefile; /* The make file */
-#ifdef eon
-unsigned memspace = MEMSPACE;
-#endif
-
-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 */
-
-
-void
-main(argc, argv)
-int argc;
-char ** argv;
+int main(int argc, char** argv)
{
- register char * p; /* For argument processing */
- int estat = 0; /* For question */
- register struct name * np;
- int nargc = 0;
- char **nargv;
- int fflag = 0;
-
-
- myname = (argc-- < 1) ? "make" : *argv++;
- nargv = argv;
-
- while (argc > 0)
- {
- argc--; /* One less to process */
- p = *argv++; /* Now processing this one */
-
- if (*p == '-') while (*++p != '\0')
- {
- switch(*p)
- {
- case 'f': /* Alternate file name */
- fflag = 1;
- break;
-#ifdef eon
- case 'm': /* Change space requirements */
- if (*++p == '\0')
- {
- if (argc-- <= 0)
- usage();
- p = *argv++;
- }
- memspace = atoi(p);
- goto end_of_args;
-#endif
- case 'n': /* Pretend mode */
- domake = FALSE;
- break;
- case 'i': /* Ignore fault mode */
- ignore = TRUE;
- break;
- case 's': /* Silent about commands */
- silent = TRUE;
- break;
- case 'p':
- print = TRUE;
- break;
- case 'r':
- rules = FALSE;
- break;
- case 't':
- dotouch = TRUE;
- break;
- case 'q':
- quest = TRUE;
- break;
- case 'k':
- break;
- default: /* Wrong option */
- usage();
- }
- }
- else {
- if (fflag) {
- if (argc <= 0) usage();
- makefile = p;
- fflag = 0;
- }
- else {
- nargc++;
- *nargv++ = p;
- }
- }
- end_of_args:;
- }
- argv = nargv - nargc;
- argc = nargc;
-
-#ifdef eon
- if (initalloc(memspace) == 0xffff) /* Must get memory for alloc */
- fatal("Cannot initalloc memory");
-#endif
-
- if (makefile && strcmp(makefile, "-") == 0) /* Can use stdin as makefile */
- ifd = stdin;
- else
- if (!makefile) /* If no file, then use default */
- {
- if ((ifd = fopen(DEFN1, "r")) == (FILE *)0)
-#ifdef eon
- if (errno != ER_NOTF)
- fatal("Can't open %s; error %02x", DEFN1, errno);
-#endif
-#ifdef unix
- if (errno != ENOENT)
- fatal("Can't open %s; error %02x", DEFN1, errno);
-#endif
-#ifndef os9
- if ((ifd == (FILE *)0)
- && ((ifd = fopen(DEFN2, "r")) == (FILE *)0))
- fatal("Can't open %s", DEFN2);
-#else
- fatal("Can't open %s", DEFN1);
-#endif
- }
- else
- if ((ifd = fopen(makefile, "r")) == (FILE *)0)
- fatal("Can't open %s", makefile);
-
- makerules();
-
- setmacro("$", "$", 4);
-
- while (argc && (p = index(*argv, '=')))
- {
- char c;
-
- c = *p;
- *p = '\0';
- setmacro(*argv, p+1, 3);
- *p = c;
-
- argv++;
- argc--;
- }
-
- input(ifd); /* Input all the gunga */
- fclose(ifd); /* Finished with makefile */
- 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)
- fatal("No targets defined");
-
- circh(); /* Check circles in target definitions */
-
- if (!argc)
- estat = make(firstname, 0);
- 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);
+ register char * p; /* For argument processing */
+ int estat = 0; /* For question */
+ register struct name * np;
+ int nargc = 0;
+ char **nargv;
+ int fflag = 0;
+
+
+ myname = (argc-- < 1) ? "make" : *argv++;
+ nargv = argv;
+
+ while (argc > 0)
+ {
+ argc--; /* One less to process */
+ p = *argv++; /* Now processing this one */
+
+ if (*p == '-') while (*++p != '\0')
+ {
+ switch(*p)
+ {
+ case 'f': /* Alternate file name */
+ fflag = 1;
+ break;
+ case 'n': /* Pretend mode */
+ domake = FALSE;
+ break;
+ case 'i': /* Ignore fault mode */
+ ignore = TRUE;
+ break;
+ case 's': /* Silent about commands */
+ silent = TRUE;
+ break;
+ case 'p':
+ print = TRUE;
+ break;
+ case 'r':
+ rules = FALSE;
+ break;
+ case 't':
+ dotouch = TRUE;
+ break;
+ case 'q':
+ quest = TRUE;
+ break;
+ case 'k':
+ break;
+ default: /* Wrong option */
+ usage();
+ }
+ }
+ else {
+ if (fflag) {
+ if (argc <= 0) usage();
+ makefile = p;
+ fflag = 0;
+ }
+ else {
+ nargc++;
+ *nargv++ = p;
+ }
+ }
+ end_of_args:;
+ }
+ argv = nargv - nargc;
+ argc = nargc;
+
+
+ if (makefile && strcmp(makefile, "-") == 0) /* Can use stdin as makefile */
+ ifd = stdin;
+ else
+ if (!makefile) /* If no file, then use default */
+ {
+ if ((ifd = fopen(DEFN1, "r")) == NULL)
+ if ((ifd == NULL)
+ && ((ifd = fopen(DEFN2, "r")) == NULL))
+ fatal("Can't open %s", DEFN2);
+ }
+ else
+ if ((ifd = fopen(makefile, "r")) == NULL)
+ fatal("Can't open %s", makefile);
+
+ makerules();
+
+ setmacro("$", "$", 4);
+
+ while (argc && (p = strchr(*argv, '=')))
+ {
+ char c;
+
+ c = *p;
+ *p = '\0';
+ setmacro(*argv, p+1, 3);
+ *p = c;
+
+ argv++;
+ argc--;
+ }
+
+ input(ifd); /* Input all the gunga */
+ fclose(ifd); /* Finished with makefile */
+ 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)
+ fatal("No targets defined",NULL);
+
+ circh(); /* Check circles in target definitions */
+
+ if (!argc)
+ estat = make(firstname, 0);
+ 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);
+ return 0;
}
-usage()
+static void usage(void)
{
- fprintf(stderr, "Usage: %s [-f makefile] [-inpqrst] [macro=val ...] [target(s) ...]\n", myname);
- exit(1);
+ fprintf(stderr, "Usage: %s [-f makefile] [-inpqrst] [macro=val ...] [target(s) ...]\n", myname);
+ exit(1);
}
/*VARARGS1*/
-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);
-}
-
-char *
-index(s, c)
- register char *s, c;
+void fatal(char *msg, char* value)
{
- while (*s)
- if (*s++ == c)
- return --s;
- return (char *)0;
+ if (value != NULL)
+ {
+ fprintf(stderr, "%s: ", myname);
+ fprintf(stderr, msg, value);
+ } else
+ {
+ fprintf(stderr, "%s: ", myname);
+ fprintf(stderr, msg);
+ }
+ fputc('\n', stderr);
+ exit(1);
}
-char *
-rindex(str, chr)
- register char *str, chr;
-{
- register char *retptr = 0;
-
- while (*str)
- if (*str++ == chr)
- retptr = &str[-1];
- return retptr;
-}
/*
- * Do the actual making for make
+ * Do the actual making for make
*
- * $Header$
+ * $Header$
*/
#include <stdio.h>
-#ifdef unix
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
+/* UNIX specific */
+#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
+#ifndef unix
+#define unix
#endif
-#ifdef eon
-#include <sys/stat.h>
-#include <sys/err.h>
-#endif
-#ifdef os9
-#include <time.h>
-#include <os9.h>
-#include <modes.h>
-#include <direct.h>
-#include <errno.h>
#endif
-#include "h.h"
-
-
-/*
- * Exec a shell that returns exit status correctly (/bin/esh).
- * The standard EON shell returns the process number of the last
- * async command, used by the debugger (ugg).
- * [exec on eon is like a fork+exec on unix]
- */
-int
-dosh(string, shell)
-char * string;
-char * shell;
-{
- int number;
-
-#ifdef unix
- return system(string);
+#if defined(__MINGW32__) || defined(__MINGW64__)
+#ifndef unix
+#define unix
#endif
-#ifdef eon
- return ((number = execl(shell, shell,"-c", string, 0)) == -1) ?
- -1: /* couldn't start the shell */
- wait(number); /* return its exit status */
#endif
-#ifdef os9
- int status, pid;
-
- strcat(string, "\n");
- if ((number = os9fork(shell, strlen(string), string, 0, 0, 0)) == -1)
- return -1; /* Couldn't start a shell */
- do
- {
- if ((pid = wait(&status)) == -1)
- return -1; /* child already died!?!? */
- } while (pid != number);
-
- return status;
-#endif
-}
-/*
- * Do commands to make a target
- */
-void
-docmds1(np, lp)
-struct name * np;
-struct line * lp;
-{
- bool ssilent;
- bool signore;
- int estat;
- register char * q;
- register char * p;
- char * shell;
- register struct cmd * cp;
-
-
- if (*(shell = getmacro("SHELL")) == '\0')
-#ifdef eon
- shell = ":bin/esh";
-#endif
+
#ifdef unix
- shell = "/bin/sh";
-#endif
-#ifdef os9
- shell = "shell";
+#include <unistd.h>
+#include <utime.h>
#endif
+#include "h.h"
- for (cp = lp->l_cmd; cp; cp = cp->c_next)
- {
- strcpy(str1, cp->c_cmd);
- expand(str1);
- q = str1;
- ssilent = silent;
- signore = ignore;
- while ((*q == '@') || (*q == '-'))
- {
- if (*q == '@') /* Specific silent */
- ssilent = TRUE;
- else /* Specific ignore */
- signore = TRUE;
- q++; /* Not part of the command */
- }
-
- if (!domake)
- ssilent = 0;
-
- if (!ssilent)
- fputs(" ", stdout);
-
- for (p=q; *p; p++)
- {
- if (*p == '\n' && p[1] != '\0')
- {
- *p = ' ';
- if (!ssilent)
- fputs("\\\n", stdout);
- }
- else if (!ssilent)
- putchar(*p);
- }
- if (!ssilent) {
- putchar('\n');
- fflush(stdout);
- }
-
- if (domake)
- { /* Get the shell to execute it */
- if ((estat = dosh(q, shell)) != 0)
- {
- if (estat == -1)
- fatal("Couldn't execute %s", shell);
- else
- {
- printf("%s: Error code %d", myname, estat);
- if (signore)
- fputs(" (Ignored)\n", stdout);
- else
- {
- putchar('\n');
- if (!(np->n_flag & N_PREC))
- if (unlink(np->n_name) == 0)
- printf("%s: '%s' removed.\n", myname, np->n_name);
- exit(1);
- }
- }
- fflush(stdout);
- }
- }
- }
-}
-
-
-docmds(np)
-struct name * np;
-{
- register struct line * lp;
-
+void docmds(struct name *np);
- for (lp = np->n_line; lp; lp = lp->l_next)
- docmds1(np, lp);
-}
+#ifndef max
+#define max(a,b) ((a)>(b)?(a):(b))
+#endif
-#ifdef os9
/*
- * Some stuffing around to get the modified time of a file
- * in an os9 file system
+ * Exec a shell that returns exit status correctly (/bin/esh).
+ * The standard EON shell returns the process number of the last
+ * async command, used by the debugger (ugg).
+ * [exec on eon is like a fork+exec on unix]
*/
-getmdate(fd, tbp)
-struct sgtbuf * tbp;
+static int dosh(char *string, char *shell)
{
- struct registers regs;
- static struct fildes fdbuf;
-
-
- regs.rg_a = fd;
- regs.rg_b = SS_FD;
- regs.rg_x = &fdbuf;
- regs.rg_y = sizeof (fdbuf);
-
- if (_os9(I_GETSTT, ®s) == -1)
- {
- errno = regs.rg_b & 0xff;
- return -1;
- }
- if (tbp)
- {
- _strass(tbp, fdbuf.fd_date, sizeof (fdbuf.fd_date));
- tbp->t_second = 0; /* Files are only acurate to mins */
- }
- return 0;
+ return system(string);
}
/*
- * Kludge routine to return an aproximation of how many
- * seconds since 1980. Dates will be in order, but will not
- * be lineer
+ * Do commands to make a target
*/
-time_t
-cnvtime(tbp)
-struct sgtbuf *tbp;
+static void docmds1(struct name *np, struct line *lp)
{
- long acc;
-
+ bool ssilent;
+ bool signore;
+ int estat;
+ register char * q;
+ register char * p;
+ char * shell;
+ register struct cmd * cp;
- acc = tbp->t_year - 80; /* Baseyear is 1980 */
- acc = acc * 12 + tbp->t_month;
- acc = acc * 31 + tbp->t_day;
- acc = acc * 24 + tbp->t_hour;
- acc = acc * 60 + tbp->t_minute;
- acc = acc * 60 + tbp->t_second;
- return acc;
+ if (*(shell = getmacro("SHELL")) == '\0')
+#ifdef unix
+ shell = "/bin/sh";
+#endif
+ for (cp = lp->l_cmd; cp; cp = cp->c_next)
+ {
+ strcpy(str1, cp->c_cmd);
+ expand(str1);
+ q = str1;
+ ssilent = silent;
+ signore = ignore;
+ while ((*q == '@') || (*q == '-'))
+ {
+ if (*q == '@') /* Specific silent */
+ ssilent = TRUE;
+ else /* Specific ignore */
+ signore = TRUE;
+ q++; /* Not part of the command */
+ }
+
+ if (!domake)
+ ssilent = 0;
+
+ if (!ssilent)
+ fputs(" ", stdout);
+
+ for (p=q; *p; p++)
+ {
+ if (*p == '\n' && p[1] != '\0')
+ {
+ *p = ' ';
+ if (!ssilent)
+ fputs("\\\n", stdout);
+ }
+ else if (!ssilent)
+ putchar(*p);
+ }
+ if (!ssilent) {
+ putchar('\n');
+ fflush(stdout);
+ }
+
+ if (domake)
+ { /* Get the shell to execute it */
+ if ((estat = dosh(q, shell)) != 0)
+ {
+ if (estat == -1)
+ fatal("Couldn't execute %s", shell);
+ else
+ {
+ printf("%s: Error code %d", myname, estat);
+ if (signore)
+ fputs(" (Ignored)\n", stdout);
+ else
+ {
+ putchar('\n');
+ if (!(np->n_flag & N_PREC))
+ if (remove(np->n_name) == 0)
+ printf("%s: '%s' removed.\n", myname, np->n_name);
+ exit(1);
+ }
+ }
+ fflush(stdout);
+ }
+ }
+ }
}
-/*
- * Get the current time in the internal format
- */
-time(tp)
-time_t * tp;
+void docmds(struct name *np)
{
- struct sgtbuf tbuf;
+ register struct line * lp;
- if (getime(&tbuf) < 0)
- return -1;
-
- if (tp)
- *tp = cnvtime(&tbuf);
-
- return 0;
+ for (lp = np->n_line; lp; lp = lp->l_next)
+ docmds1(np, lp);
}
-#endif
/*
- * Get the modification time of a file. If the first
- * doesn't exist, it's modtime is set to 0.
+ * Get the modification time of a file. If the first
+ * doesn't exist, it's modtime is set to 0.
*/
-void
-modtime(np)
-struct name * np;
+void modtime(struct name *np)
{
-#ifdef unix
- struct stat info;
+ struct stat info;
+ if (stat(np->n_name, &info) < 0)
+ {
+ if (errno != ENOENT)
+ fatal("Can't open %s", np->n_name);
- if (stat(np->n_name, &info) < 0)
- {
- if (errno != ENOENT)
- fatal("Can't open %s; error %d", np->n_name, errno);
-
- np->n_time = 0L;
- }
- else
- np->n_time = info.st_mtime;
-#endif
-#ifdef eon
- struct stat info;
- int fd;
-
-
- if ((fd = open(np->n_name, 0)) < 0)
- {
- if (errno != ER_NOTF)
- fatal("Can't open %s; error %02x", np->n_name, errno);
-
- np->n_time = 0L;
- }
- else if (getstat(fd, &info) < 0)
- fatal("Can't getstat %s; error %02x", np->n_name, errno);
- else
- np->n_time = info.st_mod;
-
- close(fd);
-#endif
-#ifdef os9
- struct sgtbuf info;
- int fd;
-
-
- if ((fd = open(np->n_name, 0)) < 0)
- {
- if (errno != E_PNNF)
- fatal("Can't open %s; error %02x", np->n_name, errno);
-
- np->n_time = 0L;
- }
- else if (getmdate(fd, &info) < 0)
- fatal("Can't getstat %s; error %02x", np->n_name, errno);
- else
- np->n_time = cnvtime(&info);
-
- close(fd);
-#endif
+ np->n_time = 0L;
+ }
+ else
+ np->n_time = info.st_mtime;
}
/*
- * Update the mod time of a file to now.
+ * Update the mod time of a file to now.
*/
-void
-touch(np)
-struct name * np;
+void touch(struct name *np)
{
- char c;
- int fd;
-
-
- if (!domake || !silent)
- printf(" touch(%s)\n", np->n_name);
-
- if (domake)
- {
#ifdef unix
- long a[2];
- long time();
-
- a[0] = a[1] = time((long *)0);
- if (utime(np->n_name, &a[0]) < 0)
- printf("%s: '%s' not touched - non-existant\n",
- myname, np->n_name);
+ if (!domake || !silent)
+ printf(" touch(%s)\n", np->n_name);
+
+ if (domake)
+ {
+ struct utimbuf a;
+ time_t timeval;
+
+ a.actime = a.modtime = time(&timeval);
+ if (utime(np->n_name, &a) < 0)
+ printf("%s: '%s' not touched - non-existant\n",
+ myname, np->n_name);
+ }
#endif
-#ifdef eon
- if ((fd = open(np->n_name, 0)) < 0)
- printf("%s: '%s' not touched - non-existant\n",
- myname, np->n_name);
- else
- {
- uread(fd, &c, 1, 0);
- uwrite(fd, &c, 1);
- }
- close(fd);
-#endif
-#ifdef os9
- /*
- * Strange that something almost as totally useless
- * as this is easy to do in os9!
- */
- if ((fd = open(np->n_name, S_IWRITE)) < 0)
- printf("%s: '%s' not touched - non-existant\n",
- myname, np->n_name);
- close(fd);
-#endif
- }
+}
+
+static void make1(struct name *np, struct line *lp, struct depend *qdp)
+{
+ register struct depend * dp;
+ register char *p;
+
+ if (dotouch)
+ touch(np);
+ else
+ {
+ strcpy(str1, "");
+ for (dp = qdp; dp; dp = qdp)
+ {
+ if (strlen(str1))
+ strcat(str1, " ");
+ strcat(str1, dp->d_name->n_name);
+ qdp = dp->d_next;
+ free((char *)dp);
+ }
+ setmacro("?", str1, 4);
+ setmacro("@", np->n_name, 4);
+ p = strrchr(np->n_name, '.');
+ if (p) *p = 0;
+ setmacro("*", np->n_name, 4);
+ if (p) *p = '.';
+ if (lp) /* lp set if doing a :: rule */
+ docmds1(np, lp);
+ else
+ docmds(np);
+ }
}
/*
- * Recursive routine to make a target.
+ * Recursive routine to make a target.
*/
-int
-make(np, level)
-struct name * np;
-int level;
+int make(struct name *np, int level)
{
- register struct depend * dp;
- register struct line * lp;
- register struct depend * qdp;
- time_t dtime = 1;
- bool didsomething = 0;
- int dynamic = 0;
-
-
- if (np->n_flag & N_DONE)
- return 0;
-
- if (!np->n_time)
- modtime(np); /* Gets modtime of this file */
-
- if (rules)
- {
- for (lp = np->n_line; lp; lp = lp->l_next)
- if (lp->l_cmd)
- break;
- if (!lp) {
- dyndep(np);
- dynamic = 1;
- }
- }
-
- if (!(np->n_flag & N_TARG) && np->n_time == 0L)
- fatal("Don't know how to make %s", np->n_name);
-
- for (qdp = (struct depend *)0, lp = np->n_line; lp; lp = lp->l_next)
- {
- for (dp = lp->l_dep; dp; dp = dp->d_next)
- {
- char *sv = 0;
- if (dynamic) {
- char *s = getmacro("<");
-
- if (s) {
- sv = malloc((unsigned)(strlen(s)+1));
- if (!sv) {
- fatal("no space for saved $<");
- }
- strcpy(sv, s);
- }
- }
- make(dp->d_name, level+1);
- if (dynamic && sv) {
- setmacro("<", sv, 4);
- free(sv);
- }
- if (np->n_time < dp->d_name->n_time)
- qdp = newdep(dp->d_name, qdp);
- dtime = max(dtime, dp->d_name->n_time);
- }
- if (!quest && (np->n_flag & N_DOUBLE) && (np->n_time < dtime))
- {
- make1(np, lp, qdp); /* free()'s qdp */
- dtime = 1;
- qdp = (struct depend *)0;
- didsomething++;
- }
- }
-
- np->n_flag |= N_DONE;
-
- if (quest)
- {
- long t;
-
- t = np->n_time;
- time(&np->n_time);
- return t < dtime;
- }
- else if (np->n_time < dtime && !(np->n_flag & N_DOUBLE))
- {
- make1(np, (struct line *)0, qdp); /* free()'s qdp */
- time(&np->n_time);
- }
- else if (level == 0 && !didsomething)
- printf("%s: '%s' is up to date\n", myname, np->n_name);
- return 0;
+ register struct depend * dp;
+ register struct line * lp;
+ register struct depend * qdp;
+ time_t dtime = 1;
+ bool didsomething = 0;
+ int dynamic = 0;
+
+
+ if (np->n_flag & N_DONE)
+ return 0;
+
+ if (!np->n_time)
+ modtime(np); /* Gets modtime of this file */
+
+ if (rules)
+ {
+ for (lp = np->n_line; lp; lp = lp->l_next)
+ if (lp->l_cmd)
+ break;
+ if (!lp) {
+ dyndep(np);
+ dynamic = 1;
+ }
+ }
+
+ if (!(np->n_flag & N_TARG) && np->n_time == 0L)
+ fatal("Don't know how to make %s", np->n_name);
+
+ for (qdp = (struct depend *)0, lp = np->n_line; lp; lp = lp->l_next)
+ {
+ for (dp = lp->l_dep; dp; dp = dp->d_next)
+ {
+ char *sv = 0;
+ if (dynamic) {
+ char *s = getmacro("<");
+
+ if (s) {
+ sv = malloc((unsigned)(strlen(s)+1));
+ if (!sv) {
+ fatal("no space for saved $<",NULL);
+ }
+ strcpy(sv, s);
+ }
+ }
+ make(dp->d_name, level+1);
+ if (dynamic && sv) {
+ setmacro("<", sv, 4);
+ free(sv);
+ }
+ if (np->n_time < dp->d_name->n_time)
+ qdp = newdep(dp->d_name, qdp);
+ dtime = max(dtime, dp->d_name->n_time);
+ }
+ if (!quest && (np->n_flag & N_DOUBLE) && (np->n_time < dtime))
+ {
+ make1(np, lp, qdp); /* free()'s qdp */
+ dtime = 1;
+ qdp = (struct depend *)0;
+ didsomething++;
+ }
+ }
+
+ np->n_flag |= N_DONE;
+
+ if (quest)
+ {
+ long t;
+
+ t = np->n_time;
+ time(&np->n_time);
+ return t < dtime;
+ }
+ else if (np->n_time < dtime && !(np->n_flag & N_DOUBLE))
+ {
+ make1(np, (struct line *)0, qdp); /* free()'s qdp */
+ time(&np->n_time);
+ }
+ else if (level == 0 && !didsomething)
+ printf("%s: '%s' is up to date\n", myname, np->n_name);
+ return 0;
}
-make1(np, lp, qdp)
-register struct depend * qdp;
-struct line * lp;
-struct name * np;
-{
- register struct depend * dp;
- register char *p;
- char *rindex();
-
-
- if (dotouch)
- touch(np);
- else
- {
- strcpy(str1, "");
- for (dp = qdp; dp; dp = qdp)
- {
- if (strlen(str1))
- strcat(str1, " ");
- strcat(str1, dp->d_name->n_name);
- qdp = dp->d_next;
- free((char *)dp);
- }
- setmacro("?", str1, 4);
- setmacro("@", np->n_name, 4);
- p = rindex(np->n_name, '.');
- if (p) *p = 0;
- setmacro("*", np->n_name, 4);
- if (p) *p = '.';
- if (lp) /* lp set if doing a :: rule */
- docmds1(np, lp);
- else
- docmds(np);
- }
-}
/*
- * Read in makefile
+ * Read in makefile
*
- * $Header$
+ * $Header$
*/
+#include <stdlib.h>
+#include <string.h>
#include <stdio.h>
-#include <ctype.h>
+#include <ctype.h>
#include "h.h"
-int lineno;
+int lineno;
/*
- * Syntax error handler. Print message, with line number, and exits.
+ * Syntax error handler. Print message, with line number, and exits.
*/
/*VARARGS1*/
-void
-error(msg, a1, a2, a3)
-char * msg;
+void error(char *msg, char* a1)
{
- fprintf(stderr, "%s: ", myname);
- fprintf(stderr, msg, a1, a2, a3);
- if (lineno)
- fprintf(stderr, " near line %d", lineno);
- fputc('\n', stderr);
- exit(1);
+ fprintf(stderr, "%s: ", myname);
+ if (a1 != NULL)
+ {
+ fprintf(stderr, msg, a1);
+ } else
+ {
+ fprintf(stderr, "%s",msg);
+ }
+
+ if (lineno)
+ fprintf(stderr, " near line %d", lineno);
+ fputc('\n', stderr);
+ exit(1);
}
/*
- * Read a line into the supplied string of length LZ. Remove
- * comments, ignore blank lines. Deal with quoted (\) #, and
- * quoted newlines. If EOF return TRUE.
+ * Read a line into the supplied string of length LZ. Remove
+ * comments, ignore blank lines. Deal with quoted (\) #, and
+ * quoted newlines. If EOF return TRUE.
*/
-bool
-getline(str, fd)
-char * str;
-FILE * fd;
+bool mgetline(char* str, FILE* fd)
{
- register char * p;
- char * q;
- int pos = 0;
-
-
- for (;;)
- {
- if (fgets(str+pos, LZ-pos, fd) == (char *)0)
- return TRUE; /* EOF */
-
- lineno++;
-
- if ((p = index(str+pos, '\n')) == (char *)0)
- error("Line too long");
-
- if (p[-1] == '\\')
- {
- p[-1] = '\n';
- pos = p - str;
- continue;
- }
-
- p = str;
- while (((q = index(p, '#')) != (char *)0) &&
- (p != q) && (q[-1] == '\\'))
- {
- char *a;
-
- a = q - 1; /* Del \ chr; move rest back */
- p = q;
- while (*a++ = *q++)
- ;
- }
- if (q != (char *)0)
- {
- q[0] = '\n';
- q[1] = '\0';
- }
-
- p = str;
- while (isspace(*p)) /* Checking for blank */
- p++;
-
- if (*p != '\0')
- return FALSE;
- pos = 0;
- }
+ register char * p;
+ char * q;
+ int pos = 0;
+
+
+ for (;;)
+ {
+ if (fgets(str+pos, LZ-pos, fd) == (char *)0)
+ return TRUE; /* EOF */
+
+ lineno++;
+
+ if ((p = strchr(str+pos, '\n')) == (char *)0)
+ error("Line too long", NULL);
+
+ if (p[-1] == '\\')
+ {
+ p[-1] = '\n';
+ pos = p - str;
+ continue;
+ }
+
+ p = str;
+ while (((q = strchr(p, '#')) != (char *)0) &&
+ (p != q) && (q[-1] == '\\'))
+ {
+ char *a;
+
+ a = q - 1; /* Del \ chr; move rest back */
+ p = q;
+ while ((*a++ = *q++))
+ ;
+ }
+ if (q != (char *)0)
+ {
+ q[0] = '\n';
+ q[1] = '\0';
+ }
+
+ p = str;
+ while (isspace(*p)) /* Checking for blank */
+ p++;
+
+ if (*p != '\0')
+ return FALSE;
+ pos = 0;
+ }
}
/*
- * Get a word from the current line, surounded by white space.
- * return a pointer to it. String returned has no white spaces
- * in it.
+ * Get a word from the current line, surounded by white space.
+ * return a pointer to it. String returned has no white spaces
+ * in it.
*/
-char *
-gettok(ptr)
-char **ptr;
+char *gettok(char **ptr)
{
- register char * p;
+ register char * p;
- while (isspace(**ptr)) /* Skip spaces */
- (*ptr)++;
+ while (isspace(**ptr)) /* Skip spaces */
+ (*ptr)++;
- if (**ptr == '\0') /* Nothing after spaces */
- return NULL;
+ if (**ptr == '\0') /* Nothing after spaces */
+ return NULL;
- p = *ptr; /* word starts here */
+ p = *ptr; /* word starts here */
- while ((**ptr != '\0') && (!isspace(**ptr)))
- (*ptr)++; /* Find end of word */
+ while ((**ptr != '\0') && (!isspace(**ptr)))
+ (*ptr)++; /* Find end of word */
- *(*ptr)++ = '\0'; /* Terminate it */
+ *(*ptr)++ = '\0'; /* Terminate it */
- return(p);
+ return(p);
}
/*
- * Control of the implicit suffix rules
+ * Control of the implicit suffix rules
*
- * $Header$
+ * $Header$
*/
-
+#include <string.h>
+#include <stdio.h>
#include "h.h"
/*
- * Return a pointer to the suffix of a name
+ * Return a pointer to the suffix of a name
*/
-char *
-suffix(name)
-char * name;
+char *suffix(char *name)
{
- return rindex(name, '.');
+ return strrchr(name, '.');
}
/*
- * Dynamic dependency. This routine applies the suffis rules
- * to try and find a source and a set of rules for a missing
- * target. If found, np is made into a target with the implicit
- * source name, and rules. Returns TRUE if np was made into
- * a target.
+ * Dynamic dependency. This routine applies the suffis rules
+ * to try and find a source and a set of rules for a missing
+ * target. If found, np is made into a target with the implicit
+ * source name, and rules. Returns TRUE if np was made into
+ * a target.
*/
-bool
-dyndep(np)
-struct name * np;
+bool dyndep(struct name *np)
{
- register char * p;
- register char * q;
- register char * suff; /* Old suffix */
- register char * basename; /* Name without suffix */
- struct name * op; /* New dependent */
- struct name * sp; /* Suffix */
- struct line * lp;
- struct depend * dp;
- char * newsuff;
-
-
- p = str1;
- q = np->n_name;
- if (!(suff = suffix(q)))
- return FALSE; /* No suffix */
- while (q < suff)
- *p++ = *q++;
- *p = '\0';
- basename = setmacro("*", str1, 4)->m_val;
-
- if (!((sp = newname(".SUFFIXES"))->n_flag & N_TARG))
- return FALSE;
-
- for (lp = sp->n_line; lp; lp = lp->l_next)
- for (dp = lp->l_dep; dp; dp = dp->d_next)
- {
- newsuff = dp->d_name->n_name;
- if (strlen(suff)+strlen(newsuff)+1 >= LZ)
- fatal("Suffix rule too long");
- p = str1;
- q = newsuff;
- while (*p++ = *q++)
- ;
- p--;
- q = suff;
- while (*p++ = *q++)
- ;
- sp = newname(str1);
- if (sp->n_flag & N_TARG)
- {
- p = str1;
- q = basename;
- if (strlen(basename) + strlen(newsuff)+1 >= LZ)
- fatal("Implicit name too long");
- while (*p++ = *q++)
- ;
- p--;
- q = newsuff;
- while (*p++ = *q++)
- ;
- op = newname(str1);
- if (!op->n_time)
- modtime(op);
- if (op->n_time || (op->n_flag & N_TARG))
- {
- dp = newdep(op, (struct depend *)0);
- newline(np, dp, sp->n_line->l_cmd, 0);
- setmacro("<", op->n_name, 4);
- return TRUE;
- }
- }
- }
- return FALSE;
+ register char * p;
+ register char * q;
+ register char * suff; /* Old suffix */
+ register char * basename; /* Name without suffix */
+ struct name * op; /* New dependent */
+ struct name * sp; /* Suffix */
+ struct line * lp;
+ struct depend * dp;
+ char * newsuff;
+
+
+ p = str1;
+ q = np->n_name;
+ if (!(suff = suffix(q)))
+ return FALSE; /* No suffix */
+ while (q < suff)
+ *p++ = *q++;
+ *p = '\0';
+ basename = setmacro("*", str1, 4)->m_val;
+
+ if (!((sp = newname(".SUFFIXES"))->n_flag & N_TARG))
+ return FALSE;
+
+ for (lp = sp->n_line; lp; lp = lp->l_next)
+ for (dp = lp->l_dep; dp; dp = dp->d_next)
+ {
+ newsuff = dp->d_name->n_name;
+ if (strlen(suff)+strlen(newsuff)+1 >= LZ)
+ fatal("Suffix rule too long",NULL);
+ p = str1;
+ q = newsuff;
+ while ((*p++ = *q++))
+ ;
+ p--;
+ q = suff;
+ while ((*p++ = *q++))
+ ;
+ sp = newname(str1);
+ if (sp->n_flag & N_TARG)
+ {
+ p = str1;
+ q = basename;
+ if (strlen(basename) + strlen(newsuff)+1 >= LZ)
+ fatal("Implicit name too long",NULL);
+ while ((*p++ = *q++))
+ ;
+ p--;
+ q = newsuff;
+ while ((*p++ = *q++))
+ ;
+ op = newname(str1);
+ if (!op->n_time)
+ modtime(op);
+ if (op->n_time || (op->n_flag & N_TARG))
+ {
+ dp = newdep(op, (struct depend *)0);
+ newline(np, dp, sp->n_line->l_cmd, 0);
+ setmacro("<", op->n_name, 4);
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
}
/*
- * Make the default rules
+ * Make the default rules
*/
-void
-makerules()
+void makerules(void)
{
- struct cmd * cp;
- struct name * np;
- struct depend * dp;
+ struct cmd * cp;
+ struct name * np;
+ struct depend * dp;
#ifdef eon
- setmacro("BDSCC", "asm", 0);
- /* setmacro("BDSCFLAGS", "", 0); */
- cp = newcmd("$(BDSCC) $(BDSCFLAGS) -n $<", (struct cmd *)0);
- np = newname(".c.o");
- newline(np, (struct depend *)0, cp, 0);
-
- setmacro("CC", "c", 0);
- setmacro("CFLAGS", "-O", 0);
- cp = newcmd("$(CC) $(CFLAGS) -c $<", (struct cmd *)0);
- np = newname(".c.obj");
- newline(np, (struct depend *)0, cp, 0);
-
- setmacro("M80", "asm -n", 0);
- /* setmacro("M80FLAGS", "", 0); */
- cp = newcmd("$(M80) $(M80FLAGS) $<", (struct cmd *)0);
- np = newname(".mac.o");
- newline(np, (struct depend *)0, cp, 0);
-
- setmacro("AS", "zas", 0);
- /* setmacro("ASFLAGS", "", 0); */
- cp = newcmd("$(ZAS) $(ASFLAGS) -o $@ $<", (struct cmd *)0);
- np = newname(".as.obj");
- newline(np, (struct depend *)0, cp, 0);
-
- np = newname(".as");
- dp = newdep(np, (struct depend *)0);
- np = newname(".obj");
- dp = newdep(np, dp);
- np = newname(".c");
- dp = newdep(np, dp);
- np = newname(".o");
- dp = newdep(np, dp);
- np = newname(".mac");
- dp = newdep(np, dp);
- np = newname(".SUFFIXES");
- newline(np, dp, (struct cmd *)0, 0);
+ setmacro("BDSCC", "asm", 0);
+ /* setmacro("BDSCFLAGS", "", 0); */
+ cp = newcmd("$(BDSCC) $(BDSCFLAGS) -n $<", (struct cmd *)0);
+ np = newname(".c.o");
+ newline(np, (struct depend *)0, cp, 0);
+
+ setmacro("CC", "c", 0);
+ setmacro("CFLAGS", "-O", 0);
+ cp = newcmd("$(CC) $(CFLAGS) -c $<", (struct cmd *)0);
+ np = newname(".c.obj");
+ newline(np, (struct depend *)0, cp, 0);
+
+ setmacro("M80", "asm -n", 0);
+ /* setmacro("M80FLAGS", "", 0); */
+ cp = newcmd("$(M80) $(M80FLAGS) $<", (struct cmd *)0);
+ np = newname(".mac.o");
+ newline(np, (struct depend *)0, cp, 0);
+
+ setmacro("AS", "zas", 0);
+ /* setmacro("ASFLAGS", "", 0); */
+ cp = newcmd("$(ZAS) $(ASFLAGS) -o $@ $<", (struct cmd *)0);
+ np = newname(".as.obj");
+ newline(np, (struct depend *)0, cp, 0);
+
+ np = newname(".as");
+ dp = newdep(np, (struct depend *)0);
+ np = newname(".obj");
+ dp = newdep(np, dp);
+ np = newname(".c");
+ dp = newdep(np, dp);
+ np = newname(".o");
+ dp = newdep(np, dp);
+ np = newname(".mac");
+ dp = newdep(np, dp);
+ np = newname(".SUFFIXES");
+ newline(np, dp, (struct cmd *)0, 0);
#endif
/*
- * Some of the UNIX implicit rules
+ * Some of the UNIX implicit rules
*/
#ifdef unix
- setmacro("CC", "cc", 0);
- setmacro("CFLAGS", "-O", 0);
+ setmacro("CC", "cc", 0);
+ setmacro("CFLAGS", "-O", 0);
#ifdef MINIX
- cp = newcmd("$(CC) $(CFLAGS) -S $<", (struct cmd *)0);
- np = newname(".c.s");
+ cp = newcmd("$(CC) $(CFLAGS) -S $<", (struct cmd *)0);
+ np = newname(".c.s");
#else
- cp = newcmd("$(CC) $(CFLAGS) -c $<", (struct cmd *)0);
- np = newname(".c.o");
-#endif MINIX
- newline(np, (struct depend *)0, cp, 0);
-
- setmacro("AS", "as", 0);
- cp = newcmd("$(AS) -o $@ $<", (struct cmd *)0);
- np = newname(".s.o");
- newline(np, (struct depend *)0, cp, 0);
-
- setmacro("YACC", "yacc", 0);
- /* setmacro("YFLAGS", "", 0); */
- cp = newcmd("$(YACC) $(YFLAGS) $<", (struct cmd *)0);
- cp = newcmd("mv y.tab.c $@", cp);
- np = newname(".y.c");
- newline(np, (struct depend *)0, cp, 0);
-
- cp = newcmd("$(YACC) $(YFLAGS) $<", (struct cmd *)0);
- cp = newcmd("$(CC) $(CFLAGS) -c y.tab.c", cp);
- cp = newcmd("rm y.tab.c", cp);
- cp = newcmd("mv y.tab.o $@", cp);
- np = newname(".y.o");
- newline(np, (struct depend *)0, cp, 0);
-
- setmacro("LEX", "lex", 0);
- /* setmacro("LFLAGS", "", 0); */
- cp = newcmd("$(LEX) $(LFLAGS) $<", (struct cmd *)0);
- cp = newcmd("mv lex.yy.c $@", cp);
- np = newname(".l.c");
- newline(np, (struct depend *)0, cp, 0);
-
- cp = newcmd("$(LEX) $(LFLAGS) $<", (struct cmd *)0);
- cp = newcmd("$(CC) $(CFLAGS) -c lex.yy.c", cp);
- cp = newcmd("rm lex.yy.c", cp);
- cp = newcmd("mv lex.yy.o $@", cp);
- np = newname(".l.o");
- newline(np, (struct depend *)0, cp, 0);
-
- np = newname(".s");
- dp = newdep(np, (struct depend *)0);
- np = newname(".o");
- dp = newdep(np, dp);
- np = newname(".c");
- dp = newdep(np, dp);
- np = newname(".y");
- dp = newdep(np, dp);
- np = newname(".l");
- dp = newdep(np, dp);
- np = newname(".SUFFIXES");
- newline(np, dp, (struct cmd *)0, 0);
+ cp = newcmd("$(CC) $(CFLAGS) -c $<", (struct cmd *)0);
+ np = newname(".c.o");
+#endif /* MINIX */
+ newline(np, (struct depend *)0, cp, 0);
+
+ setmacro("AS", "as", 0);
+ cp = newcmd("$(AS) -o $@ $<", (struct cmd *)0);
+ np = newname(".s.o");
+ newline(np, (struct depend *)0, cp, 0);
+
+ setmacro("YACC", "yacc", 0);
+ /* setmacro("YFLAGS", "", 0); */
+ cp = newcmd("$(YACC) $(YFLAGS) $<", (struct cmd *)0);
+ cp = newcmd("mv y.tab.c $@", cp);
+ np = newname(".y.c");
+ newline(np, (struct depend *)0, cp, 0);
+
+ cp = newcmd("$(YACC) $(YFLAGS) $<", (struct cmd *)0);
+ cp = newcmd("$(CC) $(CFLAGS) -c y.tab.c", cp);
+ cp = newcmd("rm y.tab.c", cp);
+ cp = newcmd("mv y.tab.o $@", cp);
+ np = newname(".y.o");
+ newline(np, (struct depend *)0, cp, 0);
+
+ setmacro("LEX", "lex", 0);
+ /* setmacro("LFLAGS", "", 0); */
+ cp = newcmd("$(LEX) $(LFLAGS) $<", (struct cmd *)0);
+ cp = newcmd("mv lex.yy.c $@", cp);
+ np = newname(".l.c");
+ newline(np, (struct depend *)0, cp, 0);
+
+ cp = newcmd("$(LEX) $(LFLAGS) $<", (struct cmd *)0);
+ cp = newcmd("$(CC) $(CFLAGS) -c lex.yy.c", cp);
+ cp = newcmd("rm lex.yy.c", cp);
+ cp = newcmd("mv lex.yy.o $@", cp);
+ np = newname(".l.o");
+ newline(np, (struct depend *)0, cp, 0);
+
+ np = newname(".s");
+ dp = newdep(np, (struct depend *)0);
+ np = newname(".o");
+ dp = newdep(np, dp);
+ np = newname(".c");
+ dp = newdep(np, dp);
+ np = newname(".y");
+ dp = newdep(np, dp);
+ np = newname(".l");
+ dp = newdep(np, dp);
+ np = newname(".SUFFIXES");
+ newline(np, dp, (struct cmd *)0, 0);
#endif
#ifdef os9
/*
- * Fairlight use an enhanced version of the C sub-system.
- * They have a specialised macro pre-processor.
+ * Fairlight use an enhanced version of the C sub-system.
+ * They have a specialised macro pre-processor.
*/
- setmacro("CC", "cc", 0);
- setmacro("CFLAGS", "-z", 0);
- cp = newcmd("$(CC) $(CFLAGS) -r $<", (struct cmd *)0);
-
- np = newname(".c.r");
- newline(np, (struct depend *)0, cp, 0);
- np = newname(".ca.r");
- newline(np, (struct depend *)0, cp, 0);
- np = newname(".a.r");
- newline(np, (struct depend *)0, cp, 0);
- np = newname(".o.r");
- newline(np, (struct depend *)0, cp, 0);
- np = newname(".mc.r");
- newline(np, (struct depend *)0, cp, 0);
- np = newname(".mca.r");
- newline(np, (struct depend *)0, cp, 0);
- np = newname(".ma.r");
- newline(np, (struct depend *)0, cp, 0);
- np = newname(".mo.r");
- newline(np, (struct depend *)0, cp, 0);
-
- np = newname(".r");
- dp = newdep(np, (struct depend *)0);
- np = newname(".mc");
- dp = newdep(np, dp);
- np = newname(".mca");
- dp = newdep(np, dp);
- np = newname(".c");
- dp = newdep(np, dp);
- np = newname(".ca");
- dp = newdep(np, dp);
- np = newname(".ma");
- dp = newdep(np, dp);
- np = newname(".mo");
- dp = newdep(np, dp);
- np = newname(".o");
- dp = newdep(np, dp);
- np = newname(".a");
- dp = newdep(np, dp);
- np = newname(".SUFFIXES");
- newline(np, dp, (struct cmd *)0, 0);
+ setmacro("CC", "cc", 0);
+ setmacro("CFLAGS", "-z", 0);
+ cp = newcmd("$(CC) $(CFLAGS) -r $<", (struct cmd *)0);
+
+ np = newname(".c.r");
+ newline(np, (struct depend *)0, cp, 0);
+ np = newname(".ca.r");
+ newline(np, (struct depend *)0, cp, 0);
+ np = newname(".a.r");
+ newline(np, (struct depend *)0, cp, 0);
+ np = newname(".o.r");
+ newline(np, (struct depend *)0, cp, 0);
+ np = newname(".mc.r");
+ newline(np, (struct depend *)0, cp, 0);
+ np = newname(".mca.r");
+ newline(np, (struct depend *)0, cp, 0);
+ np = newname(".ma.r");
+ newline(np, (struct depend *)0, cp, 0);
+ np = newname(".mo.r");
+ newline(np, (struct depend *)0, cp, 0);
+
+ np = newname(".r");
+ dp = newdep(np, (struct depend *)0);
+ np = newname(".mc");
+ dp = newdep(np, dp);
+ np = newname(".mca");
+ dp = newdep(np, dp);
+ np = newname(".c");
+ dp = newdep(np, dp);
+ np = newname(".ca");
+ dp = newdep(np, dp);
+ np = newname(".ma");
+ dp = newdep(np, dp);
+ np = newname(".mo");
+ dp = newdep(np, dp);
+ np = newname(".o");
+ dp = newdep(np, dp);
+ np = newname(".a");
+ dp = newdep(np, dp);
+ np = newname(".SUFFIXES");
+ newline(np, dp, (struct cmd *)0, 0);
#endif
}