XCOMM ---------------------------------------------------------------------
XCOMM Imake rules for building libraries, programs, scripts, and data files
XCOMM rules:  $Xorg: Imake.rules,v 1.3 2000/08/17 19:41:46 cpqbld Exp $
XCOMM rules:  $XdotOrg: xc/config/cf/Imake.rules,v 1.8 2005/02/01 22:27:00 ajax Exp $
XCOMM
XCOMM
XCOMM
XCOMM
XCOMM rules:  $XFree86: xc/config/cf/Imake.rules,v 3.128 2003/11/15 03:25:17 dawes Exp $

/*
 *		   MACHINE-INDEPENDENT RULES; DO NOT MODIFY
 *
 * Warning, when defining rules: make sure you do not include both a trailing
 * backslash and double ampersand backslash or else you will get an extra
 * backslash in the Makefile.
 *
 * The following macros are defined for the various templates and Imakefiles
 * (for a list of the applicable make variables, see the template files):
 *
 * Concat			(a,b)
 * Concat3			(a,b,c)
 * Concat4			(a,b,c,d)
 * _Use				(a,b)
 * _UseCat			(a,b,c)
 * _MUse			(a,b)
 * _MUseCat			(a,b,c)
 * ProgramTargetName		(target)
 * HostProgramTargetName	(target)
 * RunProgram			(progvar,options)
 * RunProgramWithSetup		(setup,progvar,options)
 * RemoveFile			(file)
 * RemoveFiles			(files)
 * CenterLoadTarget		(target,srclist,libs,defines)
 * CenterProgramTarget		(program,srclist,objlist,locallibs,syslibs)
 * SentinelLinkTarget		(step,program,linklist)
 * SentinelProgramTarget	(program,deplist,linklist)
 * SentinelCplusplusProgramTarget	(program,deplist,linklist)
 * PurifyLinkTarget		(step,program,linklist)
 * PurifyProgramTarget		(program,deplist,linklist)
 * PurifyCplusplusProgramTarget	(program,deplist,linklist)
 * ProofLinkTarget		(step,program,linklist)
 * ProofProgramTarget		(program,deplist,linklist)
 * ProofCplusplusProgramTarget	(program,deplist,linklist)
 * ProofCleanTarget		()
 * RemoveTargetProgram		(program)
 * MakeDir			(dir)
 * InstallDirectory		(dir)
 * BuildIncludesTop		(srclist)
 * BuildIncludes		(srclist,dstsubdir,dstupdir)
 * LinkRule			(program,options,objects,libraries)
 * HostLinkRule			(program,options,objects,libraries)
 * NoCmpScript			(target)
 * NoConfigRec			(target)
 * NormalProgramTarget		(program,objects,deplibs,locallibs,syslibs)
 * SetUIDProgramTarget		(program,objects,deplibs,locallibs,syslibs)
 * SingleProgramTarget		(program,objects,locallibs,syslibs)
 * SimpleProgramTarget		(program)
 * ComplexProgramTarget		(program)
 * ComplexProgramTarget_1	(program,locallib,syslib)
 * ComplexProgramTarget_2	(program,locallib,syslib)
 * ComplexProgramTarget_3	(program,locallib,syslib)
 * ServerTargetWithFlags	(server,subdirs,objects,libs,syslibs,flags)
 * ServerTarget			(server,subdirs,objects,libs,syslibs)
 * MoveToBakFile		(file)
 * RMoveToBakFile		(file)
 * RanLibrary			(args)
 * LibraryTargetName		(libname)
 * LibraryTargetNameSuffix	(libname,suffix)
 * InstallNamedTarget		(step,srcname,flags,dest,dstname)
 * InstallTarget		(step,file,flags,dest)
 * InstallLibrary		(libname,dest)
 * MergeIntoInstalledLibrary	(tolib,fromlib)
 * InstallLibraryAlias		(libname,alias,dest)
 * InstallLintLibrary		(libname,dest)
 * InstallManPageLong		(file,destdir,dest)
 * InstallManPage		(file,destdir)
 * InstallManPageAliases	(file,destdir,aliases)
 * ManKeywordsTarget		(manpath)
 * InstallNamedNonExec		(srcname,dstname,dest)
 * InstallNonExecFile		(file,dest)
 * InstallNonExecFileNoClobber	(file,dest)
 * InstallNonExec		(file,dest)
 * InstallProgramWithFlags	(program,dest,flags)
 * InstallProgram		(program,dest)
 * InstallScript		(program,dest)
 * InstallNamedProg		(srcname,dstname,dest)
 * InstallNamedProgNoClobber	(srcname,dstname,dest)
 * MakeFlagsToShellFlags	(makeflags,shellcmd)
 * MakeNamedTargetSubdir	(dir,flags,subname)
 * LinkConfDirectoryLong	(mdir,cdir,rdir,ldir,opath,npath)
 * LinkConfDirectory		(mdir,cdir,rdir,ldir)
 * LinkConfFileLong		(cfile,lfile,opath,npath)
 * LinkConfFile			(cfile,lfile)
 * LinkFileList			(step,list,dir,sub)
 * LinkVarDirectory		(mdir,cdir,rdir,ldir)
 * InstallMultipleDestFlags	(step,list,dest,flags)
 * InstallMultipleDest		(step,list,dest)
 * InstallMultiple		(list,dest)
 * InstallMultipleFlags		(list,dest,flags)
 * InstallMultipleMan		(list,dest)
 * InstallMultipleManSuffix	(list,dest,suffix)
 * DependDependency		()
 * DependTarget			()
 * DependTarget3		(srcs1,srcs2,srcs3)
 * CleanTarget			()
 * TagsTarget			()
 * ImakeDependency		(target)
 * BuildMakefileTarget		(notused,imakeflags)
 * MakefileTarget		()
 * LibMkdir			(dir)
 * LibCleanDir			(dir)
 * LintLibReferences		(varname,libname,libsource)
 * UnsharedLibReferences	(varname,libname,libsource)
 * ProjectUnsharedLibReferences	(varname,libname,libsource,buildlibdir)
 * SharedLibDependencies	(libname,libsource,revname)
 * SharedDSLibDependencies	(libname,libsource,revname)
 * SharedLibReferences		(varname,libname,libsource,revname,rev)
 * SharedDSLibReferences	(varname,libname,libsource,revname,rev)
 * ObjectCompile		(options)
 * NormalLibObjCompile		(options)
 * NormalSharedLibObjCompile	(options)
 * NormalRelocLibObjCompile	(options)
 * LibObjCompile		(dir,options)
 * DebuggedLibObjCompile	(options)
 * ProfiledLibObjCompile	(options)
 * SharedLibObjCompile		(options)
 * NormalLibraryObjectRule	()
 * NormalFortranObjectRule	()
 * ObjectFromSpecialSource	(dst,src,flags)
 * SpecialObjectRule		(objs,depends,options)
 * SpecialCObjectRule		(basename,depends,options)
 * LexFile			(file)
 * M4File			(file,includes)
 * YaccFile			(file,flags)
 * YaccFileNoFlags		(file)
 * MakeLibrary			(libname,objlist)
 * LinkBuildLibrary		(lib)
 * LinkBuildSonameLibrary	(lib)
 * NormalLibraryTarget		(libname,objlist)
 * NormalLibraryTarget2		(libname,objlist1,objlist2)
 * NormalLibraryTarget3		(libname,objlist1,objlist2,objlist3)
 * NormalDepLibraryTarget	(libname,deplist,objlist)
 * UnsharedLibraryTarget	(libname,objlist,down,up)
 * UnsharedLibraryTarget3	(libname,objlist1,objlist2,objlist3,down,up)
 * SubdirLibraryRule		(objlist)
 * ProfiledLibraryTarget	(libname,objlist)
 * DebuggedLibraryTarget	(libname,objlist)
 * AliasedLibraryTarget		(libname,alias)
 * NormalRelocatableTarget	(objname,objlist)
 * ProfiledRelocatableTarget	(objname,objlist)
 * DebuggedRelocatableTarget	(objname,objlist)
 * LintLibraryTarget		(libname,srclist)
 * NormalLintTarget		(srclist)
 * LintTarget			()
 * LinkSourceFile		(src,dir)
 * LinkFile			(tofile,fromfile)
 * MakeSubincludesForBuild	(step,dir,srclist)
 * LangNamedTargetSubdirs	(lang,name,dirs,verb,flags,subname)
 * LangNamedMakeSubdirs		(lang,name,dirs)
 * LangMakeSubdirs		(lang,dirs)
 * NamedTargetSubdirs		(name,dirs,verb,flags,subname)
 * NamedMakeSubdirs		(name,dirs)
 * MakeSubdirs			(dirs)
 * DependSubdirs		(dirs)
 * ForceSubdirs			(dirs)
 * InstallSubdirs		(dirs)
 * InstallManSubdirs		(dirs)
 * IncludesSubdirs		(dirs)
 * NamedCleanSubdirs		(name,dirs)
 * CleanSubdirs			(dirs)
 * NamedTagSubdirs		(name,dirs)
 * TagSubdirs			(dirs)
 * MakeLintSubdirs		(dirs,target,subtarget)
 * LintSubdirs			(dirs)
 * MakeLintLibSubdirs		(dirs)
 * MakeMakeSubdirs		(dirs,target)
 * MakefileSubdirs		(dirs)
 * CppScriptTarget		(dst,src,defs,deplist)
 * MakeScriptFromCpp		(name,defs)
 * CppFileTarget		(dst,src,defs,deplist)
 * CppSourceFile		(dst,src,defs,deplist)
 * MakeDirectories		(step,dirs)
 * AllTarget			(depends)
 * StaticLibrary		(libpath,libname)
 * MakeMutex			(targets)
 * LinkBuildModule		(module,subdir)
 * LinkBuildNamedModule		(module,name,subdir)
 * DynamicModuleTarget		(module,modlist)
 * InstallDynamicModule		(module,dest,subdir)
 * InstallDynamicNamedModule	(module,instname,dest,subdir)
 * LinkerRuntimeLibraryPathFlag	(path)
 *
 *
 * The following are in specific <os>Lib.rules:
 *
 * SharedLibraryTarget		(libname,rev,solist,down,up)
 * SharedLibraryDataTarget	(libname,rev,salist)
 * InstallSharedLibrary		(libname,rev,dest)
 * InstallSharedLibraryData	(libname,rev,dest)
 * SharedDepModuleTarget	(name,deps,solist)
 *
 */

#define NullParameter

/* if [ -d ] or [ ! -d ] causes make to fail, define this as - */
#ifndef DirFailPrefix
#define DirFailPrefix
#endif

/*
 * NoCmpScript - suppress clearmake build script comparison.
 */
#ifndef NoCmpScript
#if HasClearmake
#define NoCmpScript(targ)						@@\
XCOMM special target for clearmake					@@\
.NO_CMP_SCRIPT: targ
#else
#define NoCmpScript(targ) /**/
#endif
#endif

/*
 * NoConfigRec - suppress using clearmake configuration records.
 */
#ifndef NoConfigRec
#if HasClearmake
#define NoConfigRec(targ)						@@\
XCOMM special target for clearmake					@@\
.NO_CONFIG_REC: targ
#else
#define NoConfigRec(targ) /**/
#endif
#endif

/*
 * Concat - concatenates two strings.
 */
#ifndef Concat
#if (defined(__STDC__) && !defined(UnixCpp)) || defined(AnsiCpp)
#define Concat(a,b)a##b
#else
#define Concat(a,b)a/**/b
#endif
#endif

/*
 * Concat3 - concatenates three strings.
 */
#ifndef Concat3
#if (defined(__STDC__) && !defined(UnixCpp)) || defined(AnsiCpp)
#define Concat3(a,b,c)a##b##c
#else
#define Concat3(a,b,c)a/**/b/**/c
#endif
#endif

/*
 * Concat4 - concatenates four strings.
 */
#ifndef Concat4
#if (defined(__STDC__) && !defined(UnixCpp)) || defined(AnsiCpp)
#define Concat4(a,b,c,d)a##b##c##d
#else
#define Concat4(a,b,c,d)a/**/b/**/c/**/d
#endif
#endif

/*
 * _XUse - makes a choice based on UseInstalledX11.
 */
#ifndef _XUse
# if defined(UseInstalled) || UseInstalledX11
#  define _XUse(a,b) a
# else
#  define _XUse(a,b) b
# endif
#endif /* _XUse */

/*
 * _Use - makes a choice based on UseInstalled.
 */
#ifndef _Use
# define _Use	_XUse
#endif /* _Use */

/*
 * _XUseCat - combination of _XUse and Concat.
 *           exists to avoid problems with some preprocessors
 */
#ifndef _XUseCat
# if (defined(__STDC__) && !defined(UnixCpp)) || defined(AnsiCpp)
#  if defined(UseInstalled) || UseInstalledX11
#   define _XUseCat(a,b,c) a##c
#  else
#   define _XUseCat(a,b,c) b##c
#  endif
# else
#  if defined(UseInstalled) || UseInstalledX11
#   define _XUseCat(a,b,c) a/**/c
#  else
#   define _XUseCat(a,b,c) b/**/c
#  endif
# endif
#endif /* _XUseCat */

/*
 * _UseCat - combination of _Use and Concat.
 *           exists to avoid problems with some preprocessors
 */
#ifndef _UseCat
# define _UseCat	_XUseCat
#endif /* _UseCat */

#ifndef ProgramTargetName
#define ProgramTargetName(target)target
#endif

#ifndef HostProgramTargetName
#define HostProgramTargetName(target)target
#endif

#ifndef RunProgram
#define RunProgram(progvar,options) $(progvar) options
#endif

#ifndef RunProgramWithSetup
#define RunProgramWithSetup(setup,progvar,options) setup $(progvar) options
#endif

#ifndef RunPerlScript
#define RunPerlScript(script,options) $(PERLENVSETUP) $(PERL) $(PERLOPTS) script options
#endif

#ifndef RemoveFile
#define RemoveFile(file) $(RM) file
#endif /* RemoveFile */

#ifndef RemoveFiles
#define RemoveFiles(files) $(RM) files
#endif /* RemoveFiles */

#if RemoveObsoleteFiles
#define RemoveOldFile(new,old,dir)					@@\
	@if [ -f new ]; then set -x; \					@@\
		RemoveFile($(DESTDIR)dir/old); \			@@\
	fi
#else
#define RemoveOldFile(new,old,dir) $(_NULLCMD_)
#endif

/*
 * CenterLoadTarget - generate rules to load files into CodeCenter
 */
#ifndef CenterLoadTarget
#if HasCodeCenter
#define CenterLoadTarget(target,srclist,libs,defines)			@@\
ProgramTargetName(target):: srclist					@@\
	XCOMM load defines srclist libs
#else
#define CenterLoadTarget(target,srclist,libs,defines) /**/
#endif
#endif /* CenterLoadTarget */

/*
 * CenterProgramTarget - generate rules to make CodeCenter read in sources
 * and objects.
 */
#ifndef CenterProgramTarget
#define CenterProgramTarget(program,srclist,objlist,locallibs,syslibs)	@@\
CenterLoadTarget(Concat(debug_,program),srclist,$(EXTRA_LDOPTIONS) $(LOCAL_LDFLAGS) $(LDPRELIBS) locallibs $(LDLIBS) syslibs,$(ALLDEFINES)) @@\
									@@\
CenterLoadTarget(Concat(odebug_,program),objlist,$(EXTRA_LDOPTIONS) $(LOCAL_LDFLAGS) $(LDPRELIBS) locallibs $(LDLIBS) syslibs,$(ALLDEFINES))
#endif /* CenterProgramTarget */

#ifndef SentinelLinkTarget
#if HasSentinel
#define SentinelLinkTarget(step,program,linklist)			@@\
ProgramTargetName(step.sentinel):					@@\
	RemoveTargetProgram($@)						@@\
	$(CCENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CC) -o program.sentinel $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
#else
#define SentinelLinkTarget(step,program,linklist) /**/
#endif
#endif /* SentinelLinkTarget */

/*
 * SentinelProgramTarget - generate rules to make Sentinel image
 */
