+++ /dev/null
-.TH IMAKE 1 "Jan 6, 1987"
-.UC 4
-.SH NAME
-imake \- C preprocessor interface to the make utility
-.SH SYNOPSIS
-.B imake
-[
-.B \-Ddefine
-] [
-.B \-Idirectory
-] [
-.B \-T
-] [
-.B \-f
-.I imakefile
-] [
-.B \-s
-[
-.I makefile
-]] [
-.B \-v
-] [ make options or arguments ]
-.SH DESCRIPTION
-.I Imake
-takes a template and an Imakefile and runs the C preprocessor on it producing a
-temporary makefile in /usr/tmp. It then runs
-.I make
-on this pre-processed makefile.
-See IMPLEMENTATION DETAIL below.
-.PP
-By default,
-.I Imake
-looks first for the file named
-.I Imakefile
-and if that fails, looks for the file named
-.I imakefile,
-both in the current working directory.
-.SH OPTIONS
-.TP 5
-.B \-Ddefine
-Define.
-This argument is passed on to the preprocessor, cpp.
-This can also be accomplished with the environment variable,
-IMAKEINCLUDE.
-.TP 5
-.B \-Idirectory
-Include directory.
-This argument is passed on to the preprocessor, cpp.
-This can also be accomplished with the environment variable,
-IMAKEINCLUDE.
-.TP 5
-.B \-T template
-Template file.
-Specifies the template file to be initially included by cpp,
-instead of the default file
-.I Imake.template.
-.TP 5
-.B \-f imakefile
-File.
-Specifies an alternate imakefile for
-.I imake to use.
-.TP 5
-.B \-s [ filename ]
-Show.
-.I Imake
-will preprocess the imakefile,
-and direct it to the standard output.
-The
-.I make
-program will not be invoked.
-If the filename argument is present
-the output will be directed instead to the named file.
-Typically, this is
-.I \-s Makefile.
-.TP 5
-.B \-v
-Verbose.
-.I Imake
-will display the command line it uses to invoke the C preprocessor before
-actually doing so.
-.SH "ENVIRONMENT VARIABLES"
-Imake consults its environment for three variables:
-.TP 5
-.B IMAKEINCLUDE
-If defined, this should be a valid include argument for the
-C preprocessor. E.g. ``-I/usr/include/local''.
-Actually, any valid
-.I cpp
-argument will work here.
-.TP 5
-.B IMAKECPP
-If defined, this should be a valid path to a preprocessor program.
-E.g. ``/usr/local/cpp''.
-By default,
-.I imake
-will use /lib/cpp.
-.TP 5
-.B IMAKEMAKE
-If defined, this should be a valid path to a make program.
-E.g. ``/usr/local/make''.
-By default,
-.I imake
-will use whatever
-.I make
-program is found using
-.I execvp(3).
-.SH IMPLEMENTATION DETAIL
-.I Imake
-first determins the name of the imakefile from the command line \-f
-flag or from the content of the current directory, depending
-on whether Imakefile or imakefile exist.
-We shall call this \fI<imakefile>\fP.
-It also determines the name of the template
-from the command line \-T flag or the default, Imake.template.
-Call this \fI<template>\fP.
-.PP
-The program then examines the imakefile looking for any lines
-that begin with a '#' character. If it finds one,
-it checks to see if it is a valid C preprocessor directive
-from the set
-.I #include,
-.I #define,
-.I #undef,
-.I #ifdef,
-.I #else,
-.I #endif
-or
-.I #if.
-If it is,
-.I imake
-leaves it unchanged.
-If not,
-it pads the beginning of the line with a null C comment ``/**/''
-so that the line will by untouched by the preprocessor.
-This is usefull for preserving the use of
-.I make
-style ``#'' comments.
-If any lines needed to be changed,
-a temporary file named /tmp/tmp-imake.* will receive the "padded"
-imakefile.
-Call this file, whether it needed to be changed or not,
-\fI<input-imakefile>\fP.
-.PP
-Then the program
-starts up the C preprocessor with the command line
-.RS 5
-.sp 1
-/lib/cpp -I. -I/usr/lib/local/imake.includes -Uunix
-.sp 1
-.RE
-perhaps prepending the argument list with the IMAKEINCLUDE
-environment variable,
-the \fI\-I\fP, and the \fI\-D\fP command line arguments;
-or changing the preprocessor program to the IMAKECPP environment variable.
-Standard input is from the
-.I imake
-program and standard output is directed to a temporary file in
-/usr/tmp/tmp-make.*;
-unless there was an argument to the \-s flag, in which case
-output is directed there.
-Call this file \fI<makefile>\fP.
-The first three lines provided as input to the preprocessor
-will be
-.RS 5
-.sp 1
-#define IMAKE_TEMPLATE "\fI<template>\fP"
-.br
-#define INCLUDE_IMAKEFILE "\fI<input-imakefile>\fP"
-.br
-#include IMAKE_TEMPLATE
-.sp 1
-.RE
-.PP
-Note that this implies that the template must have, at a bare minimum,
-the line
-.RS 5
-.sp 1
-#include INCLUDE_IMAKEFILE
-.sp 1
-.RE
-.PP
-Next,
-.I imake
-reads the entire output of the preprocessor into memory,
-stripping off any double '@' signs encountered in the input.
-This is very useful for writing cpp multi-line macros that
-won't be coalesced into a single line the way
-.I cpp
-normally does.
-In addition, trailing white space on any line is thrown away to keep
-.I make
-from getting upset;
-and most blank lines are thrown
-away.
-For example, the macro
-.ta .8i 1.6i 5i
-.nf
-
-#define program_target(program, objlist) @@\e
-program: objlist @@\e
- $(CC) -o $@ objlist $(LDFLAGS)
-
-.fi
-when called with
-.I "program_target(foo, foo1.o foo2.o)"
-will expand to
-.nf
-
-foo: foo1.o foo2.o
- $(CC) -o $@ foo1.o foo2.o $(LDFLAGS)
-
-.fi
-.DT
-.PP
-Finally,
-if the
-.B -s
-option has not been specified,
-.I imake
-calls the program
-.RS 5
-.sp 1
- make MAKE=\fI<program>\fP MAKEFILE=\fI<imakefile>\fP -f \fI<makefile>\fP makeargs
-.sp 1
-.RE
-where ``makeargs'' is replaced with any arguments found on the command line.
-.SH FILES
-.ta 3i
-/usr/tmp/tmp-imake.\fInnnnnn\fP temporary input file for cpp
-.br
-/usr/tmp/tmp-make.\fInnnnnn\fP temporary input file for make
-.br
-/lib/cpp default C preprocessor
-.br
-/usr/lib/local/imake.includes default directory for include files.
-.DT
-.SH "SEE ALSO"
-make(1)
-.br
-S. I. Feldman
-.I
-Make \- A Program for Maintaining Computer Programs
-.SH "AUTHOR"
-Todd Brunhoff; Tektronix, inc. and Project Athena, MIT.
-.SH "BUGS"
-The C-preprocessor, Cpp,
-on a Sun compresses all tabs in a macro expansion to a single
-space. It also replaces an escaped newline with a space instead of
-deleting it. There is a kludge in the code to try to get around this
-but it depends on the fact that all targets have a ':' somewhere in
-the line and all actions for a target do not have a ':'.
-.PP
-You can use \fImake\fP-style '#' comments in the Imakefile, but
-not in the template or any other included files. If you want
-them, you must preceed them with a C null comment, /**/.
+++ /dev/null
-/*****************************************************************************\
- * *
- * Porting Note *
- * *
- * Add the value of BOOTSTRAPCFLAGS to the cpp_argv table so that it will be *
- * passed to the template file. *
- * *
-\*****************************************************************************/
-
-
-
-/*
- *
- * Copyright 1985, 1986, 1987 by the Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, and distribute this
- * software and its documentation for any purpose and without
- * fee is hereby granted, provided that the above copyright
- * notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in
- * advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission.
- * M.I.T. makes no representations about the suitability of
- * this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * $XConsortium: imake.c,v 1.51 89/12/12 12:37:30 jim Exp $
- * $Locker$
- *
- * Author:
- * Todd Brunhoff
- * Tektronix, inc.
- * While a guest engineer at Project Athena, MIT
- *
- * imake: the include-make program.
- *
- * Usage: imake [-Idir] [-Ddefine] [-T] [-f imakefile ] [-s] [-e] [-v] [make flags]
- *
- * Imake takes a template makefile (Imake.tmpl) and runs cpp on it
- * producing a temporary makefile in /tmp. It then runs make on
- * this pre-processed makefile.
- * Options:
- * -D define. Same as cpp -D argument.
- * -I Include directory. Same as cpp -I argument.
- * -T template. Designate a template other
- * than Imake.tmpl
- * -s[F] show. Show the produced makefile on the standard
- * output. Make is not run is this case. If a file
- * argument is provided, the output is placed there.
- * -e[F] execute instead of show; optionally name Makefile F
- * -v verbose. Show the make command line executed.
- *
- * Environment variables:
- *
- * IMAKEINCLUDE Include directory to use in addition to "."
- * IMAKECPP Cpp to use instead of /lib/cpp
- * IMAKEMAKE make program to use other than what is
- * found by searching the $PATH variable.
- * Other features:
- * imake reads the entire cpp output into memory and then scans it
- * for occurences of "@@". If it encounters them, it replaces it with
- * a newline. It also trims any trailing white space on output lines
- * (because make gets upset at them). This helps when cpp expands
- * multi-line macros but you want them to appear on multiple lines.
- *
- * The macros MAKEFILE and MAKE are provided as macros
- * to make. MAKEFILE is set to imake's makefile (not the constructed,
- * preprocessed one) and MAKE is set to argv[0], i.e. the name of
- * the imake program.
- *
- * Theory of operation:
- * 1. Determine the name of the imakefile from the command line (-f)
- * or from the content of the current directory (Imakefile or imakefile).
- * Call this <imakefile>. This gets added to the arguments for
- * make as MAKEFILE=<imakefile>.
- * 2. Determine the name of the template from the command line (-T)
- * or the default, Imake.tmpl. Call this <template>
- * 3. Start up cpp an provide it with three lines of input:
- * #define IMAKE_TEMPLATE " <template> "
- * #define INCLUDE_IMAKEFILE < <imakefile> >
- * #include IMAKE_TEMPLATE
- * Note that the define for INCLUDE_IMAKEFILE is intended for
- * use in the template file. This implies that the imake is
- * useless unless the template file contains at least the line
- * #include INCLUDE_IMAKEFILE
- * 4. Gather the output from cpp, and clean it up, expanding @@ to
- * newlines, stripping trailing white space, cpp control lines,
- * and extra blank lines. This cleaned output is placed in a
- * temporary file. Call this <makefile>.
- * 5. Start up make specifying <makefile> as its input.
- *
- * The design of the template makefile should therefore be:
- * <set global macros like CFLAGS, etc.>
- * <include machine dependent additions>
- * #include INCLUDE_IMAKEFILE
- * <add any global targets like 'clean' and long dependencies>
- */
-#include <stdio.h>
-#include <ctype.h>
-#include <sys/types.h>
-#ifdef SYSV
-#ifndef macII /* mac will get the stuff out of file.h */
-#include <fcntl.h>
-#endif
-#else /* !SYSV */
-#include <sys/wait.h>
-#endif /* !SYSV */
-#include <sys/file.h>
-#include <signal.h>
-#include <sys/stat.h>
-#include "imakemdep.h"
-
-
-#define TRUE 1
-#define FALSE 0
-
-#ifdef FIXUP_CPP_WHITESPACE
-int InRule = FALSE;
-#endif
-
-/*
- * Some versions of cpp reduce all tabs in macro expansion to a single
- * space. In addition, the escaped newline may be replaced with a
- * space instead of being deleted. Blech.
- */
-#ifndef FIXUP_CPP_WHITESPACE
-#define KludgeOutputLine(arg)
-#define KludgeResetRule()
-#endif
-
-typedef unsigned char boolean;
-
-#ifndef DEFAULT_CPP
-#define DEFAULT_CPP "/lib/cpp"
-#endif
-
-char *cpp = DEFAULT_CPP;
-
-char *tmpMakefile = "/tmp/Imf.XXXXXX";
-char *tmpImakefile = "/tmp/IIf.XXXXXX";
-char *make_argv[ ARGUMENTS ] = { "make" };
-
-int make_argindex;
-int cpp_argindex;
-char *make = NULL;
-char *Imakefile = NULL;
-char *Makefile = "Makefile";
-char *Template = "Imake.tmpl";
-char *program;
-char *FindImakefile();
-char *ReadLine();
-char *CleanCppInput();
-char *strdup();
-
-boolean verbose = FALSE;
-boolean show = TRUE;
-extern int errno;
-extern char *Emalloc();
-extern char *realloc();
-extern char *getenv();
-extern char *mktemp();
-
-main(argc, argv)
- int argc;
- char **argv;
-{
- FILE *tmpfd;
- char makeMacro[ BUFSIZ ];
- char makefileMacro[ BUFSIZ ];
-
- init();
- SetOpts(argc, argv);
-
- Imakefile = FindImakefile(Imakefile);
- if (Makefile)
- tmpMakefile = Makefile;
- else
- tmpMakefile = mktemp(strdup(tmpMakefile));
- AddMakeArg("-f");
- AddMakeArg( tmpMakefile );
- sprintf(makeMacro, "MAKE=%s", program);
- AddMakeArg( makeMacro );
- sprintf(makefileMacro, "MAKEFILE=%s", Imakefile);
- AddMakeArg( makefileMacro );
-
- if ((tmpfd = fopen(tmpMakefile, "w+")) == NULL)
- LogFatal("Cannot create temporary file %s.", tmpMakefile);
-
- cppit(Imakefile, Template, tmpfd, tmpMakefile);
-
- if (show) {
- if (Makefile == NULL)
- showit(tmpfd);
- } else
- makeit();
- wrapup();
- exit(0);
-}
-
-showit(fd)
- FILE *fd;
-{
- char buf[ BUFSIZ ];
- int red;
-
- fseek(fd, 0, 0);
- while ((red = fread(buf, 1, BUFSIZ, fd)) > 0)
- fwrite(buf, red, 1, stdout);
- if (red < 0)
- LogFatal("Cannot write stdout.", "");
-}
-
-wrapup()
-{
- if (tmpMakefile != Makefile)
- unlink(tmpMakefile);
- unlink(tmpImakefile);
-}
-
-#if SIGNALRETURNSINT
-int
-#else
-void
-#endif
-catch(sig)
- int sig;
-{
- errno = 0;
- LogFatalI("Signal %d.", sig);
-}
-
-/*
- * Initialize some variables.
- */
-init()
-{
- char *p;
-
- make_argindex=0;
- while (make_argv[ make_argindex ] != NULL)
- make_argindex++;
- cpp_argindex = 0;
- while (cpp_argv[ cpp_argindex ] != NULL)
- cpp_argindex++;
-
- /*
- * See if the standard include directory is different than
- * the default. Or if cpp is not the default. Or if the make
- * found by the PATH variable is not the default.
- */
- if (p = getenv("IMAKEINCLUDE")) {
- if (*p != '-' || *(p+1) != 'I')
- LogFatal("Environment var IMAKEINCLUDE %s\n",
- "must begin with -I");
- AddCppArg(p);
- for (; *p; p++)
- if (*p == ' ') {
- *p++ = '\0';
- AddCppArg(p);
- }
- }
- if (p = getenv("IMAKECPP"))
- cpp = p;
- if (p = getenv("IMAKEMAKE"))
- make = p;
-
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- signal(SIGINT, catch);
-
- /* This kludge is here because in AIX cpp doesn't define any
- * symbols in cpp, they are all defined by cc.
- */
-#ifdef _AIX
- AddCppArg("-D_AIX");
-#endif
-}
-
-AddMakeArg(arg)
- char *arg;
-{
- errno = 0;
- if (make_argindex >= ARGUMENTS-1)
- LogFatal("Out of internal storage.", "");
- make_argv[ make_argindex++ ] = arg;
- make_argv[ make_argindex ] = NULL;
-}
-
-AddCppArg(arg)
- char *arg;
-{
- errno = 0;
- if (cpp_argindex >= ARGUMENTS-1)
- LogFatal("Out of internal storage.", "");
- cpp_argv[ cpp_argindex++ ] = arg;
- cpp_argv[ cpp_argindex ] = NULL;
-}
-
-SetOpts(argc, argv)
- int argc;
- char **argv;
-{
- errno = 0;
- /*
- * Now gather the arguments for make
- */
- program = argv[0];
- for(argc--, argv++; argc; argc--, argv++) {
- /*
- * We intercept these flags.
- */
- if (argv[0][0] == '-') {
- if (argv[0][1] == 'D') {
- AddCppArg(argv[0]);
- } else if (argv[0][1] == 'I') {
- AddCppArg(argv[0]);
- } else if (argv[0][1] == 'f') {
- if (argv[0][2])
- Imakefile = argv[0]+2;
- else {
- argc--, argv++;
- if (! argc)
- LogFatal("No description arg after -f flag\n", "");
- Imakefile = argv[0];
- }
- } else if (argv[0][1] == 's') {
- if (argv[0][2])
- Makefile = (argv[0][2] == '-') ? NULL : argv[0]+2;
- else if (argc > 1 && argv[1][0] != '-') {
- argc--, argv++;
- Makefile = argv[0];
- }
- show = TRUE;
- } else if (argv[0][1] == 'e') {
- Makefile = (argv[0][2] ? argv[0]+2 : NULL);
- show = FALSE;
- } else if (argv[0][1] == 'T') {
- if (argv[0][2])
- Template = argv[0]+2;
- else {
- argc--, argv++;
- if (! argc)
- LogFatal("No description arg after -T flag\n", "");
- Template = argv[0];
- }
- } else if (argv[0][1] == 'v') {
- verbose = TRUE;
- } else
- AddMakeArg(argv[0]);
- } else
- AddMakeArg(argv[0]);
- }
-}
-
-char *FindImakefile(Imakefile)
- char *Imakefile;
-{
- int fd;
-
- if (Imakefile) {
- if ((fd = open(Imakefile, O_RDONLY)) < 0)
- LogFatal("Cannot open %s.", Imakefile);
- } else {
- if ((fd = open("Imakefile", O_RDONLY)) < 0)
- if ((fd = open("imakefile", O_RDONLY)) < 0)
- LogFatal("No description file.", "");
- else
- Imakefile = "imakefile";
- else
- Imakefile = "Imakefile";
- }
- close (fd);
- return(Imakefile);
-}
-
-LogFatalI(s, i)
- char *s;
- int i;
-{
- /*NOSTRICT*/
- LogFatal(s, (char *)i);
-}
-
-LogFatal(x0,x1)
- char *x0, *x1;
-{
- extern char *sys_errlist[];
- static boolean entered = FALSE;
-
- if (entered)
- return;
- entered = TRUE;
-
- fprintf(stderr, "%s: ", program);
- if (errno)
- fprintf(stderr, "%s: ", sys_errlist[ errno ]);
- fprintf(stderr, x0,x1);
- fprintf(stderr, " Stop.\n");
- wrapup();
- exit(1);
-}
-
-showargs(argv)
- char **argv;
-{
- for (; *argv; argv++)
- fprintf(stderr, "%s ", *argv);
- fprintf(stderr, "\n");
-}
-
-cppit(Imakefile, template, outfd, outfname)
- char *Imakefile;
- char *template;
- FILE *outfd;
- char *outfname;
-{
- FILE *pipeFile;
- int pid, pipefd[2];
-#ifdef SYSV
- int status;
-#else /* !SYSV */
- union wait status;
-#endif /* !SYSV */
- char *cleanedImakefile;
-
- /*
- * Get a pipe.
- */
- if (pipe(pipefd) < 0)
- LogFatal("Cannot make a pipe.", "");
-
- /*
- * Fork and exec cpp
- */
- pid = fork();
- if (pid < 0)
- LogFatal("Cannot fork.", "");
- if (pid) { /* parent */
- close(pipefd[0]);
- cleanedImakefile = CleanCppInput(Imakefile);
- if ((pipeFile = fdopen(pipefd[1], "w")) == NULL)
- LogFatalI("Cannot fdopen fd %d for output.", pipefd[1]);
- fprintf(pipeFile, "#define IMAKE_TEMPLATE\t\"%s\"\n",
- template);
- fprintf(pipeFile, "#define INCLUDE_IMAKEFILE\t<%s>\n",
- cleanedImakefile);
- fprintf(pipeFile, "#include IMAKE_TEMPLATE\n");
- fclose(pipeFile);
- while (wait(&status) > 0) {
- errno = 0;
-#ifdef SYSV
- if ((status >> 8) & 0xff)
- LogFatalI("Signal %d.", (status >> 8) & 0xff);
- if (status & 0xff)
- LogFatalI("Exit code %d.", status & 0xff);
-#else /* !SYSV */
- if (status.w_termsig)
- LogFatalI("Signal %d.", status.w_termsig);
- if (status.w_retcode)
- LogFatalI("Exit code %d.", status.w_retcode);
-#endif /* !SYSV */
- }
- CleanCppOutput(outfd, outfname);
- } else { /* child... dup and exec cpp */
- if (verbose)
- showargs(cpp_argv);
- dup2(pipefd[0], 0);
- dup2(fileno(outfd), 1);
- close(pipefd[1]);
- execv(cpp, cpp_argv);
- LogFatal("Cannot exec %s.", cpp);
- }
-}
-
-makeit()
-{
- int pid;
-#ifdef SYSV
- int status;
-#else /* !SYSV */
- union wait status;
-#endif /* !SYSV */
-
- /*
- * Fork and exec make
- */
- pid = fork();
- if (pid < 0)
- LogFatal("Cannot fork.", "");
- if (pid) { /* parent... simply wait */
- while (wait(&status) > 0) {
- errno = 0;
-#ifdef SYSV
- if ((status >> 8) & 0xff)
- LogFatalI("Signal %d.", (status >> 8) & 0xff);
- if (status & 0xff)
- LogFatalI("Exit code %d.", status & 0xff);
-#else /* !SYSV */
- if (status.w_termsig)
- LogFatalI("Signal %d.", status.w_termsig);
- if (status.w_retcode)
- LogFatalI("Exit code %d.", status.w_retcode);
-#endif /* !SYSV */
- }
- } else { /* child... dup and exec cpp */
- if (verbose)
- showargs(make_argv);
- if (make)
- execv(make, make_argv);
- else
- execvp("make", make_argv);
- LogFatal("Cannot exec %s.", cpp);
- }
-}
-
-char *CleanCppInput(Imakefile)
- char *Imakefile;
-{
- FILE *outFile = NULL;
- int infd;
- char *buf, /* buffer for file content */
- *pbuf, /* walking pointer to buf */
- *punwritten, /* pointer to unwritten portion of buf */
- *cleanedImakefile = Imakefile, /* return value */
- *ptoken, /* pointer to # token */
- *pend, /* pointer to end of # token */
- savec; /* temporary character holder */
- struct stat st;
-
- /*
- * grab the entire file.
- */
- if ((infd = open(Imakefile, O_RDONLY)) < 0)
- LogFatal("Cannot open %s for input.", Imakefile);
- fstat(infd, &st);
- buf = Emalloc(st.st_size+1);
- if (read(infd, buf, st.st_size) != st.st_size)
- LogFatal("Cannot read all of %s:", Imakefile);
- close(infd);
- buf[ st.st_size ] = '\0';
-
- punwritten = pbuf = buf;
- while (*pbuf) {
- /* pad make comments for cpp */
- if (*pbuf == '#' && (pbuf == buf || pbuf[-1] == '\n')) {
-
- ptoken = pbuf+1;
- while (*ptoken == ' ' || *ptoken == '\t')
- ptoken++;
- pend = ptoken;
- while (*pend && *pend != ' ' && *pend != '\t' && *pend != '\n')
- pend++;
- savec = *pend;
- *pend = '\0';
- if (strcmp(ptoken, "include")
- && strcmp(ptoken, "define")
- && strcmp(ptoken, "undef")
- && strcmp(ptoken, "ifdef")
- && strcmp(ptoken, "ifndef")
- && strcmp(ptoken, "else")
- && strcmp(ptoken, "endif")
- && strcmp(ptoken, "if")) {
- if (outFile == NULL) {
- tmpImakefile = mktemp(strdup(tmpImakefile));
- cleanedImakefile = tmpImakefile;
- outFile = fopen(tmpImakefile, "w");
- if (outFile == NULL)
- LogFatal("Cannot open %s for write.\n",
- tmpImakefile);
- }
- fwrite(punwritten, sizeof(char), pbuf-punwritten, outFile);
- fputs("/**/", outFile);
- punwritten = pbuf;
- }
- *pend = savec;
- }
- pbuf++;
- }
- if (outFile) {
- fwrite(punwritten, sizeof(char), pbuf-punwritten, outFile);
- fclose(outFile); /* also closes the pipe */
- }
-
- return(cleanedImakefile);
-}
-
-CleanCppOutput(tmpfd, tmpfname)
- FILE *tmpfd;
- char *tmpfname;
-{
- char *input;
- int blankline = 0;
-
- while(input = ReadLine(tmpfd, tmpfname)) {
- if (isempty(input)) {
- if (blankline++)
- continue;
- KludgeResetRule();
- } else {
- blankline = 0;
- KludgeOutputLine(&input);
- fputs(input, tmpfd);
- }
- putc('\n', tmpfd);
- }
- fflush(tmpfd);
-#ifdef NFS_STDOUT_BUG
- /*
- * On some systems, NFS seems to leave a large number of nulls at
- * the end of the file. Ralph Swick says that this kludge makes the
- * problem go away.
- */
- ftruncate (fileno(tmpfd), (off_t)ftell(tmpfd));
-#endif
-}
-
-/*
- * Determine of a line has nothing in it. As a side effect, we trim white
- * space from the end of the line. Cpp magic cookies are also thrown away.
- */
-isempty(line)
- char *line;
-{
- char *pend;
-
- /*
- * Check for lines of the form
- * # n "...
- * or
- * # line n "...
- */
- if (*line == '#') {
- pend = line+1;
- if (*pend == ' ')
- pend++;
- if (strncmp(pend, "line ", 5) == 0)
- pend += 5;
- if (isdigit(*pend)) {
- while (isdigit(*pend))
- pend++;
- if (*pend++ == ' ' && *pend == '"')
- return(TRUE);
- }
- }
-
- /*
- * Find the end of the line and then walk back.
- */
- for (pend=line; *pend; pend++) ;
-
- pend--;
- while (pend >= line && (*pend == ' ' || *pend == '\t'))
- pend--;
- *++pend = '\0';
- return (*line == '\0');
-}
-
-/*ARGSUSED*/
-char *ReadLine(tmpfd, tmpfname)
- FILE *tmpfd;
- char *tmpfname;
-{
- static boolean initialized = FALSE;
- static char *buf, *pline, *end;
- char *p1, *p2;
-
- if (! initialized) {
- int total_red;
- struct stat st;
-
- /*
- * Slurp it all up.
- */
- fseek(tmpfd, 0, 0);
- fstat(fileno(tmpfd), &st);
- pline = buf = Emalloc(st.st_size+1);
- total_red = read(fileno(tmpfd), buf, st.st_size);
- if (total_red != st.st_size)
- LogFatal("cannot read %s\n", tmpMakefile);
- end = buf + st.st_size;
- *end = '\0';
- lseek(fileno(tmpfd), 0, 0);
-#ifdef SYSV
- freopen(tmpfname, "w+", tmpfd);
-#else /* !SYSV */
- ftruncate(fileno(tmpfd), 0);
-#endif /* !SYSV */
- initialized = TRUE;
- fprintf (tmpfd, "# Makefile generated by imake - do not edit!\n");
- fprintf (tmpfd, "# %s\n",
- "$XConsortium: imake.c,v 1.51 89/12/12 12:37:30 jim Exp $");
-
-#ifdef FIXUP_CPP_WHITESPACE
- {
- static char *cpp_warning[] = {
-"#",
-"# The cpp used on this machine replaces all newlines and multiple tabs and",
-"# spaces in a macro expansion with a single space. Imake tries to compensate",
-"# for this, but is not always successful.",
-"#",
-NULL };
- char **cpp;
-
- for (cpp = cpp_warning; *cpp; cpp++) {
- fprintf (tmpfd, "%s\n", *cpp);
- }
- }
-#endif /* FIXUP_CPP_WHITESPACE */
- }
-
- for (p1 = pline; p1 < end; p1++) {
- if (*p1 == '@' && *(p1+1) == '@') { /* soft EOL */
- *p1++ = '\0';
- p1++; /* skip over second @ */
- break;
- }
- else if (*p1 == '\n') { /* real EOL */
- *p1++ = '\0';
- break;
- }
- }
-
- /*
- * return NULL at the end of the file.
- */
- p2 = (pline == p1 ? NULL : pline);
- pline = p1;
- return(p2);
-}
-
-writetmpfile(fd, buf, cnt)
- FILE *fd;
- int cnt;
- char *buf;
-{
- errno = 0;
- if (fwrite(buf, cnt, 1, fd) != 1)
- LogFatal("Cannot write to %s.", tmpMakefile);
-}
-
-char *Emalloc(size)
- int size;
-{
- char *p, *malloc();
-
- if ((p = malloc(size)) == NULL)
- LogFatalI("Cannot allocate %d bytes\n", size);
- return(p);
-}
-
-#ifdef FIXUP_CPP_WHITESPACE
-KludgeOutputLine(pline)
- char **pline;
-{
- char *p = *pline;
-
- switch (*p) {
- case '#': /*Comment - ignore*/
- break;
- case '\t': /*Already tabbed - ignore it*/
- break;
- case ' ': /*May need a tab*/
- default:
- for (; *p; p++) if (p[0] == ':' &&
- p > *pline && p[-1] != '\\') {
- if (**pline == ' ')
- (*pline)++;
- InRule = TRUE;
- break;
- }
- if (InRule && **pline == ' ')
- **pline = '\t';
- break;
- }
-}
-
-KludgeResetRule()
-{
- InRule = FALSE;
-}
-#endif /* FIXUP_CPP_WHITESPACE */
-
-char *strdup(cp)
- register char *cp;
-{
- register char *new = Emalloc(strlen(cp) + 1);
-
- strcpy(new, cp);
- return new;
-}
+++ /dev/null
-/*
- * $XConsortium: imakemdep.h,v 1.10 89/12/18 16:56:38 jim Exp $
- *
- * This file contains machine-dependent constants for the imake utility. When
- * porting imake, read each of the steps below and add in any necessary
- * definitions. Do *not* edit ccimake.c or imake.c!
- */
-
-#ifdef CCIMAKE
-/*
- * Step 1: imake_ccflags
- * Define any special flags that will be needed to get imake.c to compile.
- * These will be passed to the compile along with the contents of the
- * make variable BOOTSTRAPCFLAGS.
- */
-
-#ifdef sparc
-#define imake_ccflags "-DSYSV"
-#endif
-
-#ifdef hpux
-#define imake_ccflags "-Wc,-Nd4000,-Ns3000 -DSYSV"
-#endif
-
-#ifdef macII
-#define imake_ccflags "-DSYSV"
-#endif
-
-#ifdef stellar
-#define imake_ccflags "-DSYSV"
-#endif
-
-#ifdef att
-#define imake_ccflags "-DSYSV -DUSG"
-#endif
-
-#ifdef CRAY
-#define imake_ccflags "-DSYSV -DUSG"
-#endif
-
-#ifdef aix
-#define imake_ccflags "-Daix -DSYSV"
-#endif
-
-#ifdef umips
-#ifdef SYSTYPE_SYSV
-#define imake_ccflags "-DSYSV -I../../lib/X/mips -I/usr/include/bsd ../../lib/X/mips/mipssysvc.c -lbsd"
-#endif
-#endif
-
-#ifdef ultrix
-#include <dbm.h>
-#ifdef BYTESIZ
-#define imake_ccflags "-O -DULTRIX31"
-#else
-#define ULTRIX40
-#define imake_ccflags "-O -DULTRIX40"
-#endif
-#endif
-
-#else /* not CCIMAKE */
-#ifndef MAKEDEPEND
-/*
- * Step 2: dup2
- * If your OS doesn't have a dup2() system call to duplicate one file
- * descriptor onto another, define such a mechanism here (if you don't
- * already fall under the existing category(ies).
- */
-#if defined(SYSV) && !defined(CRAY)
-#define dup2(fd1,fd2) ((fd1 == fd2) ? fd1 : (close(fd2), \
- fcntl(fd1, F_DUPFD, fd2)))
-#endif
-
-
-/*
- * Step 3: FIXUP_CPP_WHITESPACE
- * If your cpp collapses tabs macro expansions into a single space and
- * replaces escaped newlines with a space, define this symbol. This will
- * cause imake to attempt to patch up the generated Makefile by looking
- * for lines that have colons in them (this is why the rules file escapes
- * all colons). One way to tell if you need this is to see whether or not
- * your Makefiles have no tabs in them and lots of @@ strings.
- */
-#if defined(sun) || defined(SYSV) || defined(_AIX)
-#define FIXUP_CPP_WHITESPACE
-#endif
-
-
-/*
- * Step 4: DEFAULT_CPP
- * If the C preprocessor does not live in /lib/cpp, set this symbol to
- * the appropriate location.
- */
-#ifdef apollo
-#define DEFAULT_CPP "/usr/lib/cpp"
-#endif
-
-
-/*
- * Step 5: cpp_argv
- * The following table contains the cpp flags that should be passed to
- * cpp whenever a Makefile is being generated. If your preprocessor
- * doesn't predefine any unique symbols, choose one and add it to the
- * end of this table. Then, do the following:
- *
- * a. Use this symbol at the top of Imake.tmpl when setting MacroFile.
- * b. Put this symbol in the definition of BootstrapCFlags in your
- * <platform>.cf file.
- * c. When doing a make World, always add "BOOTSTRAPCFLAGS=-Dsymbol"
- * to the end of the command line.
- *
- * Note that you may define more than one symbols (useful for platforms
- * that support multiple operating systems).
- */
-
-#define ARGUMENTS 50 /* number of arguments in various arrays */
-char *cpp_argv[ARGUMENTS] = {
- "cpp", /* replaced by the actual cpp program to exec */
- "-I.", /* add current directory to include path */
-#ifdef unix
- "-Uunix", /* remove unix symbol so that filename unix.c okay */
-#endif
-#ifdef M4330
- "-DM4330", /* Tektronix */
-#endif
-#ifdef M4310
- "-DM4310", /* Tektronix */
-#endif
-#ifdef macII
- "-DmacII", /* Apple A/UX */
-#endif
-#ifdef att
- "-Datt", /* AT&T products */
-#endif
-#ifdef aix
- "-Daix", /* AIX instead of AOS */
-#ifndef ibm
-#define ibm /* allow BOOTSTRAPCFLAGS="-Daix" */
-#endif
-#endif
-#ifdef ibm
- "-Dibm", /* IBM PS/2 and RT under both AOS and AIX */
-#endif
-#ifdef ULTRIX31
- "-DULTRIX31",
-#endif
-#ifdef ULTRIX40
- "-DULTRIX40",
-#endif
-};
-#else /* else MAKEDEPEND */
-/*
- * Step 6: predefs
- * If your compiler and/or preprocessor define any specific symbols, add
- * them to the the following table. The definition of struct symtab is
- * in util/makedepend/main.c.
- */
-struct symtab predefs[] = {
-#ifdef apollo
- {"apollo", "1"},
-#endif
-#ifdef ibm032
- {"ibm032", "1"},
-#endif
-#ifdef ibm
- {"ibm", "1"},
-#endif
-#ifdef aix
- {"aix", "1"},
-#endif
-#ifdef sun
- {"sun", "1"},
-#endif
-#ifdef hpux
- {"hpux", "1"},
-#endif
-#ifdef vax
- {"vax", "1"},
-#endif
-#ifdef VMS
- {"VMS", "1"},
-#endif
-#ifdef cray
- {"cray", "1"},
-#endif
-#ifdef CRAY
- {"CRAY", "1"},
-#endif
-#ifdef att
- {"att", "1"},
-#endif
-#ifdef mips
- {"mips", "1"},
-#endif
-#ifdef ultrix
- {"ultrix", "1"},
-#endif
-#ifdef stellar
- {"stellar", "1"},
-#endif
-#ifdef mc68000
- {"mc68000", "1"},
-#endif
-#ifdef mc68020
- {"mc68020", "1"},
-#endif
-#ifdef __GNUC__
- {"__GNUC__", "1"},
-#endif
-#ifdef __STDC__
- {"__STDC__", "1"},
-#endif
-#ifdef __HIGHC__
- {"__HIGHC__", "1"},
-#endif
-#ifdef CMU
- {"CMU", "1"},
-#endif
- /* add any additional symbols before this line */
- {NULL, NULL}
-};
-
-#endif /* MAKEDEPEND */
-#endif /* CCIMAKE */
+++ /dev/null
-/**/#
-/**/# The Main rules
-/**/#
-
-/*
- * This is the standard rule for compiling system calls
- */
-#define library_sysobj_rule() @@\
-.c.o: @@\
- $(CPP) -E -DPROF $*.c | $(AS) -o $*.o -Mx @@\
- -$(LD) -X -r -o profiled/$*.o $*.o @@\
- $(CPP) -E $*.c | $(AS) -o $*.o -Mx @@\
- -$(LD) -x -r -o a.out $*.o @@\
- mv a.out $*.o
-
-
-/*
- * ... and for other objects in libraries
- */
-#define library_obj_rule() @@\
-.s.o: @@\
- $(CPP) $(DEFINES) -E -DPROF $*.s \ @@\
- | $(AS) $(AFLAGS) -68020 -o $*.o -Mx @@\
- -$(LD) -X -r -o profiled/$*.o $*.o @@\
- $(CPP) $(DEFINES) -E $*.s | $(AS) $(AFLAGS) -68020 -o $*.o -Mx @@\
- -$(LD) -x -r -o a.out $*.o @@\
- mv a.out $*.o @@\
- @@\
-.c.o: @@\
- $(CC) -p -c $(CFLAGS) $*.c @@\
- -$(LD) -X -r -o profiled/$*.o $*.o @@\
- $(CC) -c $(CFLAGS) $*.c @@\
- -$(LD) -x -r -o a.out $*.o @@\
- mv a.out $*.o
-
-
-/*
- * These two are used by things like csh...
- */
-#define cxstr_obj_target(target) @@\
-target.o: target @@\
- ${XSTR} @@\
- ${CC} -c -R xs.c @@\
- mv -f xs.o target.o @@\
- rm -f xs.c
-
-#define cxstr_obj_rule() @@\
-.c.o: @@\
- ${CC} -E ${CFLAGS} $*.c | ${XSTR} -c - @@\
- ${CC} -c ${CFLAGS} x.c @@\
- mv -f x.o $*.o @@\
- rm -f x.c
-
-
-/*
- * Special library rules for generating files from the UTek library
- */
-#define tools_library_obj_rule() @@\
-.s.o: @@\
- $(CPP) $(DEFINES) -E $*.s | $(AS) $(AFLAGS) -68020 -o $*.o -Mx @@\
- -$(LD) -x -r -o a.out $*.o @@\
- mv a.out $*.o @@\
- @@\
-.c.o: @@\
- $(CC) -c $(CFLAGS) $*.c @@\
- -$(LD) -x -r -o a.out $*.o @@\
- mv a.out $*.o
-
-#define library_target(libname) @@\
-all: lib/**/libname lib/**/libname/**/_p @@\
-lib/**/libname: $(OBJS) @@\
- ar cruf $@ $(OBJS) @@\
-lib/**/libname/**/_p: $(OBJS) @@\
- cd profiled; ar cruf ../$@ $(OBJS)
-
-#define tools_library_target(libname) @@\
-all: lib/**/libname @@\
-lib/**/libname: $(OBJS) @@\
- ar cru $@ $(OBJS) @@\
-
-/*
- * Note that '/*' plays havoc with cpp. So we use the equivalent '/?*'.
- */
-#define multiple_library_target(libname,dirlist) @@\
-all: lib/**/libname lib/**/libname/**/_p @@\
- @@\
-lib/**/libname: dirlist @@\
- -mkdir tmp @@\
- for i in dirlist; do \ @@\
- (cd tmp; ar x ../$$i/lib$${i}); done @@\
- ar crf $@ `ls tmp/?*.o` @@\
- rm -rf tmp @@\
-lib/**/libname/**/_p: dirlist @@\
- -mkdir tmp @@\
- for i in dirlist; do \ @@\
- (cd tmp; ar x ../$$i/lib$${i}_p); done @@\
- ar crf $@ `ls tmp/?*.o` @@\
- rm -rf tmp @@\
- @@\
-dirlist: FRC @@\
- cd $@; $(IMAKE) $(MFLAGS) all @@\
-FRC:
-
-
-/*
- * This is a basic program target
- */
-#define program_target(program, objlist) @@\
-program: objlist $(SYSOBJECTS) @@\
- $(CC) -o $@ objlist $(LDFLAGS) @@\
- $(XINU) $@
-
-
-/*
- * This target can be called by all programs that are contained in
- * a single c source file.
- */
-#define simple_program_target(program,dest) @@\
-OBJS = program.$O @@\
-SRCS = program.c @@\
- @@\
-complex_program_target(program,dest)
-
-
-/*
- * This target is like simple_program_target() except that the dependency
- * list is long (it must be provided in the Imakefile.
- */
-#define complex_program_target(program,dest) @@\
-program: $(OBJS) $(SYSOBJECTS) @@\
- $(CC) -o $@ $(OBJS) $(LDFLAGS) @@\
- $(XINU) $@ @@\
- @@\
-install_program(program,dest) @@\
-depend_target()
-
-
-/*
- * Compile an assembler module that is kept in a .c file (like the
- * system call library).
- */
-#define casm_obj_target(basename) @@\
-basename.$O: basename.c @@\
- ${CC} -E basename.c | ${AS} -o basename.$O
-
-/*
- * Install a non-executable file.
- */
-#define install_non_exec(file,dest) @@\
-install:: file @@\
- install68 -c -m 0664 file $(DEST)/dest
-
-
-/*
- * Install a shell program. Must be named 'program'.sh.
- */
-#define install_shell(program,dest) @@\
-install:: program.sh @@\
- install68 -c program.sh $(DEST)/dest/program
-
-#define install_program(program,dest) @@\
-install:: program @@\
- install68 -c program $(DEST)/dest
-
-#define install_multiple(list,dest) @@\
-install:: list @@\
- @for i in list; do \ @@\
- (set -x; install68 -c $$i $(DEST)/dest); \ @@\
- done
-
-#define install_library(libname,dest) @@\
-install:: lib/**/libname lib/**/libname/**/_p @@\
- install68 -c -r -x lib/**/libname \ @@\
- $(DEST)/dest/lib/**/libname.a @@\
- install68 -c -r -x lib/**/libname/**/_p \ @@\
- $(DEST)/dest/lib/**/libname/**/_p.a @@\
- @@\
-install_vax_library(libname,lib68)
-
-#define install_vax_library(libname,dest) @@\
-install:: lib/**/libname lib/**/libname/**/_p @@\
- install68 -c -r lib/**/libname \ @@\
- $(TOOLSDEST)/dest/lib/**/libname.a @@\
- install68 -c -r lib/**/libname/**/_p \ @@\
- $(TOOLSDEST)/dest/lib/**/libname/**/_p.a @@\
-
-#define install_tools_library(libname,dest) @@\
-install:: lib/**/libname @@\
- install68 -c -r lib/**/libname \ @@\
- $(DEST)/dest/lib/**/libname.a @@\
-
-/*
- * Do an imake on multiple sub-directories.
- */
-#define imake_multiple() @@\
-all: @@\
- @-for dir in `ls -F | egrep /`; do \ @@\
- (set -x; cd $$dir; $(IMAKE)); \ @@\
- done @@\
- @@\
-imake_multiple_install()
-
-
-#define imake_multiple_install() @@\
-install:: @@\
- @-for dir in `ls -F | egrep /`; do \ @@\
- (set -x; cd $$dir; $(IMAKE) install); \ @@\
- done
-
-/*
- * This makes the depend target given OBJS.
- */
-#define DependComment '# define Dependencies for $(MACHINE)'
-#define depend_target() @@\
-depend: @@\
- echo DependComment > $(MACHINE).depend @@\
- makedepend -s DependComment \ @@\
- -f $(MACHINE).depend \ @@\
- $(DEPEND_INCLUDES) \ @@\
- $(DEPEND_DEFINES) \ @@\
- $(INCLUDES) \ @@\
- $(SRCS)