1XCOMM ---------------------------------------------------------------------
2XCOMM Imake rules for building libraries, programs, scripts, and data files
3XCOMM rules:  $Xorg: Imake.rules,v 1.3 2000/08/17 19:41:46 cpqbld Exp $
4XCOMM rules:  $XdotOrg: xc/config/cf/Imake.rules,v 1.8 2005/02/01 22:27:00 ajax Exp $
5XCOMM
6XCOMM
7XCOMM
8XCOMM
9XCOMM rules:  $XFree86: xc/config/cf/Imake.rules,v 3.128 2003/11/15 03:25:17 dawes Exp $
10
11/*
12 *		   MACHINE-INDEPENDENT RULES; DO NOT MODIFY
13 *
14 * Warning, when defining rules: make sure you do not include both a trailing
15 * backslash and double ampersand backslash or else you will get an extra
16 * backslash in the Makefile.
17 *
18 * The following macros are defined for the various templates and Imakefiles
19 * (for a list of the applicable make variables, see the template files):
20 *
21 * Concat			(a,b)
22 * Concat3			(a,b,c)
23 * Concat4			(a,b,c,d)
24 * _Use				(a,b)
25 * _UseCat			(a,b,c)
26 * _MUse			(a,b)
27 * _MUseCat			(a,b,c)
28 * ProgramTargetName		(target)
29 * HostProgramTargetName	(target)
30 * RunProgram			(progvar,options)
31 * RunProgramWithSetup		(setup,progvar,options)
32 * RemoveFile			(file)
33 * RemoveFiles			(files)
34 * CenterLoadTarget		(target,srclist,libs,defines)
35 * CenterProgramTarget		(program,srclist,objlist,locallibs,syslibs)
36 * SentinelLinkTarget		(step,program,linklist)
37 * SentinelProgramTarget	(program,deplist,linklist)
38 * SentinelCplusplusProgramTarget	(program,deplist,linklist)
39 * PurifyLinkTarget		(step,program,linklist)
40 * PurifyProgramTarget		(program,deplist,linklist)
41 * PurifyCplusplusProgramTarget	(program,deplist,linklist)
42 * ProofLinkTarget		(step,program,linklist)
43 * ProofProgramTarget		(program,deplist,linklist)
44 * ProofCplusplusProgramTarget	(program,deplist,linklist)
45 * ProofCleanTarget		()
46 * RemoveTargetProgram		(program)
47 * MakeDir			(dir)
48 * InstallDirectory		(dir)
49 * BuildIncludesTop		(srclist)
50 * BuildIncludes		(srclist,dstsubdir,dstupdir)
51 * LinkRule			(program,options,objects,libraries)
52 * HostLinkRule			(program,options,objects,libraries)
53 * NoCmpScript			(target)
54 * NoConfigRec			(target)
55 * NormalProgramTarget		(program,objects,deplibs,locallibs,syslibs)
56 * SetUIDProgramTarget		(program,objects,deplibs,locallibs,syslibs)
57 * SingleProgramTarget		(program,objects,locallibs,syslibs)
58 * SimpleProgramTarget		(program)
59 * ComplexProgramTarget		(program)
60 * ComplexProgramTarget_1	(program,locallib,syslib)
61 * ComplexProgramTarget_2	(program,locallib,syslib)
62 * ComplexProgramTarget_3	(program,locallib,syslib)
63 * ServerTargetWithFlags	(server,subdirs,objects,libs,syslibs,flags)
64 * ServerTarget			(server,subdirs,objects,libs,syslibs)
65 * MoveToBakFile		(file)
66 * RMoveToBakFile		(file)
67 * RanLibrary			(args)
68 * LibraryTargetName		(libname)
69 * LibraryTargetNameSuffix	(libname,suffix)
70 * InstallNamedTarget		(step,srcname,flags,dest,dstname)
71 * InstallTarget		(step,file,flags,dest)
72 * InstallLibrary		(libname,dest)
73 * MergeIntoInstalledLibrary	(tolib,fromlib)
74 * InstallLibraryAlias		(libname,alias,dest)
75 * InstallLintLibrary		(libname,dest)
76 * InstallManPageLong		(file,destdir,dest)
77 * InstallManPage		(file,destdir)
78 * InstallManPageAliases	(file,destdir,aliases)
79 * ManKeywordsTarget		(manpath)
80 * InstallNamedNonExec		(srcname,dstname,dest)
81 * InstallNonExecFile		(file,dest)
82 * InstallNonExecFileNoClobber	(file,dest)
83 * InstallNonExec		(file,dest)
84 * InstallProgramWithFlags	(program,dest,flags)
85 * InstallProgram		(program,dest)
86 * InstallScript		(program,dest)
87 * InstallNamedProg		(srcname,dstname,dest)
88 * InstallNamedProgNoClobber	(srcname,dstname,dest)
89 * MakeFlagsToShellFlags	(makeflags,shellcmd)
90 * MakeNamedTargetSubdir	(dir,flags,subname)
91 * LinkConfDirectoryLong	(mdir,cdir,rdir,ldir,opath,npath)
92 * LinkConfDirectory		(mdir,cdir,rdir,ldir)
93 * LinkConfFileLong		(cfile,lfile,opath,npath)
94 * LinkConfFile			(cfile,lfile)
95 * LinkFileList			(step,list,dir,sub)
96 * LinkVarDirectory		(mdir,cdir,rdir,ldir)
97 * InstallMultipleDestFlags	(step,list,dest,flags)
98 * InstallMultipleDest		(step,list,dest)
99 * InstallMultiple		(list,dest)
100 * InstallMultipleFlags		(list,dest,flags)
101 * InstallMultipleMan		(list,dest)
102 * InstallMultipleManSuffix	(list,dest,suffix)
103 * DependDependency		()
104 * DependTarget			()
105 * DependTarget3		(srcs1,srcs2,srcs3)
106 * CleanTarget			()
107 * TagsTarget			()
108 * ImakeDependency		(target)
109 * BuildMakefileTarget		(notused,imakeflags)
110 * MakefileTarget		()
111 * LibMkdir			(dir)
112 * LibCleanDir			(dir)
113 * LintLibReferences		(varname,libname,libsource)
114 * UnsharedLibReferences	(varname,libname,libsource)
115 * ProjectUnsharedLibReferences	(varname,libname,libsource,buildlibdir)
116 * SharedLibDependencies	(libname,libsource,revname)
117 * SharedDSLibDependencies	(libname,libsource,revname)
118 * SharedLibReferences		(varname,libname,libsource,revname,rev)
119 * SharedDSLibReferences	(varname,libname,libsource,revname,rev)
120 * ObjectCompile		(options)
121 * NormalLibObjCompile		(options)
122 * NormalSharedLibObjCompile	(options)
123 * NormalRelocLibObjCompile	(options)
124 * LibObjCompile		(dir,options)
125 * DebuggedLibObjCompile	(options)
126 * ProfiledLibObjCompile	(options)
127 * SharedLibObjCompile		(options)
128 * NormalLibraryObjectRule	()
129 * NormalFortranObjectRule	()
130 * ObjectFromSpecialSource	(dst,src,flags)
131 * SpecialObjectRule		(objs,depends,options)
132 * SpecialCObjectRule		(basename,depends,options)
133 * LexFile			(file)
134 * M4File			(file,includes)
135 * YaccFile			(file,flags)
136 * YaccFileNoFlags		(file)
137 * MakeLibrary			(libname,objlist)
138 * LinkBuildLibrary		(lib)
139 * LinkBuildSonameLibrary	(lib)
140 * NormalLibraryTarget		(libname,objlist)
141 * NormalLibraryTarget2		(libname,objlist1,objlist2)
142 * NormalLibraryTarget3		(libname,objlist1,objlist2,objlist3)
143 * NormalDepLibraryTarget	(libname,deplist,objlist)
144 * UnsharedLibraryTarget	(libname,objlist,down,up)
145 * UnsharedLibraryTarget3	(libname,objlist1,objlist2,objlist3,down,up)
146 * SubdirLibraryRule		(objlist)
147 * ProfiledLibraryTarget	(libname,objlist)
148 * DebuggedLibraryTarget	(libname,objlist)
149 * AliasedLibraryTarget		(libname,alias)
150 * NormalRelocatableTarget	(objname,objlist)
151 * ProfiledRelocatableTarget	(objname,objlist)
152 * DebuggedRelocatableTarget	(objname,objlist)
153 * LintLibraryTarget		(libname,srclist)
154 * NormalLintTarget		(srclist)
155 * LintTarget			()
156 * LinkSourceFile		(src,dir)
157 * LinkFile			(tofile,fromfile)
158 * MakeSubincludesForBuild	(step,dir,srclist)
159 * LangNamedTargetSubdirs	(lang,name,dirs,verb,flags,subname)
160 * LangNamedMakeSubdirs		(lang,name,dirs)
161 * LangMakeSubdirs		(lang,dirs)
162 * NamedTargetSubdirs		(name,dirs,verb,flags,subname)
163 * NamedMakeSubdirs		(name,dirs)
164 * MakeSubdirs			(dirs)
165 * DependSubdirs		(dirs)
166 * ForceSubdirs			(dirs)
167 * InstallSubdirs		(dirs)
168 * InstallManSubdirs		(dirs)
169 * IncludesSubdirs		(dirs)
170 * NamedCleanSubdirs		(name,dirs)
171 * CleanSubdirs			(dirs)
172 * NamedTagSubdirs		(name,dirs)
173 * TagSubdirs			(dirs)
174 * MakeLintSubdirs		(dirs,target,subtarget)
175 * LintSubdirs			(dirs)
176 * MakeLintLibSubdirs		(dirs)
177 * MakeMakeSubdirs		(dirs,target)
178 * MakefileSubdirs		(dirs)
179 * CppScriptTarget		(dst,src,defs,deplist)
180 * MakeScriptFromCpp		(name,defs)
181 * CppFileTarget		(dst,src,defs,deplist)
182 * CppSourceFile		(dst,src,defs,deplist)
183 * MakeDirectories		(step,dirs)
184 * AllTarget			(depends)
185 * StaticLibrary		(libpath,libname)
186 * MakeMutex			(targets)
187 * LinkBuildModule		(module,subdir)
188 * LinkBuildNamedModule		(module,name,subdir)
189 * DynamicModuleTarget		(module,modlist)
190 * InstallDynamicModule		(module,dest,subdir)
191 * InstallDynamicNamedModule	(module,instname,dest,subdir)
192 * LinkerRuntimeLibraryPathFlag	(path)
193 *
194 *
195 * The following are in specific <os>Lib.rules:
196 *
197 * SharedLibraryTarget		(libname,rev,solist,down,up)
198 * SharedLibraryDataTarget	(libname,rev,salist)
199 * InstallSharedLibrary		(libname,rev,dest)
200 * InstallSharedLibraryData	(libname,rev,dest)
201 * SharedDepModuleTarget	(name,deps,solist)
202 *
203 */
204
205#define NullParameter
206
207/* if [ -d ] or [ ! -d ] causes make to fail, define this as - */
208#ifndef DirFailPrefix
209#define DirFailPrefix
210#endif
211
212/*
213 * NoCmpScript - suppress clearmake build script comparison.
214 */
215#ifndef NoCmpScript
216#if HasClearmake
217#define NoCmpScript(targ)						@@\
218XCOMM special target for clearmake					@@\
219.NO_CMP_SCRIPT: targ
220#else
221#define NoCmpScript(targ) /**/
222#endif
223#endif
224
225/*
226 * NoConfigRec - suppress using clearmake configuration records.
227 */
228#ifndef NoConfigRec
229#if HasClearmake
230#define NoConfigRec(targ)						@@\
231XCOMM special target for clearmake					@@\
232.NO_CONFIG_REC: targ
233#else
234#define NoConfigRec(targ) /**/
235#endif
236#endif
237
238/*
239 * Concat - concatenates two strings.
240 */
241#ifndef Concat
242#if (defined(__STDC__) && !defined(UnixCpp)) || defined(AnsiCpp)
243#define Concat(a,b)a##b
244#else
245#define Concat(a,b)a/**/b
246#endif
247#endif
248
249/*
250 * Concat3 - concatenates three strings.
251 */
252#ifndef Concat3
253#if (defined(__STDC__) && !defined(UnixCpp)) || defined(AnsiCpp)
254#define Concat3(a,b,c)a##b##c
255#else
256#define Concat3(a,b,c)a/**/b/**/c
257#endif
258#endif
259
260/*
261 * Concat4 - concatenates four strings.
262 */
263#ifndef Concat4
264#if (defined(__STDC__) && !defined(UnixCpp)) || defined(AnsiCpp)
265#define Concat4(a,b,c,d)a##b##c##d
266#else
267#define Concat4(a,b,c,d)a/**/b/**/c/**/d
268#endif
269#endif
270
271/*
272 * _XUse - makes a choice based on UseInstalledX11.
273 */
274#ifndef _XUse
275# if defined(UseInstalled) || UseInstalledX11
276#  define _XUse(a,b) a
277# else
278#  define _XUse(a,b) b
279# endif
280#endif /* _XUse */
281
282/*
283 * _Use - makes a choice based on UseInstalled.
284 */
285#ifndef _Use
286# define _Use	_XUse
287#endif /* _Use */
288
289/*
290 * _XUseCat - combination of _XUse and Concat.
291 *           exists to avoid problems with some preprocessors
292 */
293#ifndef _XUseCat
294# if (defined(__STDC__) && !defined(UnixCpp)) || defined(AnsiCpp)
295#  if defined(UseInstalled) || UseInstalledX11
296#   define _XUseCat(a,b,c) a##c
297#  else
298#   define _XUseCat(a,b,c) b##c
299#  endif
300# else
301#  if defined(UseInstalled) || UseInstalledX11
302#   define _XUseCat(a,b,c) a/**/c
303#  else
304#   define _XUseCat(a,b,c) b/**/c
305#  endif
306# endif
307#endif /* _XUseCat */
308
309/*
310 * _UseCat - combination of _Use and Concat.
311 *           exists to avoid problems with some preprocessors
312 */
313#ifndef _UseCat
314# define _UseCat	_XUseCat
315#endif /* _UseCat */
316
317#ifndef ProgramTargetName
318#define ProgramTargetName(target)target
319#endif
320
321#ifndef HostProgramTargetName
322#define HostProgramTargetName(target)target
323#endif
324
325#ifndef RunProgram
326#define RunProgram(progvar,options) $(progvar) options
327#endif
328
329#ifndef RunProgramWithSetup
330#define RunProgramWithSetup(setup,progvar,options) setup $(progvar) options
331#endif
332
333#ifndef RunPerlScript
334#define RunPerlScript(script,options) $(PERLENVSETUP) $(PERL) $(PERLOPTS) script options
335#endif
336
337#ifndef RemoveFile
338#define RemoveFile(file) $(RM) file
339#endif /* RemoveFile */
340
341#ifndef RemoveFiles
342#define RemoveFiles(files) $(RM) files
343#endif /* RemoveFiles */
344
345#if RemoveObsoleteFiles
346#define RemoveOldFile(new,old,dir)					@@\
347	@if [ -f new ]; then set -x; \					@@\
348		RemoveFile($(DESTDIR)dir/old); \			@@\
349	fi
350#else
351#define RemoveOldFile(new,old,dir) $(_NULLCMD_)
352#endif
353
354/*
355 * CenterLoadTarget - generate rules to load files into CodeCenter
356 */
357#ifndef CenterLoadTarget
358#if HasCodeCenter
359#define CenterLoadTarget(target,srclist,libs,defines)			@@\
360ProgramTargetName(target):: srclist					@@\
361	XCOMM load defines srclist libs
362#else
363#define CenterLoadTarget(target,srclist,libs,defines) /**/
364#endif
365#endif /* CenterLoadTarget */
366
367/*
368 * CenterProgramTarget - generate rules to make CodeCenter read in sources
369 * and objects.
370 */
371#ifndef CenterProgramTarget
372#define CenterProgramTarget(program,srclist,objlist,locallibs,syslibs)	@@\
373CenterLoadTarget(Concat(debug_,program),srclist,$(EXTRA_LDOPTIONS) $(LOCAL_LDFLAGS) $(LDPRELIBS) locallibs $(LDLIBS) syslibs,$(ALLDEFINES)) @@\
374									@@\
375CenterLoadTarget(Concat(odebug_,program),objlist,$(EXTRA_LDOPTIONS) $(LOCAL_LDFLAGS) $(LDPRELIBS) locallibs $(LDLIBS) syslibs,$(ALLDEFINES))
376#endif /* CenterProgramTarget */
377
378#ifndef SentinelLinkTarget
379#if HasSentinel
380#define SentinelLinkTarget(step,program,linklist)			@@\
381ProgramTargetName(step.sentinel):					@@\
382	RemoveTargetProgram($@)						@@\
383	$(CCENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CC) -o program.sentinel $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
384#else
385#define SentinelLinkTarget(step,program,linklist) /**/
386#endif
387#endif /* SentinelLinkTarget */
388
389/*
390 * SentinelProgramTarget - generate rules to make Sentinel image
391 */
392#ifndef SentinelProgramTarget
393#if HasSentinel
394#define	SentinelProgramTarget(program,deplist,linklist)			@@\
395ProgramTargetName(program.sentinel): deplist				@@\
396	RemoveTargetProgram($@)						@@\
397	$(CCENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
398									@@\
399clean clean.sentinel::							@@\
400	RemoveFile(program.sentinel)
401#else
402#define	SentinelProgramTarget(program,deplist,linklist) /**/
403#endif
404#endif /* SentinelProgramTarget */
405
406/*
407 * SentinelCplusplusProgramTarget - generate rules to make Sentinel image
408 */
409#ifndef SentinelCplusplusProgramTarget
410#if HasSentinel
411#define	SentinelCplusplusProgramTarget(program,deplist,linklist)	@@\
412ProgramTargetName(program.sentinel): deplist				@@\
413	RemoveTargetProgram($@)						@@\
414	$(CXXENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
415									@@\
416clean clean.sentinel::							@@\
417	RemoveFile(program.sentinel)
418#else
419#define	SentinelCplusplusProgramTarget(program,deplist,linklist) /**/
420#endif
421#endif /* SentinelCplusplusProgramTarget */
422
423#ifndef PurifyLinkTarget
424#if HasPurify
425#define PurifyLinkTarget(step,program,linklist)				@@\
426ProgramTargetName(step.pure):						@@\
427	RemoveTargetProgram($@)						@@\
428	$(CCENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CC) -o program.pure $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
429#else
430#define PurifyLinkTarget(step,program,linklist) /**/
431#endif
432#endif /* PurifyLinkTarget */
433
434/*
435 * PurifyProgramTarget - generate rules to make Purify'ed image
436 */
437#ifndef PurifyProgramTarget
438#if HasPurify
439#define	PurifyProgramTarget(program,deplist,linklist)			@@\
440ProgramTargetName(program.pure): deplist				@@\
441	RemoveTargetProgram($@)						@@\
442	$(CCENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
443									@@\
444clean clean.pure::							@@\
445	RemoveFile(program.pure)
446#else
447#define	PurifyProgramTarget(program,deplist,linklist) /**/
448#endif
449#endif /* PurifyProgramTarget */
450
451/*
452 * PurifyCplusplusProgramTarget - generate rules to make Purify'ed image
453 */
454#ifndef PurifyCplusplusProgramTarget
455#if HasPurify
456#define	PurifyCplusplusProgramTarget(program,deplist,linklist)		@@\
457ProgramTargetName(program.pure): deplist				@@\
458	RemoveTargetProgram($@)						@@\
459	$(CXXENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
460									@@\
461clean clean.pure::							@@\
462	RemoveFile(program.pure)
463#else
464#define	PurifyCplusplusProgramTarget(program,deplist,linklist) /**/
465#endif
466#endif /* PurifyCplusplusProgramTarget */
467
468#ifndef ProofLinkTarget
469#if HasTestCenter
470#define ProofLinkTarget(step,program,linklist)				@@\
471ProgramTargetName(step.tc):						@@\
472	RemoveTargetProgram($@)						@@\
473	$(CCENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CC) -o program.tc $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
474#else
475#define ProofLinkTarget(step,program,linklist) /**/
476#endif
477#endif /* ProofLinkTarget */
478
479/*
480 * ProofProgramTarget - generate rules to make Proof'ed image
481 */
482#ifndef ProofProgramTarget
483#if HasTestCenter
484#define	ProofProgramTarget(program,deplist,linklist)			@@\
485ProgramTargetName(program.tc): deplist					@@\
486	RemoveTargetProgram($@)						@@\
487	$(CCENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
488									@@\
489clean cleantc::								@@\
490	RemoveFiles(program.tc program.tc.*.*)
491#else
492#define	ProofProgramTarget(program,deplist,linklist) /**/
493#endif
494#endif /* ProofProgramTarget */
495
496/*
497 * ProofCplusplusProgramTarget - generate rules to make Proof'ed image
498 */
499#ifndef ProofCplusplusProgramTarget
500#if HasTestCenter
501#define	ProofCplusplusProgramTarget(program,deplist,linklist)		@@\
502ProgramTargetName(program.tc): deplist					@@\
503	RemoveTargetProgram($@)						@@\
504	$(CXXENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
505									@@\
506clean cleantc::								@@\
507	RemoveFiles(program.tc program.tc.*.*)
508#else
509#define	ProofCplusplusProgramTarget(program,deplist,linklist) /**/
510#endif
511#endif /* ProofCplusplusProgramTarget */
512
513#ifndef ProofCleanTarget
514#if HasTestCenter
515#define ProofCleanTarget()						@@\
516clean cleantc::								@@\
517	$(RM) -r TC.Cache
518#else
519#define ProofCleanTarget() /**/
520#endif
521#endif /* ProofCleanTarget */
522
523#ifndef RemoveTargetProgram
524#if RemoveTargetProgramByMoving
525#define RemoveTargetProgram(program) \
526-if [ -f program ]; then RemoveFile(Concat(program,~)); $(MV) program Concat(program,~); fi
527#else
528#define RemoveTargetProgram(program) RemoveFile(program)
529#endif
530#endif /* RemoveTargetProgram */
531
532#ifndef MakeDir
533#define MakeDir(dir) DirFailPrefix@if [ -d dir ]; then \		@@\
534		set +x; \						@@\
535	else \								@@\
536		if [ -h dir ]; then \					@@\
537			(set -x; rm -f dir); \				@@\
538		fi; \							@@\
539		(set -x; $(MKDIRHIER) dir); \				@@\
540	fi
541#endif /* MakeDir */
542
543#ifndef MakeDirInline
544#define MakeDirInline(dir) if [ -d dir ]; then \			@@\
545		:; \							@@\
546	else \								@@\
547		if [ -h dir ]; then \					@@\
548			(set -x; rm -f dir); \				@@\
549		fi; \							@@\
550		(set -x; $(MKDIRHIER) dir); \				@@\
551	fi
552#endif /* MakeDirInline */
553
554#ifndef InstallDirectory
555#define InstallDirectory(dir)						@@\
556install::								@@\
557	MakeDir(dir)
558#endif /* InstallDirectory */
559
560#ifndef InstallCreateLink
561# define InstallCreateLink(dest,from,to)				@@\
562install::								@@\
563	  cd $(DESTDIR)dest && \					@@\
564	  $(LN) -sf from to
565#endif
566
567#ifndef BuildIncludesTop
568#define BuildIncludesTop(srclist)					@@\
569includes:: srclist							@@\
570	MakeDir($(BUILDINCDIR))						@@\
571	@(set -x; cd $(BUILDINCDIR) && for i in srclist; do \		@@\
572		RemoveFile($$i); \					@@\
573		$(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/$$i .; \		@@\
574	done)
575#endif /* BuildIncludesTop */
576
577#ifndef BuildIncludes
578#define BuildIncludes(srclist,dstsubdir,dstupdir)			@@\
579includes:: srclist							@@\
580	MakeDir($(BUILDINCDIR)/dstsubdir)				@@\
581	@(set -x; cd $(BUILDINCDIR)/dstsubdir && for i in srclist; do \	@@\
582		RemoveFile($$i); \					@@\
583		$(LN) $(BUILDINCTOP)/dstupdir/$(CURRENT_DIR)/$$i .; \	@@\
584	done)
585#endif /* BuildIncludes */
586
587/*
588 * LinkBuildBinary - export a binary from the build tree.
589 */
590#ifndef LinkBuildBinary
591#define LinkBuildBinary(binary)						@@\
592all:: $(BUILDBINDIR)/binary binary					@@\
593									@@\
594$(BUILDBINDIR)/binary: binary						@@\
595	MakeDir($(BUILDBINDIR))						@@\
596	RemoveFile($@)							@@\
597	cd $(BUILDBINDIR) && $(LN) $(BUILDBINTOP)/$(CURRENT_DIR)/binary .
598#endif /* LinkBuildBinary */
599
600#ifndef BuildInterfaces
601#define BuildInterfaces(srclist,dstsubdir,dstupdir)			@@\
602interfaces::								@@\
603	MakeDir($(BUILDINCDIR)/dstsubdir)				@@\
604	@(set -x; cd $(BUILDINCDIR)/dstsubdir && for i in srclist; do \	@@\
605		RemoveFile($$i); \					@@\
606		$(LN) $(BUILDINCTOP)/dstupdir/$(CURRENT_DIR)/$$i .; \	@@\
607	done)
608#endif /* BuildInterfaces */
609
610/*
611 * LinkRule - link a program
612 */
613#ifndef LinkRule
614#define LinkRule(program,options,objects,libraries) \
615$(CCLINK) -o program options objects libraries $(EXTRA_LOAD_FLAGS)
616#endif /* LinkRule */
617
618/*
619 * HostLinkRule - link a utility to be used on the build host
620 * (differs from LinkRule if cross compiling)
621 */
622#ifndef HostLinkRule
623#define HostLinkRule LinkRule
624#endif
625
626#ifndef CplusplusLinkRule
627#define CplusplusLinkRule(program,options,objects,libraries) \
628$(CXXLINK) -o program options objects libraries $(EXTRA_LOAD_FLAGS)
629#endif /* CplusplusLinkRule */
630
631/*
632 * NormalProgramTarget - generate rules to compile and link the indicated
633 * program; since it does not use any default object files, it may be used for
634 * multiple programs in the same Imakefile.
635 */
636#ifndef NormalProgramTarget
637#define	NormalProgramTarget(program,objects,deplibs,locallibs,syslibs)	@@\
638ProgramTargetName(program): objects deplibs				@@\
639	RemoveTargetProgram($@)						@@\
640	LinkRule($@,$(LDOPTIONS),objects,locallibs $(LDLIBS) syslibs)	@@\
641									@@\
642SentinelProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
643PurifyProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
644ProofProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
645									@@\
646clean::									@@\
647	RemoveFile(ProgramTargetName(program))
648#endif /* NormalProgramTarget */
649
650
651/*
652 * NormalCplusplusProgramTarget - Like NormalTargetProgram, but uses
653 * C++ linking rules.
654 */
655#ifndef NormalCplusplusProgramTarget
656#define	NormalCplusplusProgramTarget(program,objects,deplibs,locallibs,syslibs)	@@\
657ProgramTargetName(program): objects deplibs				@@\
658	RemoveTargetProgram($@)						@@\
659	CplusplusLinkRule($@,$(CXXLDOPTIONS),objects,locallibs $(LDLIBS) syslibs) @@\
660									@@\
661SentinelCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
662PurifyCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
663ProofCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
664									@@\
665clean::									@@\
666	RemoveFile(ProgramTargetName(program))
667#endif /* NormalCplusplusProgramTarget */
668
669
670#ifndef SetUIDProgramTarget
671#define SetUIDProgramTarget NormalProgramTarget
672#endif
673
674
675/*
676 * SingleProgramTarget - obsolete version of NormalProgramTarget that does
677 * not have deplibs.
678 */
679#ifndef SingleProgramTarget
680#define	SingleProgramTarget(program,objects,locallibs,syslibs)		@@\
681NormalProgramTarget(program,objects,NullParameter,locallibs,syslibs)
682#endif /* SingleProgramTarget */
683
684/*
685 * SimpleProgramTarget - generate rules for compiling and linking programs
686 * that only have one C source file.  It should only be used in Imakefiles
687 * that describe a single program.
688 */
689#ifndef SimpleProgramTarget
690#define	SimpleProgramTarget(program)					@@\
691           OBJS = program.o						@@\
692           SRCS = program.c						@@\
693									@@\
694ComplexProgramTarget(program)
695#endif /* SimpleProgramTarget */
696
697#ifndef SimpleProgramTarget_1
698#define	SimpleProgramTarget_1(program)					@@\
699           OBJS1 = program.o						@@\
700           SRCS1 = program.c						@@\
701									@@\
702ComplexProgramTarget_1(program,$(LOCAL_LIBRARIES),NullParameter)
703#endif /* SimpleProgramTarget_1 */
704#ifndef SimpleProgramTarget_2
705#define	SimpleProgramTarget_2(program)					@@\
706           OBJS2 = program.o						@@\
707           SRCS2 = program.c						@@\
708									@@\
709ComplexProgramTarget_2(program,$(LOCAL_LIBRARIES),NullParameter)
710#endif /* SimpleProgramTarget_2 */
711#ifndef SimpleProgramTarget_3
712#define	SimpleProgramTarget_3(program)					@@\
713           OBJS3 = program.o						@@\
714           SRCS3 = program.c						@@\
715									@@\
716ComplexProgramTarget_3(program,$(LOCAL_LIBRARIES),NullParameter)
717#endif /* SimpleProgramTarget_3 */
718#ifndef SimpleProgramTarget_4
719#define	SimpleProgramTarget_4(program)					@@\
720           OBJS4 = program.o						@@\
721           SRCS4 = program.c						@@\
722									@@\
723ComplexProgramTarget_4(program,$(LOCAL_LIBRARIES),NullParameter)
724#endif /* SimpleProgramTarget_4 */
725#ifndef SimpleProgramTarget_5
726#define	SimpleProgramTarget_5(program)					@@\
727           OBJS5 = program.o						@@\
728           SRCS5 = program.c						@@\
729									@@\
730ComplexProgramTarget_5(program,$(LOCAL_LIBRARIES),NullParameter)
731#endif /* SimpleProgramTarget_5 */
732#ifndef SimpleProgramTarget_6
733#define	SimpleProgramTarget_6(program)					@@\
734           OBJS6 = program.o						@@\
735           SRCS6 = program.c						@@\
736									@@\
737ComplexProgramTarget_6(program,$(LOCAL_LIBRARIES),NullParameter)
738#endif /* SimpleProgramTarget_6 */
739#ifndef SimpleProgramTarget_7
740#define	SimpleProgramTarget_7(program)					@@\
741           OBJS7 = program.o						@@\
742           SRCS7 = program.c						@@\
743									@@\
744ComplexProgramTarget_7(program,$(LOCAL_LIBRARIES),NullParameter)
745#endif /* SimpleProgramTarget_7 */
746#ifndef SimpleProgramTarget_8
747#define	SimpleProgramTarget_8(program)					@@\
748           OBJS8 = program.o						@@\
749           SRCS8 = program.c						@@\
750									@@\
751ComplexProgramTarget_8(program,$(LOCAL_LIBRARIES),NullParameter)
752#endif /* SimpleProgramTarget_8 */
753#ifndef SimpleProgramTarget_9
754#define	SimpleProgramTarget_9(program)					@@\
755           OBJS9 = program.o						@@\
756           SRCS9 = program.c						@@\
757									@@\
758ComplexProgramTarget_9(program,$(LOCAL_LIBRARIES),NullParameter)
759#endif /* SimpleProgramTarget_9 */
760#ifndef SimpleProgramTarget_10
761#define	SimpleProgramTarget_10(program)					@@\
762           OBJS10 = program.o						@@\
763           SRCS10 = program.c						@@\
764									@@\
765ComplexProgramTarget_10(program,$(LOCAL_LIBRARIES),NullParameter)
766#endif /* SimpleProgramTarget_10 */
767
768#ifndef SimpleCplusplusProgramTarget
769#define SimpleCplusplusProgramTarget(program)				@@\
770           OBJS = program.o						@@\
771           SRCS = program.CCsuf						@@\
772									@@\
773ComplexCplusplusProgramTarget(program)
774#endif /* SimpleCplusplusProgramTarget */
775
776#ifndef ProgramTargetHelper
777#define	ProgramTargetHelper(program,srcs,objs,deplib,locallib,syslib)	@@\
778ProgramTargetName(program): $(objs) $(deplib)				@@\
779	RemoveTargetProgram($@)						@@\
780	LinkRule($@,$(LDOPTIONS),$(objs),locallib $(LDLIBS) syslib)	@@\
781									@@\
782CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)		@@\
783SentinelProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
784PurifyProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
785ProofProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
786									@@\
787InstallProgram(program,$(BINDIR))					@@\
788InstallManPage(program,$(MANDIR))
789#endif /* ProgramTargetHelper */
790
791#ifndef ProgramTargetHelperNoMan
792#define ProgramTargetHelperNoMan(program,srcs,objs,deplib,locallib,syslib) @@\
793ProgramTargetName(program): $(objs) $(deplib)				@@\
794	RemoveTargetProgram($@)						@@\
795	LinkRule($@,$(LDOPTIONS),$(objs),locallib $(LDLIBS) syslib)	@@\
796									@@\
797CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)		@@\
798SentinelProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
799PurifyProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
800ProofProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
801									@@\
802InstallProgram(program,$(BINDIR))
803#endif /* ProgramTargetHelperNoMan */
804
805#ifndef CplusplusProgramTargetHelper
806#define	CplusplusProgramTargetHelper(program,srcs,objs,deplib,locallib,syslib) @@\
807ProgramTargetName(program): $(objs) $(deplib)				@@\
808	RemoveTargetProgram($@)						@@\
809	CplusplusLinkRule($@,$(CXXLDOPTIONS),$(objs),locallib $(LDLIBS) syslib) @@\
810									@@\
811CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)		@@\
812SentinelCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
813PurifyCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
814ProofCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
815									@@\
816InstallProgram(program,$(BINDIR))					@@\
817InstallManPage(program,$(MANDIR))
818#endif /* CplusplusProgramTargetHelper */
819
820#ifndef CplusplusProgramTargetHelperNoMan
821#define	CplusplusProgramTargetHelperNoMan(program,srcs,objs,deplib,locallib,syslib) @@\
822ProgramTargetName(program): $(objs) $(deplib)				@@\
823	RemoveTargetProgram($@)						@@\
824	CplusplusLinkRule($@,$(CXXLDOPTIONS),$(objs),locallib $(LDLIBS) syslib) @@\
825									@@\
826CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)		@@\
827SentinelCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
828PurifyCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
829ProofCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
830									@@\
831InstallProgram(program,$(BINDIR))					@@
832#endif /* CplusplusProgramTargetHelperNoMan */
833
834/*
835 * ComplexProgramTarget - generate rules for compiling and linking the
836 * program specified by $(OBJS) and $(SRCS), installing the program and its
837 * man page, and generating dependencies.  It should only be used in
838 * Imakefiles that describe a single program.
839 */
840#ifndef ComplexProgramTarget
841#define	ComplexProgramTarget(program)					@@\
842        PROGRAM = ProgramTargetName(program)				@@\
843									@@\
844AllTarget(ProgramTargetName(program))					@@\
845									@@\
846ProgramTargetHelper(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
847									@@\
848DependTarget()								@@\
849LintTarget()								@@\
850									@@\
851clean::									@@\
852	RemoveFile(ProgramTargetName(program))
853#endif /* ComplexProgramTarget */
854
855#ifndef ComplexCplusplusProgramTarget
856#define	ComplexCplusplusProgramTarget(program)				@@\
857        PROGRAM = ProgramTargetName(program)				@@\
858									@@\
859AllTarget(ProgramTargetName(program))					@@\
860									@@\
861CplusplusProgramTargetHelper(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
862									@@\
863DependTarget()								@@\
864LintTarget()								@@\
865									@@\
866clean::									@@\
867	RemoveFile(ProgramTargetName(program))
868#endif /* ComplexCplusplusProgramTarget */
869
870/*
871 * ComplexProgramTargetNoMan - generate rules for compiling and linking
872 * the program specified by $(OBJS) and $(SRCS), installing the program
873 * and generating dependencies.  It should only be used in Imakefiles
874 * that describe a single program, and have no manual page.
875 */
876#ifndef ComplexProgramTargetNoMan
877#define ComplexProgramTargetNoMan(program)				@@\
878        PROGRAM = ProgramTargetName(program)				@@\
879									@@\
880AllTarget(ProgramTargetName(program))					@@\
881									@@\
882ProgramTargetHelperNoMan(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
883									@@\
884DependTarget()								@@\
885LintTarget()								@@\
886									@@\
887clean::									@@\
888	RemoveFile(ProgramTargetName(program))
889#endif /* ComplexProgramTargetNoMan */
890
891#ifndef ComplexCplusplusProgramTarget
892#define	ComplexCplusplusProgramTarget(program)				@@\
893        PROGRAM = program						@@\
894									@@\
895AllTarget(program)							@@\
896									@@\
897CplusplusProgramTargetHelperNoMan(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
898									@@\
899DependTarget()								@@\
900LintTarget()								@@\
901									@@\
902clean::									@@\
903	RemoveFile(ProgramTargetName(program))
904#endif /* ComplexCplusplusProgramTarget */
905
906/*
907 * ComplexProgramTarget_1 - generate rules for compiling and linking the
908 * program specified by $(OBJS1) and $(SRCS1), installing the program and its
909 * man page, and generating dependencies for it and any programs described
910 * by $(SRCS2) through $(SRCS10).  It should be used to build the primary
911 * program in Imakefiles that describe multiple programs.
912 */
913#ifndef ComplexProgramTarget_1
914#define	ComplexProgramTarget_1(program,locallib,syslib)			@@\
915  OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) \			@@\
916         $(OBJS6) $(OBJS7) $(OBJS8) $(OBJS9) $(OBJS10)			@@\
917  SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4) $(SRCS5) \			@@\
918         $(SRCS6) $(SRCS7) $(SRCS8) $(SRCS9) $(SRCS10)			@@\
919									@@\
920AllTarget($(PROGRAMS))							@@\
921									@@\
922ProgramTargetHelper(program,SRCS1,OBJS1,DEPLIBS1,locallib,syslib)	@@\
923									@@\
924DependTarget()								@@\
925LintTarget()								@@\
926									@@\
927clean::									@@\
928	RemoveFiles($(PROGRAMS))
929#endif /* ComplexProgramTarget_1 */
930
931#ifndef ComplexCplusplusProgramTarget_1
932#define	ComplexCplusplusProgramTarget_1(program,locallib,syslib)	@@\
933  OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) \			@@\
934         $(OBJS6) $(OBJS7) $(OBJS8) $(OBJS9) $(OBJS10)			@@\
935  SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4) $(SRCS5) \			@@\
936         $(SRCS6) $(SRCS7) $(SRCS8) $(SRCS9) $(SRCS10)			@@\
937									@@\
938AllTarget($(PROGRAMS))							@@\
939									@@\
940CplusplusProgramTargetHelper(program,SRCS1,OBJS1,DEPLIBS1,locallib,syslib)@@\
941									@@\
942DependTarget()								@@\
943LintTarget()								@@\
944									@@\
945clean::									@@\
946	RemoveFiles($(PROGRAMS))
947#endif /* ComplexCplusplusProgramTarget_1 */
948
949/*
950 * ComplexProgramTarget_2 - generate rules for compiling and linking the
951 * program specified by $(OBJS2) and $(SRCS2) and installing the program and
952 * man page.  It should be used to build the second program in Imakefiles
953 * describing more than one program.
954 */
955#ifndef ComplexProgramTarget_2
956#define	ComplexProgramTarget_2(program,locallib,syslib)			@@\
957ProgramTargetHelper(program,SRCS2,OBJS2,DEPLIBS2,locallib,syslib)
958#endif /* ComplexProgramTarget_2 */
959
960#ifndef ComplexCplusplusProgramTarget_2
961#define	ComplexCplusplusProgramTarget_2(program,locallib,syslib)	@@\
962CplusplusProgramTargetHelper(program,SRCS2,OBJS2,DEPLIBS2,locallib,syslib)
963#endif /* ComplexCplusplusProgramTarget_2 */
964
965/*
966 * ComplexProgramTarget_3 - generate rules for compiling and linking the
967 * program specified by $(OBJS3) and $(SRCS3) and installing the program and
968 * man page.  It should be used to build the third program in Imakefiles
969 * describing more than one program.
970 */
971#ifndef ComplexProgramTarget_3
972#define	ComplexProgramTarget_3(program,locallib,syslib)			@@\
973ProgramTargetHelper(program,SRCS3,OBJS3,DEPLIBS3,locallib,syslib)
974#endif /* ComplexProgramTarget_3 */
975
976#ifndef ComplexCplusplusProgramTarget_3
977#define	ComplexCplusplusProgramTarget_3(program,locallib,syslib)	@@\
978CplusplusProgramTargetHelper(program,SRCS3,OBJS3,DEPLIBS3,locallib,syslib)
979#endif /* ComplexCplusplusProgramTarget_3 */
980
981/*
982 * ComplexProgramTarget_4 - generate rules for compiling and linking the
983 * program specified by $(OBJS4) and $(SRCS4) and installing the program and
984 * man page.  It should be used to build the third program in Imakefiles
985 * describing more than one program.
986 */
987#ifndef ComplexProgramTarget_4
988#define	ComplexProgramTarget_4(program,locallib,syslib)			@@\
989ProgramTargetHelper(program,SRCS4,OBJS4,DEPLIBS4,locallib,syslib)
990#endif /* ComplexProgramTarget_4 */
991
992#ifndef ComplexCplusplusProgramTarget_4
993#define	ComplexCplusplusProgramTarget_4(program,locallib,syslib)	@@\
994CplusplusProgramTargetHelper(program,SRCS4,OBJS4,DEPLIBS4,locallib,syslib)
995#endif /* ComplexCplusplusProgramTarget_4 */
996
997/*
998 * ComplexProgramTarget_5 - generate rules for compiling and linking the
999 * program specified by $(OBJS5) and $(SRCS5) and installing the program and
1000 * man page.  It should be used to build the third program in Imakefiles
1001 * describing more than one program.
1002 */
1003#ifndef ComplexProgramTarget_5
1004#define	ComplexProgramTarget_5(program,locallib,syslib)			@@\
1005ProgramTargetHelper(program,SRCS5,OBJS5,DEPLIBS5,locallib,syslib)
1006#endif /* ComplexProgramTarget_5 */
1007
1008#ifndef ComplexCplusplusProgramTarget_5
1009#define	ComplexCplusplusProgramTarget_5(program,locallib,syslib)	@@\
1010CplusplusProgramTargetHelper(program,SRCS5,OBJS5,DEPLIBS5,locallib,syslib)
1011#endif /* ComplexCplusplusProgramTarget_5 */
1012
1013/*
1014 * ComplexProgramTarget_6 - generate rules for compiling and linking the
1015 * program specified by $(OBJS6) and $(SRCS6) and installing the program and
1016 * man page.  It should be used to build the third program in Imakefiles
1017 * describing more than one program.
1018 */
1019#ifndef ComplexProgramTarget_6
1020#define	ComplexProgramTarget_6(program,locallib,syslib)			@@\
1021ProgramTargetHelper(program,SRCS6,OBJS6,DEPLIBS6,locallib,syslib)
1022#endif /* ComplexProgramTarget_6 */
1023
1024#ifndef ComplexCplusplusProgramTarget_6
1025#define	ComplexCplusplusProgramTarget_6(program,locallib,syslib)	@@\
1026CplusplusProgramTargetHelper(program,SRCS6,OBJS6,DEPLIBS6,locallib,syslib)
1027#endif /* ComplexCplusplusProgramTarget_6 */
1028
1029/*
1030 * ComplexProgramTarget_7 - generate rules for compiling and linking the
1031 * program specified by $(OBJS7) and $(SRCS7) and installing the program and
1032 * man page.  It should be used to build the third program in Imakefiles
1033 * describing more than one program.
1034 */
1035#ifndef ComplexProgramTarget_7
1036#define	ComplexProgramTarget_7(program,locallib,syslib)			@@\
1037ProgramTargetHelper(program,SRCS7,OBJS7,DEPLIBS7,locallib,syslib)
1038#endif /* ComplexProgramTarget_7 */
1039
1040#ifndef ComplexCplusplusProgramTarget_7
1041#define	ComplexCplusplusProgramTarget_7(program,locallib,syslib)	@@\
1042CplusplusProgramTargetHelper(program,SRCS7,OBJS7,DEPLIBS7,locallib,syslib)
1043#endif /* ComplexCplusplusProgramTarget_7 */
1044
1045/*
1046 * ComplexProgramTarget_8 - generate rules for compiling and linking the
1047 * program specified by $(OBJS8) and $(SRCS8) and installing the program and
1048 * man page.  It should be used to build the third program in Imakefiles
1049 * describing more than one program.
1050 */
1051#ifndef ComplexProgramTarget_8
1052#define	ComplexProgramTarget_8(program,locallib,syslib)			@@\
1053ProgramTargetHelper(program,SRCS8,OBJS8,DEPLIBS8,locallib,syslib)
1054#endif /* ComplexProgramTarget_8 */
1055
1056#ifndef ComplexCplusplusProgramTarget_8
1057#define	ComplexCplusplusProgramTarget_8(program,locallib,syslib)	@@\
1058CplusplusProgramTargetHelper(program,SRCS8,OBJS8,DEPLIBS8,locallib,syslib)
1059#endif /* ComplexCplusplusProgramTarget_8 */
1060
1061/*
1062 * ComplexProgramTarget_9 - generate rules for compiling and linking the
1063 * program specified by $(OBJS9) and $(SRCS9) and installing the program and
1064 * man page.  It should be used to build the third program in Imakefiles
1065 * describing more than one program.
1066 */
1067#ifndef ComplexProgramTarget_9
1068#define	ComplexProgramTarget_9(program,locallib,syslib)			@@\
1069ProgramTargetHelper(program,SRCS9,OBJS9,DEPLIBS9,locallib,syslib)
1070#endif /* ComplexProgramTarget_9 */
1071
1072#ifndef ComplexCplusplusProgramTarget_9
1073#define	ComplexCplusplusProgramTarget_9(program,locallib,syslib)	@@\
1074CplusplusProgramTargetHelper(program,SRCS9,OBJS9,DEPLIBS9,locallib,syslib)
1075#endif /* ComplexCplusplusProgramTarget_9 */
1076
1077/*
1078 * ComplexProgramTarget_10 - generate rules for compiling and linking the
1079 * program specified by $(OBJS10) and $(SRCS10) and installing the program and
1080 * man page.  It should be used to build the third program in Imakefiles
1081 * describing more than one program.
1082 */
1083#ifndef ComplexProgramTarget_10
1084#define	ComplexProgramTarget_10(program,locallib,syslib)		@@\
1085ProgramTargetHelper(program,SRCS10,OBJS10,DEPLIBS10,locallib,syslib)
1086#endif /* ComplexProgramTarget_10 */
1087
1088#ifndef ComplexCplusplusProgramTarget_10
1089#define	ComplexCplusplusProgramTarget_10(program,locallib,syslib)	@@\
1090CplusplusProgramTargetHelper(program,SRCS10,OBJS10,DEPLIBS10,locallib,syslib)
1091#endif /* ComplexCplusplusProgramTarget_10 */
1092
1093#ifndef MoveToBakFile
1094#define MoveToBakFile(file) -@if [ -f file ]; then set -x; \		@@\
1095	$(MV) file file.bak; else exit 0; fi
1096#endif /* MoveToBakFile */
1097
1098#ifndef RMoveToBakFile
1099#define RMoveToBakFile(file) -@if [ -f file ]; then set -x; \		@@\
1100	RemoveFile(file.bak); $(MV) file file.bak; \			@@\
1101	else exit 0; fi
1102#endif /* RMoveToBakFile */
1103
1104/*
1105 * ServerTargetWithFlags - generate rules to compile, link, and relink a server
1106 */
1107#ifndef ServerTargetWithFlags
1108#define	ServerTargetWithFlags(server,subdirs,objects,libs,syslibs,flags) @@\
1109AllTarget(ProgramTargetName(server))					@@\
1110ProgramTargetName(server): subdirs objects libs				@@\
1111	MoveToBakFile($@)						@@\
1112	LinkRule($@,$(LDOPTIONS),objects,libs $(LDLIBS) syslibs) @@\
1113									@@\
1114Concat(load,server):							@@\
1115	MoveToBakFile(ProgramTargetName(server))			@@\
1116	LinkRule(ProgramTargetName(server),$(LDOPTIONS),objects,libs $(LDLIBS) syslibs) @@\
1117									@@\
1118loadX:: Concat(load,server)						@@\
1119									@@\
1120SentinelProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
1121SentinelLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
1122PurifyProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
1123PurifyLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
1124ProofProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
1125ProofLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
1126									@@\
1127InstallProgramWithFlags(server,$(BINDIR),flags)				@@\
1128									@@\
1129clean::									@@\
1130	RemoveFile(ProgramTargetName(server))
1131#endif /* ServerTargetWithFlags */
1132
1133/*
1134 * ServerTarget - rules to compile, link, and relink a normal server
1135 */
1136#ifndef ServerTarget
1137#define	ServerTarget(server,subdirs,objects,libs,syslibs)		@@\
1138ServerTargetWithFlags(server,subdirs,objects,libs,syslibs,$(_NOOP_))
1139#endif /* ServerTarget */
1140
1141#if DoRanlibCmd
1142#define RanLibrary(args) $(RANLIB) args
1143#else
1144#define RanLibrary(args) $(_NULLCMD_)
1145#endif
1146
1147#ifndef LibraryTargetName
1148#define LibraryTargetName(libname)Concat(lib,libname.a)
1149#endif
1150
1151/* This rule is used for libs in Xserver/Imakefile which are loaded, not
1152 * linked into the core module. Since modules are called libXXXX.a,
1153 * this rule mustn't be overridden by .cf files.
1154 */
1155#ifndef ModuleLibraryTargetName
1156#define ModuleLibraryTargetName(libname)Concat(lib,libname.a)
1157#endif
1158
1159#ifndef LibraryTargetNameSuffix
1160#define LibraryTargetNameSuffix(libname,suffix)Concat3(lib,libname,suffix.a)
1161#endif
1162
1163#ifndef InstallNamedInline
1164#define InstallNamedInline(srcname,flags,dest,dstname) $(INSTALL) $(INSTALLFLAGS) flags srcname $(DESTDIR)dest/dstname
1165#endif
1166
1167#ifndef InstallNamedTarget
1168#define InstallNamedTarget(step,srcname,flags,dest,dstname)		@@\
1169step:: srcname								@@\
1170	MakeDir($(DESTDIR)dest)						@@\
1171	InstallNamedInline(srcname,flags,dest,dstname)
1172#endif /* InstallNamedTarget */
1173
1174/*
1175 * InstallNamedTargetNoClobber - Like InstallNamedTarget, but doesn't
1176 * do the install if an installed version already exists.  Useful
1177 * for files that might have local customizations that you don't
1178 * want to clobber.  Config files are good candidates for this.
1179 */
1180#ifndef InstallNamedTargetNoClobber
1181#define InstallNamedTargetNoClobber(step,srcname,flags,dest,dstname)	@@\
1182step:: srcname								@@\
1183	MakeDir($(DESTDIR)dest)						@@\
1184	@if [ -f $(DESTDIR)dest/dstname ]; then \			@@\
1185	 echo "Not overwriting existing" $(DESTDIR)dest/dstname; \	@@\
1186	else set -x; \							@@\
1187	 $(INSTALL) $(INSTALLFLAGS) flags srcname $(DESTDIR)dest/dstname; fi
1188#endif /* InstallNamedTargetNoClobber */
1189
1190#ifndef InstallTarget
1191#define InstallTarget(step,file,flags,dest)				@@\
1192InstallNamedTarget(step,file,flags,dest,file)
1193#endif /* InstallTarget */
1194
1195#ifndef InstallInline
1196#define InstallInline(file,flags,dest) InstallNamedInline(file,flags,dest,file)
1197#endif
1198
1199/*
1200 * InstallLibrary - generate rules to install the indicated library.
1201 */
1202#ifndef InstallLibrary
1203#define	InstallLibrary(libname,dest)					@@\
1204install:: LibraryTargetName(libname)					@@\
1205	MakeDir($(DESTDIR)dest)						@@\
1206	$(INSTALL) $(INSTALLFLAGS) $(INSTLIBFLAGS) LibraryTargetName(libname) $(DESTDIR)dest @@\
1207	RanLibrary($(RANLIBINSTFLAGS) $(DESTDIR)dest/LibraryTargetName(libname))
1208#endif /* InstallLibrary */
1209
1210
1211/*
1212 * InstallDriverSDKLibrary - rule to install Driver SDK library.
1213 *                           (only used for XFree86). This is a no-op
1214 *                           rule so that Imakefiles on non-XFree86 systems
1215 *                           continue to build Makefiles correctly.
1216 */
1217#ifndef InstallDriverSDKLibrary
1218#define InstallDriverSDKLibrary(lib,dir)
1219#endif
1220
1221
1222/*
1223 * InstallDriverSDKNamedLibrary - rule to install Driver SDK library.
1224 *                         (only used for XFree86). This is a no-op
1225 *                         rule so that Imakefiles on non-XFree86 systems
1226 *                         continue to build Makefiles correctly.
1227 */
1228#ifndef InstallDriverSDKNamedLibrary
1229#define InstallDriverSDKNamedLibrary(lib,dlib,dir)
1230#endif
1231
1232
1233/*
1234 * InstallDriverSDKLibraryModule - rule to install Driver SDK library module.
1235 *                           (only used for XFree86). This is a no-op
1236 *                           rule so that Imakefiles on non-XFree86 systems
1237 *                           continue to build Makefiles correctly.
1238 */
1239#ifndef InstallDriverSDKLibraryModule
1240#define InstallDriverSDKLibraryModule(lib,dlib,dir)
1241#endif
1242
1243
1244/*
1245 * MergeIntoInstalledLibrary - generate rules to merge one library into another
1246 */
1247#ifndef MergeIntoInstalledLibrary
1248#define MergeIntoInstalledLibrary(tolib,fromlib)			@@\
1249install::  fromlib							@@\
1250	$(SCRIPTSRC)/mergelib $(DESTDIR)tolib fromlib
1251#endif /* MergeIntoInstalledLibrary */
1252
1253/*
1254 * InstallLibraryAlias - generate rules to create a link from one library name
1255 * to another for the purposes of aliasing.
1256 */
1257#ifndef InstallLibraryAlias
1258#define	InstallLibraryAlias(libname,alias,dest)				@@\
1259install::								@@\
1260	-(cd $(DESTDIR)dest && ( \					@@\
1261		RemoveFile(LibraryTargetName(alias)); \			@@\
1262		$(LN) LibraryTargetName(libname) LibraryTargetName(alias)))
1263#endif /* InstallLibraryAlias */
1264
1265
1266/*
1267 * InstallLintLibrary - generate rules to install the indicated lint library.
1268 */
1269#ifndef InstallLintLibrary
1270#define	InstallLintLibrary(libname,dest)				@@\
1271InstallTarget(install.ln,Concat(llib-l,libname.ln),$(INSTLIBFLAGS),dest)
1272#endif /* InstallLintLibrary */
1273
1274
1275#if !CompressManPages
1276/*
1277 * InstallManPageLong - generate rules to install the indicated manual page,
1278 * giving it an alternate name.  This is used for installing man pages whose
1279 * base name without the .man suffix would normally be longer than 8 characters
1280 * (the limit for using source code control systems on files systems with
1281 * short file names).
1282 */
1283#ifndef InstallManPageLong
1284#define	InstallManPageLong(file,destdir,dest)				@@\
1285BuildInstallHtmlManPage(file,dest,$(MANSUFFIX))				@@\
1286									@@\
1287CppManTarget(file,$(EXTRAMANDEFS))					@@\
1288									@@\
1289InstallNamedTarget(install.man,file.$(MANNEWSUFFIX),$(INSTMANFLAGS),destdir,dest.$(MANSUFFIX))
1290#endif /* InstallManPageLong */
1291
1292
1293/*
1294 * InstallManPageAliases - generate rules to install manual page aliases.
1295 */
1296#ifndef InstallManPageAliases
1297#define	InstallManPageAliases(file,destdir,aliases)			@@\
1298InstallHtmlManPageAliases(file,aliases,$(MANSUFFIX))			@@\
1299									@@\
1300install.man::								@@\
1301	@(TMP="#tmp.$$$$"; \						@@\
1302	RemoveFile($${TMP}); \						@@\
1303	echo .so `basename destdir`/file.$(MANSUFFIX) > $${TMP}; \	@@\
1304	for i in aliases; do (set -x; \					@@\
1305	$(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) $${TMP} $(DESTDIR)destdir/$$i.$(MANSUFFIX)); \ @@\
1306	done; \								@@\
1307	RemoveFile($${TMP}))
1308#endif /* InstallManPageAliases */
1309
1310
1311/*
1312 * InstallGenManPageLong - More general rules for installing manual pages --
1313 * doesn't assume MANSUFFIX.
1314 */
1315#ifndef InstallGenManPageLong
1316#define	InstallGenManPageLong(file,destdir,dest,suffix)			@@\
1317BuildInstallHtmlManPage(file,dest,suffix)				@@\
1318									@@\
1319CppManTarget(file, $(EXTRAMANDEFS))					@@\
1320									@@\
1321install.man:: file.$(MANNEWSUFFIX)					@@\
1322	MakeDir($(DESTDIR)destdir)					@@\
1323	$(INSTALL) -c $(INSTMANFLAGS) file.$(MANNEWSUFFIX) \		@@\
1324		$(DESTDIR)destdir/dest.suffix
1325#endif /* InstallGenManPageLong */
1326
1327
1328/*
1329 * InstallGenManPageAliases - general equivalent of InstallManPageAliases
1330 */
1331#ifndef InstallGenManPageAliases
1332#define	InstallGenManPageAliases(file,destdir,suffix,aliases)		@@\
1333InstallHtmlManPageAliases(file,aliases,suffix)				@@\
1334									@@\
1335install.man::								@@\
1336	@(TMP="#tmp.$$$$"; \						@@\
1337	RemoveFile($${TMP}); \						@@\
1338	echo .so `basename destdir`/file.suffix > $${TMP}; \		@@\
1339	for i in aliases; do (set -x; \					@@\
1340	$(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) $${TMP} $(DESTDIR)destdir/$$i.suffix); \ @@\
1341	done; \								@@\
1342	RemoveFile($${TMP}))
1343#endif /* InstallGenManPageAliases */
1344
1345#else /* CompressManPages */
1346
1347#ifndef InstallManPageLong
1348#define InstallManPageLong(file,destdir,dest)				@@\
1349BuildInstallHtmlManPage(file,dest,$(MANSUFFIX))				@@\
1350									@@\
1351CppManTarget(file, $(EXTRAMANDEFS))					@@\
1352									@@\
1353install.man:: file.$(MANNEWSUFFIX)					@@\
1354	MakeDir($(DESTDIR)destdir)					@@\
1355	$(RM) $(DESTDIR)destdir/dest.$(MANSUFFIX)*			@@\
1356	$(INSTALL) -c $(INSTMANFLAGS) file.$(MANNEWSUFFIX) \		@@\
1357	  $(DESTDIR)destdir/dest.$(MANSUFFIX)				@@\
1358	-$(COMPRESSMANCMD) $(DESTDIR)destdir/dest.$(MANSUFFIX)
1359#endif
1360
1361#ifndef InstallGenManPageLong
1362#define InstallGenManPageLong(file,destdir,dest,suffix)			@@\
1363BuildInstallHtmlManPage(file,dest,suffix)				@@\
1364									@@\
1365CppManTarget(file, $(EXTRAMANDEFS))					@@\
1366									@@\
1367install.man:: file.$(MANNEWSUFFIX)					@@\
1368	MakeDir($(DESTDIR)destdir)					@@\
1369	$(RM) $(DESTDIR)destdir/dest.suffix*				@@\
1370	$(INSTALL) -c $(INSTMANFLAGS) file.$(MANNEWSUFFIX) \		@@\
1371	  $(DESTDIR)destdir/dest.suffix					@@\
1372	-$(COMPRESSMANCMD) $(DESTDIR)destdir/dest.suffix
1373#endif
1374
1375#ifndef InstallMultipleMan
1376#define InstallMultipleMan(list,dest)					@@\
1377install.man:: list							@@\
1378	MakeDir($(DESTDIR)dest)						@@\
1379	@case '${MFLAGS}' in *[i]*) set +e;; esac; \			@@\
1380	for i in list; do \						@@\
1381		(MNAME=`echo $$i | cut -f1 -d.`; \			@@\
1382		set -x;	\						@@\
1383		$(RM) $(DESTDIR)dest/$${MNAME}*; \			@@\
1384		$(INSTALL) -c $(INSTMANFLAGS) $$i \			@@\
1385		  $(DESTDIR)dest/$${MNAME}.$(MANSUFFIX); \		@@\
1386		$(COMPRESSMANCMD) $(DESTDIR)dest/$${MNAME}.$(MANSUFFIX)); \ @@\
1387	done
1388#endif
1389
1390/*
1391 * InstallManPageAliases - install soft links for aliases.
1392 */
1393#ifndef InstallManPageAliasesBase
1394#define InstallManPageAliasesBase(file,destdir,aliases)			@@\
1395install.man::								@@\
1396	@(SUFFIX=`echo $(DESTDIR)destdir/file.* | sed -e 's,.*/[^\.]*.,,'`; \ @@\
1397	for i in aliases; do (set -x; \					@@\
1398	$(RM) $(DESTDIR)destdir/$$i.*; \				@@\
1399	(cd $(DESTDIR)destdir; $(LN) file.$${SUFFIX} \			@@\
1400	$$i.$${SUFFIX})); \						@@\
1401	done)
1402#endif
1403
1404#ifndef InstallManPageAliases
1405#define InstallManPageAliases(file,destdir,aliases)			@@\
1406InstallHtmlManPageAliases(file,aliases,$(MANSUFFIX))			@@\
1407									@@\
1408InstallManPageAliasesBase(file,destdir,aliases)
1409#endif
1410
1411
1412/*
1413 * InstallGenManPageAliases - install soft links for aliases.
1414 */
1415#ifndef InstallGenManPageAliases
1416#define InstallGenManPageAliases(file,destdir,suffix,aliases)		@@\
1417InstallHtmlManPageAliases(file,aliases,suffix)				@@\
1418									@@\
1419InstallManPageAliasesBase(file,destdir,aliases)
1420#endif
1421
1422#endif /* CompressManPages */
1423
1424
1425/*
1426 * InstallManPage - generate rules to install the indicated manual page.
1427 */
1428#ifndef InstallManPage
1429#define	InstallManPage(file,destdir)					@@\
1430InstallManPageLong(file,destdir,file)
1431#endif /* InstallManPage */
1432
1433
1434/*
1435 * InstallGenManPage - general equivalent of InstallManPage
1436 */
1437#ifndef InstallGenManPage
1438#define	InstallGenManPage(file,destdir,suffix)				@@\
1439InstallGenManPageLong(file,destdir,file,suffix)
1440#endif /* InstallGenManPage */
1441
1442
1443/*
1444 * RmanDependency - generate rules to build the rman program if
1445 * this Imakefile is within the source tree.
1446 */
1447#ifndef RmanDependency
1448#ifdef UseInstalled
1449#define RmanDependency() /**/
1450#else
1451#define RmanDependency()						@@\
1452NoCmpScript(ProgramTargetName($(RMAN)))					@@\
1453									@@\
1454ProgramTargetName($(RMAN)):						@@\
1455	@echo "checking $(RMANBASENAME) over in $(TOP)/config/util first..."; \	@@\
1456	cd $(TOP)/config/util && $(MAKE) rmanonly; \			@@\
1457	echo "okay, continuing in $(CURRENT_DIR)"
1458
1459#endif /* UseInstalled */
1460#endif /* RmanDependency */
1461
1462#ifndef RmanCmdDependency
1463#ifdef UseInstalled
1464#define RmanCmdDependency	/**/
1465#else
1466#define RmanCmdDependency	ProgramTargetName($(RMAN))
1467#endif
1468#endif
1469
1470#ifndef BuildInstallHtmlManPage
1471#if BuildHtmlManPages
1472#define BuildInstallHtmlManPage(file,dest,suffix)			@@\
1473AllTarget(dest.suffix.html)						@@\
1474									@@\
1475dest.suffix.html: file.$(MANNEWSUFFIX) RmanCmdDependency		@@\
1476	RemoveFiles(dest.suffix.html dest.suffix-html)			@@\
1477	RunProgram(RMAN,$(RMANOPTIONS) < file.$(MANNEWSUFFIX) \		@@\
1478	  > dest.suffix-html) && $(MV) dest.suffix-html $@		@@\
1479									@@\
1480install.man:: dest.suffix.html						@@\
1481	MakeDir($(DESTDIR)$(DOCHTMLDIR))				@@\
1482	@(SUF=`expr suffix \: '\(.\)'`; \				@@\
1483	 set -x; \							@@\
1484	 $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) dest.suffix.html $(DESTDIR)$(DOCHTMLDIR)/dest.$$SUF.html)	@@\
1485									@@\
1486clean::									@@\
1487	RemoveFiles(dest.suffix.html dest.suffix-html)
1488#else
1489#define BuildInstallHtmlManPage(file,dest,suffix) /**/
1490#endif
1491#endif
1492
1493#ifndef InstallHtmlManPageAliases
1494#if BuildHtmlManPages
1495#define InstallHtmlManPageAliases(file,aliases,suffix)			@@\
1496install.man:: file.suffix.html						@@\
1497	MakeDir($(DESTDIR)$(DOCHTMLDIR))				@@\
1498	@SUF=`expr suffix \: '\(.\)'`; \				@@\
1499	for i in aliases; do (set -x; \					@@\
1500	  RemoveFile($(DESTDIR)$(DOCHTMLDIR)/$$i.$$SUF.html); \		@@\
1501	  (cd $(DESTDIR)$(DOCHTMLDIR); \				@@\
1502	    $(LN) file.$$SUF.html $$i.$$SUF.html)); \			@@\
1503	done
1504#else
1505#define InstallHtmlManPageAliases(file,aliases,suffix) /**/
1506#endif
1507#endif
1508
1509#ifndef HtmlManIndex
1510#if BuildHtmlManPages
1511#define HtmlManIndex							@@\
1512html_index::								@@\
1513	MakeDir($(DESTDIR)$(DOCHTMLDIR))				@@\
1514	$(HTMLINDEXCMD) $(DESTDIR)$(DOCHTMLDIR)
1515#else
1516#define HtmlManIndex	html_index::
1517#endif
1518#endif
1519
1520
1521/*
1522 * ManKeywordsTarget - generate the database used by "man -k".
1523 * This rule updates the index in the directory "manpath", which
1524 * indexes all the manual pages in the section subdirectories under
1525 * it.  An update command is defined only on systems that have a
1526 * per MANPATH element index.  If the OS supports only one system-wide
1527 * database, we don't update it, because then we can't do cross
1528 * installations or use a non-empty DESTDIR for testing.
1529 */
1530#ifndef ManKeywordsTarget
1531#define ManKeywordsTarget(manpath) man_keywords::
1532#endif
1533
1534/*
1535 * InstallNamedNonExec - generate rules to install a data file
1536 */
1537#ifndef InstallNamedNonExec
1538#define	InstallNamedNonExec(srcname,dstname,dest)			@@\
1539InstallNamedTarget(install,srcname,$(INSTDATFLAGS),dest,dstname)
1540#endif /* InstallNamedNonExec */
1541
1542
1543/*
1544 * InstallDriverSDKNamedNonExec - rule for installing server Driver SDK files.
1545 *                         (only used for XFree86). This is a no-op
1546 *                         rule so that Imakefiles on non-XFree86 systems
1547 *                         continue to build Makefiles correctly.
1548 */
1549#ifndef InstallDriverSDKNamedNonExec
1550#define InstallDriverSDKNamedNonExec(srcname,dstname,dest)
1551#endif
1552
1553
1554/*
1555 * InstallNonExecFile - generate rules to install a data file
1556 */
1557#ifndef InstallNonExecFile
1558#define InstallNonExecFile(file,dest)					@@\
1559InstallTarget(install,file,$(INSTDATFLAGS),dest)
1560#endif /* InstallNonExecFile */
1561
1562
1563/*
1564 * InstallNonExecFileNoClobber - install a data file once
1565 */
1566#ifndef InstallNonExecFileNoClobber
1567#define InstallNonExecFileNoClobber(file,dest)				@@\
1568InstallNamedTargetNoClobber(install,file,$(INSTDATFLAGS),dest,file)
1569#endif /* InstallNonExecFileNoClobber */
1570
1571
1572/*
1573 * InstallDriverSDKNonExecFile - rule for installing server Driver SDK files.
1574 *                         (only used for XFree86). This is a no-op
1575 *                         rule so that Imakefiles on non-XFree86 systems
1576 *                         continue to build Makefiles correctly.
1577 */
1578#ifndef InstallDriverSDKNonExecFile
1579#define InstallDriverSDKNonExecFile(file,dir)
1580#endif
1581
1582
1583/*
1584 * InstallNonExec - generate rules to install a data file, but does not
1585 * try to create the destination directory (deprecated)
1586 */
1587#ifndef InstallNonExec
1588#define	InstallNonExec(file,dest)					@@\
1589install:: file								@@\
1590	$(INSTALL) $(INSTALLFLAGS) $(INSTDATFLAGS) file $(DESTDIR)dest
1591#endif /* InstallNonExec */
1592
1593
1594/*
1595 * InstallProgramWithFlags - generate rules to install an executable program
1596 * using given install flags.
1597 */
1598#ifndef InstallProgramWithFlags
1599#if StripInstalledPrograms && CrossCompiling
1600#define InstallProgramWithFlags(program,dest,flags)			@@\
1601InstallTarget(install,ProgramTargetName(program),$(INSTPGMFLAGS) flags,dest) @@\
1602	CrossStripCmd $(DESTDIR)dest/ProgramTargetName(program)
1603#else
1604#define InstallProgramWithFlags(program,dest,flags)			@@\
1605InstallTarget(install,ProgramTargetName(program),$(INSTPGMFLAGS) flags,dest)
1606#endif /* StripInstalledPrograms && CrossCompiling */
1607#endif /* InstallProgramWithFlags */
1608
1609
1610/*
1611 * InstallProgram - generate rules to install an executable program using any
1612 * special install flags set in $(INSTALLFLAGS).
1613 */
1614#ifndef InstallProgram
1615#define	InstallProgram(program,dest)					@@\
1616InstallProgramWithFlags(program,dest,NullParameter)
1617#endif /* InstallProgram */
1618
1619
1620
1621/*
1622 * InstallScript - install a shell script.
1623 */
1624#ifndef InstallScript
1625#define	InstallScript(program,dest)					@@\
1626InstallNamedTarget(install,program.script,$(INSTBINFLAGS),dest,program)
1627#endif /* InstallScript */
1628
1629
1630/*
1631 * InstallNamedProg - install a program with renaming and no stripping.
1632 */
1633#ifndef InstallNamedProg
1634#define InstallNamedProg(srcname,dstname,dest)				@@\
1635InstallNamedTarget(install,srcname,$(INSTBINFLAGS),dest,dstname)
1636#endif /* InstallNamedProg */
1637
1638
1639/*
1640 * InstallNamedProgNoClobber - Like InstallNamedProg, but doesn't
1641 * do the install if an installed version already exists.
1642 */
1643#ifndef InstallNamedProgNoClobber
1644#define InstallNamedProgNoClobber(srcname,dstname,dest)			@@\
1645InstallNamedTargetNoClobber(install,srcname,$(INSTBINFLAGS),dest,dstname)
1646#endif /* InstallNamedProgNoClobber */
1647
1648
1649/*
1650 * InstallDriverSDKNamedProg - rule for installing server Driver SDK files.
1651 *                         (only used for XFree86). This is a no-op
1652 *                         rule so that Imakefiles on non-XFree86 systems
1653 *                         continue to build Makefiles correctly.
1654 */
1655#ifndef InstallDriverSDKNamedProg
1656#define InstallDriverSDKNamedProg(srcname,dstname,dest)
1657#endif
1658
1659
1660/*
1661 * MakeFlagsToShellFlags - set variables before starting a loop.
1662 * makeflags is the set of "make" flags to check.
1663 * shellcmd is the shell command to execute if any of the flags are set.
1664 *
1665 * The usual use of this rule is to translate make's "don't quit on error"
1666 * flags into the equivalent for the shell.  To do this, "make -i" always
1667 * becomes "set +e".  "make -k" should also turn on "set +e" if the target
1668 * is building subdirectories.  That is, subdirectories are independent
1669 * and should appear to be multiple targets, even though they are
1670 * implemented in a loop in a single target.
1671 */
1672#ifndef MakeFlagsToShellFlags
1673#define MakeFlagsToShellFlags(makeflags,shellcmd)\
1674	for flag in ${MAKEFLAGS} ''; do \				@@\
1675	  case "$$flag" in *=*) ;; --*) ;; *[makeflags]*) shellcmd;; esac; done
1676#endif
1677
1678/*
1679 * MakeNamedTargetSubdir - do make in a subdir.
1680 */
1681#ifndef MakeNamedTargetSubdir
1682#define MakeNamedTargetSubdir(dir,flags,subname)\
1683		(cd dir && $(MAKE) $(MFLAGS) $(PARALLELMFLAGS) \	@@\
1684			flags subname)
1685#endif
1686
1687/*
1688 * LinkFileList - link a list of files from one place to another
1689 */
1690#ifndef LinkFileList
1691#define LinkFileList(step,list,dir,sub)					@@\
1692step::									@@\
1693	@MakeFlagsToShellFlags(i,set +e); \				@@\
1694	echo "	cd" dir; cd dir && \					@@\
1695	for i in list; do (set -x; $(LN) -f sub/$$i .); done
1696#endif
1697
1698
1699/*
1700 * LinkConfDirectoryLong
1701 *
1702 * Make links from opath (usually <ProjectRoot>/lib/X11) to npath
1703 * For example /usr/X11R6/lib/X11/xdm ==> /etc/X11/xdm so that X
1704 * binaries can be mounted from a read-only volume like a CD-ROM;
1705 * but files that may need to be edited can be stored locally on
1706 * read-write media. If someone has an existing installation, be
1707 * careful and move existing files to the new location in /etc.
1708 * XXX Need to make the installation script do this when installing
1709 * binary distributions.
1710 *
1711 * Since the link is used in the installation process, we need to
1712 * make the link relative in order to honor $(DESTDIR) if it is set.
1713 *
1714 * Note: The sed script used here is not completely general.  It assumes
1715 * that no elements of the path are '..', and that none start with '.'
1716 * that aren't just '.'.
1717 *
1718 * For a more general solution $(REVPATH) could be used.  Even though
1719 * it was intended for something a little different, it does do what is
1720 * required here.
1721 *
1722 */
1723#ifndef LinkConfDirectoryLong
1724#if UseSeparateConfDir && HasSymLinks
1725#define LinkConfDirectoryLong(mdir,cdir,rdir,ldir,opath,npath)		@@\
1726install::								@@\
1727	@MakeFlagsToShellFlags(i,set +e); \				@@\
1728	if [ -h Concat($(DESTDIR),npath/mdir) ]; then \			@@\
1729	  $(RM) Concat($(DESTDIR),npath/mdir); \			@@\
1730	fi								@@\
1731	MakeDir(Concat($(DESTDIR),opath/cdir))				@@\
1732	MakeDir(Concat($(DESTDIR),npath/mdir))				@@\
1733	@MakeFlagsToShellFlags(i,set +e); \				@@\
1734	if [ -d Concat($(DESTDIR),opath/cdir) ]; then \			@@\
1735	  RELPATH=`echo opath/cdir | \					@@\
1736		sed -e 's:^/::' -e 's:[^/.][^/]*:..:'g -e 's:/\.$$::'`; \ @@\
1737	  cd Concat($(DESTDIR),opath/cdir); \				@@\
1738	  if [ -d rdir -a ! -h rdir ]; then \				@@\
1739	    (cd rdir; tar cf - . | \					@@\
1740		(cd Concat($(DESTDIR),npath/mdir); \			@@\
1741		 tar xf -; exit 0); exit 0); \				@@\
1742	  fi; \								@@\
1743	  $(RM) -r rdir; \						@@\
1744	  $(LN) Concat($${RELPATH},npath/mdir) ldir; \			@@\
1745	fi
1746#else
1747#define LinkConfDirectoryLong(mdir,cdir,rdir,ldir,opath,npath)
1748#endif
1749#endif
1750
1751#ifndef LinkConfDirectory
1752#define LinkConfDirectory(mdir,cdir,rdir,ldir) LinkConfDirectoryLong(mdir,cdir,rdir,ldir,$(LIBDIR),$(CONFDIR))
1753#endif
1754
1755#ifndef LinkVarDirectory
1756#define LinkVarDirectory(mdir,cdir,rdir,ldir) LinkConfDirectoryLong(mdir,cdir,rdir,ldir,$(LIBDIR),$(VARDIR))
1757#endif
1758
1759/*
1760 * LinkConfFileLong
1761 *
1762 * Make links from opath (<ProjectRoot>/lib/X11) to npath
1763 * For example /usr/X11R6/lib/X11/xxx ==> /etc/X11/xxx so that X binaries
1764 * can be mounted from a read-only volume like a CD-ROM;
1765 * but files that may need to be edited can be stored locally on
1766 * read-write media. If someone has an existing installation, be
1767 * careful and move existing files to the new location in /etc.
1768 * XXX Need to make the installation script do this when installing
1769 * binary distributions.
1770 *
1771 * Since the link is used in the installation process, we need to
1772 * make the link relative in order to honor $(DESTDIR) if it is set.
1773 */
1774#ifndef LinkConfFileLong
1775#if UseSeparateConfDir && HasSymLinks
1776#define LinkConfFileLong(cfile,lfile,opath,npath)			@@\
1777install::								@@\
1778	MakeDir(Concat($(DESTDIR),opath))				@@\
1779	MakeDir(Concat($(DESTDIR),npath))				@@\
1780	@MakeFlagsToShellFlags(i,set +e); \				@@\
1781	if [ -d Concat($(DESTDIR),opath) ]; then \			@@\
1782	  RELPATH=`echo opath | \					@@\
1783		sed -e 's:^.::' -e 's:[^/.][^/]*:..:'g`; \		@@\
1784	  cd Concat($(DESTDIR),opath); \				@@\
1785	  if [ -f lfile -a ! -h lfile ]; then \				@@\
1786	    cp -p lfile Concat($(DESTDIR),npath/cfile); \		@@\
1787	  fi; \								@@\
1788	  $(RM) -r lfile; \						@@\
1789	  $(LN) Concat($${RELPATH},npath/cfile) lfile; \		@@\
1790	fi
1791#else
1792#define LinkConfFileLong(cfile,lfile,opath,npath)
1793#endif
1794#endif
1795
1796
1797#ifndef LinkConfFile
1798#define LinkConfFile(cfile,lfile) LinkConfFileLong(cfile,lfile,$(LIBDIR),$(CONFDIR))
1799#endif
1800
1801/*
1802 * InstallMultipleDestFlags - generate rules to install multiple files at
1803 * once during a particular step in the build using a specific set of install
1804 * flags.
1805 */
1806#ifndef InstallMultipleDestFlags
1807#define InstallMultipleDestFlags(step,list,dest,flags)			@@\
1808step:: list								@@\
1809	MakeDir($(DESTDIR)dest)						@@\
1810	@MakeFlagsToShellFlags(i,set +e); \				@@\
1811	for i in list; do \						@@\
1812		(set -x; $(INSTALL) $(INSTALLFLAGS) flags $$i $(DESTDIR)dest); \	@@\
1813	done
1814#endif /* InstallMultipleDestFlags */
1815
1816
1817/*
1818 * InstallDriverSDKMultipleDestFlags - rule for installing server Driver SDK
1819 *                         files. (only used for XFree86). This is a no-op
1820 *                         rule so that Imakefiles on non-XFree86 systems
1821 *                         continue to build Makefiles correctly.
1822 */
1823#ifndef InstallDriverSDKMultipleDestFlags
1824#define InstallDriverSDKMultipleDestFlags(list,dest,flags)
1825#endif
1826
1827
1828/*
1829 * InstallMultipleDest - generate rules to install multiple files at once
1830 * during a particular step in the build using any install flags set in
1831 * $(INSTDATFLAGS).
1832 */
1833#ifndef InstallMultipleDest
1834#define InstallMultipleDest(step,list,dest)				@@\
1835InstallMultipleDestFlags(step,list,dest,$(INSTDATFLAGS))
1836#endif /* InstallMultipleDest */
1837
1838/*
1839 * InstallMultiple - generate rules to install multiple files at once
1840 * during the install step of the build using any install flags set in
1841 * $(INSTALLFLAGS).
1842 */
1843#ifndef InstallMultiple
1844#define	InstallMultiple(list,dest)					@@\
1845InstallMultipleDest(install,list,dest)
1846#endif /* InstallMultiple */
1847
1848
1849/*
1850 * InstallMultipleFlags - generate rules to install multiple files at once
1851 * during the install step of the build using the given install flags.
1852 */
1853#ifndef InstallMultipleFlags
1854#define InstallMultipleFlags(list,dest,flags)				@@\
1855InstallMultipleDestFlags(install,list,dest,flags)
1856#endif /* InstallMultipleFlags */
1857
1858
1859/*
1860 * InstallMultipleMan - generate rules to install a variety of manual pages
1861 * during the install.man step of the build.
1862 */
1863#ifndef InstallMultipleMan
1864#define InstallMultipleMan(list,dest)					@@\
1865InstallMultipleDestFlags(install.man,list,dest,$(INSTMANFLAGS))
1866#endif /* InstallMultipleMan */
1867
1868/*
1869 * InstallMultipleManSuffix - generate rules to install multiple manual
1870 * pages dufing the install.man step of the build, where
1871 * the target files have the suffix given.
1872 */
1873#ifndef InstallMultipleManSuffix
1874#define InstallMultipleManSuffix(list,dest,suffix)			@@\
1875install.man::								@@\
1876	MakeDir($(DESTDIR)dest)						@@\
1877	@MakeFlagsToShellFlags(i,set +e); \				@@\
1878	for i in list; do \						@@\
1879	  (set -x; $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) $$i.suffix $(DESTDIR)dest/$$i.$(MANSUFFIX)); \	@@\
1880	done
1881#endif /* InstallMultipleManSuffix */
1882
1883
1884/*
1885 * IncludeMakefile - rule to include another Makefile.
1886 * Must not generate an error or even a warning if the named file
1887 * is not present, since we use this to include Makefile.dep, which
1888 * may not be built yet.
1889 * This is defined non-null iff HasMakefileSafeInclude is YES.
1890 * The double-@ is to ensure no leading spaces on the line.
1891 */
1892#ifndef IncludeMakefile
1893#if HasClearmake
1894#define IncludeMakefile(file) @@sinclude file
1895#else
1896#if HasBsdMake
1897#define IncludeMakefile(file) @@# dependencies are in .depend
1898#else
1899#define IncludeMakefile(file) /**/
1900#endif
1901#endif
1902#endif
1903
1904/*
1905 * DependDependencyStatement - Used by DependDependency to set up the
1906 * most specific dependency, which differs based on whether we support
1907 * a separate Makefile.dep on this platform.
1908 */
1909#ifndef DependDependencyStatement
1910#if HasMakefileSafeInclude
1911#define DependDependencyStatement()					@@\
1912DependFileName:: ProgramTargetName($(DEPEND))
1913#else
1914#define DependDependencyStatement()					@@\
1915depend:: ProgramTargetName($(DEPEND))
1916#endif
1917#endif
1918
1919/*
1920 * DependDependency - generate rules to build the makedepend program if
1921 * this Imakefile is within the source tree.
1922 */
1923#ifndef DependDependency
1924#ifdef UseInstalled
1925#define DependDependency() /**/
1926#else
1927#define DependDependency()						@@\
1928DependDependencyStatement()						@@\
1929									@@\
1930NoCmpScript(ProgramTargetName($(DEPEND)))				@@\
1931									@@\
1932ProgramTargetName($(DEPEND)):						@@\
1933	@echo "checking $@ over in $(DEPENDSRC) first..."; \		@@\
1934	cd $(DEPENDSRC) && $(MAKE) makedependonly; \			@@\
1935	echo "okay, continuing in $(CURRENT_DIR)"
1936
1937#endif /* UseInstalled */
1938#endif /* DependDependency */
1939
1940
1941/*
1942 * DependTarget - generate rules to compute dependencies for all files listed
1943 * in $(SRCS).
1944 */
1945#ifndef DependTarget
1946#if HasMakefileSafeInclude
1947#define DependTarget()							@@\
1948DependDependency()							@@\
1949									@@\
1950depend:: DependFileName							@@\
1951									@@\
1952DependFileName::							@@\
1953	RemoveFile($@)							@@\
1954	RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- $(SRCS)) > $@
1955#else /* HasMakefileSafeInclude */
1956#define	DependTarget()							@@\
1957DependDependency()							@@\
1958									@@\
1959depend::								@@\
1960	RunProgram(DEPEND,$(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- $(SRCS))
1961#endif /* HasMakefileSafeInclude else */
1962#endif /* DependTarget */
1963
1964/*
1965 * DependTarget3 - generate rules to compute dependencies for all files given.
1966 */
1967#ifndef DependTarget3
1968#if HasMakefileSafeInclude
1969#define DependTarget3(srcs1,srcs2,srcs3)				@@\
1970DependDependency()							@@\
1971									@@\
1972depend:: DependFileName							@@\
1973									@@\
1974DependFileName::							@@\
1975	RemoveFile($@)							@@\
1976	RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs1) > $@	@@\
1977	RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs2) >> $@	@@\
1978	RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs3) >> $@
1979#else /* HasMakefileSafeInclude */
1980#define	DependTarget3(srcs1,srcs2,srcs3)				@@\
1981DependDependency()							@@\
1982									@@\
1983depend::								@@\
1984	RunProgram(DEPEND,$(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs1)	@@\
1985	RunProgram(DEPEND,-a $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs2)	@@\
1986	RunProgram(DEPEND,-a $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs3)
1987#endif /* HasMakefileSafeInclude else */
1988#endif /* DependTarget3 */
1989
1990
1991/*
1992 * CleanTarget - generate rules to remove any garbage files
1993 */
1994#ifndef CleanTarget
1995#define	CleanTarget()							@@\
1996clean::									@@\
1997	$(RM) FilesToClean ExtraFilesToClean DocFilesToClean "#"*	@@\
1998									@@\
1999ProofCleanTarget()
2000#endif /* CleanTarget */
2001
2002
2003/*
2004 * TagsTarget - generate rules to compute tags files for C source code.
2005 */
2006#ifndef TagsTarget
2007#define	TagsTarget()							@@\
2008tags::									@@\
2009	$(TAGS) -w *.[ch]						@@\
2010	$(TAGS) -xw *.[ch] > TAGS
2011#endif /* TagsTarget */
2012
2013
2014/*
2015 * ImakeDependency - generate rules to compile imake if this Imakefile is
2016 * within the source tree.
2017 */
2018#ifndef ImakeDependency
2019#ifdef UseInstalled
2020#define ImakeDependency(target) /**/
2021#else
2022#define ImakeDependency(target)						@@\
2023target:: ProgramTargetName($(IMAKE))					@@\
2024									@@\
2025NoCmpScript(ProgramTargetName($(IMAKE)) $(IMAKE).Osuf)			@@\
2026									@@\
2027ProgramTargetName($(IMAKE)) $(IMAKE).Osuf:				@@\
2028	-@(cd $(IMAKESRC) && if [ -f Makefile ]; then \			@@\
2029	echo "checking $@ in $(IMAKESRC) first..."; $(MAKE) imakeonly; else \	@@\
2030	echo "bootstrapping $@ from Makefile.ini in $(IMAKESRC) first..."; \	@@\
2031	$(MAKE) -f Makefile.ini BOOTSTRAPCFLAGS="$(BOOTSTRAPCFLAGS)"; fi; \	@@\
2032	echo "okay, continuing in $(CURRENT_DIR)")
2033#endif /* UseInstalled */
2034#endif /* ImakeDependency */
2035
2036
2037/*
2038 * BuildMakefileTarget - generate rules to build a Makefile from an Imakefile
2039 * and any special imake flags.  This is generally done automatically by the
2040 * template or by any special Imakefiles.  The first argument exists just
2041 * because imakeflags is usually empty and some preprocessors will complain
2042 * if an empty argument is passed as the sole argument to a macro.
2043 */
2044#ifndef BuildMakefileTarget
2045#define	BuildMakefileTarget(notused,imakeflags)				@@\
2046ImakeDependency(Makefile)						@@\
2047									@@\
2048Makefile::								@@\
2049	RMoveToBakFile(Makefile)					@@\
2050	$(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) imakeflags
2051
2052#endif /* BuildMakefileTarget */
2053
2054
2055/*
2056 * MakefileTarget - generate rules to build a normal Makefile.
2057 */
2058#ifndef MakefileTarget
2059#define MakefileTarget()						@@\
2060BuildMakefileTarget(Imakefile,NullParameter)
2061#endif /* MakefileTarget */
2062
2063
2064/*
2065 * LibMkdir - helper for creating library object subdirectories
2066 */
2067#ifndef LibMkdir
2068#define LibMkdir(dir) DirFailPrefix@if [ -d dir ]; then exit 0; else set -x; mkdir dir; fi
2069#endif
2070
2071#ifndef LibMkdirLinkSubdirs
2072#define LibMkdirLinkSubdirs(dir) DirFailPrefix@if [ -d dir ]; then \	@@\
2073	    exit 0; \							@@\
2074	else \								@@\
2075	    echo "mkdir dir"; mkdir dir; \				@@\
2076	    for i in $(SUBDIRS); do \					@@\
2077	      j=`echo "$$i" | sed -e 's;[^/]\{1,\};..;g'`; \		@@\
2078	      if [ ! -d "dir/`dirname $$i`" ]; then \			@@\
2079		$(MKDIRHIER) "dir/`dirname $$i`"; \			@@\
2080	      fi; \							@@\
2081	      echo $(LN) "$$j/$$i/dir" "dir/$$i"; \			@@\
2082	      $(LN) "$$j/$$i/dir" "dir/$$i"; \				@@\
2083	    done; \							@@\
2084	fi
2085#endif
2086
2087/*
2088 * LibCleanDir - helper for cleaning library object subdirectories
2089 */
2090#ifndef LibCleanDir
2091#define LibCleanDir(dir) -@if [ -d dir ]; then \			@@\
2092		set -x; $(RM) -r dir; else exit 0; fi
2093#endif
2094
2095/*
2096 * LintLibReferences - variables for lint libraries
2097 */
2098#ifndef LintLibReferences
2099#define LintLibReferences(varname,libname,libsource)			@@\
2100Concat(LINT,varname) = _UseCat($(LINTLIBDIR)/llib-l,libsource/llib-,libname.ln)
2101#endif
2102
2103
2104/*
2105 * UnsharedLibReferences - variables for unshared libraries
2106 */
2107#ifndef UnsharedLibReferences
2108#define UnsharedLibReferences(varname,libname,libsource)		@@\
2109ProjectUnsharedLibReferences(varname,libname,libsource,$(BUILDLIBDIR))
2110#endif
2111
2112/*
2113 * ProjectUnsharedLibReferences - variables for unshared libraries
2114 */
2115#ifndef ProjectUnsharedLibReferences
2116#define ProjectUnsharedLibReferences(varname,libname,libsource,buildlibdir)	@@\
2117Concat3(DEP,varname,LIB) = _UseCat($(USRLIBDIR)/,buildlibdir/,LibraryTargetName(libname))	@@\
2118Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)		@@\
2119LintLibReferences(varname,libname,libsource)
2120#endif
2121
2122 /*
2123 * ProjectUnsharedFontLibReferences - unshared font libraries
2124 */
2125#ifndef ProjectUnsharedFontLibReferences
2126#define ProjectUnsharedFontLibReferences()					@@\
2127DEPFONTLIB = _UseCat($(USRLIBDIR)/,XBuildLibDir/,LibraryTargetName(Xfont))	@@\
2128FONTLIB = -L$(FREETYPELIBDIR) -L$(FONTLIBSRC) LoaderLibPrefix -lXfont		@@\
2129LintLibReferences(XFONT,Xfont,$(FONTLIBSRC))
2130#endif
2131
2132/*
2133 * SharedLibDependencies - shared library dependencies
2134 */
2135#ifndef SharedLibDependencies
2136#define SharedLibDependencies(libname,libsource,revname) /**/
2137#endif
2138
2139/*
2140 * SharedFontLibReferences - shared font libraries
2141 */
2142#ifndef SharedFontLibReferences
2143#define SharedFontLibReferences()					@@\
2144SOFONTREV = SharedFontRev						@@\
2145DEPFONTLIB = SharedLibDependencies(Xfont,$(FONTLIBSRC),SOFONTREV)	@@\
2146FONTLIB = -L$(FREETYPELIBDIR) -L$(FONTLIBSRC) LoaderLibPrefix -lXfont	@@\
2147LintLibReferences(XFONT,Xfont,$(FONTLIBSRC))
2148#endif
2149
2150/*
2151 * SharedDSLibDependencies - shared library dependencies with data separation
2152 */
2153#ifndef SharedDSLibDependencies
2154#define SharedDSLibDependencies(libname,libsource,revname) /**/
2155#endif
2156
2157/*
2158 * SharedLibReferences - variables for shared libraries
2159 */
2160#ifndef SharedLibReferences
2161#define SharedLibReferences(varname,libname,libsource,revname,rev)	@@\
2162revname = rev								@@\
2163Concat3(DEP,varname,LIB) = SharedLibDependencies(libname,libsource,revname) @@\
2164Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)		@@\
2165LintLibReferences(varname,libname,libsource)
2166#endif
2167
2168/*
2169 * SharedDSLibReferences - variables for shared libraries with data separation
2170 */
2171#ifndef SharedDSLibReferences
2172#define SharedDSLibReferences(varname,libname,libsource,revname,rev)	@@\
2173revname = rev								@@\
2174Concat3(DEP,varname,LIB) = SharedDSLibDependencies(libname,libsource,revname) @@\
2175Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)		@@\
2176LintLibReferences(varname,libname,libsource)
2177#endif
2178
2179/*
2180 * CPPOnlyCompile - run C compiler's preprocessor only
2181 */
2182#ifndef CPPOnlyCompile
2183#define CPPOnlyCompile(src,options) RemoveFile($@)			@@\
2184	ClearmakeOSName \
2185	$(CC) -E $(CFLAGS) options src > $@
2186#endif
2187
2188/*
2189 * ObjectCompile - compile fragment for a normal object file
2190 */
2191#ifndef ObjectCompile
2192#define ObjectCompile(options) RemoveFile($@)				@@\
2193	ClearmakeOSName \
2194	$(CC) -c $(CFLAGS) options $*.c
2195#endif
2196
2197/*
2198 * CompileCToAsm - compile C file to assembler
2199 */
2200#ifndef CompileCToAsm
2201#define CompileCToAsm(options) RemoveFile($@)				@@\
2202	ClearmakeOSName \
2203	$(CC) -S $(CFLAGS) options $*.c
2204#endif
2205
2206
2207/*
2208 * CompileCplusplusToAsm - compile C++ file to assembler
2209 */
2210#ifndef CompileCplusplusToAsm
2211#define CompileCplusplusToAsm(options) RemoveFile($@)			@@\
2212	ClearmakeOSName \
2213	$(CC) -S $(CFLAGS) options $*.cc
2214#endif
2215
2216
2217#ifndef ObjectCplusplusCompile
2218#define ObjectCplusplusCompile(options) RemoveFile($@)			@@\
2219	ClearmakeOSName \
2220	$(CXX) -c $(CXXFLAGS) options $*.CCsuf
2221#endif
2222
2223/*
2224 * NormalLibObjCompile - compile fragment for a normal library object file
2225 */
2226#ifndef NormalLibObjCompile
2227#define NormalLibObjCompile(options) ObjectCompile(options)
2228#endif
2229
2230#ifndef NormalRelocLibObjCompile
2231# if !StaticNeedsPicForShared
2232#  define NormalRelocLibObjCompile(options) NormalLibObjCompile(options)
2233# else
2234#  define NormalRelocLibObjCompile(options) NormalLibObjCompile(options $(PICFLAGS))
2235# endif
2236#endif
2237
2238#ifndef NormalLibObjCplusplusCompile
2239#define NormalLibObjCplusplusCompile(options) ObjectCplusplusCompile(options)
2240#endif
2241
2242/*
2243 * NormalSharedLibObjCompile - compile fragment for shared objects
2244 */
2245#ifndef NormalSharedLibObjCompile
2246#define NormalSharedLibObjCompile(options) NormalLibObjCompile(options $(SHLIBDEF) $(SHAREDCODEDEF) $(PICFLAGS))
2247#endif
2248
2249#ifndef NormalSharedLibObjCplusplusCompile
2250#define NormalSharedLibObjCplusplusCompile(options) NormalLibObjCplusplusCompile(options $(SHLIBDEF) $(SHAREDCODEDEF) $(CXXPICFLAGS))
2251#endif
2252
2253/*
2254 * LibObjCompile - compile fragment for unshared/profiled/debugged objects
2255 */
2256#ifndef LibObjCompile
2257#if HasGcc || HasGcc2
2258#define LibObjCompile(dir,options) RemoveFiles($@ dir/$@)		@@\
2259	ClearmakeOSName \
2260	$(CC) -c $(CCOPTIONS) $(THREADS_CFLAGS) $(ALLDEFINES) \
2261	options $*.c -o dir/$@
2262#else
2263#define LibObjCompile(dir,options) RemoveFiles($@ dir/$@)		@@\
2264	ClearmakeOSName \
2265	$(CC) -c $(CCOPTIONS) $(THREADS_CFLAGS) $(ALLDEFINES) \
2266	options $*.c							@@\
2267	$(MV) $@ dir/$@
2268#endif
2269#endif
2270
2271#ifndef LibObjCplusplusCompile
2272#if HasGcc || HasGcc2
2273#define LibObjCplusplusCompile(dir,options) RemoveFiles($@ dir/$@)	@@\
2274	ClearmakeOSName \
2275	$(CXX) -c $(CXXOPTIONS) $(THREADS_CXXFLAGS) $(CXXDEFINES) \
2276	options $*.CCsuf -o dir/$@
2277#else
2278#define LibObjCplusplusCompile(dir,options) RemoveFiles($@ dir/$@)	@@\
2279	ClearmakeOSName \
2280	$(CXX) -c $(CXXOPTIONS) $(THREADS_CXXFLAGS) $(CXXDEFINES) \
2281	options $*.CCsuf						@@\
2282	$(MV) $@ dir/$@
2283#endif
2284#endif
2285
2286/*
2287 * DebuggedLibObjCompile - compile fragment for debugged objects
2288 */
2289#ifndef DebuggedLibObjCompile
2290#define DebuggedLibObjCompile(options) LibObjCompile(debugger,DebuggableCDebugFlags options)
2291#endif
2292
2293#ifndef DebuggedLibObjCplusplusCompile
2294#define DebuggedLibObjCplusplusCompile(options) LibObjCplusplusCompile(debugger,DebuggableCplusplusDebugFlags options)
2295#endif
2296
2297/*
2298 * ProfiledLibObjCompile - compile fragment for profiled objects
2299 */
2300#ifndef ProfiledLibObjCompile
2301#define ProfiledLibObjCompile(options) LibObjCompile(profiled,ProfiledCDebugFlags options)
2302#endif
2303
2304#ifndef ProfiledLibObjCplusplusCompile
2305#define ProfiledLibObjCplusplusCompile(options) LibObjCplusplusCompile(profiled,ProfiledCplusplusDebugFlags options)
2306#endif
2307
2308/*
2309 * UnsharedLibObjCompile - compile fragment for unshared objects
2310 */
2311#ifndef UnsharedLibObjCompile
2312#define UnsharedLibObjCompile(options) LibObjCompile(unshared,$(CDEBUGFLAGS) $(CLIBDEBUGFLAGS) options)
2313#endif
2314
2315#ifndef UnsharedLibObjCplusplusCompile
2316#define UnsharedLibObjCplusplusCompile(options) LibObjCplusplusCompile(unshared,$(CXXDEBUGFLAGS) $(CXXLIBDEBUGFLAGS) options)
2317#endif
2318
2319/*
2320 * SharedLibObjCompile - compile fragment for shared objects
2321 */
2322#ifndef SharedLibObjCompile
2323#define SharedLibObjCompile(options) LibObjCompile(shared,options $(SHLIBDEF) $(SHAREDCODEDEF) $(PICFLAGS) $(CDEBUGFLAGS) $(CLIBDEBUGFLAGS))
2324#endif
2325
2326/*
2327 * NormalLibraryObjectRule - for simple libraries
2328 */
2329#ifndef NormalLibraryObjectRule
2330#define	NormalLibraryObjectRule()					@@\
2331.c.Osuf:								@@\
2332	NormalLibObjCompile($(_NOOP_))
2333#endif /* NormalLibraryObjectRule */
2334
2335#ifndef NormalCplusplusObjectRule
2336#define NormalCplusplusObjectRule()					@@\
2337.CCsuf.Osuf:								@@\
2338	NormalLibObjCplusplusCompile($(_NOOP_))
2339#endif
2340
2341#ifndef NormalFortranObjectRule
2342#define NormalFortranObjectRule()					@@\
2343.f.Osuf:								@@\
2344	RemoveFile($@)							@@\
2345	ClearmakeOSName \
2346	$(FC) -c $(FCFLAGS) $*.f
2347#endif
2348
2349/*
2350 * SpecialObjectRule - generate rules to compile a file with special flags.
2351 */
2352#ifndef SpecialObjectRule
2353#define SpecialObjectRule(objs,depends,options)				@@\
2354objs:	depends								@@\
2355	ObjectCompile(options)
2356#endif /* SpecialObjectRule */
2357
2358#ifndef SpecialCplusplusObjectRule
2359#define SpecialCplusplusObjectRule(baseobj,basedep,options)		@@\
2360baseobj.Osuf:	basedep.CCsuf						@@\
2361	ObjectCplusplusCompile(options)
2362#endif /* SpecialCplusplusObjectRule */
2363
2364/*
2365 * SpecialCObjectRule - generate rules to compile a C file with special flags.
2366 *			also handles CodeCenter rules
2367 */
2368#ifndef SpecialCObjectRule
2369#define SpecialCObjectRule(basename,depends,options)			@@\
2370SpecialObjectRule(basename.Osuf,basename.c depends,options)		@@\
2371									@@\
2372basename.i: basename.c depends						@@\
2373	CPPOnlyCompile(basename.c,options)				@@\
2374									@@\
2375basename.s: basename.c depends						@@\
2376	CompileCToAsm(options)						@@\
2377									@@\
2378CenterLoadTarget(debug_src,basename.c,NullParameter,$(ALLDEFINES) options)
2379#endif /* SpecialCObjectRule */
2380
2381
2382#ifndef ObjectFromSpecialSource
2383#define ObjectFromSpecialSource(dst,src,flags)				@@\
2384NoConfigRec(dst.c)							@@\
2385									@@\
2386dst.c:  src.c								@@\
2387	RemoveFile($@)							@@\
2388	$(LN) $? $@							@@\
2389									@@\
2390SpecialCObjectRule(dst,NullParameter,flags)				@@\
2391									@@\
2392includes:: dst.c							@@\
2393									@@\
2394depend::  dst.c								@@\
2395									@@\
2396clean::									@@\
2397	RemoveFile(dst.c)
2398#endif /* ObjectFromSpecialSource */
2399
2400#ifndef CPPOnlyAsm
2401#define CPPOnlyAsm(basename,options) RemoveFile(basename.i)		@@\
2402	$(CPP) AsmDefines $(DEFINES) $(INCLUDES) options basename.S | \	@@\
2403		grep -v '^\#' > basename.i
2404#endif
2405
2406#ifndef AssembleObject
2407#define AssembleObject(basename,flags) CPPOnlyAsm(basename,flags)	@@\
2408	RemoveFile(basename.o)						@@\
2409	$(AS) -o basename.o basename.i					@@\
2410	RemoveFile(basename.i)
2411#endif
2412
2413#ifndef NormalAsmObjectRule
2414#define NormalAsmObjectRule()						@@\
2415.S.o:									@@\
2416	AssembleObject($*,$(_NOOP_))					@@\
2417									@@\
2418.S.i:									@@\
2419	CPPOnlyAsm($*,$(_NOOP_))
2420#endif
2421
2422#ifndef ObjectFromSpecialAsmSource
2423#define ObjectFromSpecialAsmSource(dst,src,flags)			@@\
2424dst.S:  src.S								@@\
2425	RemoveFile($@)							@@\
2426	$(LN) $? $@							@@\
2427									@@\
2428dst.o:  dst.S								@@\
2429	AssembleObject(dst,flags)					@@\
2430									@@\
2431dst.i:  dst.S								@@\
2432	CPPOnlyAsm(dst,flags)						@@\
2433									@@\
2434depend:: dst.S								@@\
2435									@@\
2436clean::									@@\
2437	RemoveFile(dst.S)
2438#endif
2439
2440#ifndef ObjectFromAsmSource
2441#define ObjectFromAsmSource(src,flags)					@@\
2442									@@\
2443src.o:  src.S								@@\
2444	AssembleObject(src,flags)					@@\
2445									@@\
2446src.i:  src.S								@@\
2447	CPPOnlyAsm(src,flags)						@@\
2448									@@\
2449depend:: src.S
2450#endif
2451
2452#ifndef SwitchYYPrefix
2453#define SwitchYYPrefix(in,out,prefix) \
2454	sed 's/yy/prefix/g' in | sed 's/__REALLY_YY__/yy/' > out && RemoveFile(in)
2455#endif
2456
2457#ifndef LexFilePrefix
2458#define LexFilePrefix(file,prefix)					@@\
2459file.c: file.l								@@\
2460	ClearmakeOSName \
2461	$(LEX) $(LFLAGS) file.l						@@\
2462	SwitchYYPrefix(lex.yy.c,file.c,prefix)				@@\
2463									@@\
2464depend:: file.c								@@\
2465									@@\
2466clean::									@@\
2467	RemoveFiles(lex.yy.c file.c)
2468#endif
2469
2470#ifndef LexFileExplicit
2471#if HasClearmake		/* provide a place to hang ClearmakeOSName */
2472#define LexFileExplicit(file)						@@\
2473file.c: file.l								@@\
2474	ClearmakeOSName \
2475	$(LEX) $(LFLAGS) file.l						@@\
2476	$(MV) lex.yy.c file.c
2477#else
2478#define LexFileExplicit(file) /* the default rule is fine */
2479#endif
2480#endif
2481
2482#ifndef LexFile
2483#define LexFile(file)							@@\
2484LexFileExplicit(file)							@@\
2485									@@\
2486depend:: file.c								@@\
2487									@@\
2488clean::									@@\
2489	RemoveFiles(lex.yy.c file.c)
2490#endif /* LexFile */
2491
2492
2493#ifndef M4File
2494#define M4File(file,includes)						@@\
2495file: file.m4 includes							@@\
2496	RemoveFile(file)						@@\
2497	$(M4) $(M4FLAGS) file.m4 >file					@@\
2498									@@\
2499depend:: file								@@\
2500									@@\
2501clean::									@@\
2502	RemoveFile(file)
2503#endif /* M4File */
2504
2505#ifndef YaccFilePrefix
2506#if HasGnuMake
2507#define YaccFilePrefix(file,flags,prefix)				@@\
2508depend:: file.c								@@\
2509									@@\
2510file.h: file.c								@@\
2511									@@\
2512file.c: file.y								@@\
2513	ClearmakeOSName \
2514	$(YACC) flags file.y						@@\
2515	SwitchYYPrefix(y.tab.c,file.c,prefix)				@@\
2516	@if [ -f y.tab.h ]; then set -x; SwitchYYPrefix(y.tab.h,file.h,prefix); \@@\
2517	else exit 0; fi							@@\
2518									@@\
2519clean::									@@\
2520	RemoveFiles(y.tab.c y.tab.h file.h file.c)
2521#else
2522#define YaccFilePrefix(file,flags,prefix)				@@\
2523depend:: file.c								@@\
2524									@@\
2525file.h file.c: file.y							@@\
2526	ClearmakeOSName \
2527	$(YACC) flags file.y						@@\
2528	SwitchYYPrefix(y.tab.c,file.c,prefix)				@@\
2529	@if [ -f y.tab.h ]; then set -x; SwitchYYPrefix(y.tab.h,file.h,prefix); \	@@\
2530	else exit 0; fi							@@\
2531									@@\
2532clean::									@@\
2533	RemoveFiles(y.tab.c y.tab.h file.h file.c)
2534#endif
2535#endif /* YaccFile */
2536
2537#ifndef YaccFile
2538#if HasGnuMake
2539#define YaccFile(file,flags)						@@\
2540depend:: file.c								@@\
2541									@@\
2542file.h: file.c								@@\
2543									@@\
2544file.c: file.y								@@\
2545	ClearmakeOSName \
2546	$(YACC) flags file.y						@@\
2547	$(MV) y.tab.c file.c						@@\
2548	@if [ -f y.tab.h ]; then set -x; $(MV) y.tab.h file.h; \	@@\
2549	else exit 0; fi							@@\
2550									@@\
2551clean::									@@\
2552	RemoveFiles(y.tab.c y.tab.h file.h file.c)
2553#else
2554#define YaccFile(file,flags)						@@\
2555depend:: file.c								@@\
2556									@@\
2557file.h file.c: file.y							@@\
2558	ClearmakeOSName \
2559	$(YACC) flags file.y						@@\
2560	$(MV) y.tab.c file.c						@@\
2561	@if [ -f y.tab.h ]; then set -x; $(MV) y.tab.h file.h; \	@@\
2562	else exit 0; fi							@@\
2563									@@\
2564clean::									@@\
2565	RemoveFiles(y.tab.c y.tab.h file.h file.c)
2566#endif
2567#endif /* YaccFile */
2568
2569#ifndef YaccFileNoFlags
2570#define YaccFileNoFlags(file)						@@\
2571depend:: file.c								@@\
2572									@@\
2573file.c: file.y								@@\
2574	ClearmakeOSName \
2575	$(YACC) file.y							@@\
2576	$(MV) y.tab.c file.c						@@\
2577									@@\
2578clean::									@@\
2579	RemoveFiles(y.tab.c file.c)
2580#endif /* YaccFileNoFlags */
2581
2582
2583#ifndef MakeLibrary
2584#define MakeLibrary(libname,objlist) $(AR) libname objlist
2585#endif
2586
2587#ifndef LinkBuildLibrary
2588#ifdef UseInstalled
2589#define LinkBuildLibrary(lib) $(_NULLCMD_)
2590#else
2591#define LinkBuildLibrary(lib) MakeDir($(BUILDLIBDIR))			@@\
2592	RemoveFile($(BUILDLIBDIR)/lib)					@@\
2593	cd $(BUILDLIBDIR) && $(LN) $(BUILDLIBTOP)/$(CURRENT_DIR)/lib .
2594#endif
2595#endif /* LinkBuildLibrary */
2596
2597#ifndef LinkBuildLibraryMaybe
2598#ifdef UseInstalled
2599#define LinkBuildLibraryMaybe(lib,doit) $(_NULLCMD_)
2600#else
2601#define LinkBuildLibraryMaybe(lib,doit) MakeDir($(BUILDLIBDIR))		@@\
2602	@if doit; then (set -x; \					@@\
2603	  RemoveFile($(BUILDLIBDIR)/lib); \				@@\
2604	  cd $(BUILDLIBDIR) && $(LN) $(BUILDLIBTOP)/$(CURRENT_DIR)/lib .); fi
2605#endif
2606#endif /* LinkBuildLibraryMaybe */
2607
2608#ifndef _LinkBuildLibrary /* will get redefined elsewhere */
2609#define _LinkBuildLibrary(lib) $(_NULLCMD_)
2610#endif /* _LinkBuildLibrary */
2611
2612#ifndef LinkBuildSonameLibrary
2613#ifdef UseInstalled
2614#define LinkBuildSonameLibrary(lib) true
2615#else
2616#define LinkBuildSonameLibrary(lib) MakeDirInline($(BUILDLIBDIR));\	@@\
2617	(set -x; RemoveFile($(BUILDLIBDIR)/lib);\			@@\
2618	(cd $(BUILDLIBDIR) && $(LN) $(BUILDLIBTOP)/$(CURRENT_DIR)/lib .))
2619#endif
2620#endif /* LinkBuildSonameLibrary */
2621
2622#ifndef LinkBuildLibraryInline
2623#define LinkBuildLibraryInline(lib) LinkBuildSonameLibrary(lib)
2624#endif /* LinkBuildLibraryInline */
2625
2626/*
2627 * NormalLibraryTarget - generate rules to create a library.
2628 */
2629#ifndef NormalLibraryTarget
2630#define	NormalLibraryTarget(libname,objlist)				@@\
2631AllTarget(LibraryTargetName(libname))					@@\
2632									@@\
2633LibraryTargetName(libname): objlist $(EXTRALIBRARYDEPS)			@@\
2634	RemoveFile($@)							@@\
2635	MakeLibrary($@,objlist)						@@\
2636	RanLibrary($@)							@@\
2637	_LinkBuildLibrary($@)
2638#endif /* NormalLibraryTarget */
2639
2640
2641/*
2642 * NormalLibraryTarget2 - generate rules to create a library in two steps.
2643 * This is used to create libraries with large numbers of files.
2644 */
2645#ifndef NormalLibraryTarget2
2646#define	NormalLibraryTarget2(libname,objlist1,objlist2)			@@\
2647AllTarget(LibraryTargetName(libname))					@@\
2648									@@\
2649LibraryTargetName(libname): objlist1 objlist2 $(EXTRALIBRARYDEPS)	@@\
2650	RemoveFile($@)							@@\
2651	MakeLibrary($@,objlist1)					@@\
2652	MakeLibrary($@,objlist2)					@@\
2653	RanLibrary($@)							@@\
2654	_LinkBuildLibrary($@)
2655#endif /* NormalLibraryTarget2 */
2656
2657
2658/*
2659 * NormalLibraryTarget3 - generate rules to create a library in three steps.
2660 * This is used to create libraries with very large numbers of files.
2661 */
2662#ifndef NormalLibraryTarget3
2663#define	NormalLibraryTarget3(libname,objlist1,objlist2,objlist3)	@@\
2664AllTarget(LibraryTargetName(libname))					@@\
2665									@@\
2666LibraryTargetName(libname): objlist1 objlist2 objlist3 $(EXTRALIBRARYDEPS)	@@\
2667	RemoveFile($@)							@@\
2668	MakeLibrary($@,objlist1)					@@\
2669	MakeLibrary($@,objlist2)					@@\
2670	MakeLibrary($@,objlist3)					@@\
2671	RanLibrary($@)							@@\
2672	_LinkBuildLibrary($@)
2673#endif /* NormalLibraryTarget3 */
2674
2675
2676/*
2677 * NormalDepLibraryTarget - generate rules to create a library.
2678 */
2679#ifndef NormalDepLibraryTarget
2680#define	NormalDepLibraryTarget(libname,deplist,objlist)			@@\
2681AllTarget(LibraryTargetName(libname))					@@\
2682									@@\
2683LibraryTargetName(libname): deplist $(EXTRALIBRARYDEPS)			@@\
2684	RemoveFile($@)							@@\
2685	MakeLibrary($@,objlist)						@@\
2686	RanLibrary($@)							@@\
2687	_LinkBuildLibrary($@)
2688#endif /* NormalDepLibraryTarget */
2689
2690
2691/*
2692 * UnsharedLibraryTarget - generate rules to create a library.
2693 */
2694#ifndef UnsharedLibraryTarget
2695#define	UnsharedLibraryTarget(libname,objlist,down,up)			@@\
2696AllTarget(LibraryTargetName(libname))					@@\
2697									@@\
2698LibraryTargetName(libname): objlist $(EXTRALIBRARYDEPS)			@@\
2699	RemoveFile($@)							@@\
2700	@(set -x; cd down && MakeLibrary(up/$@,objlist)) || exit 1;	@@\
2701	RanLibrary($@)							@@\
2702	_LinkBuildLibrary($@)
2703#endif /* UnsharedLibraryTarget */
2704
2705
2706/*
2707 * UnsharedLibraryTarget3 - generate rules to create a library in three steps.
2708 * This is used to create libraries with very large numbers of files.
2709 */
2710#ifndef UnsharedLibraryTarget3
2711#define	UnsharedLibraryTarget3(libname,objlist1,objlist2,objlist3,down,up) @@\
2712AllTarget(LibraryTargetName(libname))					@@\
2713									@@\
2714LibraryTargetName(libname): objlist1 objlist2 objlist3 $(EXTRALIBRARYDEPS)	@@\
2715	RemoveFile($@)							@@\
2716	(cd down && MakeLibrary(up/$@,objlist1))			@@\
2717	(cd down && MakeLibrary(up/$@,objlist2))			@@\
2718	(cd down && MakeLibrary(up/$@,objlist3))			@@\
2719	RanLibrary($@)							@@\
2720	_LinkBuildLibrary($@)
2721#endif /* UnsharedLibraryTarget3 */
2722
2723
2724/*
2725 * SubdirLibraryRule -
2726 */
2727#ifndef SubdirLibraryRule
2728#define	SubdirLibraryRule(objlist)					@@\
2729all:: DONE								@@\
2730									@@\
2731DONE: objlist								@@\
2732	RemoveFile($@)							@@\
2733	touch $@							@@\
2734									@@\
2735clean::									@@\
2736	RemoveFile(DONE)
2737#endif /* SubdirLibraryRule */
2738
2739
2740/*
2741 * ProfiledLibraryTarget - generate rules to create a profiled library.
2742 */
2743#ifndef ProfiledLibraryTarget
2744#define	ProfiledLibraryTarget(libname,objlist)				@@\
2745AllTarget(LibraryTargetNameSuffix(libname,_p))				@@\
2746									@@\
2747LibraryTargetNameSuffix(libname,_p): objlist $(EXTRALIBRARYDEPS)	@@\
2748	RemoveFile($@)							@@\
2749	cd profiled && MakeLibrary(../$@,objlist)			@@\
2750	RanLibrary($@)
2751
2752#endif /* ProfiledLibraryTarget */
2753
2754
2755/*
2756 * ProfiledDepLibraryTarget - generate rules to create a profiled library.
2757 */
2758#ifndef ProfiledDepLibraryTarget
2759#define	ProfiledDepLibraryTarget(libname,deplist,objlist)		@@\
2760AllTarget(LibraryTargetNameSuffix(libname,_p))				@@\
2761									@@\
2762LibraryTargetNameSuffix(libname,_p): deplist $(EXTRALIBRARYDEPS)	@@\
2763	RemoveFile($@)							@@\
2764	MakeLibrary($@,objlist)						@@\
2765	RanLibrary($@)
2766
2767#endif /* ProfiledDepLibraryTarget */
2768
2769
2770/*
2771 * DebuggedLibraryTarget - generate rules to create a debuggable library.
2772 */
2773#ifndef DebuggedLibraryTarget
2774#define	DebuggedLibraryTarget(libname,objlist)				@@\
2775AllTarget(LibraryTargetNameSuffix(libname,_d))				@@\
2776									@@\
2777LibraryTargetNameSuffix(libname,_d): objlist $(EXTRALIBRARYDEPS)	@@\
2778	RemoveFile($@)							@@\
2779	cd debugger && MakeLibrary(../$@,objlist)			@@\
2780	RanLibrary($@)
2781
2782#endif /* DebuggedLibraryTarget */
2783
2784
2785/*
2786 * DebuggedDepLibraryTarget - generate rules to create a debuggable library.
2787 */
2788#ifndef DebuggedDepLibraryTarget
2789#define	DebuggedDepLibraryTarget(libname,deplist,objlist)		@@\
2790AllTarget(LibraryTargetNameSuffix(libname,_d))				@@\
2791									@@\
2792LibraryTargetNameSuffix(libname,_d): deplist $(EXTRALIBRARYDEPS)	@@\
2793	RemoveFile($@)							@@\
2794	MakeLibrary($@,objlist)						@@\
2795	RanLibrary($@)
2796
2797#endif /* DebuggedDepLibraryTarget */
2798
2799
2800/*
2801 * AliasedLibraryTarget - generate rules to link one library to another.
2802 */
2803#ifndef AliasedLibraryTarget
2804#define	AliasedLibraryTarget(libname,alias)				@@\
2805AllTarget(LibraryTargetName(alias))					@@\
2806									@@\
2807LibraryTargetName(alias): LibraryTargetName(libname)			@@\
2808	RemoveFile($@)							@@\
2809	$(LN) LibraryTargetName(libname) $@				@@\
2810									@@\
2811clean::									@@\
2812	RemoveFile(LibraryTargetName(alias))
2813#endif /* AliasedLibraryTarget */
2814
2815
2816/*
2817 * NormalRelocatableTarget - generate rules to produce a relocatable object
2818 * file instead of a library.
2819 */
2820#ifndef NormalRelocatableTarget
2821#define	NormalRelocatableTarget(objname,objlist)			@@\
2822AllTarget(objname.Osuf)							@@\
2823									@@\
2824objname.Osuf: objlist $(EXTRALIBRARYDEPS)				@@\
2825	RemoveFile($@)							@@\
2826	$(LD) $(LDCOMBINEFLAGS) objlist -o $@
2827#endif /* NormalRelocatableTarget */
2828
2829
2830/*
2831 * NormalDepRelocatableTarget - generate rules to produce a relocatable object
2832 * file instead of a library.
2833 */
2834#ifndef NormalDepRelocatableTarget
2835#define	NormalDepRelocatableTarget(objname,deplist,objlist)		@@\
2836AllTarget(objname.Osuf)							@@\
2837									@@\
2838objname.Osuf: deplist $(EXTRALIBRARYDEPS)				@@\
2839	RemoveFile($@)							@@\
2840	$(LD) $(LDCOMBINEFLAGS) objlist -o $@
2841#endif /* NormalDepRelocatableTarget */
2842
2843
2844/*
2845 * ProfiledRelocatableTarget - generate rules to produce a profiled relocatable
2846 * object file instead of a library.
2847 */
2848#ifndef ProfiledRelocatableTarget
2849#define	ProfiledRelocatableTarget(objname,objlist)			@@\
2850AllTarget(Concat(objname,_p.Osuf))					@@\
2851									@@\
2852Concat(objname,_p.Osuf): objlist $(EXTRALIBRARYDEPS)			@@\
2853	RemoveFile($@)							@@\
2854	$(LD) -X -r objlist -o $@
2855
2856#endif /* ProfiledRelocatableTarget */
2857
2858
2859/*
2860 * DebuggedRelocatableTarget - generate rules to produce a debuggable
2861 * relocatable object file instead of a library.
2862 */
2863#ifndef DebuggedRelocatableTarget
2864#define	DebuggedRelocatableTarget(objname,objlist)			@@\
2865AllTarget(Concat(objname,_d.Osuf))					@@\
2866									@@\
2867Concat(objname,_d.Osuf): objlist $(EXTRALIBRARYDEPS)			@@\
2868	RemoveFile($@)							@@\
2869	$(LD) -X -r objlist -o $@
2870
2871#endif /* DebuggedRelocatableTarget */
2872
2873
2874/*
2875 * LintLibraryTarget - generate rules to create a lint library.  Note that the
2876 * lint library is always forced to be newer than the library itself.
2877 */
2878#ifndef LintLibraryTarget
2879#define	LintLibraryTarget(libname,srclist)				@@\
2880lintlib:: Concat(llib-l,libname.ln)					@@\
2881									@@\
2882Concat(llib-l,libname.ln): srclist $(EXTRALIBRARYDEPS)			@@\
2883	RemoveFile($@)							@@\
2884	$(LINT) Concat($(LINTLIBFLAG),libname) $(LINTFLAGS) srclist
2885#endif /* LintLibraryTarget */
2886
2887
2888/*
2889 * NormalLintTarget - generate rules to lint a set of sources.
2890 */
2891#ifndef NormalLintTarget
2892#define NormalLintTarget(srclist)					@@\
2893lint:									@@\
2894	$(LINT) $(LINTFLAGS) srclist $(LINTLIBS)			@@\
2895lint1:									@@\
2896	$(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
2897#endif /* NormalLintTarget */
2898
2899
2900/*
2901 * LintTarget - generate rules to lint $(SRCS)
2902 */
2903#ifndef LintTarget
2904#define LintTarget()							@@\
2905NormalLintTarget($(SRCS))
2906#endif
2907
2908
2909/*
2910 * LinkSourceFile - snag source file from some other directory
2911 */
2912#ifndef LinkSourceFile
2913#define LinkSourceFile(src,dir)						@@\
2914src:  dir/src								@@\
2915	RemoveFile($@)							@@\
2916	$(LN) $? $@							@@\
2917									@@\
2918NoConfigRec(src)							@@\
2919									@@\
2920includes:: src								@@\
2921									@@\
2922depend:: src								@@\
2923									@@\
2924clean::									@@\
2925	RemoveFile(src)
2926#endif
2927
2928
2929/*
2930 * LinkFile - link a file
2931 */
2932#ifndef LinkFile
2933#define LinkFile(tofile,fromfile)					@@\
2934tofile:: fromfile							@@\
2935	RemoveFile($@)							@@\
2936	$(LN) $? $@							@@\
2937									@@\
2938NoConfigRec(tofile)							@@\
2939									@@\
2940includes:: tofile							@@\
2941									@@\
2942depend:: tofile								@@\
2943									@@\
2944clean::									@@\
2945	RemoveFile(tofile)
2946#endif
2947
2948
2949#ifndef MakeSubincludesForBuild
2950#define MakeSubincludesForBuild(step,dir,srclist)			@@\
2951step::  dir srclist							@@\
2952	@-(list=`echo srclist | sed -e 's/[^ ]*\///g'`; \		@@\
2953		set -x; cd dir && RemoveFiles($$list))			@@\
2954	@for i in srclist; do \						@@\
2955		(set -x; cd dir && $(LN) ../$$i .); \			@@\
2956	done								@@\
2957									@@\
2958dir::									@@\
2959	$(MKDIRHIER) dir						@@\
2960									@@\
2961clean::									@@\
2962	@-(if [ -d dir ]; then \					@@\
2963		list=`echo srclist | sed -e 's/[^ ]*\///g'`; \		@@\
2964		set -x; cd dir && RemoveFile($$list); else exit 0; fi)
2965#endif
2966
2967
2968/*
2969 * LangNamedTargetSubdirs - recursively make a series of steps
2970 */
2971#ifndef LangNamedTargetSubdirs
2972#define LangNamedTargetSubdirs(lang,name,dirs,verb,flags,subname)	@@\
2973name::									@@\
2974	@MakeFlagsToShellFlags(ik,set +e); \				@@\
2975	for i in dirs ;\						@@\
2976	do \								@@\
2977		echo verb "in $(CURRENT_DIR)/$$i..."; \			@@\
2978		(cd $$i && LANG=lang $(MAKE) $(MFLAGS) flags subname);\ @@\
2979	done
2980#endif
2981
2982
2983/*
2984 * NamedMakeSubdirs - generate rules to do makes in the given subdirectories.
2985 * If you want CDEBUGFLAGS passed along to subdirectories, provide a line like
2986 * the following in the appropriate Imakefile
2987 *
2988 *         #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)'
2989 */
2990#ifndef LangNamedMakeSubdirs
2991#define LangNamedMakeSubdirs(lang,name,dirs) \
2992LangNamedTargetSubdirs(lang,name,dirs,"making" name,PassCDebugFlags,all)
2993#endif /* LangNamedMakeSubdirs */
2994
2995#ifndef LangMakeSubdirs
2996#define LangMakeSubdirs(lang,dirs)					@@\
2997LangNamedMakeSubdirs(lang,all,dirs)
2998#endif /* LangMakeSubdirs */
2999
3000
3001
3002/*
3003 * NamedTargetSubdirs - recursively make a series of steps
3004 */
3005#ifndef NamedTargetSubdirs
3006#define NamedTargetSubdirs(name,dirs,verb,flags,subname)		@@\
3007name::									@@\
3008	@MakeFlagsToShellFlags(ik,set +e); \				@@\
3009	for i in dirs ;\						@@\
3010	do \								@@\
3011		echo verb "in $(CURRENT_DIR)/$$i..."; \			@@\
3012		MakeNamedTargetSubdir($$i,flags,subname); \		@@\
3013	done
3014#endif
3015
3016
3017/*
3018 * NamedMakeSubdirs - generate rules to do makes in the given subdirectories.
3019 * If you want CDEBUGFLAGS passed along to subdirectories, provide a line like
3020 * the following in the appropriate Imakefile
3021 *
3022 *         #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)'
3023 */
3024#ifndef NamedMakeSubdirs
3025#define NamedMakeSubdirs(name,dirs) \
3026NamedTargetSubdirs(name,dirs,"making" name,PassCDebugFlags,all)
3027#endif /* NamedMakeSubdirs */
3028
3029#ifndef MakeSubdirs
3030#define MakeSubdirs(dirs)						@@\
3031NamedMakeSubdirs(all,dirs)
3032#endif /* MakeSubdirs */
3033
3034
3035/*
3036 * DependSubdirs - generate rules to recursively compute dependencies as
3037 * part of the make depend step.
3038 */
3039#ifndef DependSubdirs
3040#define DependSubdirs(dirs) \
3041NamedTargetSubdirs(depend,dirs,"depending",NullParameter,depend)
3042#endif /* DependSubdirs */
3043
3044
3045/*
3046 * ForceSubdirs - force make to build subdirectories
3047 */
3048#ifndef ForceSubdirs
3049#if !HasBsdMake
3050#define ForceSubdirs(dirs)						@@\
3051dirs: FRC								@@\
3052	@echo "making all in $(CURRENT_DIR)/$@..."			@@\
3053	@MakeNamedTargetSubdir($@,PassCDebugFlags,all)			@@\
3054									@@\
3055FRC:
3056#else
3057/* For BSD 4.4 make */
3058#define ForceSubdirs(dirs)						@@\
3059dirs:	.EXEC								@@\
3060	@cd $@ ; echo "making all in $(CURRENT_DIR)/$@..."; \		@@\
3061	$(MAKE) $(MFLAGS) PassCDebugFlags all				@@\
3062									@@\
3063.EXEC:
3064#endif
3065
3066#endif /* ForceSubdirs */
3067
3068/*
3069 * InstallSubdirs - generate rules to recursively install programs and files.
3070 */
3071#ifndef InstallSubdirs
3072#define InstallSubdirs(dirs) \
3073NamedTargetSubdirs(install,dirs,"installing",DESTDIR=$(DESTDIR),install)
3074#endif /* InstallSubdirs */
3075
3076
3077/*
3078 * InstallManSubdirs - generate rules to recursively install manual pages.
3079 */
3080#ifndef InstallManSubdirs
3081#define InstallManSubdirs(dirs) \
3082NamedTargetSubdirs(install.man,dirs,"installing man pages",DESTDIR=$(DESTDIR),install.man)
3083#endif /* InstallManSubdirs */
3084
3085
3086/*
3087 * IncludesSubdirs - generate rules to recursively put include files in build
3088 */
3089#ifndef IncludesSubdirs
3090#define IncludesSubdirs(dirs) \
3091NamedTargetSubdirs(includes,dirs,including,NullParameter,includes)
3092#endif
3093
3094
3095/*
3096 * InstallDriverSDKSubdirs - generate rules to recursively install Driver
3097 *                         SDK (only used for XFree86). This is a no-op
3098 *                         rule so that Imakefiles on non-XFree86 systems
3099 *                         continue to build Makefiles correctly.
3100 */
3101#ifndef InstallDriverSDKSubdirs
3102#define InstallDriverSDKSubdirs(dirs)
3103#endif
3104
3105/*
3106 * InstallDriverSDKObjectModule - generate rules to recursively install Driver
3107 *                         SDK (only used for XFree86). This is a no-op
3108 *                         rule so that Imakefiles on non-XFree86 systems
3109 *                         continue to build Makefiles correctly.
3110 */
3111#ifndef InstallDriverSDKObjectModule
3112#define InstallDriverSDKObjectModule(module,dest,subdir)
3113#endif
3114#ifndef InstallDriverSDKObjectSubModule
3115#define InstallDriverSDKObjectSubModule(module,dest,subdir)
3116#endif
3117
3118
3119
3120/*
3121 * CleanSubdirs - generate rules to recursively clean out garbage files.
3122 */
3123#define BootstrapCleanSubdirs /**/	/* used at top-level */
3124#ifndef NamedCleanSubdirs
3125#define NamedCleanSubdirs(name,dirs) \
3126NamedTargetSubdirs(name,dirs,"cleaning",BootstrapCleanSubdirs,clean)
3127#endif /* NamedCleanSubdirs */
3128
3129#ifndef CleanSubdirs
3130#define CleanSubdirs(dirs) \
3131NamedCleanSubdirs(clean,dirs)
3132#endif
3133
3134
3135/*
3136 * TagSubdirs - generate rules to recursively create tags files.
3137 */
3138#ifndef NamedTagSubdirs
3139#define NamedTagSubdirs(name,dirs) \
3140NamedTargetSubdirs(name,dirs,"tagging",TAGS='$(TAGS)',tags)
3141#endif /* TagSubdirs */
3142
3143#ifndef TagSubdirs
3144#define TagSubdirs(dirs) \
3145NamedTagSubdirs(tags,dirs)
3146#endif
3147
3148/*
3149 * MakeLintSubdirs - generate rules to recursively lint directories as part
3150 * of the named step.
3151 */
3152#ifndef MakeLintSubdirs
3153#define MakeLintSubdirs(dirs,target,subtarget) \
3154NamedTargetSubdirs(target,dirs,"linting" for target and subtarget,DESTDIR=$(DESTDIR) LINTOPTS='$(LINTOPTS)',subtarget)
3155#endif /* MakeLintSubdirs */
3156
3157
3158/*
3159 * LintSubdirs - generate rules to recursively lint directories as part of
3160 * the make lint step.
3161 */
3162#ifndef LintSubdirs
3163#define LintSubdirs(dirs)						@@\
3164MakeLintSubdirs(dirs,lint,lint)
3165#endif /* LintSubdirs */
3166
3167
3168/*
3169 * MakeLintLibSubdirs - generate rules to recursively create lint libraries.
3170 */
3171#ifndef MakeLintLibSubdirs
3172#define MakeLintLibSubdirs(dirs)					@@\
3173MakeLintSubdirs(dirs,lintlib,lintlib)
3174#endif /* MakeLintLibSubdirs */
3175
3176
3177/*
3178 * MakeMakeSubdirs - generate rules to recursively recreate Makefiles as part
3179 * of the specified step in the build.  If $(TOP) is set to an absolute path,
3180 * do not prepend the ../ prefix.  This makes running things outside of the
3181 * source tree much easier.
3182 * $(ONESUBDIR)/Makefile exists as a separate, explicit target so that
3183 * clearmake will know what its goal is and do wink-in.
3184 */
3185#ifndef MakeMakeSubdirs
3186#define MakeMakeSubdirs(dirs,target)					@@\
3187$(ONESUBDIR)/Makefile:							@@\
3188	@MakeFlagsToShellFlags(n,executeit="no"); \			@@\
3189	cd $(ONESUBDIR) && \						@@\
3190	if [ "$$executeit" != "no" ]; then \				@@\
3191		ImakeSubCmdHelper -DTOPDIR=$(IMAKETOP) -DCURDIR=$(ONECURDIR)$(ONESUBDIR); \ @@\
3192	fi;								@@\
3193									@@\
3194target::								@@\
3195	-@MakeFlagsToShellFlags(ik,set +e); \				@@\
3196	MakeFlagsToShellFlags(n,executeit="no"); \			@@\
3197	for i in dirs ;\						@@\
3198	do \								@@\
3199		case "$(CURRENT_DIR)" in \				@@\
3200		.) curdir= ;; \						@@\
3201		*) curdir=$(CURRENT_DIR)/ ;; \				@@\
3202		esac; \							@@\
3203		echo "making Makefiles in $$curdir$$i..."; \		@@\
3204		itmp=`echo $$i | sed -e 's;^\./;;g' -e 's;/\./;/;g'`; \	@@\
3205		curtmp="$(CURRENT_DIR)" \				@@\
3206		toptmp=""; \						@@\
3207		case "$$itmp" in \					@@\
3208		    ../?*) \						@@\
3209			while echo "$$itmp" | grep '^\.\./' > /dev/null;\	@@\
3210			  do \						@@\
3211			     toptmp="/`basename $$curtmp`$$toptmp"; \	@@\
3212			     curtmp="`dirname $$curtmp`"; \		@@\
3213			     itmp="`echo $$itmp | sed 's;\.\./;;'`"; \	@@\
3214			  done \					@@\
3215		    ;; \						@@\
3216		esac; \							@@\
3217		case "$$itmp" in \					@@\
3218		*/?*/?*/?*/?*)	newtop=../../../../..;; \		@@\
3219		*/?*/?*/?*)	newtop=../../../..;; \			@@\
3220		*/?*/?*)	newtop=../../..;; \			@@\
3221		*/?*)		newtop=../..;; \			@@\
3222		*)		newtop=..;; \				@@\
3223		esac; \							@@\
3224		newtop="$$newtop$$toptmp"; \				@@\
3225		case "$(TOP)" in \					@@\
3226		/?*) imaketop=$(TOP) \					@@\
3227		     imakeprefix= ;; \					@@\
3228		.) imaketop=$$newtop \					@@\
3229		   imakeprefix=$$newtop/ ;; \				@@\
3230		*) imaketop=$$newtop/$(TOP) \				@@\
3231		   imakeprefix=$$newtop/ ;; \				@@\
3232		esac; \							@@\
3233		RemoveFile($$i/Makefile.bak); \				@@\
3234		if [ -f $$i/Makefile ]; then \				@@\
3235			echo "	$(MV) Makefile Makefile.bak"; \		@@\
3236			if [ "$$executeit" != "no" ]; then \		@@\
3237				$(MV) $$i/Makefile $$i/Makefile.bak; \	@@\
3238			fi; \						@@\
3239		fi; \							@@\
3240		$(MAKE) $(MFLAGS) $(MAKE_OPTS) ONESUBDIR=$$i ONECURDIR=$$curdir IMAKETOP=$$imaketop IMAKEPREFIX=$$imakeprefix $$i/Makefile; \	@@\
3241		if [ -d $$i ] ; then \					@@\
3242			cd $$i; \					@@\
3243			$(MAKE) $(MFLAGS) Makefiles; \			@@\
3244			cd $$newtop; \					@@\
3245		else \							@@\
3246			exit 1; \					@@\
3247		fi; \							@@\
3248	done
3249
3250#ifdef UseInstalled
3251#define ImakeSubCmdHelper $(IMAKE_CMD)
3252#else
3253#define ImakeSubCmdHelper $(IMAKEPREFIX)$(IMAKE) -I$(IMAKEPREFIX)$(IRULESRC) \
3254			  $(IMAKE_DEFINES) $(IMAKE_WARNINGS)
3255#endif
3256
3257#endif /* MakeMakeSubdirs */
3258
3259
3260/*
3261 * MakefileSubdirs - generate rules to create Makefiles.
3262 */
3263#ifndef MakefileSubdirs
3264#define MakefileSubdirs(dirs)						@@\
3265MakeMakeSubdirs(dirs,Makefiles)
3266#endif /* MakefileSubdirs */
3267
3268/*
3269 * Translate XCOMM into pound sign with sed, rather than passing -DXCOMM=XCOMM
3270 * to cpp, because that trick does not work on all ANSI C preprocessors.
3271 * Delete line numbers from the cpp output (-P is not portable, I guess).
3272 * Allow XCOMM to be preceded by whitespace and provide a means of generating
3273 * output lines with trailing backslashes.
3274 * Allow XHASH to always be substituted, even in cases where XCOMM isn't.
3275 */
3276#ifndef CppSedMagic
3277#define CppSedMagic sed -e '/^#  *[0-9][0-9]*  *.*$$/d' \
3278			-e '/^#line  *[0-9][0-9]*  *.*$$/d' \
3279			-e '/^[ 	]*XCOMM$$/s/XCOMM/#/' \
3280			-e '/^[ 	]*XCOMM[^a-zA-Z0-9_]/s/XCOMM/#/' \
3281			-e '/^[ 	]*XHASH/s/XHASH/#/' \
3282			-e '/\@\@$$/s/\@\@$$/\\/'
3283#endif /* CppSedMagic */
3284
3285#ifndef CppFileTarget
3286#define CppFileTarget(dst,src,defs,deplist)				@@\
3287dst::  src deplist							@@\
3288	RemoveFile($@)							@@\
3289	ClearmakeOSName \
3290	$(CPP) CppNoLineInfoOption defs <src | CppSedMagic >$@		@@\
3291									@@\
3292clean::									@@\
3293	RemoveFiles(dst)
3294#endif /* CppFileTarget */
3295
3296/*
3297 * CppScriptTarget - generate rules to create a shell script by running the
3298 * input through cpp.  If the ExecableScripts configuration parameter is not
3299 * set, then make sure that the first line begins with a colon.
3300 */
3301#ifndef CppScriptTarget
3302#if ExecableScripts		/* can use #! instead of colon */
3303#define CppScriptTarget(dst,src,defs,deplist)				@@\
3304dst::	src deplist							@@\
3305	RemoveFile($@)							@@\
3306	ClearmakeOSName \
3307	$(CPP) CppNoLineInfoOption defs <src | CppSedMagic >$@		@@\
3308	chmod a+x $@							@@\
3309									@@\
3310clean::									@@\
3311	RemoveFiles(dst)
3312#else
3313#define CppScriptTarget(dst,src,defs,deplist)				@@\
3314dst::  src deplist							@@\
3315	RemoveFile($@)							@@\
3316	ClearmakeOSName \
3317	echo \: >$@							@@\
3318	sed '1d' src | $(CPP) CppNoLineInfoOption defs | CppSedMagic >>$@	@@\
3319	chmod a+x $@							@@\
3320									@@\
3321clean::									@@\
3322	RemoveFile(dst)
3323#endif /* ExecableScripts */
3324#endif /* CppScriptTarget */
3325
3326
3327/*
3328 * MakeScriptFromCpp - generate rules to create a script from a file with a
3329 * .cpp suffix.
3330 */
3331#ifndef MakeScriptFromCpp
3332#define MakeScriptFromCpp(name,defs)					@@\
3333CppScriptTarget(name,name.cpp,defs,NullParameter)
3334#endif /* MakeScriptFromCpp */
3335
3336#ifndef CppSourceFile
3337#define CppSourceFile(dst,src,defs,deplist)				@@\
3338CppFileTarget(dst,src,defs,deplist)					@@\
3339									@@\
3340includes:: dst								@@\
3341									@@\
3342depend:: dst
3343#endif /* CppSourceFile */
3344
3345/* Like CppFileTarget, but don't add any default defines */
3346#ifndef CppRawFileTarget
3347#define CppRawFileTarget(dst,src,defs,deplist)				@@\
3348dst::  src deplist							@@\
3349	RemoveFile($@)							@@\
3350	ClearmakeOSName \
3351	$(RAWCPP) CppNoLineInfoOption defs <src | CppSedMagic >$@	@@\
3352									@@\
3353clean::									@@\
3354	RemoveFiles(dst)
3355#endif /* CppFileTarget */
3356
3357/*
3358 * CppManTarget - preprocess man pages.  OS-specific man sections are replaced.
3359 */
3360#ifndef CppManTarget
3361#define CppManTarget(name,defs)						@@\
3362AllTarget(name.$(MANNEWSUFFIX))						@@\
3363									@@\
3364name.$(MANNEWSUFFIX): name.$(MANSRCSUFFIX)				@@\
3365	RemoveFile($@)							@@\
3366	if test -z "$(PREPROCESSMANPAGES)" ; then \			@@\
3367	   cd `dirname name` && \					@@\
3368	   $(LN) `basename name.$(MANSRCSUFFIX)` `basename $@`; \	@@\
3369	else \								@@\
3370	     ClearmakeOSName \
3371	     $(RAWCPP) CppNoLineInfoOption $(MANDEFS) defs \		@@\
3372	     < name.$(MANSRCSUFFIX) | CppSedMagic >$@; \		@@\
3373	fi								@@\
3374									@@\
3375clean::									@@\
3376	RemoveFile(name.$(MANNEWSUFFIX))
3377#endif /* CppManTarget */
3378
3379/*
3380 * MakeDirectories - generate rules to create a hierarchy of directories.
3381 */
3382#ifndef MakeDirectories
3383#define MakeDirectories(step,dirs)					@@\
3384step::									@@\
3385	DirFailPrefix@MakeFlagsToShellFlags(i,set +e); \		@@\
3386	for i in dirs; do if [ -d $(DESTDIR)$$i ]; then \		@@\
3387		set +x; else (set -x; $(MKDIRHIER) $(DESTDIR)$$i); fi; \ @@\
3388	done
3389#endif /* MakeDirectories */
3390
3391
3392/*
3393 * AllTarget - generate rules to build necessary things during make all.
3394 */
3395#ifndef AllTarget
3396#define AllTarget(depends)						@@\
3397all:: depends
3398#endif /* AllTarget */
3399
3400#ifdef DefineOldLibraryRules
3401#include <oldlib.rules>
3402#endif
3403
3404#ifndef StaticLibrary
3405#define StaticLibrary(libpath,libname) Concat3(libpath,/,LibraryTargetName(libname))
3406#endif
3407
3408/*
3409 * MakeMutex - generate mutex rules for parallel make
3410 */
3411#ifndef MakeMutex
3412#ifdef MutexDirective
3413#define MakeMutex(targets)						@@\
3414MutexDirective:	targets
3415#endif /* MutexDirective */
3416#endif /* MakeMutex */
3417
3418/*
3419 * Rules for dynamic modules.  These are primarily used by XFree86
3420 */
3421
3422#ifndef LinkBuildModule
3423#ifdef UseInstalled
3424#define LinkBuildModule(module,subdir) $(_NULLCMD_)
3425#else
3426#define LinkBuildModule(module,subdir)\
3427	MakeDir($(BUILDMODULEDIR)/subdir)				@@\
3428	RemoveFile($(BUILDMODULEDIR)/subdir/module)			@@\
3429	@(UP="`$(REVPATH) subdir`"; set -x; \				@@\
3430	  cd $(BUILDMODULEDIR)/subdir && \				@@\
3431		$(LN) $(BUILDMODULETOP)/$${UP}$(CURRENT_DIR)/module .)
3432#endif
3433#endif /* LinkBuildModule */
3434
3435#ifndef LinkBuildNamedModule
3436#ifdef UseInstalled
3437#define LinkBuildNamedModule(module,name,subdir) $(_NULLCMD_)
3438#else
3439#define LinkBuildNamedModule(module,name,subdir)\
3440	MakeDir($(BUILDMODULEDIR)/subdir)				@@\
3441	RemoveFile($(BUILDMODULEDIR)/subdir/name)			@@\
3442	@(UP="`$(REVPATH) subdir`"; set -x; \				@@\
3443	  cd $(BUILDMODULEDIR)/subdir && \				@@\
3444		$(LN) $(BUILDMODULETOP)/$${UP}$(CURRENT_DIR)/module name)
3445#endif
3446#endif /* LinkBuildNamedModule */
3447
3448/*
3449 * ModuleObjectRule
3450 */
3451#ifndef ModuleObjectRule
3452#define ModuleObjectRule() NormalLibraryObjectRule()
3453#endif
3454
3455/*
3456 * ObjectModuleTarget - build a module as a single object file
3457 */
3458#ifndef ObjectModuleTarget
3459#if MakeDllModules && DoLoadableServer
3460#define ObjectModuleTarget(module,objects)				@@\
3461DynamicModuleTarget(Concat(module,_drv.so), objects)
3462#else
3463#define ObjectModuleTarget(module,objects)				@@\
3464NormalRelocatableTarget(Concat(module,_drv), objects)
3465#endif
3466#endif
3467
3468/*
3469 * LibraryModuleTarget
3470 */
3471#ifndef LibraryModuleTarget
3472#if MakeDllModules && DoLoadableServer
3473#define LibraryModuleTarget(module,objects)				@@\
3474NormalLibraryTarget(module, objects)					@@\
3475DynamicModuleTarget(Concat3(lib,module,.so), objects)
3476#else
3477#define LibraryModuleTarget(module, objects)				@@\
3478NormalLibraryTarget(module, objects)
3479#endif
3480#endif
3481
3482/*
3483 * DepLibraryModuleTarget
3484 */
3485#ifndef DepLibraryModuleTarget
3486#if MakeDllModules && DoLoadableServer
3487#define DepLibraryModuleTarget(module,deplist,objects)			@@\
3488NormalDepLibraryTarget(module, deplist, objects)			@@\
3489DepDynamicModuleTarget(Concat3(lib,module,.so), deplist, objects)
3490#else
3491#define DepLibraryModuleTarget(module,deplist,objects)			@@\
3492NormalDepLibraryTarget(module, deplist, objects)
3493#endif
3494#endif
3495
3496/*
3497 * DynamicModuleTarget - build a module to be dynamically loaded
3498 */
3499#ifndef DynamicModuleTarget
3500#define DynamicModuleTarget(module,modlist)				@@\
3501AllTarget(module)							@@\
3502									@@\
3503module: modlist								@@\
3504	RemoveFile($@)							@@\
3505	$(CC) -o $@ $(SHLIBLDFLAGS) $(NOSTDLIB) modlist $(POSTNOSTDLIB) @@\
3506									@@\
3507clean::									@@\
3508	RemoveFile(module)
3509#endif /* DynamicModuleTarget */
3510
3511/*
3512 * DepDynamicModuleTarget - build a module to be dynamically loaded
3513 */
3514#ifndef DepDynamicModuleTarget
3515#define DepDynamicModuleTarget(module,deplist,modlist)			@@\
3516AllTarget(module)							@@\
3517									@@\
3518module: deplist								@@\
3519	RemoveFile($@)							@@\
3520	$(CC) -o $@ $(SHLIBLDFLAGS) $(NOSTDLIB) modlist $(POSTNOSTDLIB) @@\
3521									@@\
3522clean::									@@\
3523	RemoveFile(module)
3524#endif /* DepDynamicModuleTarget */
3525
3526/*
3527 * InstallDynamicModule - install a dynamic module
3528 */
3529#ifndef InstallDynamicModule
3530#define InstallDynamicModule(module,dest,subdir)			@@\
3531AllTarget(module)							@@\
3532	LinkBuildModule(module,subdir)					@@\
3533									@@\
3534install:: module							@@\
3535	MakeDir($(DESTDIR)dest/subdir)					@@\
3536	$(INSTALL) -c $(INSTDATFLAGS) module $(DESTDIR)dest/subdir
3537#endif
3538
3539#ifndef InstallDynamicNamedModule
3540#define InstallDynamicNamedModule(module,instname,dest,subdir)		@@\
3541AllTarget(module)							@@\
3542	LinkBuildNamedModule(module,instname,subdir)			@@\
3543									@@\
3544install:: module							@@\
3545	MakeDir($(DESTDIR)dest/subdir)					@@\
3546	$(INSTALL) -c $(INSTDATFLAGS) module $(DESTDIR)dest/subdir/instname
3547#endif
3548
3549/* Shortcuts for installing driver module, one per class */
3550#ifndef InstallVideoObjectModule
3551#define InstallVideoObjectModule(module,dest)                          @@\
3552InstallObjectModule(module,dest,drivers)
3553#endif
3554#ifndef InstallInputObjectModule
3555#define InstallInputObjectModule(module,dest)                          @@\
3556InstallObjectModule(module,dest,input)
3557#endif
3558#ifndef InstallExtensionsObjectModule
3559#define InstallExtensionsObjectModule(module,dest)                     @@\
3560InstallObjectModule(module,dest,extensions)
3561#endif
3562#ifndef InstallFontsObjectModule
3563#define InstallFontsObjectModule(module,dest)                          @@\
3564InstallObjectModule(module,dest,fonts)
3565#endif
3566#ifndef InstallMultimediaObjectModule
3567#define InstallMultimediaObjectModule(module,dest)                     @@\
3568InstallObjectModule(module,dest,multimedia)
3569#endif
3570
3571#ifndef InstallObjectModule
3572#if !DoLoadableServer
3573#define InstallObjectModule(module,dest,subdir)	/**/
3574#else
3575#if MakeDllModules
3576#define InstallObjectModule(module,dest,subdir)				@@\
3577InstallDynamicModule(Concat(module,_drv.so),dest,subdir)
3578#else
3579#define InstallObjectModule(module,dest,subdir)				@@\
3580InstallDynamicModule(Concat(module,_drv.o),dest,subdir)
3581#endif
3582#endif
3583#endif
3584
3585#ifndef InstallLibraryModule
3586#if !DoLoadableServer
3587#define InstallLibraryModule(module,dest,subdir)	/**/
3588#else
3589#if MakeDllModules
3590#define InstallLibraryModule(module,dest,subdir)			@@\
3591InstallDynamicModule(Concat3(lib,module,.so),dest,subdir)
3592#else
3593#define InstallLibraryModule(module,dest,subdir)			@@\
3594InstallDynamicModule(ModuleLibraryTargetName(module),dest,subdir)
3595#endif
3596#endif
3597#endif
3598
3599#ifndef InstallModuleManPage
3600#define InstallModuleManPage(module)					@@\
3601InstallGenManPage(module,$(DRIVERMANDIR),$(DRIVERMANSUFFIX))
3602#endif
3603
3604#ifndef BuildObjectFromLibraryWithPath
3605#define BuildObjectFromLibraryWithPath(libpath,libname,objname)		@@\
3606AllTarget(objname.Osuf)							@@\
3607									@@\
3608objname.Osuf: Concat3(libpath,/lib,libname.a)				@@\
3609	@$(MKDIRHIER) tmp						@@\
3610	@$(CP) Concat3(libpath,/lib,libname.a) tmp			@@\
3611	@(cd tmp; set -x; ArExtCmd Concat(lib,libname.a); \		@@\
3612	  $(LD) $(LDCOMBINEFLAGS) *.Osuf -o ../$@; \			@@\
3613	  RemoveFiles(*.Osuf))						@@\
3614	@$(RM) -r tmp							@@\
3615									@@\
3616clean::									@@\
3617	RemoveFile(objname.Osuf)
3618#endif
3619
3620#ifndef BuildObjectFromLibrary
3621#define BuildObjectFromLibrary(libname,objname) BuildObjectFromLibraryWithPath(.,libname,objname)
3622#endif
3623
3624/*
3625 * LinkerRuntimeLibraryPathFlag - defined here to be a no-op for systems that
3626 * don't need it.   Overridden in system-specific config files for systems that
3627 * need it, usually with something like "Concat(-R,path)"
3628 */
3629#ifndef LinkerRuntimeLibraryPathFlag
3630# define LinkerRuntimeLibraryPathFlag(path)  /* */
3631#endif
3632
3633/* Phony targets - GNU make has a feature to mark a target as phony,
3634 * which means that it won't consider that target to be the name of a
3635 * file.  In general this speeds up make, since it doesn't have to
3636 * look for those files when it sets out to create a phony target.
3637 * However, on cygwin, this is actually required for correct
3638 * operation, since the Win32 filesystems are case insensitive and the
3639 * install target conflicts with the INSTALL file present in some
3640 * (autotooled) directories.
3641 *
3642 * We probably don't need the #ifdef protection, since other make
3643 * implementations would just consider this a normal rule.  Better
3644 * safe than sorry, though.
3645 */
3646#if HasGnuMake
3647.PHONY: all interfaces install install.man install.lib install.sdk \
3648	depend includes clean
3649#endif
3650