#ifndef SentinelProgramTarget
#if HasSentinel
#define	SentinelProgramTarget(program,deplist,linklist)			@@\
ProgramTargetName(program.sentinel): deplist				@@\
	RemoveTargetProgram($@)						@@\
	$(CCENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
									@@\
clean clean.sentinel::							@@\
	RemoveFile(program.sentinel)
#else
#define	SentinelProgramTarget(program,deplist,linklist) /**/
#endif
#endif /* SentinelProgramTarget */

/*
 * SentinelCplusplusProgramTarget - generate rules to make Sentinel image
 */
#ifndef SentinelCplusplusProgramTarget
#if HasSentinel
#define	SentinelCplusplusProgramTarget(program,deplist,linklist)	@@\
ProgramTargetName(program.sentinel): deplist				@@\
	RemoveTargetProgram($@)						@@\
	$(CXXENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
									@@\
clean clean.sentinel::							@@\
	RemoveFile(program.sentinel)
#else
#define	SentinelCplusplusProgramTarget(program,deplist,linklist) /**/
#endif
#endif /* SentinelCplusplusProgramTarget */

#ifndef PurifyLinkTarget
#if HasPurify
#define PurifyLinkTarget(step,program,linklist)				@@\
ProgramTargetName(step.pure):						@@\
	RemoveTargetProgram($@)						@@\
	$(CCENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CC) -o program.pure $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
#else
#define PurifyLinkTarget(step,program,linklist) /**/
#endif
#endif /* PurifyLinkTarget */

/*
 * PurifyProgramTarget - generate rules to make Purify'ed image
 */
#ifndef PurifyProgramTarget
#if HasPurify
#define	PurifyProgramTarget(program,deplist,linklist)			@@\
ProgramTargetName(program.pure): deplist				@@\
	RemoveTargetProgram($@)						@@\
	$(CCENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
									@@\
clean clean.pure::							@@\
	RemoveFile(program.pure)
#else
#define	PurifyProgramTarget(program,deplist,linklist) /**/
#endif
#endif /* PurifyProgramTarget */

/*
 * PurifyCplusplusProgramTarget - generate rules to make Purify'ed image
 */
#ifndef PurifyCplusplusProgramTarget
#if HasPurify
#define	PurifyCplusplusProgramTarget(program,deplist,linklist)		@@\
ProgramTargetName(program.pure): deplist				@@\
	RemoveTargetProgram($@)						@@\
	$(CXXENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
									@@\
clean clean.pure::							@@\
	RemoveFile(program.pure)
#else
#define	PurifyCplusplusProgramTarget(program,deplist,linklist) /**/
#endif
#endif /* PurifyCplusplusProgramTarget */

#ifndef ProofLinkTarget
#if HasTestCenter
#define ProofLinkTarget(step,program,linklist)				@@\
ProgramTargetName(step.tc):						@@\
	RemoveTargetProgram($@)						@@\
	$(CCENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CC) -o program.tc $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
#else
#define ProofLinkTarget(step,program,linklist) /**/
#endif
#endif /* ProofLinkTarget */

/*
 * ProofProgramTarget - generate rules to make Proof'ed image
 */
#ifndef ProofProgramTarget
#if HasTestCenter
#define	ProofProgramTarget(program,deplist,linklist)			@@\
ProgramTargetName(program.tc): deplist					@@\
	RemoveTargetProgram($@)						@@\
	$(CCENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
									@@\
clean cleantc::								@@\
	RemoveFiles(program.tc program.tc.*.*)
#else
#define	ProofProgramTarget(program,deplist,linklist) /**/
#endif
#endif /* ProofProgramTarget */

/*
 * ProofCplusplusProgramTarget - generate rules to make Proof'ed image
 */
#ifndef ProofCplusplusProgramTarget
#if HasTestCenter
#define	ProofCplusplusProgramTarget(program,deplist,linklist)		@@\
ProgramTargetName(program.tc): deplist					@@\
	RemoveTargetProgram($@)						@@\
	$(CXXENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
									@@\
clean cleantc::								@@\
	RemoveFiles(program.tc program.tc.*.*)
#else
#define	ProofCplusplusProgramTarget(program,deplist,linklist) /**/
#endif
#endif /* ProofCplusplusProgramTarget */

#ifndef ProofCleanTarget
#if HasTestCenter
#define ProofCleanTarget()						@@\
clean cleantc::								@@\
	$(RM) -r TC.Cache
#else
#define ProofCleanTarget() /**/
#endif
#endif /* ProofCleanTarget */

#ifndef RemoveTargetProgram
#if RemoveTargetProgramByMoving
#define RemoveTargetProgram(program) \
-if [ -f program ]; then RemoveFile(Concat(program,~)); $(MV) program Concat(program,~); fi
#else
#define RemoveTargetProgram(program) RemoveFile(program)
#endif
#endif /* RemoveTargetProgram */

#ifndef MakeDir
#define MakeDir(dir) DirFailPrefix@if [ -d dir ]; then \		@@\
		set +x; \						@@\
	else \								@@\
		if [ -h dir ]; then \					@@\
			(set -x; rm -f dir); \				@@\
		fi; \							@@\
		(set -x; $(MKDIRHIER) dir); \				@@\
	fi
#endif /* MakeDir */

#ifndef MakeDirInline
#define MakeDirInline(dir) if [ -d dir ]; then \			@@\
		:; \							@@\
	else \								@@\
		if [ -h dir ]; then \					@@\
			(set -x; rm -f dir); \				@@\
		fi; \							@@\
		(set -x; $(MKDIRHIER) dir); \				@@\
	fi
#endif /* MakeDirInline */

#ifndef InstallDirectory
#define InstallDirectory(dir)						@@\
install::								@@\
	MakeDir(dir)
#endif /* InstallDirectory */

#ifndef InstallCreateLink
# define InstallCreateLink(dest,from,to)				@@\
install::								@@\
	  cd $(DESTDIR)dest && \					@@\
	  $(LN) -sf from to
#endif

#ifndef BuildIncludesTop
#define BuildIncludesTop(srclist)					@@\
includes:: srclist							@@\
	MakeDir($(BUILDINCDIR))						@@\
	@(set -x; cd $(BUILDINCDIR) && for i in srclist; do \		@@\
		RemoveFile($$i); \					@@\
		$(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/$$i .; \		@@\
	done)
#endif /* BuildIncludesTop */

#ifndef BuildIncludes
#define BuildIncludes(srclist,dstsubdir,dstupdir)			@@\
includes:: srclist							@@\
	MakeDir($(BUILDINCDIR)/dstsubdir)				@@\
	@(set -x; cd $(BUILDINCDIR)/dstsubdir && for i in srclist; do \	@@\
		RemoveFile($$i); \					@@\
		$(LN) $(BUILDINCTOP)/dstupdir/$(CURRENT_DIR)/$$i .; \	@@\
	done)
#endif /* BuildIncludes */

/*
 * LinkBuildBinary - export a binary from the build tree.
 */
#ifndef LinkBuildBinary
#define LinkBuildBinary(binary)						@@\
all:: $(BUILDBINDIR)/binary binary					@@\
									@@\
$(BUILDBINDIR)/binary: binary						@@\
	MakeDir($(BUILDBINDIR))						@@\
	RemoveFile($@)							@@\
	cd $(BUILDBINDIR) && $(LN) $(BUILDBINTOP)/$(CURRENT_DIR)/binary .
#endif /* LinkBuildBinary */

#ifndef BuildInterfaces
#define BuildInterfaces(srclist,dstsubdir,dstupdir)			@@\
interfaces::								@@\
	MakeDir($(BUILDINCDIR)/dstsubdir)				@@\
	@(set -x; cd $(BUILDINCDIR)/dstsubdir && for i in srclist; do \	@@\
		RemoveFile($$i); \					@@\
		$(LN) $(BUILDINCTOP)/dstupdir/$(CURRENT_DIR)/$$i .; \	@@\
	done)
#endif /* BuildInterfaces */

/*
 * LinkRule - link a program
 */
#ifndef LinkRule
#define LinkRule(program,options,objects,libraries) \
$(CCLINK) -o program options objects libraries $(EXTRA_LOAD_FLAGS)
#endif /* LinkRule */

/*
 * HostLinkRule - link a utility to be used on the build host
 * (differs from LinkRule if cross compiling)
 */
#ifndef HostLinkRule
#define HostLinkRule LinkRule
#endif

#ifndef CplusplusLinkRule
#define CplusplusLinkRule(program,options,objects,libraries) \
$(CXXLINK) -o program options objects libraries $(EXTRA_LOAD_FLAGS)
#endif /* CplusplusLinkRule */

/*
 * NormalProgramTarget - generate rules to compile and link the indicated
 * program; since it does not use any default object files, it may be used for
 * multiple programs in the same Imakefile.
 */
#ifndef NormalProgramTarget
#define	NormalProgramTarget(program,objects,deplibs,locallibs,syslibs)	@@\
ProgramTargetName(program): objects deplibs				@@\
	RemoveTargetProgram($@)						@@\
	LinkRule($@,$(LDOPTIONS),objects,locallibs $(LDLIBS) syslibs)	@@\
									@@\
SentinelProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
PurifyProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
ProofProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
									@@\
clean::									@@\
	RemoveFile(ProgramTargetName(program))
#endif /* NormalProgramTarget */


/*
 * NormalCplusplusProgramTarget - Like NormalTargetProgram, but uses
 * C++ linking rules.
 */
#ifndef NormalCplusplusProgramTarget
#define	NormalCplusplusProgramTarget(program,objects,deplibs,locallibs,syslibs)	@@\
ProgramTargetName(program): objects deplibs				@@\
	RemoveTargetProgram($@)						@@\
	CplusplusLinkRule($@,$(CXXLDOPTIONS),objects,locallibs $(LDLIBS) syslibs) @@\
									@@\
SentinelCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
PurifyCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
ProofCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
									@@\
clean::									@@\
	RemoveFile(ProgramTargetName(program))
#endif /* NormalCplusplusProgramTarget */


#ifndef SetUIDProgramTarget
#define SetUIDProgramTarget NormalProgramTarget
#endif


/*
 * SingleProgramTarget - obsolete version of NormalProgramTarget that does
 * not have deplibs.
 */
#ifndef SingleProgramTarget
#define	SingleProgramTarget(program,objects,locallibs,syslibs)		@@\
NormalProgramTarget(program,objects,NullParameter,locallibs,syslibs)
#endif /* SingleProgramTarget */

/*
 * SimpleProgramTarget - generate rules for compiling and linking programs
 * that only have one C source file.  It should only be used in Imakefiles
 * that describe a single program.
 */
#ifndef SimpleProgramTarget
#define	SimpleProgramTarget(program)					@@\
           OBJS = program.o						@@\
           SRCS = program.c						@@\
									@@\
ComplexProgramTarget(program)
#endif /* SimpleProgramTarget */

#ifndef SimpleProgramTarget_1
#define	SimpleProgramTarget_1(program)					@@\
           OBJS1 = program.o						@@\
           SRCS1 = program.c						@@\
									@@\
ComplexProgramTarget_1(program,$(LOCAL_LIBRARIES),NullParameter)
#endif /* SimpleProgramTarget_1 */
#ifndef SimpleProgramTarget_2
#define	SimpleProgramTarget_2(program)					@@\
           OBJS2 = program.o						@@\
           SRCS2 = program.c						@@\
									@@\
ComplexProgramTarget_2(program,$(LOCAL_LIBRARIES),NullParameter)
#endif /* SimpleProgramTarget_2 */
#ifndef SimpleProgramTarget_3
#define	SimpleProgramTarget_3(program)					@@\
           OBJS3 = program.o						@@\
           SRCS3 = program.c						@@\
									@@\
ComplexProgramTarget_3(program,$(LOCAL_LIBRARIES),NullParameter)
#endif /* SimpleProgramTarget_3 */
#ifndef SimpleProgramTarget_4
#define	SimpleProgramTarget_4(program)					@@\
           OBJS4 = program.o						@@\
           SRCS4 = program.c						@@\
									@@\
ComplexProgramTarget_4(program,$(LOCAL_LIBRARIES),NullParameter)
#endif /* SimpleProgramTarget_4 */
#ifndef SimpleProgramTarget_5
#define	SimpleProgramTarget_5(program)					@@\
           OBJS5 = program.o						@@\
           SRCS5 = program.c						@@\
									@@\
ComplexProgramTarget_5(program,$(LOCAL_LIBRARIES),NullParameter)
#endif /* SimpleProgramTarget_5 */
#ifndef SimpleProgramTarget_6
#define	SimpleProgramTarget_6(program)					@@\
           OBJS6 = program.o						@@\
           SRCS6 = program.c						@@\
									@@\
ComplexProgramTarget_6(program,$(LOCAL_LIBRARIES),NullParameter)
#endif /* SimpleProgramTarget_6 */
#ifndef SimpleProgramTarget_7
#define	SimpleProgramTarget_7(program)					@@\
           OBJS7 = program.o						@@\
           SRCS7 = program.c						@@\
									@@\
ComplexProgramTarget_7(program,$(LOCAL_LIBRARIES),NullParameter)
#endif /* SimpleProgramTarget_7 */
#ifndef SimpleProgramTarget_8
#define	SimpleProgramTarget_8(program)					@@\
           OBJS8 = program.o						@@\
           SRCS8 = program.c						@@\
									@@\
ComplexProgramTarget_8(program,$(LOCAL_LIBRARIES),NullParameter)
#endif /* SimpleProgramTarget_8 */
#ifndef SimpleProgramTarget_9
#define	SimpleProgramTarget_9(program)					@@\
           OBJS9 = program.o						@@\
           SRCS9 = program.c						@@\
									@@\
ComplexProgramTarget_9(program,$(LOCAL_LIBRARIES),NullParameter)
#endif /* SimpleProgramTarget_9 */
#ifndef SimpleProgramTarget_10
#define	SimpleProgramTarget_10(program)					@@\
           OBJS10 = program.o						@@\
           SRCS10 = program.c						@@\
									@@\
ComplexProgramTarget_10(program,$(LOCAL_LIBRARIES),NullParameter)
#endif /* SimpleProgramTarget_10 */

#ifndef SimpleCplusplusProgramTarget
#define SimpleCplusplusProgramTarget(program)				@@\
           OBJS = program.o						@@\
           SRCS = program.CCsuf						@@\
									@@\
ComplexCplusplusProgramTarget(program)
#endif /* SimpleCplusplusProgramTarget */

#ifndef ProgramTargetHelper
#define	ProgramTargetHelper(program,srcs,objs,deplib,locallib,syslib)	@@\
ProgramTargetName(program): $(objs) $(deplib)				@@\
	RemoveTargetProgram($@)						@@\
	LinkRule($@,$(LDOPTIONS),$(objs),locallib $(LDLIBS) syslib)	@@\
									@@\
CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)		@@\
SentinelProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
PurifyProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
ProofProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
									@@\
InstallProgram(program,$(BINDIR))					@@\
InstallManPage(program,$(MANDIR))
#endif /* ProgramTargetHelper */

#ifndef ProgramTargetHelperNoMan
#define ProgramTargetHelperNoMan(program,srcs,objs,deplib,locallib,syslib) @@\
ProgramTargetName(program): $(objs) $(deplib)				@@\
	RemoveTargetProgram($@)						@@\
	LinkRule($@,$(LDOPTIONS),$(objs),locallib $(LDLIBS) syslib)	@@\
									@@\
CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)		@@\
SentinelProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
PurifyProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
ProofProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
									@@\
InstallProgram(program,$(BINDIR))
#endif /* ProgramTargetHelperNoMan */

#ifndef CplusplusProgramTargetHelper
#define	CplusplusProgramTargetHelper(program,srcs,objs,deplib,locallib,syslib) @@\
ProgramTargetName(program): $(objs) $(deplib)				@@\
	RemoveTargetProgram($@)						@@\
	CplusplusLinkRule($@,$(CXXLDOPTIONS),$(objs),locallib $(LDLIBS) syslib) @@\
									@@\
CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)		@@\
SentinelCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
PurifyCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
ProofCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
									@@\
InstallProgram(program,$(BINDIR))					@@\
InstallManPage(program,$(MANDIR))
#endif /* CplusplusProgramTargetHelper */

#ifndef CplusplusProgramTargetHelperNoMan
#define	CplusplusProgramTargetHelperNoMan(program,srcs,objs,deplib,locallib,syslib) @@\
ProgramTargetName(program): $(objs) $(deplib)				@@\
	RemoveTargetProgram($@)						@@\
	CplusplusLinkRule($@,$(CXXLDOPTIONS),$(objs),locallib $(LDLIBS) syslib) @@\
									@@\
CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)		@@\
SentinelCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
PurifyCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
ProofCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
									@@\
InstallProgram(program,$(BINDIR))					@@
#endif /* CplusplusProgramTargetHelperNoMan */

/*
 * ComplexProgramTarget - generate rules for compiling and linking the
 * program specified by $(OBJS) and $(SRCS), installing the program and its
 * man page, and generating dependencies.  It should only be used in
 * Imakefiles that describe a single program.
 */
#ifndef ComplexProgramTarget
#define	ComplexProgramTarget(program)					@@\
        PROGRAM = ProgramTargetName(program)				@@\
									@@\
AllTarget(ProgramTargetName(program))					@@\
									@@\
ProgramTargetHelper(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
									@@\
DependTarget()								@@\
LintTarget()								@@\
									@@\
clean::									@@\
	RemoveFile(ProgramTargetName(program))
#endif /* ComplexProgramTarget */

#ifndef ComplexCplusplusProgramTarget
#define	ComplexCplusplusProgramTarget(program)				@@\
        PROGRAM = ProgramTargetName(program)				@@\
									@@\
AllTarget(ProgramTargetName(program))					@@\
									@@\
CplusplusProgramTargetHelper(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
									@@\
DependTarget()								@@\
LintTarget()								@@\
									@@\
clean::									@@\
	RemoveFile(ProgramTargetName(program))
#endif /* ComplexCplusplusProgramTarget */

/*
 * ComplexProgramTargetNoMan - generate rules for compiling and linking
 * the program specified by $(OBJS) and $(SRCS), installing the program
 * and generating dependencies.  It should only be used in Imakefiles
 * that describe a single program, and have no manual page.
 */
#ifndef ComplexProgramTargetNoMan
#define ComplexProgramTargetNoMan(program)				@@\
        PROGRAM = ProgramTargetName(program)				@@\
									@@\
AllTarget(ProgramTargetName(program))					@@\
									@@\
ProgramTargetHelperNoMan(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
									@@\
DependTarget()								@@\
LintTarget()								@@\
									@@\
clean::									@@\
	RemoveFile(ProgramTargetName(program))
#endif /* ComplexProgramTargetNoMan */

#ifndef ComplexCplusplusProgramTarget
#define	ComplexCplusplusProgramTarget(program)				@@\
        PROGRAM = program						@@\
									@@\
AllTarget(program)							@@\
									@@\
CplusplusProgramTargetHelperNoMan(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
									@@\
DependTarget()								@@\
LintTarget()								@@\
									@@\
clean::									@@\
	RemoveFile(ProgramTargetName(program))
#endif /* ComplexCplusplusProgramTarget */

/*
 * ComplexProgramTarget_1 - generate rules for compiling and linking the
 * program specified by $(OBJS1) and $(SRCS1), installing the program and its
 * man page, and generating dependencies for it and any programs described
 * by $(SRCS2) through $(SRCS10).  It should be used to build the primary
 * program in Imakefiles that describe multiple programs.
 */
#ifndef ComplexProgramTarget_1
#define	ComplexProgramTarget_1(program,locallib,syslib)			@@\
  OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) \			@@\
         $(OBJS6) $(OBJS7) $(OBJS8) $(OBJS9) $(OBJS10)			@@\
  SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4) $(SRCS5) \			@@\
         $(SRCS6) $(SRCS7) $(SRCS8) $(SRCS9) $(SRCS10)			@@\
									@@\
AllTarget($(PROGRAMS))							@@\
									@@\
ProgramTargetHelper(program,SRCS1,OBJS1,DEPLIBS1,locallib,syslib)	@@\
									@@\
DependTarget()								@@\
LintTarget()								@@\
									@@\
clean::									@@\
	RemoveFiles($(PROGRAMS))
#endif /* ComplexProgramTarget_1 */

#ifndef ComplexCplusplusProgramTarget_1
#define	ComplexCplusplusProgramTarget_1(program,locallib,syslib)	@@\
  OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) \			@@\
         $(OBJS6) $(OBJS7) $(OBJS8) $(OBJS9) $(OBJS10)			@@\
  SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4) $(SRCS5) \			@@\
         $(SRCS6) $(SRCS7) $(SRCS8) $(SRCS9) $(SRCS10)			@@\
									@@\
AllTarget($(PROGRAMS))							@@\
									@@\
CplusplusProgramTargetHelper(program,SRCS1,OBJS1,DEPLIBS1,locallib,syslib)@@\
									@@\
DependTarget()								@@\
LintTarget()								@@\
									@@\
clean::									@@\
	RemoveFiles($(PROGRAMS))
#endif /* ComplexCplusplusProgramTarget_1 */

/*
 * ComplexProgramTarget_2 - generate rules for compiling and linking the
 * program specified by $(OBJS2) and $(SRCS2) and installing the program and
 * man page.  It should be used to build the second program in Imakefiles
 * describing more than one program.
 */
#ifndef ComplexProgramTarget_2
#define	ComplexProgramTarget_2(program,locallib,syslib)			@@\
ProgramTargetHelper(program,SRCS2,OBJS2,DEPLIBS2,locallib,syslib)
#endif /* ComplexProgramTarget_2 */

#ifndef ComplexCplusplusProgramTarget_2
#define	ComplexCplusplusProgramTarget_2(program,locallib,syslib)	@@\
CplusplusProgramTargetHelper(program,SRCS2,OBJS2,DEPLIBS2,locallib,syslib)
#endif /* ComplexCplusplusProgramTarget_2 */

/*
 * ComplexProgramTarget_3 - generate rules for compiling and linking the
 * program specified by $(OBJS3) and $(SRCS3) and installing the program and
 * man page.  It should be used to build the third program in Imakefiles
 * describing more than one program.
 */
#ifndef ComplexProgramTarget_3
#define	ComplexProgramTarget_3(program,locallib,syslib)			@@\
ProgramTargetHelper(program,SRCS3,OBJS3,DEPLIBS3,locallib,syslib)
#endif /* ComplexProgramTarget_3 */

#ifndef ComplexCplusplusProgramTarget_3
#define	ComplexCplusplusProgramTarget_3(program,locallib,syslib)	@@\
CplusplusProgramTargetHelper(program,SRCS3,OBJS3,DEPLIBS3,locallib,syslib)
#endif /* ComplexCplusplusProgramTarget_3 */

/*
 * ComplexProgramTarget_4 - generate rules for compiling and linking the
 * program specified by $(OBJS4) and $(SRCS4) and installing the program and
 * man page.  It should be used to build the third program in Imakefiles
 * describing more than one program.
 */
#ifndef ComplexProgramTarget_4
#define	ComplexProgramTarget_4(program,locallib,syslib)			@@\
ProgramTargetHelper(program,SRCS4,OBJS4,DEPLIBS4,locallib,syslib)
#endif /* ComplexProgramTarget_4 */

#ifndef ComplexCplusplusProgramTarget_4
#define	ComplexCplusplusProgramTarget_4(program,locallib,syslib)	@@\
CplusplusProgramTargetHelper(program,SRCS4,OBJS4,DEPLIBS4,locallib,syslib)
#endif /* ComplexCplusplusProgramTarget_4 */

/*
 * ComplexProgramTarget_5 - generate rules for compiling and linking the
 * program specified by $(OBJS5) and $(SRCS5) and installing the program and
 * man page.  It should be used to build the third program in Imakefiles
 * describing more than one program.
 */
#ifndef ComplexProgramTarget_5
#define	ComplexProgramTarget_5(program,locallib,syslib)			@@\
ProgramTargetHelper(program,SRCS5,OBJS5,DEPLIBS5,locallib,syslib)
#endif /* ComplexProgramTarget_5 */

#ifndef ComplexCplusplusProgramTarget_5
#define	ComplexCplusplusProgramTarget_5(program,locallib,syslib)	@@\
CplusplusProgramTargetHelper(program,SRCS5,OBJS5,DEPLIBS5,locallib,syslib)
#endif /* ComplexCplusplusProgramTarget_5 */

/*
 * ComplexProgramTarget_6 - generate rules for compiling and linking the
 * program specified by $(OBJS6) and $(SRCS6) and installing the program and
 * man page.  It should be used to build the third program in Imakefiles
 * describing more than one program.
 */
#ifndef ComplexProgramTarget_6
#define	ComplexProgramTarget_6(program,locallib,syslib)			@@\
ProgramTargetHelper(program,SRCS6,OBJS6,DEPLIBS6,locallib,syslib)
#endif /* ComplexProgramTarget_6 */

#ifndef ComplexCplusplusProgramTarget_6
#define	ComplexCplusplusProgramTarget_6(program,locallib,syslib)	@@\
CplusplusProgramTargetHelper(program,SRCS6,OBJS6,DEPLIBS6,locallib,syslib)
#endif /* ComplexCplusplusProgramTarget_6 */

/*
 * ComplexProgramTarget_7 - generate rules for compiling and linking the
 * program specified by $(OBJS7) and $(SRCS7) and installing the program and
 * man page.  It should be used to build the third program in Imakefiles
 * describing more than one program.
 */
#ifndef ComplexProgramTarget_7
#define	ComplexProgramTarget_7(program,locallib,syslib)			@@\
ProgramTargetHelper(program,SRCS7,OBJS7,DEPLIBS7,locallib,syslib)
#endif /* ComplexProgramTarget_7 */

#ifndef ComplexCplusplusProgramTarget_7
#define	ComplexCplusplusProgramTarget_7(program,locallib,syslib)	@@\
CplusplusProgramTargetHelper(program,SRCS7,OBJS7,DEPLIBS7,locallib,syslib)
#endif /* ComplexCplusplusProgramTarget_7 */

/*
 * ComplexProgramTarget_8 - generate rules for compiling and linking the
 * program specified by $(OBJS8) and $(SRCS8) and installing the program and
 * man page.  It should be used to build the third program in Imakefiles
 * describing more than one program.
 */
#ifndef ComplexProgramTarget_8
#define	ComplexProgramTarget_8(program,locallib,syslib)			@@\
ProgramTargetHelper(program,SRCS8,OBJS8,DEPLIBS8,locallib,syslib)
#endif /* ComplexProgramTarget_8 */

#ifndef ComplexCplusplusProgramTarget_8
#define	ComplexCplusplusProgramTarget_8(program,locallib,syslib)	@@\
CplusplusProgramTargetHelper(program,SRCS8,OBJS8,DEPLIBS8,locallib,syslib)
#endif /* ComplexCplusplusProgramTarget_8 */

/*
 * ComplexProgramTarget_9 - generate rules for compiling and linking the
 * program specified by $(OBJS9) and $(SRCS9) and installing the program and
 * man page.  It should be used to build the third program in Imakefiles
 * describing more than one program.
 */
#ifndef ComplexProgramTarget_9
#define	ComplexProgramTarget_9(program,locallib,syslib)			@@\
ProgramTargetHelper(program,SRCS9,OBJS9,DEPLIBS9,locallib,syslib)
#endif /* ComplexProgramTarget_9 */

#ifndef ComplexCplusplusProgramTarget_9
#define	ComplexCplusplusProgramTarget_9(program,locallib,syslib)	@@\
CplusplusProgramTargetHelper(program,SRCS9,OBJS9,DEPLIBS9,locallib,syslib)
#endif /* ComplexCplusplusProgramTarget_9 */

/*
 * ComplexProgramTarget_10 - generate rules for compiling and linking the
 * program specified by $(OBJS10) and $(SRCS10) and installing the program and
 * man page.  It should be used to build the third program in Imakefiles
 * describing more than one program.
 */
#ifndef ComplexProgramTarget_10
#define	ComplexProgramTarget_10(program,locallib,syslib)		@@\
ProgramTargetHelper(program,SRCS10,OBJS10,DEPLIBS10,locallib,syslib)
#endif /* ComplexProgramTarget_10 */

#ifndef ComplexCplusplusProgramTarget_10
#define	ComplexCplusplusProgramTarget_10(program,locallib,syslib)	@@\
CplusplusProgramTargetHelper(program,SRCS10,OBJS10,DEPLIBS10,locallib,syslib)
#endif /* ComplexCplusplusProgramTarget_10 */

#ifndef MoveToBakFile
#define MoveToBakFile(file) -@if [ -f file ]; then set -x; \		@@\
	$(MV) file file.bak; else exit 0; fi
#endif /* MoveToBakFile */

#ifndef RMoveToBakFile
#define RMoveToBakFile(file) -@if [ -f file ]; then set -x; \		@@\
	RemoveFile(file.bak); $(MV) file file.bak; \			@@\
	else exit 0; fi
#endif /* RMoveToBakFile */

/*
 * ServerTargetWithFlags - generate rules to compile, link, and relink a server
 */
#ifndef ServerTargetWithFlags
#define	ServerTargetWithFlags(server,subdirs,objects,libs,syslibs,flags) @@\
AllTarget(ProgramTargetName(server))					@@\
ProgramTargetName(server): subdirs objects libs				@@\
	MoveToBakFile($@)						@@\
	LinkRule($@,$(LDOPTIONS),objects,libs $(LDLIBS) syslibs) @@\
									@@\
Concat(load,server):							@@\
	MoveToBakFile(ProgramTargetName(server))			@@\
	LinkRule(ProgramTargetName(server),$(LDOPTIONS),objects,libs $(LDLIBS) syslibs) @@\
									@@\
loadX:: Concat(load,server)						@@\
									@@\
SentinelProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
SentinelLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
PurifyProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
PurifyLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
ProofProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
ProofLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
									@@\
InstallProgramWithFlags(server,$(BINDIR),flags)				@@\
									@@\
clean::									@@\
	RemoveFile(ProgramTargetName(server))
#endif /* ServerTargetWithFlags */

/*
 * ServerTarget - rules to compile, link, and relink a normal server
 */
#ifndef ServerTarget
#define	ServerTarget(server,subdirs,objects,libs,syslibs)		@@\
ServerTargetWithFlags(server,subdirs,objects,libs,syslibs,$(_NOOP_))
#endif /* ServerTarget */

#if DoRanlibCmd
#define RanLibrary(args) $(RANLIB) args
#else
#define RanLibrary(args) $(_NULLCMD_)
#endif

#ifndef LibraryTargetName
#define LibraryTargetName(libname)Concat(lib,libname.a)
#endif

/* This rule is used for libs in Xserver/Imakefile which are loaded, not
 * linked into the core module. Since modules are called libXXXX.a,
 * this rule mustn't be overriden by .cf files.
 */
#ifndef ModuleLibraryTargetName
#define ModuleLibraryTargetName(libname)Concat(lib,libname.a)
#endif

#ifndef LibraryTargetNameSuffix
#define LibraryTargetNameSuffix(libname,suffix)Concat3(lib,libname,suffix.a)
#endif

#ifndef InstallNamedInline
#define InstallNamedInline(srcname,flags,dest,dstname) $(INSTALL) $(INSTALLFLAGS) flags srcname $(DESTDIR)dest/dstname
#endif

#ifndef InstallNamedTarget
#define InstallNamedTarget(step,srcname,flags,dest,dstname)		@@\
step:: srcname								@@\
	MakeDir($(DESTDIR)dest)						@@\
	InstallNamedInline(srcname,flags,dest,dstname)
#endif /* InstallNamedTarget */

/*
 * InstallNamedTargetNoClobber - Like InstallNamedTarget, but doesn't
 * do the install if an installed version already exists.  Useful
 * for files that might have local customizations that you don't
 * want to clobber.  Config files are good candidates for this.
 */
#ifndef InstallNamedTargetNoClobber
#define InstallNamedTargetNoClobber(step,srcname,flags,dest,dstname)	@@\
step:: srcname								@@\
	MakeDir($(DESTDIR)dest)						@@\
	@if [ -f $(DESTDIR)dest/dstname ]; then \			@@\
	 echo "Not overwriting existing" $(DESTDIR)dest/dstname; \	@@\
	else set -x; \							@@\
	 $(INSTALL) $(INSTALLFLAGS) flags srcname $(DESTDIR)dest/dstname; fi
#endif /* InstallNamedTargetNoClobber */

#ifndef InstallTarget
#define InstallTarget(step,file,flags,dest)				@@\
InstallNamedTarget(step,file,flags,dest,file)
#endif /* InstallTarget */

#ifndef InstallInline
#define InstallInline(file,flags,dest) InstallNamedInline(file,flags,dest,file)
#endif

/*
 * InstallLibrary - generate rules to install the indicated library.
 */
#ifndef InstallLibrary
#define	InstallLibrary(libname,dest)					@@\
install:: LibraryTargetName(libname)					@@\
	MakeDir($(DESTDIR)dest)						@@\
	$(INSTALL) $(INSTALLFLAGS) $(INSTLIBFLAGS) LibraryTargetName(libname) $(DESTDIR)dest @@\
	RanLibrary($(RANLIBINSTFLAGS) $(DESTDIR)dest/LibraryTargetName(libname))
#endif /* InstallLibrary */


/*
 * InstallDriverSDKLibrary - rule to install Driver SDK library.
 *                           (only used for XFree86). This is a no-op
 *                           rule so that Imakefiles on non-XFree86 systems
 *                           continue to build Makefiles correctly.
 */
#ifndef InstallDriverSDKLibrary
#define InstallDriverSDKLibrary(lib,dir)
#endif


/*
 * InstallDriverSDKNamedLibrary - rule to install Driver SDK library.
 *                         (only used for XFree86). This is a no-op
 *                         rule so that Imakefiles on non-XFree86 systems
 *                         continue to build Makefiles correctly.
 */
#ifndef InstallDriverSDKNamedLibrary
#define InstallDriverSDKNamedLibrary(lib,dlib,dir)
#endif


/*
 * InstallDriverSDKLibraryModule - rule to install Driver SDK library module.
 *                           (only used for XFree86). This is a no-op
 *                           rule so that Imakefiles on non-XFree86 systems
 *                           continue to build Makefiles correctly.
 */
#ifndef InstallDriverSDKLibraryModule
#define InstallDriverSDKLibraryModule(lib,dlib,dir)
#endif


/*
 * MergeIntoInstalledLibrary - generate rules to merge one library into another
 */
#ifndef MergeIntoInstalledLibrary
#define MergeIntoInstalledLibrary(tolib,fromlib)			@@\
install::  fromlib							@@\
	$(SCRIPTSRC)/mergelib $(DESTDIR)tolib fromlib
#endif /* MergeIntoInstalledLibrary */

/*
 * InstallLibraryAlias - generate rules to create a link from one library name
 * to another for the purposes of aliasing.
 */
#ifndef InstallLibraryAlias
#define	InstallLibraryAlias(libname,alias,dest)				@@\
install::								@@\
	-(cd $(DESTDIR)dest && ( \					@@\
		RemoveFile(LibraryTargetName(alias)); \			@@\
		$(LN) LibraryTargetName(libname) LibraryTargetName(alias)))
#endif /* InstallLibraryAlias */


/*
 * InstallLintLibrary - generate rules to install the indicated lint library.
 */
#ifndef InstallLintLibrary
#define	InstallLintLibrary(libname,dest)				@@\
InstallTarget(install.ln,Concat(llib-l,libname.ln),$(INSTLIBFLAGS),dest)
#endif /* InstallLintLibrary */


#if !CompressManPages
/*
 * InstallManPageLong - generate rules to install the indicated manual page,
 * giving it an alternate name.  This is used for installing man pages whose
 * base name without the .man suffix would normally be longer than 8 characters
 * (the limit for using source code control systems on files systems with
 * short file names).
 */
#ifndef InstallManPageLong
#define	InstallManPageLong(file,destdir,dest)				@@\
BuildInstallHtmlManPage(file,dest,$(MANSUFFIX))				@@\
									@@\
CppManTarget(file,$(EXTRAMANDEFS))					@@\
									@@\
InstallNamedTarget(install.man,file.$(MANNEWSUFFIX),$(INSTMANFLAGS),destdir,dest.$(MANSUFFIX))
#endif /* InstallManPageLong */


/*
 * InstallManPageAliases - generate rules to install manual page aliases.
 */
#ifndef InstallManPageAliases
#define	InstallManPageAliases(file,destdir,aliases)			@@\
InstallHtmlManPageAliases(file,aliases,$(MANSUFFIX))			@@\
									@@\
install.man::								@@\
	@(TMP="#tmp.$$$$"; \						@@\
	RemoveFile($${TMP}); \						@@\
	echo .so `basename destdir`/file.$(MANSUFFIX) > $${TMP}; \	@@\
	for i in aliases; do (set -x; \					@@\
	$(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) $${TMP} $(DESTDIR)destdir/$$i.$(MANSUFFIX)); \ @@\
	done; \								@@\
	RemoveFile($${TMP}))
#endif /* InstallManPageAliases */


/*
 * InstallGenManPageLong - More general rules for installing manual pages --
 * doesn't assume MANSUFFIX.
 */
#ifndef InstallGenManPageLong
#define	InstallGenManPageLong(file,destdir,dest,suffix)			@@\
BuildInstallHtmlManPage(file,dest,suffix)				@@\
									@@\
CppManTarget(file, $(EXTRAMANDEFS))					@@\
									@@\
install.man:: file.$(MANNEWSUFFIX)					@@\
	MakeDir($(DESTDIR)destdir)					@@\
	$(INSTALL) -c $(INSTMANFLAGS) file.$(MANNEWSUFFIX) \		@@\
		$(DESTDIR)destdir/dest.suffix
#endif /* InstallGenManPageLong */


/*
 * InstallGenManPageAliases - general equivalent of InstallManPageAliases
 */
#ifndef InstallGenManPageAliases
#define	InstallGenManPageAliases(file,destdir,suffix,aliases)		@@\
InstallHtmlManPageAliases(file,aliases,suffix)				@@\
									@@\
install.man::								@@\
	@(TMP="#tmp.$$$$"; \						@@\
	RemoveFile($${TMP}); \						@@\
	echo .so `basename destdir`/file.suffix > $${TMP}; \		@@\
	for i in aliases; do (set -x; \					@@\
	$(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) $${TMP} $(DESTDIR)destdir/$$i.suffix); \ @@\
	done; \								@@\
	RemoveFile($${TMP}))
#endif /* InstallGenManPageAliases */

#else /* CompressManPages */

#ifndef InstallManPageLong
#define InstallManPageLong(file,destdir,dest)				@@\
BuildInstallHtmlManPage(file,dest,$(MANSUFFIX))				@@\
									@@\
CppManTarget(file, $(EXTRAMANDEFS))					@@\
									@@\
install.man:: file.$(MANNEWSUFFIX)					@@\
	MakeDir($(DESTDIR)destdir)					@@\
	$(RM) $(DESTDIR)destdir/dest.$(MANSUFFIX)*			@@\
	$(INSTALL) -c $(INSTMANFLAGS) file.$(MANNEWSUFFIX) \		@@\
	  $(DESTDIR)destdir/dest.$(MANSUFFIX)				@@\
	-$(COMPRESSMANCMD) $(DESTDIR)destdir/dest.$(MANSUFFIX)
#endif

#ifndef InstallGenManPageLong
#define InstallGenManPageLong(file,destdir,dest,suffix)			@@\
BuildInstallHtmlManPage(file,dest,suffix)				@@\
									@@\
CppManTarget(file, $(EXTRAMANDEFS))					@@\
									@@\
install.man:: file.$(MANNEWSUFFIX)					@@\
	MakeDir($(DESTDIR)destdir)					@@\
	$(RM) $(DESTDIR)destdir/dest.suffix*				@@\
	$(INSTALL) -c $(INSTMANFLAGS) file.$(MANNEWSUFFIX) \		@@\
	  $(DESTDIR)destdir/dest.suffix					@@\
	-$(COMPRESSMANCMD) $(DESTDIR)destdir/dest.suffix
#endif

#ifndef InstallMultipleMan
#define InstallMultipleMan(list,dest)					@@\
install.man:: list							@@\
	MakeDir($(DESTDIR)dest)						@@\
	@case '${MFLAGS}' in *[i]*) set +e;; esac; \			@@\
	for i in list; do \						@@\
		(MNAME=`echo $$i | cut -f1 -d.`; \			@@\
		set -x;	\						@@\
		$(RM) $(DESTDIR)dest/$${MNAME}*; \			@@\
		$(INSTALL) -c $(INSTMANFLAGS) $$i \			@@\
		  $(DESTDIR)dest/$${MNAME}.$(MANSUFFIX); \		@@\
		$(COMPRESSMANCMD) $(DESTDIR)dest/$${MNAME}.$(MANSUFFIX)); \ @@\
	done
#endif

/*
 * InstallManPageAliases - install soft links for aliases.
 */
#ifndef InstallManPageAliasesBase
#define InstallManPageAliasesBase(file,destdir,aliases)			@@\
install.man::								@@\
	@(SUFFIX=`echo $(DESTDIR)destdir/file.* | sed -e 's,.*/[^\.]*.,,'`; \ @@\
	for i in aliases; do (set -x; \					@@\
	$(RM) $(DESTDIR)destdir/$$i.*; \				@@\
	(cd $(DESTDIR)destdir; $(LN) file.$${SUFFIX} \			@@\
	$$i.$${SUFFIX})); \						@@\
	done)
#endif

#ifndef InstallManPageAliases
#define InstallManPageAliases(file,destdir,aliases)			@@\
InstallHtmlManPageAliases(file,aliases,$(MANSUFFIX))			@@\
									@@\
InstallManPageAliasesBase(file,destdir,aliases)
#endif


/*
 * InstallGenManPageAliases - install soft links for aliases.
 */
#ifndef InstallGenManPageAliases
#define InstallGenManPageAliases(file,destdir,suffix,aliases)		@@\
InstallHtmlManPageAliases(file,aliases,suffix)				@@\
									@@\
InstallManPageAliasesBase(file,destdir,aliases)
#endif

#endif /* CompressManPages */


/*
 * InstallManPage - generate rules to install the indicated manual page.
 */
#ifndef InstallManPage
#define	InstallManPage(file,destdir)					@@\
InstallManPageLong(file,destdir,file)
#endif /* InstallManPage */


/*
 * InstallGenManPage - general equivalent of InstallManPage
 */
#ifndef InstallGenManPage
#define	InstallGenManPage(file,destdir,suffix)				@@\
InstallGenManPageLong(file,destdir,file,suffix)
#endif /* InstallGenManPage */


/*
 * RmanDependency - generate rules to build the rman program if
 * this Imakefile is within the source tree.
 */
#ifndef RmanDependency
#ifdef UseInstalled
#define RmanDependency() /**/
#else
#define RmanDependency()						@@\
NoCmpScript(ProgramTargetName($(RMAN)))					@@\
									@@\
ProgramTargetName($(RMAN)):						@@\
	@echo "checking $(RMANBASENAME) over in $(TOP)/config/util first..."; \	@@\
	cd $(TOP)/config/util && $(MAKE) rmanonly; \			@@\
	echo "okay, continuing in $(CURRENT_DIR)"

#endif /* UseInstalled */
#endif /* RmanDependency */

#ifndef RmanCmdDependency
#ifdef UseInstalled
#define RmanCmdDependency	/**/
#else
#define RmanCmdDependency	ProgramTargetName($(RMAN))
#endif
#endif

#ifndef BuildInstallHtmlManPage
#if BuildHtmlManPages
#define BuildInstallHtmlManPage(file,dest,suffix)			@@\
AllTarget(dest.suffix.html)						@@\
									@@\
dest.suffix.html: file.$(MANNEWSUFFIX) RmanCmdDependency		@@\
	RemoveFiles(dest.suffix.html dest.suffix-html)			@@\
	RunProgram(RMAN,$(RMANOPTIONS) < file.$(MANNEWSUFFIX) \		@@\
	  > dest.suffix-html) && $(MV) dest.suffix-html $@		@@\
									@@\
install.man:: dest.suffix.html						@@\
	MakeDir($(DESTDIR)$(DOCHTMLDIR))				@@\
	@(SUF=`expr suffix \: '\(.\)'`; \				@@\
	 set -x; \							@@\
	 $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) dest.suffix.html $(DESTDIR)$(DOCHTMLDIR)/dest.$$SUF.html)	@@\
									@@\
clean::									@@\
	RemoveFiles(dest.suffix.html dest.suffix-html)
#else
#define BuildInstallHtmlManPage(file,dest,suffix) /**/
#endif
#endif

#ifndef InstallHtmlManPageAliases
#if BuildHtmlManPages
#define InstallHtmlManPageAliases(file,aliases,suffix)			@@\
install.man:: file.suffix.html						@@\
	MakeDir($(DESTDIR)$(DOCHTMLDIR))				@@\
	@SUF=`expr suffix \: '\(.\)'`; \				@@\
	for i in aliases; do (set -x; \					@@\
	  RemoveFile($(DESTDIR)$(DOCHTMLDIR)/$$i.$$SUF.html); \		@@\
	  (cd $(DESTDIR)$(DOCHTMLDIR); \				@@\
	    $(LN) file.$$SUF.html $$i.$$SUF.html)); \			@@\
	done
#else
#define InstallHtmlManPageAliases(file,aliases,suffix) /**/
#endif
#endif

#ifndef HtmlManIndex
#if BuildHtmlManPages
#define HtmlManIndex							@@\
html_index::								@@\
	MakeDir($(DESTDIR)$(DOCHTMLDIR))				@@\
	$(HTMLINDEXCMD) $(DESTDIR)$(DOCHTMLDIR)
#else
#define HtmlManIndex	html_index::
#endif
#endif


/*
 * ManKeywordsTarget - generate the database used by "man -k".
 * This rule updates the index in the directory "manpath", which
 * indexes all the manual pages in the section subdirectories under
 * it.  An update command is defined only on systems that have a
 * per MANPATH element index.  If the OS supports only one system-wide
 * database, we don't update it, because then we can't do cross
 * installations or use a non-empty DESTDIR for testing.
 */
#ifndef ManKeywordsTarget
#define ManKeywordsTarget(manpath) man_keywords::
#endif

/*
 * InstallNamedNonExec - generate rules to install a data file
 */
#ifndef InstallNamedNonExec
#define	InstallNamedNonExec(srcname,dstname,dest)			@@\
InstallNamedTarget(install,srcname,$(INSTDATFLAGS),dest,dstname)
#endif /* InstallNamedNonExec */


/*
 * InstallDriverSDKNamedNonExec - rule for installing server Driver SDK files.
 *                         (only used for XFree86). This is a no-op
 *                         rule so that Imakefiles on non-XFree86 systems
 *                         continue to build Makefiles correctly.
 */
#ifndef InstallDriverSDKNamedNonExec
#define InstallDriverSDKNamedNonExec(srcname,dstname,dest)
#endif


/*
 * InstallNonExecFile - generate rules to install a data file
 */
#ifndef InstallNonExecFile
#define InstallNonExecFile(file,dest)					@@\
InstallTarget(install,file,$(INSTDATFLAGS),dest)
#endif /* InstallNonExecFile */


/*
 * InstallNonExecFileNoClobber - install a data file once
 */
#ifndef InstallNonExecFileNoClobber
#define InstallNonExecFileNoClobber(file,dest)				@@\
InstallNamedTargetNoClobber(install,file,$(INSTDATFLAGS),dest,file)
#endif /* InstallNonExecFileNoClobber */


/*
 * InstallDriverSDKNonExecFile - rule for installing server Driver SDK files.
 *                         (only used for XFree86). This is a no-op
 *                         rule so that Imakefiles on non-XFree86 systems
 *                         continue to build Makefiles correctly.
 */
#ifndef InstallDriverSDKNonExecFile
#define InstallDriverSDKNonExecFile(file,dir)
#endif


/*
 * InstallNonExec - generate rules to install a data file, but does not
 * try to create the destination directory (deprecated)
 */
#ifndef InstallNonExec
#define	InstallNonExec(file,dest)					@@\
install:: file								@@\
	$(INSTALL) $(INSTALLFLAGS) $(INSTDATFLAGS) file $(DESTDIR)dest
#endif /* InstallNonExec */


/*
 * InstallProgramWithFlags - generate rules to install an executable program
 * using given install flags.
 */
#ifndef InstallProgramWithFlags
#if StripInstalledPrograms && CrossCompiling
#define InstallProgramWithFlags(program,dest,flags)			@@\
InstallTarget(install,ProgramTargetName(program),$(INSTPGMFLAGS) flags,dest) @@\
	CrossStripCmd $(DESTDIR)dest/ProgramTargetName(program)
#else
#define InstallProgramWithFlags(program,dest,flags)			@@\
InstallTarget(install,ProgramTargetName(program),$(INSTPGMFLAGS) flags,dest)
#endif /* StripInstalledPrograms && CrossCompiling */
#endif /* InstallProgramWithFlags */


/*
 * InstallProgram - generate rules to install an executable program using any
 * special install flags set in $(INSTALLFLAGS).
 */
#ifndef InstallProgram
#define	InstallProgram(program,dest)					@@\
InstallProgramWithFlags(program,dest,NullParameter)
#endif /* InstallProgram */



/*
 * InstallScript - install a shell script.
 */
#ifndef InstallScript
#define	InstallScript(program,dest)					@@\
InstallNamedTarget(install,program.script,$(INSTBINFLAGS),dest,program)
#endif /* InstallScript */


/*
 * InstallNamedProg - install a program with renaming and no stripping.
 */
#ifndef InstallNamedProg
#define InstallNamedProg(srcname,dstname,dest)				@@\
InstallNamedTarget(install,srcname,$(INSTBINFLAGS),dest,dstname)
#endif /* InstallNamedProg */


/*
 * InstallNamedProgNoClobber - Like InstallNamedProg, but doesn't
 * do the install if an installed version already exists.
 */
#ifndef InstallNamedProgNoClobber
#define InstallNamedProgNoClobber(srcname,dstname,dest)			@@\
InstallNamedTargetNoClobber(install,srcname,$(INSTBINFLAGS),dest,dstname)
#endif /* InstallNamedProgNoClobber */


/*
 * InstallDriverSDKNamedProg - rule for installing server Driver SDK files.
 *                         (only used for XFree86). This is a no-op
 *                         rule so that Imakefiles on non-XFree86 systems
 *                         continue to build Makefiles correctly.
 */
#ifndef InstallDriverSDKNamedProg
#define InstallDriverSDKNamedProg(srcname,dstname,dest)
#endif


/*
 * MakeFlagsToShellFlags - set variables before starting a loop.
 * makeflags is the set of "make" flags to check.
 * shellcmd is the shell command to execute if any of the flags are set.
 *
 * The usual use of this rule is to translate make's "don't quit on error"
 * flags into the equivalent for the shell.  To do this, "make -i" always
 * becomes "set +e".  "make -k" should also turn on "set +e" if the target
 * is building subdirectories.  That is, subdirectories are independent
 * and should appear to be multiple targets, even though they are
 * implemented in a loop in a single target.
 */
#ifndef MakeFlagsToShellFlags
#define MakeFlagsToShellFlags(makeflags,shellcmd)\
	for flag in ${MAKEFLAGS} ''; do \				@@\
	  case "$$flag" in *=*) ;; --*) ;; *[makeflags]*) shellcmd;; esac; done
