Make(1) does not support file inclusion +Fix
Gary Winiger
gww at beatnix.UUCP
Sun Mar 13 07:01:05 AEST 1988
Subject: Make(1) does not support file inclusion +Fix
Index: bin/make/{Makefile,defs,gram.y,main.c,misc.c} man1/make.1 4.3BSD
Description:
4.3BSD make does not support file inclusion. Other makes do.
Repeat-By:
Use a System V.3 or SunOS makefile with a include directive.
Fix:
Elxsi received a large third party package that used the SunOS
make include directive. Rather than redo all the makefiles,
Luong Nguyen-Duy made the following additions to 4.3 make.
The attached code solves this problem at Elxsi.
Gary..
{ucbvax!sun,uunet,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww
--------- cut --------- snip --------- :.,$w diff -------------
Index: /usr/src/etc/make/Makefile
*** /tmp/,RCSt1000738 Fri Aug 7 14:07:03 1987
--- Makefile Fri Aug 7 14:05:57 1987
***************
*** 1,6 ****
! # $Header: Makefile,v 1.1 86/12/11 12:53:09 gww Exp $ ENIX BSD
#
# $Log: Makefile,v $
# Revision 1.1 86/12/11 12:53:09 gww
# Initial revision
#
--- 1,9 ----
! # $Header: Makefile,v 1.2 87/08/07 14:05:43 gww Exp $ ENIX BSD
#
# $Log: Makefile,v $
+ # Revision 1.2 87/08/07 14:05:43 gww
+ # Add include Files feature.
+ #
# Revision 1.1 86/12/11 12:53:09 gww
# Initial revision
#
***************
*** 12,18 ****
OBJECTS=ident.o main.o doname.o misc.o files.o dosys.o gram.o
LIBES=
LINT= lint -ps
! CFLAGS= -O -DASCARCH -I. -I/usr/src/bin/make
all: make
--- 15,22 ----
OBJECTS=ident.o main.o doname.o misc.o files.o dosys.o gram.o
LIBES=
LINT= lint -ps
! DFLAGS= -DINCLUDES
! CFLAGS= -O -DASCARCH ${DFLAGS} -I. -I/usr/src/bin/make
all: make
***************
*** 20,25 ****
--- 24,35 ----
${CC} -o make ${CFLAGS} ${OBJECTS} ${LIBES}
${OBJECTS}: defs
+
+ .y.c:
+ /lib/cpp -P -E ${DFLAGS} $*.y >y.tab.y
+ ${YACC} y.tab.y
+ rm -f y.tab.y
+ mv y.tab.c $*.c
clean:
-rm -f *.o gram.c make a.out errs
Index: /usr/src/etc/make/defs
*** /tmp/,RCSt1000738 Fri Aug 7 14:07:07 1987
--- defs Fri Aug 7 14:06:02 1987
***************
*** 1,6 ****
! /* $Header: defs,v 1.1 86/12/11 12:53:11 gww Exp $ ENIX BSD
*
* $Log: defs,v $
* Revision 1.1 86/12/11 12:53:11 gww
* Initial revision
*
--- 1,9 ----
! /* $Header: defs,v 1.2 87/08/07 14:05:58 gww Exp $ ENIX BSD
*
* $Log: defs,v $
+ * Revision 1.2 87/08/07 14:05:58 gww
+ * Add include Files feature.
+ *
* Revision 1.1 86/12/11 12:53:11 gww
* Initial revision
*
***************
*** 139,141 ****
--- 142,157 ----
int *ckalloc();
struct nameblock *srchname(), *makename();
TIMETYPE exists();
+
+ #ifdef INCLUDES
+ struct include_stack
+ {
+ FILE *file;
+ int lineno;
+ char *nextc;
+ };
+ #define MAX_INCLUDES 20
+ extern push();
+ extern empty_stack();
+ extern FILE *pop();
+ #endif INCLUDES
Index: /usr/src/etc/make/gram.y
*** /tmp/,RCSt1000738 Fri Aug 7 14:07:10 1987
--- gram.y Fri Aug 7 14:06:05 1987
***************
*** 1,15 ****
%{#include "defs"
/*
* $Log: gram.y,v $
* Revision 1.1 86/12/11 12:53:18 gww
* Initial revision
*
*/
! static char *ERcsId = "$Header: gram.y,v 1.1 86/12/11 12:53:18 gww Exp $ ENIX BSD";
static char *sccsid = "@(#)gram.y 4.1 (Berkeley) 81/02/28";
%}
%term NAME SHELLINE START MACRODEF COLON DOUBLECOLON GREATER
%union
{
struct shblock *yshblock;
--- 1,22 ----
%{#include "defs"
/*
* $Log: gram.y,v $
+ * Revision 1.2 87/08/07 14:06:03 gww
+ * Add include Files feature.
+ *
* Revision 1.1 86/12/11 12:53:18 gww
* Initial revision
*
*/
! static char *ERcsId = "$Header: gram.y,v 1.2 87/08/07 14:06:03 gww Exp $ ENIX BSD";
static char *sccsid = "@(#)gram.y 4.1 (Berkeley) 81/02/28";
%}
+ #ifdef INCLUDES
+ %term NAME SHELLINE START MACRODEF COLON DOUBLECOLON GREATER INCLUDE
+ #else
%term NAME SHELLINE START MACRODEF COLON DOUBLECOLON GREATER
+ #endif INCLUDES
%union
{
struct shblock *yshblock;
***************
*** 43,48 ****
--- 50,58 ----
;
comline: START
+ #ifdef INCLUDES
+ | INCLUDE
+ #endif INCLUDES
| MACRODEF
| START namelist deplist shellist = {
while( --nlefts >= 0)
***************
*** 272,278 ****
if((c = text[0]) == '\t')
return( retsh(text) );
!
if(isalpha(c) || isdigit(c) || c==' ' || c=='.')
for(p=text+1; *p!='\0'; )
if(*p == ':')
--- 282,293 ----
if((c = text[0]) == '\t')
return( retsh(text) );
! #ifdef INCLUDES
! else if((strncmp(text, "include ", 8) == 0) ||
! (strncmp(text, "include\t", 8) == 0))
! return(do_include(text+8));
! #endif INCLUDES
!
if(isalpha(c) || isdigit(c) || c==' ' || c=='.')
for(p=text+1; *p!='\0'; )
if(*p == ':')
***************
*** 312,314 ****
--- 327,366 ----
return(START);
goto again;
}
+
+
+
+ #ifdef INCLUDES
+ do_include (text)
+ char *text;
+ {
+ register char *p;
+ register char *pend;
+ char filename[MAXPATHLEN];
+
+ /* skip leading white space */
+
+ for (; *text == ' ' || *text == '\t'; text++)
+ continue;
+
+ /* get file name */
+
+ subst(text, filename); /* Substitute for macros */
+
+ if(dbgflag) printf("Include file: %s\n", filename);
+
+ if (rddescf(filename))
+ fatal1("could not do include %s\n", filename);
+
+ return(INCLUDE);
+ }
+ #endif INCLUDES
Index: /usr/src/etc/make/main.c
*** /tmp/,RCSt1000738 Fri Aug 7 14:07:14 1987
--- main.c Fri Aug 7 14:06:09 1987
***************
*** 1,10 ****
/*
* $Log: main.c,v $
* Revision 1.1 86/12/11 12:53:21 gww
* Initial revision
*
*/
! static char *ERcsId = "$Header: main.c,v 1.1 86/12/11 12:53:21 gww Exp $ ENIX BSD";
static char *sccsid = "@(#)main.c 4.8 (Berkeley) 86/01/09";
# include "defs"
/*
--- 1,13 ----
/*
* $Log: main.c,v $
+ * Revision 1.2 87/08/07 14:06:06 gww
+ * Add include Files feature.
+ *
* Revision 1.1 86/12/11 12:53:21 gww
* Initial revision
*
*/
! static char *ERcsId = "$Header: main.c,v 1.2 87/08/07 14:06:06 gww Exp $ ENIX BSD";
static char *sccsid = "@(#)main.c 4.8 (Berkeley) 86/01/09";
# include "defs"
/*
***************
*** 280,285 ****
--- 283,292 ----
char *descfile;
{
FILE * k;
+ #ifdef INCLUDES
+ extern int yylineno;
+ extern char *zznextc;
+ #endif INCLUDES
/* read and parse description */
***************
*** 309,315 ****
--- 316,338 ----
return( rdd1(stdin) );
if( (k = fopen(descfile,"r")) != NULL)
+ #ifdef INCLUDES
+ {
+ if(fin != NULL) {
+ push(fin, yylineno, zznextc);
+ }
+ if(rdd1(k)) {
+ fatal("rddescf(), could not make %s ", descfile);
+ }
+ else {
+ if(!empty_stack())
+ fin = pop();
+ return(0);
+ }
+ }
+ #else
return( rdd1(k) );
+ #endif INCLUDES
return(1);
}
Index: /usr/src/etc/make/misc.c
*** /tmp/,RCSt1000738 Fri Aug 7 14:07:20 1987
--- misc.c Fri Aug 7 14:06:13 1987
***************
*** 1,10 ****
/*
* $Log: misc.c,v $
* Revision 1.1 86/12/11 12:53:23 gww
* Initial revision
*
*/
! static char *ERcsId = "$Header: misc.c,v 1.1 86/12/11 12:53:23 gww Exp $ ENIX BSD";
static char *sccsid = "@(#)misc.c 4.3 (Berkeley) 85/08/30";
#include "defs"
--- 1,13 ----
/*
* $Log: misc.c,v $
+ * Revision 1.2 87/08/07 14:06:10 gww
+ * Add include Files feature.
+ *
* Revision 1.1 86/12/11 12:53:23 gww
* Initial revision
*
*/
! static char *ERcsId = "$Header: misc.c,v 1.2 87/08/07 14:06:10 gww Exp $ ENIX BSD";
static char *sccsid = "@(#)misc.c 4.3 (Berkeley) 85/08/30";
#include "defs"
***************
*** 345,347 ****
--- 348,391 ----
*--qbufp = '\0';
return(qbuf);
}
+
+ #ifdef INCLUDES
+ struct include_stack stack[MAX_INCLUDES];
+ static int top = -1;
+
+ push (file, lineno, nextc)
+ FILE *file;
+ int lineno;
+ char *nextc;
+ {
+ if ( top < MAX_INCLUDES-1 ) {
+ top++;
+ stack[top].file = file;
+ stack[top].lineno = lineno;
+ stack[top].nextc = nextc;
+ }
+ else fatal1("include depth > %d\n", MAX_INCLUDES);
+ }
+
+ FILE *
+ pop()
+ {
+ extern int yylineno;
+ extern char *zznextc;
+
+ if (top == -1) {
+ fatal("pop() trying to pop null include stack\n");
+ }
+ else {
+ yylineno = stack[top].lineno;
+ zznextc = stack[top].nextc;
+ return(stack[top--].file);
+ }
+ }
+
+
+ int empty_stack()
+ {
+ return( (top == -1) ? 1 : 0 );
+ }
+ #endif INCLUDES
Index: /usr/man/man1/make.1
*** /tmp/,RCSt1000941 Fri Aug 7 15:01:47 1987
--- make.1 Fri Aug 7 15:01:20 1987
***************
*** 1,6 ****
! .\" $Header: make.1,v 1.1 86/12/12 16:17:38 gww Exp $ ENIX BSD
.\"
.\" $Log: make.1,v $
.\" Revision 1.1 86/12/12 16:17:38 gww
.\" Initial revision
.\"
--- 1,9 ----
! .\" $Header: make.1,v 1.2 87/08/07 15:01:04 gww Exp $ ENIX BSD
.\"
.\" $Log: make.1,v $
+ .\" Revision 1.2 87/08/07 15:01:04 gww
+ .\" Add include support.
+ .\"
.\" Revision 1.1 86/12/12 16:17:38 gww
.\" Initial revision
.\"
***************
*** 233,238 ****
--- 236,254 ----
unless the target is a directory or
depends on the special name `.PRECIOUS'.
.PP
+ Files may be included within a
+ .I makefile
+ similarly to the
+ .I #include
+ directive of the C preprocessor.
+ If the first seven characters of a line in a
+ .I makefile
+ are `include' and the eighth is either a blank or tab, the remainder of
+ the line is interpreted as the path name of the file to be included.
+ Marco substitutions are done on the `include' line before the path name
+ is interpreted.
+ Includes may be nested up to 20 deep.
+ .PP
Other options:
.TP
.B \-i
***************
*** 281,283 ****
--- 297,303 ----
.PP
`VPATH' is intended to act like the System V `VPATH' support,
but there is no guarantee that it functions identically.
+ .PP
+ `Include' is intended to act like the System V `include' support,
+ but there is no guarantee that it functions identically.
+ `include' does not follow `VPATH's.
More information about the Comp.bugs.4bsd.ucb-fixes
mailing list