IMAKE(1)							     IMAKE(1)



NAME
  imake	- C preprocessor interface to the make utility

SYNOPSIS
  imake	[-Ddefine] [-Idir] [-Ttemplate]	[-f filename] [-s filename] [-e] [-v]

DESCRIPTION
  Imake	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.

OPTIONS
  The following	command	line options may be passed to imake:

  -Ddefine
	  This option is passed	directly to cpp.  It is	typically used to set
	  directory-specific variables.	 For example, the X Window System
	  uses this flag to set	TOPDIR to the name of the directory contain-
	  ing the top of the core distribution and CURDIR to the name of the
	  current directory, relative to the top.

  -Idirectory
	  This option is passed	directly to cpp.  It is	typically used to
	  indicate the directory in which the imake template and configura-
	  tion files may be found.

  -Ttemplate
	  This option specifies	the name of the	master template	file (which
	  is usually located in	the directory specified	with -I) used by cpp.
	  The default is Imake.tmpl.

  -f filename
	  This option specifies	the name of the	per-directory input file.
	  The default is Imakefile.

  -s filename
	  This option specifies	the name of the	make description file to be
	  generated but	make should not	be invoked.  If	the filename is	a
	  dash (-), the	output is written to stdout.  The default is to	gen-
	  erate, but not execute, a Makefile.

  -e	  This option indicates	the imake should execute the generated
	  Makefile.  The default is to leave this to the user.

  -v	  This option indicates	that imake should print	the cpp	command	line
	  that it is using to generate the Makefile.

HOW IT WORKS
  Imake	invokes	cpp with any -I	or -D flags passed on the command line and
  passes it the	following 3 lines:

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

  where	Imake.tmpl and Imakefile may be	overridden by the -T and -f 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), imake	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 (speci-
  fied 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; imake
  takes	care of	generating the appropriate rules.

  The rules file (usually named	Imake.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,
  imake	attempts to put	back any necessary tabs	(make is very picky about the
  difference between tabs and spaces).	For this reason, colons	(:) in com-
  mand lines must be preceded by a backslash (\).

USE WITH THE X WINDOW SYSTEM
  The X	Window System uses imake extensively, for both full builds within the
  source tree and external software.  As mentioned above, two special vari-
  ables, TOPDIR	and CURDIR set to make referencing files using relative	path
  names	easier.	 For example, the following command is generated automati-
  cally	to build the Makefile in the directory lib/X/ (relative	to the top of
  the sources):

	  %  ../.././config/imake  -I../.././config \
		  -DTOPDIR=../../. -DCURDIR=./lib/X

  When building	X programs outside the source tree, a special symbol UseIn-
  stalled is defined and TOPDIR	and CURDIR are omitted.	 If the	configuration
  files	have been properly installed, the script xmkmf(1) may be used to
  specify the proper options:

	  %  xmkmf

  The command make Makefiles can then be used to generate Makefiles in any
  subdirectories.

FILES
  /usr/tmp/tmp-imake.nnnnnn	temporary input	file for cpp
  /usr/tmp/tmp-make.nnnnnn	temporary input	file for make
  /lib/cpp			default	C preprocessor


SEE ALSO
  make(1)
  S. I.	Feldman	Make - A Program for Maintaining Computer Programs



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 imake is	run:

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

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

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

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

AUTHOR
  Todd Brunhoff, Tektronix and MIT Project Athena; Jim Fulton, MIT X Consor-
  tium