#endif

/*
 * MakeNamedTargetSubdir - do make in a subdir.
 */
#ifndef MakeNamedTargetSubdir
#define MakeNamedTargetSubdir(dir,flags,subname)\
		(cd dir && $(MAKE) $(MFLAGS) $(PARALLELMFLAGS) \	@@\
			flags subname)
#endif

/*
 * LinkFileList - link a list of files from one place to another
 */
#ifndef LinkFileList
#define LinkFileList(step,list,dir,sub)					@@\
step::									@@\
	@MakeFlagsToShellFlags(i,set +e); \				@@\
	echo "	cd" dir; cd dir && \					@@\
	for i in list; do (set -x; $(LN) -f sub/$$i .); done
#endif


/*
 * LinkConfDirectoryLong
 *
 * Make links from opath (usually <ProjectRoot>/lib/X11) to npath
 * For example /usr/X11R6/lib/X11/xdm ==> /etc/X11/xdm so that X
 * binaries can be mounted from a read-only volume like a CD-ROM;
 * but files that may need to be edited can be stored locally on
 * read-write media. If someone has an existing installation, be
 * careful and move existing files to the new location in /etc.
 * XXX Need to make the installation script do this when installing
 * binary distributions.
 *
 * Since the link is used in the installation process, we need to
 * make the link relative in order to honor $(DESTDIR) if it is set.
 *
 * Note: The sed script used here is not completely general.  It assumes
 * that no elements of the path are '..', and that none start with '.'
 * that aren't just '.'.
 *
 * For a more general solution $(REVPATH) could be used.  Even though
 * it was intended for something a little different, it does do what is
 * required here.
 *
 */
