BOOTSTRAP commands


PROGRAM NAME

kgenmake - Generates Machine specific Makefiles from the Imakefile

DESCRIPTION

kgenmake is used to generate Makefiles from a template, a set of cpp macro functions, and a per-directory input file called an Imakefile. This allows machine dependencies (such has compiler options, alternate command names, and special make rules) to be kept separate from the descriptions of the various items to be built.

kgenmake should not be run directory, it is best to use the interface program 'kgenmake'. See the man page on 'kgenmake' for more information. This man page is mainly a technical reference for kgenmake.

HOW IT WORKS

kgenmake invokes cpp with any \fI\-I\fP or -D flags passed on the command line and passes it the following 3 lines:

		#define IMAKE_TEMPLATE "KHOROS.tmpl" 
		#define INCLUDE_IMAKEFILE "Imakefile"
		#include IMAKE_TEMPLATE

where Khoros.tmpl and Imakefile may be overridden by the \fI\-T\fP and \fI\-f\fP command options, respectively. If the Imakefile contains any lines beginning with a '#' character that is not followed by a cpp directive (#include, #define, #undef, #ifdef, #else, #endif, or #if), kgenmake will make a temporary makefile in which the '#' lines are prepended with the string ``/**/'' (so that cpp will copy the line into the Makefile as a comment).

The Imakefile reads in file containing machine-dependent parameters (specified as cpp symbols), a site-specific parameters file, a file containing cpp macro functions for generating make rules, and finally the Imakefile (specified by INCLUDE_IMAKEFILE) in the current directory. The Imakefile uses the macro functions to indicate what targets should be built; kgenmake takes care of generating the appropriate rules.

The rules file, Khoros.rules, in the configuration directory contains a variety of cpp macro functions that are configured according to the current platform. imake replaces any occurrences of the string ``@@'' with a newline to allow macros that generate more than one line of make rules. For example, the macro

#define program_target(program, objlist) @@\ program: objlist @@\ $(CC) -o $@ objlist $(LDFLAGS)

when called with "program_target(foo, foo1.o foo2.o)" will expand to

foo: foo1.o foo2.o $(CC) -o $@ foo1.o foo2.o $(LDFLAGS)

On systems whose cpp reduces multiple tabs and spaces to a single space, kgenmake attempts to put back any necessary tabs (make is very picky about the difference between tabs and spaces). For this reason, colons (:) in command lines must be preceded by a backslash (\\).

USE WITH KHOROS

The Khoros System uses kgenmake extensively, for both development and distribution. Two utilities that are used extensively in Khoros to maintain the kgenmake system are kgenimake(1) and kgenmake(1). kgenimake(1) will automatically generate an Imakefile.

REQUIRED ARGUMENTS

none

OPTIONAL ARGUMENTS

none

EXAMPLES

SEE ALSO

make(1), kgenimake(1), kmakedepend(1)

S. I. Feldman Make \- A Program for Maintaining Computer Programs

The Programmer's and Developers Volume of the Khoros Manual

ENVIRONMENT VARIABLES

The following environment variables may be set, however their use is not recommended as they introduce dependencies that are not readily apparent when kgenmake is run:

IMAKEINCLUDE If defined, this should be a valid include argument for the C preprocessor. E.g. ``-I/usr/include/local''. Actually, any valid cpp argument will work here.

IMAKECPP If defined, this should be a valid path to a preprocessor program. E.g. ``/usr/local/cpp''. By default, kgenmake will use /lib/cpp.

IMAKEMAKE If defined, this should be a valid path to a make program. E.g. ``/usr/local/make''. By default, kgenmake will use whatever make program is found using execvp(3).

RESTRICTIONS

Comments should be preceded by ``/**/#'' to protect them from cpp.

REFERENCES

COPYRIGHT

Copyright (C) 1993 - 1997, Khoral Research, Inc. ("KRI") All rights reserved.