[comp.os.minix] make changes for Minix/ST

meulenbr@cstw01.UUCP (Frans Meulenbroeks) (09/30/88)

Hi!
Here are the changes for the make posted last Feb or so by Brian
Beattie.
These changes solve a number of problems that I encountered when porting
this make to Minix/ST.
They can be applied to the original sources without harm.
PC owners should define MINIXPC in the makefile. 
ST owners can use the supplied makescript.

Note: this is supplied as is. use at own risk.
Note2: don't ask me about the release date of Minix/ST.
       I don't have any idea about that.

       Frans Meulenbroeks

#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
-----cut here-----cut here-----cut here-----cut here-----
#!/bin/sh
# shar:	Shell Archiver
#	Run the following text with /bin/sh to create:
#	main.cdiff
#	rules.c
#	makescript
# This archive created: Fri Sep 30 14:53:21 1988
cat << \SHAR_EOF > main.cdiff
*** main.c	Fri Sep 30 14:45:10 1988
--- ../tmp/main.c	Fri Sep 30 14:47:03 1988
***************
*** 123,129 ****
  		fatal("Cannot initalloc memory");
  #endif
  
! 	if (strcmp(makefile, "-") == 0)	/*  Can use stdin as makefile  */
  		ifd = stdin;
  	else
  		if (!makefile)		/*  If no file, then use default */
--- 123,129 ----
  		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 */
SHAR_EOF
cat << \SHAR_EOF > rules.c
/*
 *	Control of the implicit suffix rules
 */


#include "h.h"


/*
 *	Return a pointer to the suffix of a name
 */
char *
suffix(name)
char *			name;
{
	return rindex(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.
 */
bool
dyndep(np)
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)->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)
				{
					dp = newdep(op, (char *)0);
					newline(np, dp, sp->n_line->l_cmd, 0);
					setmacro("<", op->n_name);
					return TRUE;
				}
			}
		}
	return FALSE;
}


/*
 *	Make the default rules
 */
void
makerules()
{
	struct cmd *		cp;
	struct name *		np;
	struct depend *		dp;


#ifdef eon
	setmacro("BDSCC", "asm");
	/*	setmacro("BDSCFLAGS", "");	*/
	cp = newcmd("$(BDSCC) $(BDSCFLAGS) -n $<", 0);
	np = newname(".c.o");
	newline(np, (char *)0, cp, 0);

	setmacro("CC", "c");
	setmacro("CFLAGS", "-O");
	cp = newcmd("$(CC) $(CFLAGS) -c $<", 0);
	np = newname(".c.obj");
	newline(np, (char *)0, cp, 0);

	setmacro("M80", "asm -n");
	/*	setmacro("M80FLAGS", "");	*/
	cp = newcmd("$(M80) $(M80FLAGS) $<", 0);
	np = newname(".mac.o");
	newline(np, (char *)0, cp, 0);

	setmacro("AS", "zas");
	/*	setmacro("ASFLAGS", "");	*/
	cp = newcmd("$(ZAS) $(ASFLAGS) -o $@ $<", 0);
	np = newname(".as.obj");
	newline(np, (char *)0, cp, 0);

	np = newname(".as");
	dp = newdep(np, (char *)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, (char *)0, 0);
#endif

/*
 *	Some of the UNIX implicit rules
 */
#ifdef unix
	setmacro("CC", "cc");
	setmacro("CFLAGS", "-O");
#ifdef MINIXPC
	cp = newcmd("$(CC) $(CFLAGS) -S $<", (char *)0);
	np = newname(".c.s");
#else
	cp = newcmd("$(CC) $(CFLAGS) -c $<", (char *)0);
	np = newname(".c.o");
#endif MINIXPC
	newline(np, (char *)0, cp, 0);

	setmacro("AS", "as");
	cp = newcmd("$(AS) -o $@ $<", (char *)0);
	np = newname(".s.o");
	newline(np, (char *)0, cp, 0);

	setmacro("YACC", "yacc");
	/*	setmacro("YFLAGS", "");	*/
	cp = newcmd("$(YACC) $(YFLAGS) $<", (char *)0);
	cp = newcmd("mv y.tab.c $@", cp);
	np = newname(".y.c");
	newline(np, (char *)0, cp, 0);

	cp = newcmd("$(YACC) $(YFLAGS) $<", (char *)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, (char *)0, cp, 0);

	np = newname(".s");
	dp = newdep(np, (char *)0);
	np = newname(".o");
	dp = newdep(np, dp);
	np = newname(".c");
	dp = newdep(np, dp);
	np = newname(".y");
	dp = newdep(np, dp);
	np = newname(".SUFFIXES");
	newline(np, dp, (char *)0, 0);
#endif
#ifdef os9
/*
 *	Fairlight use an enhanced version of the C sub-system.
 *	They have a specialised macro pre-processor.
 */
	setmacro("CC", "cc");
	setmacro("CFLAGS", "-z");
	cp = newcmd("$(CC) $(CFLAGS) -r $<", 0);

	np = newname(".c.r");
	newline(np, (char *)0, cp, 0);
	np = newname(".ca.r");
	newline(np, (char *)0, cp, 0);
	np = newname(".a.r");
	newline(np, (char *)0, cp, 0);
	np = newname(".o.r");
	newline(np, (char *)0, cp, 0);
	np = newname(".mc.r");
	newline(np, (char *)0, cp, 0);
	np = newname(".mca.r");
	newline(np, (char *)0, cp, 0);
	np = newname(".ma.r");
	newline(np, (char *)0, cp, 0);
	np = newname(".mo.r");
	newline(np, (char *)0, cp, 0);

	np = newname(".r");
	dp = newdep(np, (char *)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, (char *)0, 0);
#endif
}
SHAR_EOF
cat << \SHAR_EOF > makescript
cc -c -O -Dunix -DMINIX check.c
cc -c -O -Dunix -DMINIX input.c
cc -c -O -Dunix -DMINIX macro.c
cc -c -O -Dunix -DMINIX main.c
cc -c -O -Dunix -DMINIX make.c
cc -c -O -Dunix -DMINIX reader.c
cc -c -O -Dunix -DMINIX rules.c
cc -o m check.o input.o macro.o main.o  make.o reader.o rules.o
SHAR_EOF
#	End of shell archive
exit 0
-- 
Frans Meulenbroeks
	Centre for Software Technology
	...!mcvax!philmds!prle!cst!meulenbr   or   ...!uunet!prlb2!cst!meulenbr
        or perhaps   meulenbr@cst.prl.philips.nl