#ifndef LinkConfDirectoryLong
#if UseSeparateConfDir && HasSymLinks
#define LinkConfDirectoryLong(mdir,cdir,rdir,ldir,opath,npath)		@@\
install::								@@\
	@MakeFlagsToShellFlags(i,set +e); \				@@\
	if [ -h Concat($(DESTDIR),npath/mdir) ]; then \			@@\
	  $(RM) Concat($(DESTDIR),npath/mdir); \			@@\
	fi								@@\
	MakeDir(Concat($(DESTDIR),opath/cdir))				@@\
	MakeDir(Concat($(DESTDIR),npath/mdir))				@@\
	@MakeFlagsToShellFlags(i,set +e); \				@@\
	if [ -d Concat($(DESTDIR),opath/cdir) ]; then \			@@\
	  RELPATH=`echo opath/cdir | \					@@\
		sed -e 's:^/::' -e 's:[^/.][^/]*:..:'g -e 's:/\.$$::'`; \ @@\
	  cd Concat($(DESTDIR),opath/cdir); \				@@\
	  if [ -d rdir -a ! -h rdir ]; then \				@@\
	    (cd rdir; tar cf - . | \					@@\
		(cd Concat($(DESTDIR),npath/mdir); \			@@\
		 tar xf -; exit 0); exit 0); \				@@\
	  fi; \								@@\
	  $(RM) -r rdir; \						@@\
	  $(LN) Concat($${RELPATH},npath/mdir) ldir; \			@@\
	fi
#else
#define LinkConfDirectoryLong(mdir,cdir,rdir,ldir,opath,npath)
#endif
#endif

#ifndef LinkConfDirectory
#define LinkConfDirectory(mdir,cdir,rdir,ldir) LinkConfDirectoryLong(mdir,cdir,rdir,ldir,$(LIBDIR),$(CONFDIR))
#endif

#ifndef LinkVarDirectory
#define LinkVarDirectory(mdir,cdir,rdir,ldir) LinkConfDirectoryLong(mdir,cdir,rdir,ldir,$(LIBDIR),$(VARDIR))
#endif

/*
 * LinkConfFileLong
 *
 * Make links from opath (<ProjectRoot>/lib/X11) to npath
 * For example /usr/X11R6/lib/X11/xxx ==> /etc/X11/xxx so that X binaries
 * can be mounted from a read-only volume like a CD-ROM;
 * but files that may need to be edited can be stored locally on
 * read-write media. If someone has an existing installation, be
 * careful and move existing files to the new location in /etc.
 * XXX Need to make the installation script do this when installing
 * binary distributions.
 *
 * Since the link is used in the installation process, we need to
 * make the link relative in order to honor $(DESTDIR) if it is set.
 */
#ifndef LinkConfFileLong
#if UseSeparateConfDir && HasSymLinks
#define LinkConfFileLong(cfile,lfile,opath,npath)			@@\
install::								@@\
	MakeDir(Concat($(DESTDIR),opath))				@@\
	MakeDir(Concat($(DESTDIR),npath))				@@\
	@MakeFlagsToShellFlags(i,set +e); \				@@\
	if [ -d Concat($(DESTDIR),opath) ]; then \			@@\
	  RELPATH=`echo opath | \					@@\
		sed -e 's:^.::' -e 's:[^/.][^/]*:..:'g`; \		@@\
	  cd Concat($(DESTDIR),opath); \				@@\
	  if [ -f lfile -a ! -h lfile ]; then \				@@\
	    cp -p lfile Concat($(DESTDIR),npath/cfile); \		@@\
	  fi; \								@@\
	  $(RM) -r lfile; \						@@\
	  $(LN) Concat($${RELPATH},npath/cfile) lfile; \		@@\
	fi
#else
#define LinkConfFileLong(cfile,lfile,opath,npath)
#endif
#endif


#ifndef LinkConfFile
#define LinkConfFile(cfile,lfile) LinkConfFileLong(cfile,lfile,$(LIBDIR),$(CONFDIR))
#endif

/*
 * InstallMultipleDestFlags - generate rules to install multiple files at
 * once during a particular step in the build using a specific set of install
 * flags.
 */
#ifndef InstallMultipleDestFlags
#define InstallMultipleDestFlags(step,list,dest,flags)			@@\
step:: list								@@\
	MakeDir($(DESTDIR)dest)						@@\
	@MakeFlagsToShellFlags(i,set +e); \				@@\
	for i in list; do \						@@\
		(set -x; $(INSTALL) $(INSTALLFLAGS) flags $$i $(DESTDIR)dest); \	@@\
	done
#endif /* InstallMultipleDestFlags */


/*
 * InstallDriverSDKMultipleDestFlags - rule for installing server Driver SDK
 *                         files. (only used for XFree86). This is a no-op
 *                         rule so that Imakefiles on non-XFree86 systems
 *                         continue to build Makefiles correctly.
 */
#ifndef InstallDriverSDKMultipleDestFlags
#define InstallDriverSDKMultipleDestFlags(list,dest,flags)
#endif


/*
 * InstallMultipleDest - generate rules to install multiple files at once
 * during a particular step in the build using any install flags set in
 * $(INSTDATFLAGS).
 */
#ifndef InstallMultipleDest
#define InstallMultipleDest(step,list,dest)				@@\
InstallMultipleDestFlags(step,list,dest,$(INSTDATFLAGS))
#endif /* InstallMultipleDest */

/*
 * InstallMultiple - generate rules to install multiple files at once
 * during the install step of the build using any install flags set in
 * $(INSTALLFLAGS).
 */
#ifndef InstallMultiple
#define	InstallMultiple(list,dest)					@@\
InstallMultipleDest(install,list,dest)
#endif /* InstallMultiple */


/*
 * InstallMultipleFlags - generate rules to install multiple files at once
 * during the install step of the build using the given install flags.
 */
#ifndef InstallMultipleFlags
#define InstallMultipleFlags(list,dest,flags)				@@\
InstallMultipleDestFlags(install,list,dest,flags)
#endif /* InstallMultipleFlags */


/*
 * InstallMultipleMan - generate rules to install a variety of manual pages
 * during the install.man step of the build.
 */
#ifndef InstallMultipleMan
#define InstallMultipleMan(list,dest)					@@\
InstallMultipleDestFlags(install.man,list,dest,$(INSTMANFLAGS))
#endif /* InstallMultipleMan */

/*
 * InstallMultipleManSuffix - generate rules to install multiple manual
 * pages dufing the install.man step of the build, where
 * the target files have the suffix given.
 */
#ifndef InstallMultipleManSuffix
#define InstallMultipleManSuffix(list,dest,suffix)			@@\
install.man::								@@\
	MakeDir($(DESTDIR)dest)						@@\
	@MakeFlagsToShellFlags(i,set +e); \				@@\
	for i in list; do \						@@\
	  (set -x; $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) $$i.suffix $(DESTDIR)dest/$$i.$(MANSUFFIX)); \	@@\
	done
#endif /* InstallMultipleManSuffix */


/*
 * IncludeMakefile - rule to include another Makefile.
 * Must not generate an error or even a warning if the named file
 * is not present, since we use this to include Makefile.dep, which
 * may not be built yet.
 * This is defined non-null iff HasMakefileSafeInclude is YES.
 * The double-@ is to ensure no leading spaces on the line.
 */
#ifndef IncludeMakefile
#if HasClearmake
#define IncludeMakefile(file) @@sinclude file
#else
#if HasBsdMake
#define IncludeMakefile(file) @@# dependencies are in .depend
#else
#define IncludeMakefile(file) /**/
#endif
#endif
#endif

/*
 * DependDependencyStatement - Used by DependDependency to set up the
 * most specific dependency, which differs based on whether we support
 * a separate Makefile.dep on this platform.
 */
#ifndef DependDependencyStatement
#if HasMakefileSafeInclude
#define DependDependencyStatement()					@@\
DependFileName:: ProgramTargetName($(DEPEND))
#else
#define DependDependencyStatement()					@@\
depend:: ProgramTargetName($(DEPEND))
#endif
#endif

/*
 * DependDependency - generate rules to build the makedepend program if
 * this Imakefile is within the source tree.
 */
#ifndef DependDependency
#ifdef UseInstalled
#define DependDependency() /**/
#else
#define DependDependency()						@@\
DependDependencyStatement()						@@\
									@@\
NoCmpScript(ProgramTargetName($(DEPEND)))				@@\
									@@\
ProgramTargetName($(DEPEND)):						@@\
	@echo "checking $@ over in $(DEPENDSRC) first..."; \		@@\
	cd $(DEPENDSRC) && $(MAKE) makedependonly; \			@@\
	echo "okay, continuing in $(CURRENT_DIR)"

#endif /* UseInstalled */
#endif /* DependDependency */


/*
 * DependTarget - generate rules to compute dependencies for all files listed
 * in $(SRCS).
 */
#ifndef DependTarget
#if HasMakefileSafeInclude
#define DependTarget()							@@\
DependDependency()							@@\
									@@\
depend:: DependFileName							@@\
									@@\
DependFileName::							@@\
	RemoveFile($@)							@@\
	RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- $(SRCS)) > $@
#else /* HasMakefileSafeInclude */
#define	DependTarget()							@@\
DependDependency()							@@\
									@@\
depend::								@@\
	RunProgram(DEPEND,$(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- $(SRCS))
#endif /* HasMakefileSafeInclude else */
#endif /* DependTarget */

/*
 * DependTarget3 - generate rules to compute dependencies for all files given.
 */
#ifndef DependTarget3
#if HasMakefileSafeInclude
#define DependTarget3(srcs1,srcs2,srcs3)				@@\
DependDependency()							@@\
									@@\
depend:: DependFileName							@@\
									@@\
DependFileName::							@@\
	RemoveFile($@)							@@\
	RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs1) > $@	@@\
	RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs2) >> $@	@@\
	RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs3) >> $@
#else /* HasMakefileSafeInclude */
#define	DependTarget3(srcs1,srcs2,srcs3)				@@\
DependDependency()							@@\
									@@\
depend::								@@\
	RunProgram(DEPEND,$(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs1)	@@\
	RunProgram(DEPEND,-a $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs2)	@@\
	RunProgram(DEPEND,-a $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs3)
#endif /* HasMakefileSafeInclude else */
#endif /* DependTarget3 */


/*
 * CleanTarget - generate rules to remove any garbage files
 */
#ifndef CleanTarget
#define	CleanTarget()							@@\
clean::									@@\
	$(RM) FilesToClean ExtraFilesToClean DocFilesToClean "#"*	@@\
									@@\
ProofCleanTarget()
#endif /* CleanTarget */


/*
 * TagsTarget - generate rules to compute tags files for C source code.
 */
#ifndef TagsTarget
#define	TagsTarget()							@@\
tags::									@@\
	$(TAGS) -w *.[ch]						@@\
	$(TAGS) -xw *.[ch] > TAGS
#endif /* TagsTarget */


/*
 * ImakeDependency - generate rules to compile imake if this Imakefile is
 * within the source tree.
 */
#ifndef ImakeDependency
#ifdef UseInstalled
#define ImakeDependency(target) /**/
#else
#define ImakeDependency(target)						@@\
target:: ProgramTargetName($(IMAKE))					@@\
									@@\
NoCmpScript(ProgramTargetName($(IMAKE)) $(IMAKE).Osuf)			@@\
									@@\
ProgramTargetName($(IMAKE)) $(IMAKE).Osuf:				@@\
	-@(cd $(IMAKESRC) && if [ -f Makefile ]; then \			@@\
	echo "checking $@ in $(IMAKESRC) first..."; $(MAKE) imakeonly; else \	@@\
	echo "bootstrapping $@ from Makefile.ini in $(IMAKESRC) first..."; \	@@\
	$(MAKE) -f Makefile.ini BOOTSTRAPCFLAGS="$(BOOTSTRAPCFLAGS)"; fi; \	@@\
	echo "okay, continuing in $(CURRENT_DIR)")
#endif /* UseInstalled */
#endif /* ImakeDependency */


/*
 * BuildMakefileTarget - generate rules to build a Makefile from an Imakefile
 * and any special imake flags.  This is generally done automatically by the
 * template or by any special Imakefiles.  The first argument exists just
 * because imakeflags is usually empty and some preprocessors will complain
 * if an empty argument is passed as the sole argument to a macro.
 */
#ifndef BuildMakefileTarget
#define	BuildMakefileTarget(notused,imakeflags)				@@\
ImakeDependency(Makefile)						@@\
									@@\
Makefile::								@@\
	RMoveToBakFile(Makefile)					@@\
	$(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) imakeflags

#endif /* BuildMakefileTarget */


/*
 * MakefileTarget - generate rules to build a normal Makefile.
 */
#ifndef MakefileTarget
#define MakefileTarget()						@@\
BuildMakefileTarget(Imakefile,NullParameter)
#endif /* MakefileTarget */


/*
 * LibMkdir - helper for creating library object subdirectories
 */
#ifndef LibMkdir
#define LibMkdir(dir) DirFailPrefix@if [ -d dir ]; then exit 0; else set -x; mkdir dir; fi
#endif

#ifndef LibMkdirLinkSubdirs
#define LibMkdirLinkSubdirs(dir) DirFailPrefix@if [ -d dir ]; then \	@@\
	    exit 0; \							@@\
	else \								@@\
	    echo "mkdir dir"; mkdir dir; \				@@\
	    for i in $(SUBDIRS); do \					@@\
	      j=`echo "$$i" | sed -e 's;[^/]\{1,\};..;g'`; \		@@\
	      if [ ! -d "dir/`dirname $$i`" ]; then \			@@\
		$(MKDIRHIER) "dir/`dirname $$i`"; \			@@\
	      fi; \							@@\
	      echo $(LN) "$$j/$$i/dir" "dir/$$i"; \			@@\
	      $(LN) "$$j/$$i/dir" "dir/$$i"; \				@@\
	    done; \							@@\
	fi
#endif

/*
 * LibCleanDir - helper for cleaning library object subdirectories
 */
#ifndef LibCleanDir
#define LibCleanDir(dir) -@if [ -d dir ]; then \			@@\
		set -x; $(RM) -r dir; else exit 0; fi
#endif

/*
 * LintLibReferences - variables for lint libraries
 */
#ifndef LintLibReferences
#define LintLibReferences(varname,libname,libsource)			@@\
Concat(LINT,varname) = _UseCat($(LINTLIBDIR)/llib-l,libsource/llib-,libname.ln)
#endif


/*
 * UnsharedLibReferences - variables for unshared libraries
 */
#ifndef UnsharedLibReferences
#define UnsharedLibReferences(varname,libname,libsource)		@@\
ProjectUnsharedLibReferences(varname,libname,libsource,$(BUILDLIBDIR))
#endif

/*
 * ProjectUnsharedLibReferences - variables for unshared libraries
 */
#ifndef ProjectUnsharedLibReferences
#define ProjectUnsharedLibReferences(varname,libname,libsource,buildlibdir)	@@\
Concat3(DEP,varname,LIB) = _UseCat($(USRLIBDIR)/,buildlibdir/,LibraryTargetName(libname))	@@\
Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)		@@\
LintLibReferences(varname,libname,libsource)
#endif

 /*
 * ProjectUnsharedFontLibReferences - unshared font libraries
 */
#ifndef ProjectUnsharedFontLibReferences
#define ProjectUnsharedFontLibReferences()					@@\
DEPFONTLIB = _UseCat($(USRLIBDIR)/,XBuildLibDir/,LibraryTargetName(Xfont))	@@\
FONTLIB = -L$(FREETYPELIBDIR) -L$(FONTLIBSRC) LoaderLibPrefix -lXfont		@@\
LintLibReferences(XFONT,Xfont,$(FONTLIBSRC))
#endif

/*
 * SharedLibDependencies - shared library dependencies
 */
#ifndef SharedLibDependencies
#define SharedLibDependencies(libname,libsource,revname) /**/
#endif

/*
 * SharedFontLibReferences - shared font libraries
 */
#ifndef SharedFontLibReferences
#define SharedFontLibReferences()					@@\
SOFONTREV = SharedFontRev						@@\
DEPFONTLIB = SharedLibDependencies(Xfont,$(FONTLIBSRC),SOFONTREV)	@@\
FONTLIB = -L$(FREETYPELIBDIR) -L$(FONTLIBSRC) LoaderLibPrefix -lXfont	@@\
LintLibReferences(XFONT,Xfont,$(FONTLIBSRC))
#endif

/*
 * SharedDSLibDependencies - shared library dependencies with data separation
 */
#ifndef SharedDSLibDependencies
#define SharedDSLibDependencies(libname,libsource,revname) /**/
#endif

/*
 * SharedLibReferences - variables for shared libraries
 */
#ifndef SharedLibReferences
#define SharedLibReferences(varname,libname,libsource,revname,rev)	@@\
revname = rev								@@\
Concat3(DEP,varname,LIB) = SharedLibDependencies(libname,libsource,revname) @@\
Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)		@@\
LintLibReferences(varname,libname,libsource)
#endif

/*
 * SharedDSLibReferences - variables for shared libraries with data separation
 */
#ifndef SharedDSLibReferences
#define SharedDSLibReferences(varname,libname,libsource,revname,rev)	@@\
revname = rev								@@\
Concat3(DEP,varname,LIB) = SharedDSLibDependencies(libname,libsource,revname) @@\
Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)		@@\
LintLibReferences(varname,libname,libsource)
#endif

/*
 * CPPOnlyCompile - run C compiler's preprocessor only
 */
#ifndef CPPOnlyCompile
#define CPPOnlyCompile(src,options) RemoveFile($@)			@@\
	ClearmakeOSName \
	$(CC) -E $(CFLAGS) options src > $@
#endif

/*
 * ObjectCompile - compile fragment for a normal object file
 */
#ifndef ObjectCompile
#define ObjectCompile(options) RemoveFile($@)				@@\
	ClearmakeOSName \
	$(CC) -c $(CFLAGS) options $*.c
#endif

/*
 * CompileCToAsm - compile C file to assembler
 */
#ifndef CompileCToAsm
#define CompileCToAsm(options) RemoveFile($@)				@@\
	ClearmakeOSName \
	$(CC) -S $(CFLAGS) options $*.c
#endif


/*
 * CompileCplusplusToAsm - compile C++ file to assembler
 */
#ifndef CompileCplusplusToAsm
#define CompileCplusplusToAsm(options) RemoveFile($@)			@@\
	ClearmakeOSName \
	$(CC) -S $(CFLAGS) options $*.cc
#endif


#ifndef ObjectCplusplusCompile
#define ObjectCplusplusCompile(options) RemoveFile($@)			@@\
	ClearmakeOSName \
	$(CXX) -c $(CXXFLAGS) options $*.CCsuf
#endif

/*
 * NormalLibObjCompile - compile fragment for a normal library object file
 */
#ifndef NormalLibObjCompile
#define NormalLibObjCompile(options) ObjectCompile(options)
#endif

#ifndef NormalRelocLibObjCompile
# if !StaticNeedsPicForShared
#  define NormalRelocLibObjCompile(options) NormalLibObjCompile(options)
# else
#  define NormalRelocLibObjCompile(options) NormalLibObjCompile(options $(PICFLAGS))
# endif
#endif

#ifndef NormalLibObjCplusplusCompile
#define NormalLibObjCplusplusCompile(options) ObjectCplusplusCompile(options)
#endif

/*
 * NormalSharedLibObjCompile - compile fragment for shared objects
 */
#ifndef NormalSharedLibObjCompile
#define NormalSharedLibObjCompile(options) NormalLibObjCompile(options $(SHLIBDEF) $(SHAREDCODEDEF) $(PICFLAGS))
#endif

#ifndef NormalSharedLibObjCplusplusCompile
#define NormalSharedLibObjCplusplusCompile(options) NormalLibObjCplusplusCompile(options $(SHLIBDEF) $(SHAREDCODEDEF) $(CXXPICFLAGS))
#endif

/*
 * LibObjCompile - compile fragment for unshared/profiled/debugged objects
 */
#ifndef LibObjCompile
#if HasGcc || HasGcc2
#define LibObjCompile(dir,options) RemoveFiles($@ dir/$@)		@@\
	ClearmakeOSName \
	$(CC) -c $(CCOPTIONS) $(THREADS_CFLAGS) $(ALLDEFINES) \
	options $*.c -o dir/$@
#else
#define LibObjCompile(dir,options) RemoveFiles($@ dir/$@)		@@\
	ClearmakeOSName \
	$(CC) -c $(CCOPTIONS) $(THREADS_CFLAGS) $(ALLDEFINES) \
	options $*.c							@@\
	$(MV) $@ dir/$@
#endif
#endif

#ifndef LibObjCplusplusCompile
#if HasGcc || HasGcc2
#define LibObjCplusplusCompile(dir,options) RemoveFiles($@ dir/$@)	@@\
	ClearmakeOSName \
	$(CXX) -c $(CXXOPTIONS) $(THREADS_CXXFLAGS) $(CXXDEFINES) \
	options $*.CCsuf -o dir/$@
#else
#define LibObjCplusplusCompile(dir,options) RemoveFiles($@ dir/$@)	@@\
	ClearmakeOSName \
	$(CXX) -c $(CXXOPTIONS) $(THREADS_CXXFLAGS) $(CXXDEFINES) \
	options $*.CCsuf						@@\
	$(MV) $@ dir/$@
#endif
#endif

/*
 * DebuggedLibObjCompile - compile fragment for debugged objects
 */
#ifndef DebuggedLibObjCompile
#define DebuggedLibObjCompile(options) LibObjCompile(debugger,DebuggableCDebugFlags options)
#endif

#ifndef DebuggedLibObjCplusplusCompile
#define DebuggedLibObjCplusplusCompile(options) LibObjCplusplusCompile(debugger,DebuggableCplusplusDebugFlags options)
#endif

/*
 * ProfiledLibObjCompile - compile fragment for profiled objects
 */
#ifndef ProfiledLibObjCompile
#define ProfiledLibObjCompile(options) LibObjCompile(profiled,ProfiledCDebugFlags options)
#endif

#ifndef ProfiledLibObjCplusplusCompile
#define ProfiledLibObjCplusplusCompile(options) LibObjCplusplusCompile(profiled,ProfiledCplusplusDebugFlags options)
#endif

/*
 * UnsharedLibObjCompile - compile fragment for unshared objects
 */
#ifndef UnsharedLibObjCompile
#define UnsharedLibObjCompile(options) LibObjCompile(unshared,$(CDEBUGFLAGS) $(CLIBDEBUGFLAGS) options)
#endif

#ifndef UnsharedLibObjCplusplusCompile
#define UnsharedLibObjCplusplusCompile(options) LibObjCplusplusCompile(unshared,$(CXXDEBUGFLAGS) $(CXXLIBDEBUGFLAGS) options)
#endif

/*
 * SharedLibObjCompile - compile fragment for shared objects
 */
#ifndef SharedLibObjCompile
#define SharedLibObjCompile(options) LibObjCompile(shared,options $(SHLIBDEF) $(SHAREDCODEDEF) $(PICFLAGS) $(CDEBUGFLAGS) $(CLIBDEBUGFLAGS))
#endif

/*
 * NormalLibraryObjectRule - for simple libraries
 */
#ifndef NormalLibraryObjectRule
#define	NormalLibraryObjectRule()					@@\
.c.Osuf:								@@\
	NormalLibObjCompile($(_NOOP_))
#endif /* NormalLibraryObjectRule */

#ifndef NormalCplusplusObjectRule
#define NormalCplusplusObjectRule()					@@\
.CCsuf.Osuf:								@@\
	NormalLibObjCplusplusCompile($(_NOOP_))
#endif

#ifndef NormalFortranObjectRule
#define NormalFortranObjectRule()					@@\
.f.Osuf:								@@\
	RemoveFile($@)							@@\
	ClearmakeOSName \
	$(FC) -c $(FCFLAGS) $*.f
#endif

/*
 * SpecialObjectRule - generate rules to compile a file with special flags.
 */
#ifndef SpecialObjectRule
#define SpecialObjectRule(objs,depends,options)				@@\
objs:	depends								@@\
	ObjectCompile(options)
#endif /* SpecialObjectRule */

#ifndef SpecialCplusplusObjectRule
#define SpecialCplusplusObjectRule(baseobj,basedep,options)		@@\
baseobj.Osuf:	basedep.CCsuf						@@\
	ObjectCplusplusCompile(options)
#endif /* SpecialCplusplusObjectRule */

/*
 * SpecialCObjectRule - generate rules to compile a C file with special flags.
 *			also handles CodeCenter rules
 */
#ifndef SpecialCObjectRule
#define SpecialCObjectRule(basename,depends,options)			@@\
SpecialObjectRule(basename.Osuf,basename.c depends,options)		@@\
									@@\
basename.i: basename.c depends						@@\
	CPPOnlyCompile(basename.c,options)				@@\
									@@\
basename.s: basename.c depends						@@\
	CompileCToAsm(options)						@@\
									@@\
CenterLoadTarget(debug_src,basename.c,NullParameter,$(ALLDEFINES) options)
#endif /* SpecialCObjectRule */


#ifndef ObjectFromSpecialSource
#define ObjectFromSpecialSource(dst,src,flags)				@@\
NoConfigRec(dst.c)							@@\
									@@\
dst.c:  src.c								@@\
	RemoveFile($@)							@@\
	$(LN) $? $@							@@\
									@@\
SpecialCObjectRule(dst,NullParameter,flags)				@@\
									@@\
includes:: dst.c							@@\
									@@\
depend::  dst.c								@@\
									@@\
clean::									@@\
	RemoveFile(dst.c)
#endif /* ObjectFromSpecialSource */

#ifndef CPPOnlyAsm
#define CPPOnlyAsm(basename,options) RemoveFile(basename.i)		@@\
	$(CPP) AsmDefines $(DEFINES) $(INCLUDES) options basename.S | \	@@\
		grep -v '^\#' > basename.i
#endif

#ifndef AssembleObject
#define AssembleObject(basename,flags) CPPOnlyAsm(basename,flags)	@@\
	RemoveFile(basename.o)						@@\
	$(AS) -o basename.o basename.i					@@\
	RemoveFile(basename.i)
#endif

#ifndef NormalAsmObjectRule
#define NormalAsmObjectRule()						@@\
.S.o:									@@\
	AssembleObject($*,$(_NOOP_))					@@\
									@@\
.S.i:									@@\
	CPPOnlyAsm($*,$(_NOOP_))
#endif

#ifndef ObjectFromSpecialAsmSource
#define ObjectFromSpecialAsmSource(dst,src,flags)			@@\
dst.S:  src.S								@@\
	RemoveFile($@)							@@\
	$(LN) $? $@							@@\
									@@\
dst.o:  dst.S								@@\
	AssembleObject(dst,flags)					@@\
									@@\
dst.i:  dst.S								@@\
	CPPOnlyAsm(dst,flags)						@@\
									@@\
depend:: dst.S								@@\
									@@\
clean::									@@\
	RemoveFile(dst.S)
#endif

#ifndef ObjectFromAsmSource
#define ObjectFromAsmSource(src,flags)					@@\
									@@\
src.o:  src.S								@@\
	AssembleObject(src,flags)					@@\
									@@\
src.i:  src.S								@@\
	CPPOnlyAsm(src,flags)						@@\
									@@\
depend:: src.S
#endif

#ifndef SwitchYYPrefix
#define SwitchYYPrefix(in,out,prefix) \
	sed 's/yy/prefix/g' in | sed 's/__REALLY_YY__/yy/' > out && RemoveFile(in)
#endif

#ifndef LexFilePrefix
#define LexFilePrefix(file,prefix)					@@\
file.c: file.l								@@\
	ClearmakeOSName \
	$(LEX) $(LFLAGS) file.l						@@\
	SwitchYYPrefix(lex.yy.c,file.c,prefix)				@@\
									@@\
depend:: file.c								@@\
									@@\
clean::									@@\
	RemoveFiles(lex.yy.c file.c)
#endif

#ifndef LexFileExplicit
#if HasClearmake		/* provide a place to hang ClearmakeOSName */
#define LexFileExplicit(file)						@@\
file.c: file.l								@@\
	ClearmakeOSName \
	$(LEX) $(LFLAGS) file.l						@@\
	$(MV) lex.yy.c file.c
#else
#define LexFileExplicit(file) /* the default rule is fine */
#endif
#endif

#ifndef LexFile
#define LexFile(file)							@@\
LexFileExplicit(file)							@@\
									@@\
depend:: file.c								@@\
									@@\
clean::									@@\
	RemoveFiles(lex.yy.c file.c)
#endif /* LexFile */


#ifndef M4File
#define M4File(file,includes)						@@\
file: file.m4 includes							@@\
	RemoveFile(file)						@@\
	$(M4) $(M4FLAGS) file.m4 >file					@@\
									@@\
depend:: file								@@\
									@@\
clean::									@@\
	RemoveFile(file)
#endif /* M4File */

#ifndef YaccFilePrefix
#if HasGnuMake
#define YaccFilePrefix(file,flags,prefix)				@@\
depend:: file.c								@@\
									@@\
file.h: file.c								@@\
									@@\
file.c: file.y								@@\
	ClearmakeOSName \
	$(YACC) flags file.y						@@\
	SwitchYYPrefix(y.tab.c,file.c,prefix)				@@\
	@if [ -f y.tab.h ]; then set -x; SwitchYYPrefix(y.tab.h,file.h,prefix); \@@\
	else exit 0; fi							@@\
									@@\
clean::									@@\
	RemoveFiles(y.tab.c y.tab.h file.h file.c)
#else
#define YaccFilePrefix(file,flags,prefix)				@@\
depend:: file.c								@@\
									@@\
file.h file.c: file.y							@@\
	ClearmakeOSName \
	$(YACC) flags file.y						@@\
	SwitchYYPrefix(y.tab.c,file.c,prefix)				@@\
	@if [ -f y.tab.h ]; then set -x; SwitchYYPrefix(y.tab.h,file.h,prefix); \	@@\
	else exit 0; fi							@@\
									@@\
clean::									@@\
	RemoveFiles(y.tab.c y.tab.h file.h file.c)
#endif
#endif /* YaccFile */

#ifndef YaccFile
#if HasGnuMake
#define YaccFile(file,flags)						@@\
depend:: file.c								@@\
									@@\
file.h: file.c								@@\
									@@\
file.c: file.y								@@\
	ClearmakeOSName \
	$(YACC) flags file.y						@@\
	$(MV) y.tab.c file.c						@@\
	@if [ -f y.tab.h ]; then set -x; $(MV) y.tab.h file.h; \	@@\
	else exit 0; fi							@@\
									@@\
clean::									@@\
	RemoveFiles(y.tab.c y.tab.h file.h file.c)
#else
#define YaccFile(file,flags)						@@\
depend:: file.c								@@\
									@@\
file.h file.c: file.y							@@\
	ClearmakeOSName \
	$(YACC) flags file.y						@@\
	$(MV) y.tab.c file.c						@@\
	@if [ -f y.tab.h ]; then set -x; $(MV) y.tab.h file.h; \	@@\
	else exit 0; fi							@@\
									@@\
clean::									@@\
	RemoveFiles(y.tab.c y.tab.h file.h file.c)
#endif
#endif /* YaccFile */

#ifndef YaccFileNoFlags
#define YaccFileNoFlags(file)						@@\
depend:: file.c								@@\
									@@\
file.c: file.y								@@\
	ClearmakeOSName \
	$(YACC) file.y							@@\
	$(MV) y.tab.c file.c						@@\
									@@\
clean::									@@\
	RemoveFiles(y.tab.c file.c)
#endif /* YaccFileNoFlags */


#ifndef MakeLibrary
#define MakeLibrary(libname,objlist) $(AR) libname objlist
#endif

#ifndef LinkBuildLibrary
#ifdef UseInstalled
#define LinkBuildLibrary(lib) $(_NULLCMD_)
#else
#define LinkBuildLibrary(lib) MakeDir($(BUILDLIBDIR))			@@\
	RemoveFile($(BUILDLIBDIR)/lib)					@@\
	cd $(BUILDLIBDIR) && $(LN) $(BUILDLIBTOP)/$(CURRENT_DIR)/lib .
#endif
#endif /* LinkBuildLibrary */

#ifndef LinkBuildLibraryMaybe
#ifdef UseInstalled
#define LinkBuildLibraryMaybe(lib,doit) $(_NULLCMD_)
#else
#define LinkBuildLibraryMaybe(lib,doit) MakeDir($(BUILDLIBDIR))		@@\
	@if doit; then (set -x; \					@@\
	  RemoveFile($(BUILDLIBDIR)/lib); \				@@\
	  cd $(BUILDLIBDIR) && $(LN) $(BUILDLIBTOP)/$(CURRENT_DIR)/lib .); fi
#endif
#endif /* LinkBuildLibraryMaybe */

#ifndef _LinkBuildLibrary /* will get redefined elsewhere */
#define _LinkBuildLibrary(lib) $(_NULLCMD_)
#endif /* _LinkBuildLibrary */

#ifndef LinkBuildSonameLibrary
#ifdef UseInstalled
#define LinkBuildSonameLibrary(lib) true
#else
#define LinkBuildSonameLibrary(lib) MakeDirInline($(BUILDLIBDIR));\	@@\
	(set -x; RemoveFile($(BUILDLIBDIR)/lib);\			@@\
	(cd $(BUILDLIBDIR) && $(LN) $(BUILDLIBTOP)/$(CURRENT_DIR)/lib .))
#endif
#endif /* LinkBuildSonameLibrary */

#ifndef LinkBuildLibraryInline
#define LinkBuildLibraryInline(lib) LinkBuildSonameLibrary(lib)
#endif /* LinkBuildLibraryInline */

/*
 * NormalLibraryTarget - generate rules to create a library.
 */
#ifndef NormalLibraryTarget
#define	NormalLibraryTarget(libname,objlist)				@@\
AllTarget(LibraryTargetName(libname))					@@\
									@@\
LibraryTargetName(libname): objlist $(EXTRALIBRARYDEPS)			@@\
	RemoveFile($@)							@@\
	MakeLibrary($@,objlist)						@@\
	RanLibrary($@)							@@\
	_LinkBuildLibrary($@)
#endif /* NormalLibraryTarget */


/*
 * NormalLibraryTarget2 - generate rules to create a library in two steps.
 * This is used to create libraries with large numbers of files.
 */
#ifndef NormalLibraryTarget2
#define	NormalLibraryTarget2(libname,objlist1,objlist2)			@@\
AllTarget(LibraryTargetName(libname))					@@\
									@@\
LibraryTargetName(libname): objlist1 objlist2 $(EXTRALIBRARYDEPS)	@@\
	RemoveFile($@)							@@\
	MakeLibrary($@,objlist1)					@@\
	MakeLibrary($@,objlist2)					@@\
	RanLibrary($@)							@@\
	_LinkBuildLibrary($@)
#endif /* NormalLibraryTarget2 */


/*
 * NormalLibraryTarget3 - generate rules to create a library in three steps.
 * This is used to create libraries with very large numbers of files.
 */
#ifndef NormalLibraryTarget3
#define	NormalLibraryTarget3(libname,objlist1,objlist2,objlist3)	@@\
AllTarget(LibraryTargetName(libname))					@@\
									@@\
LibraryTargetName(libname): objlist1 objlist2 objlist3 $(EXTRALIBRARYDEPS)	@@\
	RemoveFile($@)							@@\
	MakeLibrary($@,objlist1)					@@\
	MakeLibrary($@,objlist2)					@@\
	MakeLibrary($@,objlist3)					@@\
	RanLibrary($@)							@@\
	_LinkBuildLibrary($@)
#endif /* NormalLibraryTarget3 */


/*
 * NormalDepLibraryTarget - generate rules to create a library.
 */
#ifndef NormalDepLibraryTarget
#define	NormalDepLibraryTarget(libname,deplist,objlist)			@@\
AllTarget(LibraryTargetName(libname))					@@\
									@@\
LibraryTargetName(libname): deplist $(EXTRALIBRARYDEPS)			@@\
	RemoveFile($@)							@@\
	MakeLibrary($@,objlist)						@@\
	RanLibrary($@)							@@\
	_LinkBuildLibrary($@)
#endif /* NormalDepLibraryTarget */


/*
 * UnsharedLibraryTarget - generate rules to create a library.
 */
#ifndef UnsharedLibraryTarget
#define	UnsharedLibraryTarget(libname,objlist,down,up)			@@\
AllTarget(LibraryTargetName(libname))					@@\
									@@\
LibraryTargetName(libname): objlist $(EXTRALIBRARYDEPS)			@@\
	RemoveFile($@)							@@\
	@(set -x; cd down && MakeLibrary(up/$@,objlist)) || exit 1;	@@\
	RanLibrary($@)							@@\
	_LinkBuildLibrary($@)
#endif /* UnsharedLibraryTarget */


/*
 * UnsharedLibraryTarget3 - generate rules to create a library in three steps.
 * This is used to create libraries with very large numbers of files.
 */
#ifndef UnsharedLibraryTarget3
#define	UnsharedLibraryTarget3(libname,objlist1,objlist2,objlist3,down,up) @@\
AllTarget(LibraryTargetName(libname))					@@\
									@@\
LibraryTargetName(libname): objlist1 objlist2 objlist3 $(EXTRALIBRARYDEPS)	@@\
	RemoveFile($@)							@@\
	(cd down && MakeLibrary(up/$@,objlist1))			@@\
	(cd down && MakeLibrary(up/$@,objlist2))			@@\
	(cd down && MakeLibrary(up/$@,objlist3))			@@\
	RanLibrary($@)							@@\
	_LinkBuildLibrary($@)
#endif /* UnsharedLibraryTarget3 */


/*
 * SubdirLibraryRule -
 */
#ifndef SubdirLibraryRule
#define	SubdirLibraryRule(objlist)					@@\
all:: DONE								@@\
									@@\
DONE: objlist								@@\
	RemoveFile($@)							@@\
	touch $@							@@\
									@@\
clean::									@@\
	RemoveFile(DONE)
#endif /* SubdirLibraryRule */


/*
 * ProfiledLibraryTarget - generate rules to create a profiled library.
 */
#ifndef ProfiledLibraryTarget
#define	ProfiledLibraryTarget(libname,objlist)				@@\
AllTarget(LibraryTargetNameSuffix(libname,_p))				@@\
									@@\
LibraryTargetNameSuffix(libname,_p): objlist $(EXTRALIBRARYDEPS)	@@\
	RemoveFile($@)							@@\
	cd profiled && MakeLibrary(../$@,objlist)			@@\
	RanLibrary($@)

#endif /* ProfiledLibraryTarget */


/*
 * ProfiledDepLibraryTarget - generate rules to create a profiled library.
 */
#ifndef ProfiledDepLibraryTarget
#define	ProfiledDepLibraryTarget(libname,deplist,objlist)		@@\
AllTarget(LibraryTargetNameSuffix(libname,_p))				@@\
									@@\
LibraryTargetNameSuffix(libname,_p): deplist $(EXTRALIBRARYDEPS)	@@\
	RemoveFile($@)							@@\
	MakeLibrary($@,objlist)						@@\
	RanLibrary($@)

#endif /* ProfiledDepLibraryTarget */


/*
 * DebuggedLibraryTarget - generate rules to create a debuggable library.
 */
#ifndef DebuggedLibraryTarget
#define	DebuggedLibraryTarget(libname,objlist)				@@\
AllTarget(LibraryTargetNameSuffix(libname,_d))				@@\
									@@\
LibraryTargetNameSuffix(libname,_d): objlist $(EXTRALIBRARYDEPS)	@@\
	RemoveFile($@)							@@\
	cd debugger && MakeLibrary(../$@,objlist)			@@\
	RanLibrary($@)

#endif /* DebuggedLibraryTarget */


/*
 * DebuggedDepLibraryTarget - generate rules to create a debuggable library.
 */
#ifndef DebuggedDepLibraryTarget
#define	DebuggedDepLibraryTarget(libname,deplist,objlist)		@@\
AllTarget(LibraryTargetNameSuffix(libname,_d))				@@\
									@@\
LibraryTargetNameSuffix(libname,_d): deplist $(EXTRALIBRARYDEPS)	@@\
	RemoveFile($@)							@@\
	MakeLibrary($@,objlist)						@@\
	RanLibrary($@)

#endif /* DebuggedDepLibraryTarget */


/*
 * AliasedLibraryTarget - generate rules to link one library to another.
 */
#ifndef AliasedLibraryTarget
#define	AliasedLibraryTarget(libname,alias)				@@\
AllTarget(LibraryTargetName(alias))					@@\
									@@\
LibraryTargetName(alias): LibraryTargetName(libname)			@@\
	RemoveFile($@)							@@\
	$(LN) LibraryTargetName(libname) $@				@@\
									@@\
clean::									@@\
	RemoveFile(LibraryTargetName(alias))
#endif /* AliasedLibraryTarget */


/*
 * NormalRelocatableTarget - generate rules to produce a relocatable object
 * file instead of a library.
 */
#ifndef NormalRelocatableTarget
#define	NormalRelocatableTarget(objname,objlist)			@@\
AllTarget(objname.Osuf)							@@\
									@@\
objname.Osuf: objlist $(EXTRALIBRARYDEPS)				@@\
	RemoveFile($@)							@@\
	$(LD) $(LDCOMBINEFLAGS) objlist -o $@
#endif /* NormalRelocatableTarget */


/*
 * NormalDepRelocatableTarget - generate rules to produce a relocatable object
 * file instead of a library.
 */
#ifndef NormalDepRelocatableTarget
#define	NormalDepRelocatableTarget(objname,deplist,objlist)		@@\
AllTarget(objname.Osuf)							@@\
									@@\
objname.Osuf: deplist $(EXTRALIBRARYDEPS)				@@\
	RemoveFile($@)							@@\
	$(LD) $(LDCOMBINEFLAGS) objlist -o $@
#endif /* NormalDepRelocatableTarget */


/*
 * ProfiledRelocatableTarget - generate rules to produce a profiled relocatable
 * object file instead of a library.
 */
#ifndef ProfiledRelocatableTarget
#define	ProfiledRelocatableTarget(objname,objlist)			@@\
AllTarget(Concat(objname,_p.Osuf))					@@\
									@@\
Concat(objname,_p.Osuf): objlist $(EXTRALIBRARYDEPS)			@@\
	RemoveFile($@)							@@\
	$(LD) -X -r objlist -o $@

#endif /* ProfiledRelocatableTarget */


/*
 * DebuggedRelocatableTarget - generate rules to produce a debuggable
 * relocatable object file instead of a library.
 */
#ifndef DebuggedRelocatableTarget
#define	DebuggedRelocatableTarget(objname,objlist)			@@\
AllTarget(Concat(objname,_d.Osuf))					@@\
									@@\
Concat(objname,_d.Osuf): objlist $(EXTRALIBRARYDEPS)			@@\
	RemoveFile($@)							@@\
	$(LD) -X -r objlist -o $@

#endif /* DebuggedRelocatableTarget */


/*
 * LintLibraryTarget - generate rules to create a lint library.  Note that the
 * lint library is always forced to be newer than the library itself.
 */
#ifndef LintLibraryTarget
#define	LintLibraryTarget(libname,srclist)				@@\
lintlib:: Concat(llib-l,libname.ln)					@@\
									@@\
Concat(llib-l,libname.ln): srclist $(EXTRALIBRARYDEPS)			@@\
	RemoveFile($@)							@@\
	$(LINT) Concat($(LINTLIBFLAG),libname) $(LINTFLAGS) srclist
#endif /* LintLibraryTarget */


/*
 * NormalLintTarget - generate rules to lint a set of sources.
 */
#ifndef NormalLintTarget
#define NormalLintTarget(srclist)					@@\
lint:									@@\
	$(LINT) $(LINTFLAGS) srclist $(LINTLIBS)			@@\
lint1:									@@\
	$(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
#endif /* NormalLintTarget */


/*
 * LintTarget - generate rules to lint $(SRCS)
 */
#ifndef LintTarget
#define LintTarget()							@@\
NormalLintTarget($(SRCS))
#endif


/*
 * LinkSourceFile - snag source file from some other directory
 */
#ifndef LinkSourceFile
#define LinkSourceFile(src,dir)						@@\
src:  dir/src								@@\
	RemoveFile($@)							@@\
	$(LN) $? $@							@@\
									@@\
NoConfigRec(src)							@@\
									@@\
includes:: src								@@\
									@@\
depend:: src								@@\
									@@\
clean::									@@\
	RemoveFile(src)
#endif


/*
 * LinkFile - link a file
 */
#ifndef LinkFile
#define LinkFile(tofile,fromfile)					@@\
tofile:: fromfile							@@\
	RemoveFile($@)							@@\
	$(LN) $? $@							@@\
									@@\
NoConfigRec(tofile)							@@\
									@@\
includes:: tofile							@@\
									@@\
depend:: tofile								@@\
									@@\
clean::									@@\
	RemoveFile(tofile)
#endif


#ifndef MakeSubincludesForBuild
#define MakeSubincludesForBuild(step,dir,srclist)			@@\
step::  dir srclist							@@\
	@-(list=`echo srclist | sed -e 's/[^ ]*\///g'`; \		@@\
		set -x; cd dir && RemoveFiles($$list))			@@\
	@for i in srclist; do \						@@\
		(set -x; cd dir && $(LN) ../$$i .); \			@@\
	done								@@\
									@@\
dir::									@@\
	$(MKDIRHIER) dir						@@\
									@@\
clean::									@@\
	@-(if [ -d dir ]; then \					@@\
		list=`echo srclist | sed -e 's/[^ ]*\///g'`; \		@@\
		set -x; cd dir && RemoveFile($$list); else exit 0; fi)
#endif


/*
 * LangNamedTargetSubdirs - recursively make a series of steps
 */
#ifndef LangNamedTargetSubdirs
#define LangNamedTargetSubdirs(lang,name,dirs,verb,flags,subname)	@@\
name::									@@\
	@MakeFlagsToShellFlags(ik,set +e); \				@@\
	for i in dirs ;\						@@\
	do \								@@\
		echo verb "in $(CURRENT_DIR)/$$i..."; \			@@\
		(cd $$i && LANG=lang $(MAKE) $(MFLAGS) flags subname);\ @@\
	done
#endif


/*
 * NamedMakeSubdirs - generate rules to do makes in the given subdirectories.
 * If you want CDEBUGFLAGS passed along to subdirectories, provide a line like
 * the following in the appropriate Imakefile
 *
 *         #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)'
 */
#ifndef LangNamedMakeSubdirs
#define LangNamedMakeSubdirs(lang,name,dirs) \
LangNamedTargetSubdirs(lang,name,dirs,"making" name,PassCDebugFlags,all)
#endif /* LangNamedMakeSubdirs */

#ifndef LangMakeSubdirs
#define LangMakeSubdirs(lang,dirs)					@@\
LangNamedMakeSubdirs(lang,all,dirs)
#endif /* LangMakeSubdirs */



/*
 * NamedTargetSubdirs - recursively make a series of steps
 */
#ifndef NamedTargetSubdirs
#define NamedTargetSubdirs(name,dirs,verb,flags,subname)		@@\
name::									@@\
	@MakeFlagsToShellFlags(ik,set +e); \				@@\
	for i in dirs ;\						@@\
	do \								@@\
		echo verb "in $(CURRENT_DIR)/$$i..."; \			@@\
		MakeNamedTargetSubdir($$i,flags,subname); \		@@\
	done
#endif


/*
 * NamedMakeSubdirs - generate rules to do makes in the given subdirectories.
 * If you want CDEBUGFLAGS passed along to subdirectories, provide a line like
 * the following in the appropriate Imakefile
 *
 *         #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)'
 */
#ifndef NamedMakeSubdirs
#define NamedMakeSubdirs(name,dirs) \
NamedTargetSubdirs(name,dirs,"making" name,PassCDebugFlags,all)
#endif /* NamedMakeSubdirs */

#ifndef MakeSubdirs
#define MakeSubdirs(dirs)						@@\
NamedMakeSubdirs(all,dirs)
#endif /* MakeSubdirs */


/*
 * DependSubdirs - generate rules to recursively compute dependencies as
 * part of the make depend step.
 */
#ifndef DependSubdirs
#define DependSubdirs(dirs) \
NamedTargetSubdirs(depend,dirs,"depending",NullParameter,depend)
#endif /* DependSubdirs */


/*
 * ForceSubdirs - force make to build subdirectories
 */
#ifndef ForceSubdirs
#if !HasBsdMake
#define ForceSubdirs(dirs)						@@\
dirs: FRC								@@\
	@echo "making all in $(CURRENT_DIR)/$@..."			@@\
	@MakeNamedTargetSubdir($@,PassCDebugFlags,all)			@@\
									@@\
FRC:
#else
/* For BSD 4.4 make */
#define ForceSubdirs(dirs)						@@\
dirs:	.EXEC								@@\
	@cd $@ ; echo "making all in $(CURRENT_DIR)/$@..."; \		@@\
	$(MAKE) $(MFLAGS) PassCDebugFlags all				@@\
									@@\
.EXEC:
#endif

#endif /* ForceSubdirs */

/*
 * InstallSubdirs - generate rules to recursively install programs and files.
 */
#ifndef InstallSubdirs
#define InstallSubdirs(dirs) \
NamedTargetSubdirs(install,dirs,"installing",DESTDIR=$(DESTDIR),install)
#endif /* InstallSubdirs */


/*
 * InstallManSubdirs - generate rules to recursively install manual pages.
 */
#ifndef InstallManSubdirs
#define InstallManSubdirs(dirs) \
NamedTargetSubdirs(install.man,dirs,"installing man pages",DESTDIR=$(DESTDIR),install.man)
#endif /* InstallManSubdirs */


/*
 * IncludesSubdirs - generate rules to recursively put include files in build
 */
#ifndef IncludesSubdirs
#define IncludesSubdirs(dirs) \
NamedTargetSubdirs(includes,dirs,including,NullParameter,includes)
#endif


/*
 * InstallDriverSDKSubdirs - generate rules to recursively install Driver
 *                         SDK (only used for XFree86). This is a no-op
 *                         rule so that Imakefiles on non-XFree86 systems
 *                         continue to build Makefiles correctly.
 */
#ifndef InstallDriverSDKSubdirs
#define InstallDriverSDKSubdirs(dirs)
#endif

/*
 * InstallDriverSDKObjectModule - generate rules to recursively install Driver
 *                         SDK (only used for XFree86). This is a no-op
 *                         rule so that Imakefiles on non-XFree86 systems
 *                         continue to build Makefiles correctly.
 */
#ifndef InstallDriverSDKObjectModule
#define InstallDriverSDKObjectModule(module,dest,subdir)
#endif
#ifndef InstallDriverSDKObjectSubModule
#define InstallDriverSDKObjectSubModule(module,dest,subdir)
#endif



/*
 * CleanSubdirs - generate rules to recursively clean out garbage files.
 */
#define BootstrapCleanSubdirs /**/	/* used at top-level */
#ifndef NamedCleanSubdirs
#define NamedCleanSubdirs(name,dirs) \
NamedTargetSubdirs(name,dirs,"cleaning",BootstrapCleanSubdirs,clean)
#endif /* NamedCleanSubdirs */

#ifndef CleanSubdirs
#define CleanSubdirs(dirs) \
NamedCleanSubdirs(clean,dirs)
#endif


/*
 * TagSubdirs - generate rules to recursively create tags files.
 */
#ifndef NamedTagSubdirs
#define NamedTagSubdirs(name,dirs) \
NamedTargetSubdirs(name,dirs,"tagging",TAGS='$(TAGS)',tags)
#endif /* TagSubdirs */

#ifndef TagSubdirs
#define TagSubdirs(dirs) \
NamedTagSubdirs(tags,dirs)
#endif

/*
 * MakeLintSubdirs - generate rules to recursively lint directories as part
 * of the named step.
 */
#ifndef MakeLintSubdirs
#define MakeLintSubdirs(dirs,target,subtarget) \
NamedTargetSubdirs(target,dirs,"linting" for target and subtarget,DESTDIR=$(DESTDIR) LINTOPTS='$(LINTOPTS)',subtarget)
#endif /* MakeLintSubdirs */


/*
 * LintSubdirs - generate rules to recursively lint directories as part of
 * the make lint step.
 */
#ifndef LintSubdirs
#define LintSubdirs(dirs)						@@\
MakeLintSubdirs(dirs,lint,lint)
#endif /* LintSubdirs */


/*
 * MakeLintLibSubdirs - generate rules to recursively create lint libraries.
 */
#ifndef MakeLintLibSubdirs
#define MakeLintLibSubdirs(dirs)					@@\
MakeLintSubdirs(dirs,lintlib,lintlib)
#endif /* MakeLintLibSubdirs */


/*
 * MakeMakeSubdirs - generate rules to recursively recreate Makefiles as part
 * of the specified step in the build.  If $(TOP) is set to an absolute path,
 * do not prepend the ../ prefix.  This makes running things outside of the
 * source tree much easier.
 * $(ONESUBDIR)/Makefile exists as a separate, explicit target so that
 * clearmake will know what its goal is and do wink-in.
 */
#ifndef MakeMakeSubdirs
#define MakeMakeSubdirs(dirs,target)					@@\
$(ONESUBDIR)/Makefile:							@@\
	@MakeFlagsToShellFlags(n,executeit="no"); \			@@\
	cd $(ONESUBDIR) && \						@@\
	if [ "$$executeit" != "no" ]; then \				@@\
		ImakeSubCmdHelper -DTOPDIR=$(IMAKETOP) -DCURDIR=$(ONECURDIR)$(ONESUBDIR); \ @@\
	fi;								@@\
									@@\
target::								@@\
	-@MakeFlagsToShellFlags(ik,set +e); \				@@\
	MakeFlagsToShellFlags(n,executeit="no"); \			@@\
	for i in dirs ;\						@@\
	do \								@@\
		case "$(CURRENT_DIR)" in \				@@\
		.) curdir= ;; \						@@\
		*) curdir=$(CURRENT_DIR)/ ;; \				@@\
		esac; \							@@\
		echo "making Makefiles in $$curdir$$i..."; \		@@\
		itmp=`echo $$i | sed -e 's;^\./;;g' -e 's;/\./;/;g'`; \	@@\
		curtmp="$(CURRENT_DIR)" \				@@\
		toptmp=""; \						@@\
		case "$$itmp" in \					@@\
		    ../?*) \						@@\
			while echo "$$itmp" | grep '^\.\./' > /dev/null;\	@@\
			  do \						@@\
			     toptmp="/`basename $$curtmp`$$toptmp"; \	@@\
			     curtmp="`dirname $$curtmp`"; \		@@\
			     itmp="`echo $$itmp | sed 's;\.\./;;'`"; \	@@\
			  done \					@@\
		    ;; \						@@\
		esac; \							@@\
		case "$$itmp" in \					@@\
		*/?*/?*/?*/?*)	newtop=../../../../..;; \		@@\
		*/?*/?*/?*)	newtop=../../../..;; \			@@\
		*/?*/?*)	newtop=../../..;; \			@@\
		*/?*)		newtop=../..;; \			@@\
		*)		newtop=..;; \				@@\
		esac; \							@@\
		newtop="$$newtop$$toptmp"; \				@@\
		case "$(TOP)" in \					@@\
		/?*) imaketop=$(TOP) \					@@\
		     imakeprefix= ;; \					@@\
		.) imaketop=$$newtop \					@@\
		   imakeprefix=$$newtop/ ;; \				@@\
		*) imaketop=$$newtop/$(TOP) \				@@\
		   imakeprefix=$$newtop/ ;; \				@@\
		esac; \							@@\
		RemoveFile($$i/Makefile.bak); \				@@\
		if [ -f $$i/Makefile ]; then \				@@\
			echo "	$(MV) Makefile Makefile.bak"; \		@@\
			if [ "$$executeit" != "no" ]; then \		@@\
				$(MV) $$i/Makefile $$i/Makefile.bak; \	@@\
			fi; \						@@\
		fi; \							@@\
		$(MAKE) $(MFLAGS) $(MAKE_OPTS) ONESUBDIR=$$i ONECURDIR=$$curdir IMAKETOP=$$imaketop IMAKEPREFIX=$$imakeprefix $$i/Makefile; \	@@\
		if [ -d $$i ] ; then \					@@\
			cd $$i; \					@@\
			$(MAKE) $(MFLAGS) Makefiles; \			@@\
			cd $$newtop; \					@@\
		else \							@@\
			exit 1; \					@@\
		fi; \							@@\
	done

#ifdef UseInstalled
#define ImakeSubCmdHelper $(IMAKE_CMD)
#else
#define ImakeSubCmdHelper $(IMAKEPREFIX)$(IMAKE) -I$(IMAKEPREFIX)$(IRULESRC) \
			  $(IMAKE_DEFINES) $(IMAKE_WARNINGS)
#endif

#endif /* MakeMakeSubdirs */


/*
 * MakefileSubdirs - generate rules to create Makefiles.
 */
#ifndef MakefileSubdirs
#define MakefileSubdirs(dirs)						@@\
MakeMakeSubdirs(dirs,Makefiles)
#endif /* MakefileSubdirs */

/*
 * Translate XCOMM into pound sign with sed, rather than passing -DXCOMM=XCOMM
 * to cpp, because that trick does not work on all ANSI C preprocessors.
 * Delete line numbers from the cpp output (-P is not portable, I guess).
 * Allow XCOMM to be preceded by whitespace and provide a means of generating
 * output lines with trailing backslashes.
 * Allow XHASH to always be substituted, even in cases where XCOMM isn't.
 */
#ifndef CppSedMagic
#define CppSedMagic sed -e '/^#  *[0-9][0-9]*  *.*$$/d' \
			-e '/^#line  *[0-9][0-9]*  *.*$$/d' \
			-e '/^[ 	]*XCOMM$$/s/XCOMM/#/' \
			-e '/^[ 	]*XCOMM[^a-zA-Z0-9_]/s/XCOMM/#/' \
			-e '/^[ 	]*XHASH/s/XHASH/#/' \
			-e '/\@\@$$/s/\@\@$$/\\/'
#endif /* CppSedMagic */

#ifndef CppFileTarget
#define CppFileTarget(dst,src,defs,deplist)				@@\
dst::  src deplist							@@\
	RemoveFile($@)							@@\
	ClearmakeOSName \
	$(CPP) CppNoLineInfoOption defs <src | CppSedMagic >$@		@@\
									@@\
clean::									@@\
	RemoveFiles(dst)
#endif /* CppFileTarget */

/*
 * CppScriptTarget - generate rules to create a shell script by running the
 * input through cpp.  If the ExecableScripts configuration parameter is not
 * set, then make sure that the first line begins with a colon.
 */
#ifndef CppScriptTarget
#if ExecableScripts		/* can use #! instead of colon */
#define CppScriptTarget(dst,src,defs,deplist)				@@\
dst::	src deplist							@@\
	RemoveFile($@)							@@\
	ClearmakeOSName \
	$(CPP) CppNoLineInfoOption defs <src | CppSedMagic >$@		@@\
	chmod a+x $@							@@\
									@@\
clean::									@@\
	RemoveFiles(dst)
#else
#define CppScriptTarget(dst,src,defs,deplist)				@@\
dst::  src deplist							@@\
	RemoveFile($@)							@@\
	ClearmakeOSName \
	echo \: >$@							@@\
	sed '1d' src | $(CPP) CppNoLineInfoOption defs | CppSedMagic >>$@	@@\
	chmod a+x $@							@@\
									@@\
clean::									@@\
	RemoveFile(dst)
#endif /* ExecableScripts */
#endif /* CppScriptTarget */


/*
 * MakeScriptFromCpp - generate rules to create a script from a file with a
 * .cpp suffix.
 */
#ifndef MakeScriptFromCpp
#define MakeScriptFromCpp(name,defs)					@@\
CppScriptTarget(name,name.cpp,defs,NullParameter)
#endif /* MakeScriptFromCpp */

#ifndef CppSourceFile
#define CppSourceFile(dst,src,defs,deplist)				@@\
CppFileTarget(dst,src,defs,deplist)					@@\
									@@\
includes:: dst								@@\
									@@\
depend:: dst
#endif /* CppSourceFile */

/* Like CppFileTarget, but don't add any default defines */
#ifndef CppRawFileTarget
#define CppRawFileTarget(dst,src,defs,deplist)				@@\
dst::  src deplist							@@\
	RemoveFile($@)							@@\
	ClearmakeOSName \
	$(RAWCPP) CppNoLineInfoOption defs <src | CppSedMagic >$@	@@\
									@@\
clean::									@@\
	RemoveFiles(dst)
#endif /* CppFileTarget */

/*
 * CppManTarget - preprocess man pages.  OS-specific man sections are replaced.
 */
#ifndef CppManTarget
#define CppManTarget(name,defs)						@@\
AllTarget(name.$(MANNEWSUFFIX))						@@\
									@@\
name.$(MANNEWSUFFIX): name.$(MANSRCSUFFIX)				@@\
	RemoveFile($@)							@@\
	if test -z "$(PREPROCESSMANPAGES)" ; then \			@@\
	   cd `dirname name` && \					@@\
	   $(LN) `basename name.$(MANSRCSUFFIX)` `basename $@`; \	@@\
	else \								@@\
	     ClearmakeOSName \
	     $(RAWCPP) CppNoLineInfoOption $(MANDEFS) defs \		@@\
	     < name.$(MANSRCSUFFIX) | CppSedMagic >$@; \		@@\
	fi								@@\
									@@\
clean::									@@\
	RemoveFile(name.$(MANNEWSUFFIX))
#endif /* CppManTarget */

/*
 * MakeDirectories - generate rules to create a hierarchy of directories.
 */
#ifndef MakeDirectories
#define MakeDirectories(step,dirs)					@@\
step::									@@\
	DirFailPrefix@MakeFlagsToShellFlags(i,set +e); \		@@\
	for i in dirs; do if [ -d $(DESTDIR)$$i ]; then \		@@\
		set +x; else (set -x; $(MKDIRHIER) $(DESTDIR)$$i); fi; \ @@\
	done
#endif /* MakeDirectories */


/*
 * AllTarget - generate rules to build necessary things during make all.
 */
#ifndef AllTarget
#define AllTarget(depends)						@@\
all:: depends
#endif /* AllTarget */

#ifdef DefineOldLibraryRules
#include <oldlib.rules>
#endif

#ifndef StaticLibrary
#define StaticLibrary(libpath,libname) Concat3(libpath,/,LibraryTargetName(libname))
#endif

/*
 * MakeMutex - generate mutex rules for parallel make
 */
#ifndef MakeMutex
#ifdef MutexDirective
#define MakeMutex(targets)						@@\
MutexDirective:	targets
#endif /* MutexDirective */
#endif /* MakeMutex */

/*
 * Rules for dynamic modules.  These are primarily used by XFree86
 */

#ifndef LinkBuildModule
#ifdef UseInstalled
#define LinkBuildModule(module,subdir) $(_NULLCMD_)
#else
#define LinkBuildModule(module,subdir)\
	MakeDir($(BUILDMODULEDIR)/subdir)				@@\
	RemoveFile($(BUILDMODULEDIR)/subdir/module)			@@\
	@(UP="`$(REVPATH) subdir`"; set -x; \				@@\
	  cd $(BUILDMODULEDIR)/subdir && \				@@\
		$(LN) $(BUILDMODULETOP)/$${UP}$(CURRENT_DIR)/module .)
#endif
#endif /* LinkBuildModule */

#ifndef LinkBuildNamedModule
#ifdef UseInstalled
#define LinkBuildNamedModule(module,name,subdir) $(_NULLCMD_)
#else
#define LinkBuildNamedModule(module,name,subdir)\
	MakeDir($(BUILDMODULEDIR)/subdir)				@@\
	RemoveFile($(BUILDMODULEDIR)/subdir/name)			@@\
	@(UP="`$(REVPATH) subdir`"; set -x; \				@@\
	  cd $(BUILDMODULEDIR)/subdir && \				@@\
		$(LN) $(BUILDMODULETOP)/$${UP}$(CURRENT_DIR)/module name)
#endif
#endif /* LinkBuildNamedModule */

/*
 * ModuleObjectRule
 */
#ifndef ModuleObjectRule
#define ModuleObjectRule() NormalLibraryObjectRule()
#endif

/*
 * ObjectModuleTarget - build a module as a single object file
 */
#ifndef ObjectModuleTarget
#if MakeDllModules && DoLoadableServer
#define ObjectModuleTarget(module,objects)				@@\
DynamicModuleTarget(Concat(module,_drv.so), objects)
#else
#define ObjectModuleTarget(module,objects)				@@\
NormalRelocatableTarget(Concat(module,_drv), objects)
#endif
#endif

/*
 * LibraryModuleTarget
 */
#ifndef LibraryModuleTarget
#if MakeDllModules && DoLoadableServer
#define LibraryModuleTarget(module,objects)				@@\
NormalLibraryTarget(module, objects)					@@\
DynamicModuleTarget(Concat3(lib,module,.so), objects)
#else
#define LibraryModuleTarget(module, objects)				@@\
NormalLibraryTarget(module, objects)
#endif
#endif

/*
 * DepLibraryModuleTarget
 */
#ifndef DepLibraryModuleTarget
#if MakeDllModules && DoLoadableServer
#define DepLibraryModuleTarget(module,deplist,objects)			@@\
NormalDepLibraryTarget(module, deplist, objects)			@@\
DepDynamicModuleTarget(Concat3(lib,module,.so), deplist, objects)
#else
#define DepLibraryModuleTarget(module,deplist,objects)			@@\
NormalDepLibraryTarget(module, deplist, objects)
#endif
#endif

/*
 * DynamicModuleTarget - build a module to be dynamically loaded
 */
#ifndef DynamicModuleTarget
#define DynamicModuleTarget(module,modlist)				@@\
AllTarget(module)							@@\
									@@\
module: modlist								@@\
	RemoveFile($@)							@@\
	$(CC) -o $@ $(SHLIBLDFLAGS) $(NOSTDLIB) modlist $(POSTNOSTDLIB) @@\
									@@\
clean::									@@\
	RemoveFile(module)
#endif /* DynamicModuleTarget */

/*
 * DepDynamicModuleTarget - build a module to be dynamically loaded
 */
#ifndef DepDynamicModuleTarget
#define DepDynamicModuleTarget(module,deplist,modlist)			@@\
AllTarget(module)							@@\
									@@\
module: deplist								@@\
	RemoveFile($@)							@@\
	$(CC) -o $@ $(SHLIBLDFLAGS) $(NOSTDLIB) modlist $(POSTNOSTDLIB) @@\
									@@\
clean::									@@\
	RemoveFile(module)
#endif /* DepDynamicModuleTarget */

/*
 * InstallDynamicModule - install a dynamic module
 */
#ifndef InstallDynamicModule
#define InstallDynamicModule(module,dest,subdir)			@@\
AllTarget(module)							@@\
	LinkBuildModule(module,subdir)					@@\
									@@\
install:: module							@@\
	MakeDir($(DESTDIR)dest/subdir)					@@\
	$(INSTALL) -c $(INSTDATFLAGS) module $(DESTDIR)dest/subdir
#endif

#ifndef InstallDynamicNamedModule
#define InstallDynamicNamedModule(module,instname,dest,subdir)		@@\
AllTarget(module)							@@\
	LinkBuildNamedModule(module,instname,subdir)			@@\
									@@\
install:: module							@@\
	MakeDir($(DESTDIR)dest/subdir)					@@\
	$(INSTALL) -c $(INSTDATFLAGS) module $(DESTDIR)dest/subdir/instname
#endif

/* Shortcuts for installing driver module, one per class */
#ifndef InstallVideoObjectModule
#define InstallVideoObjectModule(module,dest)                          @@\
InstallObjectModule(module,dest,drivers)
#endif
#ifndef InstallInputObjectModule
#define InstallInputObjectModule(module,dest)                          @@\
InstallObjectModule(module,dest,input)
#endif
#ifndef InstallExtensionsObjectModule
#define InstallExtensionsObjectModule(module,dest)                     @@\
InstallObjectModule(module,dest,extensions)
#endif
#ifndef InstallFontsObjectModule
#define InstallFontsObjectModule(module,dest)                          @@\
InstallObjectModule(module,dest,fonts)
#endif
#ifndef InstallMultimediaObjectModule
#define InstallMultimediaObjectModule(module,dest)                     @@\
InstallObjectModule(module,dest,multimedia)
#endif

#ifndef InstallObjectModule
#if !DoLoadableServer
#define InstallObjectModule(module,dest,subdir)	/**/
#else
#if MakeDllModules
#define InstallObjectModule(module,dest,subdir)				@@\
InstallDynamicModule(Concat(module,_drv.so),dest,subdir)
#else
#define InstallObjectModule(module,dest,subdir)				@@\
InstallDynamicModule(Concat(module,_drv.o),dest,subdir)
#endif
#endif
#endif

#ifndef InstallLibraryModule
#if !DoLoadableServer
#define InstallLibraryModule(module,dest,subdir)	/**/
#else
#if MakeDllModules
#define InstallLibraryModule(module,dest,subdir)			@@\
InstallDynamicModule(Concat3(lib,module,.so),dest,subdir)
#else
#define InstallLibraryModule(module,dest,subdir)			@@\
InstallDynamicModule(ModuleLibraryTargetName(module),dest,subdir)
#endif
#endif
#endif

#ifndef InstallModuleManPage
#define InstallModuleManPage(module)					@@\
InstallGenManPage(module,$(DRIVERMANDIR),$(DRIVERMANSUFFIX))
#endif

#ifndef BuildObjectFromLibraryWithPath
#define BuildObjectFromLibraryWithPath(libpath,libname,objname)		@@\
AllTarget(objname.Osuf)							@@\
									@@\
objname.Osuf: Concat3(libpath,/lib,libname.a)				@@\
	@$(MKDIRHIER) tmp						@@\
	@$(CP) Concat3(libpath,/lib,libname.a) tmp			@@\
	@(cd tmp; set -x; ArExtCmd Concat(lib,libname.a); \		@@\
	  $(LD) $(LDCOMBINEFLAGS) *.Osuf -o ../$@; \			@@\
	  RemoveFiles(*.Osuf))						@@\
	@$(RM) -r tmp							@@\
									@@\
clean::									@@\
	RemoveFile(objname.Osuf)
#endif

#ifndef BuildObjectFromLibrary
#define BuildObjectFromLibrary(libname,objname) BuildObjectFromLibraryWithPath(.,libname,objname)
#endif

/*
 * LinkerRuntimeLibraryPathFlag - defined here to be a no-op for systems that
 * don't need it.   Overridden in system-specific config files for systems that
 * need it, usually with something like "Concat(-R,path)"
 */
#ifndef LinkerRuntimeLibraryPathFlag
# define LinkerRuntimeLibraryPathFlag(path)  /* */
#endif

/* Phony targets - GNU make has a feature to mark a target as phony,
 * which means that it wont consider that target to be the name of a
 * file.  In general this speeds up make, since it doesn't have to
 * look for those files when it sets out to create a phony target.
 * However, on cygwin, this is actually required for correct
 * operation, since the Win32 filesystems are case insensitive and the
 * install target conflicts with the INSTALL file present in some
 * (autotooled) directories.
 *
 * We probably don't need the #ifdef protection, since other make
 * implementations would just consider this a normal rule.  Better
 * safe than sorry, though.
 */
#if HasGnuMake
.PHONY: all interfaces install install.man install.lib install.sdk \
	depend includes clean
#endif
