home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / X11R6 / lib / X11 / config / Imake.rules < prev    next >
Text File  |  1999-09-03  |  84KB  |  2,658 lines

  1. XCOMM ---------------------------------------------------------------------
  2. XCOMM Imake rules for building libraries, programs, scripts, and data files
  3. XCOMM rules:  $TOG: Imake.rules /main/222 1997/07/17 20:04:40 kaleb $
  4. XCOMM rules:  $XFree86: xc/config/cf/Imake.rules,v 3.33.2.10 1998/11/04 10:53:01 dawes Exp $
  5.  
  6. /*
  7.  *           MACHINE-INDEPENDENT RULES; DO NOT MODIFY
  8.  *
  9.  * Warning, when defining rules: make sure you do not include both a trailing
  10.  * backslash and double ampersand backslash or else you will get an extra
  11.  * backslash in the Makefile.
  12.  * 
  13.  * The following macros are defined for the various templates and Imakefiles
  14.  * (for a list of the applicable make variables, see the template files):
  15.  * 
  16.  * Concat            (a,b)
  17.  * Concat3            (a,b,c)
  18.  * Concat4            (a,b,c,d)
  19.  * _Use                (a,b)
  20.  * _UseCat            (a,b,c)
  21.  * _MUse            (a,b)
  22.  * _MUseCat            (a,b,c)
  23.  * ProgramTargetName        (target)
  24.  * RunProgram            (progvar,options)
  25.  * RunProgramWithSetup        (setup,progvar,options)
  26.  * RemoveFile            (file)
  27.  * RemoveFiles            (files)
  28.  * CenterLoadTarget        (target,srclist,libs,defines)
  29.  * CenterProgramTarget        (program,srclist,objlist,locallibs,syslibs)
  30.  * SentinelLinkTarget        (step,program,linklist)
  31.  * SentinelProgramTarget    (program,deplist,linklist)
  32.  * SentinelCplusplusProgramTarget    (program,deplist,linklist)
  33.  * PurifyLinkTarget        (step,program,linklist)
  34.  * PurifyProgramTarget        (program,deplist,linklist)
  35.  * PurifyCplusplusProgramTarget    (program,deplist,linklist)
  36.  * ProofLinkTarget        (step,program,linklist)
  37.  * ProofProgramTarget        (program,deplist,linklist)
  38.  * ProofCplusplusProgramTarget    (program,deplist,linklist)
  39.  * ProofCleanTarget        ()
  40.  * RemoveTargetProgram        (program)
  41.  * MakeDir            (dir)
  42.  * BuildIncludesTop        (srclist)
  43.  * BuildIncludes        (srclist,dstsubdir,dstupdir)
  44.  * LinkRule            (program,options,objects,libraries)
  45.  * HostLinkRule            (program,options,objects,libraries)
  46.  * NoCmpScript            (target)
  47.  * NoConfigRec            (target)
  48.  * NormalProgramTarget        (program,objects,deplibs,locallibs,syslibs)
  49.  * SetUIDProgramTarget        (program,objects,deplibs,locallibs,syslibs)
  50.  * SingleProgramTarget        (program,objects,locallibs,syslibs)
  51.  * SimpleProgramTarget        (program)
  52.  * ComplexProgramTarget        (program)
  53.  * ComplexProgramTarget_1    (program,locallib,syslib)
  54.  * ComplexProgramTarget_2    (program,locallib,syslib)
  55.  * ComplexProgramTarget_3    (program,locallib,syslib)
  56.  * ServerTargetWithFlags    (server,subdirs,objects,libs,syslibs,flags)
  57.  * ServerTarget            (server,subdirs,objects,libs,syslibs)
  58.  * MoveToBakFile        (file)
  59.  * RMoveToBakFile        (file)
  60.  * RanLibrary            (args)
  61.  * LibraryTargetName        (libname)
  62.  * LibraryTargetNameSuffix    (libname,suffix)
  63.  * InstallNamedTarget        (step,srcname,flags,dest,dstname)
  64.  * InstallTarget        (step,file,flags,dest)
  65.  * InstallLibrary        (libname,dest)
  66.  * MergeIntoInstalledLibrary    (tolib,fromlib)
  67.  * InstallLibraryAlias        (libname,alias,dest)
  68.  * InstallLintLibrary        (libname,dest)
  69.  * InstallManPageLong        (file,destdir,dest)
  70.  * InstallManPage        (file,destdir)
  71.  * InstallManPageAliases    (file,destdir,aliases)
  72.  * ManKeywordsTarget        (manpath)
  73.  * InstallNamedNonExec        (srcname,dstname,dest)
  74.  * InstallNonExecFile        (file,dest)
  75.  * InstallNonExecFileNoClobber    (file,dest)
  76.  * InstallNonExec        (file,dest)
  77.  * InstallProgramWithFlags    (program,dest,flags)
  78.  * InstallProgram        (program,dest)
  79.  * InstallScript        (program,dest)
  80.  * InstallNamedProg        (srcname,dstname,dest)
  81.  * InstallNamedProgNoClobber    (srcname,dstname,dest)
  82.  * MakeFlagsToShellFlags    (makeflags,shellcmd)
  83.  * MakeNamedTargetSubdir    (dir,flags,subname)
  84.  * LinkFileList            (step,list,dir,sub)
  85.  * LinkVarDirectory        (mdir,cdir,rdir,ldir)
  86.  * InstallMultipleDestFlags    (step,list,dest,flags)
  87.  * InstallMultipleDest        (step,list,dest)
  88.  * InstallMultiple        (list,dest)
  89.  * InstallMultipleFlags        (list,dest,flags)
  90.  * InstallMultipleMan        (list,dest)
  91.  * DependDependency        ()
  92.  * DependTarget            ()
  93.  * DependTarget3        (srcs1,srcs2,srcs3)
  94.  * CleanTarget            ()
  95.  * TagsTarget            ()
  96.  * ImakeDependency        (target)
  97.  * BuildMakefileTarget        (notused,imakeflags)
  98.  * MakefileTarget        ()
  99.  * LibMkdir            (dir)
  100.  * LibCleanDir            (dir)
  101.  * LintLibReferences        (varname,libname,libsource)
  102.  * UnsharedLibReferences    (varname,libname,libsource)
  103.  * ProjectUnsharedLibReferences    (varname,libname,libsource,buildlibdir)
  104.  * SharedLibDependencies    (libname,libsource,revname)
  105.  * SharedDSLibDependencies    (libname,libsource,revname)
  106.  * SharedLibReferences        (varname,libname,libsource,revname,rev)
  107.  * SharedDSLibReferences    (varname,libname,libsource,revname,rev)
  108.  * ObjectCompile        (options)
  109.  * NormalLibObjCompile        (options)
  110.  * NormalSharedLibObjCompile    (options)
  111.  * LibObjCompile        (dir,options)
  112.  * DebuggedLibObjCompile    (options)
  113.  * ProfiledLibObjCompile    (options)
  114.  * SharedLibObjCompile        (options)
  115.  * NormalLibraryObjectRule    ()
  116.  * NormalFortranObjectRule    ()
  117.  * ObjectFromSpecialSource    (dst,src,flags)
  118.  * SpecialObjectRule        (objs,depends,options)
  119.  * SpecialCObjectRule        (basename,depends,options)
  120.  * LexFile            (file)
  121.  * YaccFile            (file,flags)
  122.  * YaccFileNoFlags        (file)
  123.  * MakeLibrary            (libname,objlist)
  124.  * NormalLibraryTarget        (libname,objlist)
  125.  * NormalLibraryTarget2        (libname,objlist1,objlist2)
  126.  * NormalLibraryTarget3        (libname,objlist1,objlist2,objlist3)
  127.  * NormalDepLibraryTarget    (libname,deplist,objlist)
  128.  * UnsharedLibraryTarget    (libname,objlist,down,up)
  129.  * UnsharedLibraryTarget3    (libname,objlist1,objlist2,objlist3,down,up)
  130.  * SubdirLibraryRule        (objlist)
  131.  * ProfiledLibraryTarget    (libname,objlist)
  132.  * DebuggedLibraryTarget    (libname,objlist)
  133.  * AliasedLibraryTarget        (libname,alias)
  134.  * NormalRelocatableTarget    (objname,objlist)
  135.  * ProfiledRelocatableTarget    (objname,objlist)
  136.  * DebuggedRelocatableTarget    (objname,objlist)
  137.  * LintLibraryTarget        (libname,srclist)
  138.  * NormalLintTarget        (srclist)
  139.  * LintTarget            ()
  140.  * LinkSourceFile        (src,dir)
  141.  * LinkFile            (tofile,fromfile)
  142.  * MakeSubincludesForBuild    (step,dir,srclist)
  143.  * LangNamedTargetSubdirs    (lang,name,dirs,verb,flags,subname)
  144.  * LangNamedMakeSubdirs        (lang,name,dirs)
  145.  * LangMakeSubdirs        (lang,dirs)
  146.  * NamedTargetSubdirs        (name,dirs,verb,flags,subname)
  147.  * NamedMakeSubdirs        (name,dirs)
  148.  * MakeSubdirs            (dirs)
  149.  * DependSubdirs        (dirs)
  150.  * ForceSubdirs            (dirs)
  151.  * InstallSubdirs        (dirs)
  152.  * InstallManSubdirs        (dirs)
  153.  * IncludesSubdirs        (dirs)
  154.  * NamedCleanSubdirs        (name,dirs)
  155.  * CleanSubdirs            (dirs)
  156.  * NamedTagSubdirs        (name,dirs)
  157.  * TagSubdirs            (dirs)
  158.  * MakeLintSubdirs        (dirs,target,subtarget)
  159.  * LintSubdirs            (dirs)
  160.  * MakeLintLibSubdirs        (dirs)
  161.  * MakeMakeSubdirs        (dirs,target)
  162.  * MakefileSubdirs        (dirs)
  163.  * CppScriptTarget        (dst,src,defs,deplist)
  164.  * MakeScriptFromCpp        (name,defs)
  165.  * CppFileTarget        (dst,src,defs,deplist)
  166.  * CppSourceFile        (dst,src,defs,deplist)
  167.  * MakeDirectories        (step,dirs)
  168.  * AllTarget            (depends)
  169.  * StaticLibrary        (libpath,libname)
  170.  * MakeMutex            (targets)
  171.  *
  172.  *
  173.  * The following are in specific <os>Lib.rules:
  174.  *
  175.  * SharedLibraryTarget        (libname,rev,solist,down,up)
  176.  * SharedLibraryDataTarget    (libname,rev,salist)
  177.  * InstallSharedLibrary        (libname,rev,dest)
  178.  * InstallSharedLibraryData    (libname,rev,dest)
  179.  * 
  180.  */
  181.  
  182. #define NullParameter
  183.  
  184. /* if [ -d ] or [ ! -d ] causes make to fail, define this as - */
  185. #ifndef DirFailPrefix
  186. #define DirFailPrefix
  187. #endif
  188.  
  189. /*
  190.  * NoCmpScript - suppress clearmake build script comparison.
  191.  */
  192. #ifndef NoCmpScript
  193. #if HasClearmake
  194. #define NoCmpScript(targ)                        @@\
  195. XCOMM special target for clearmake                    @@\
  196. .NO_CMP_SCRIPT: targ
  197. #else
  198. #define NoCmpScript(targ) /**/
  199. #endif
  200. #endif
  201.  
  202. /*
  203.  * NoConfigRec - suppress using clearmake configuration records.
  204.  */
  205. #ifndef NoConfigRec
  206. #if HasClearmake
  207. #define NoConfigRec(targ)                        @@\
  208. XCOMM special target for clearmake                    @@\
  209. .NO_CONFIG_REC: targ
  210. #else
  211. #define NoConfigRec(targ) /**/
  212. #endif
  213. #endif
  214.  
  215. /*
  216.  * Concat - concatenates two strings.
  217.  */
  218. #ifndef Concat
  219. #if (__STDC__ && !defined(UnixCpp)) || defined(AnsiCpp)
  220. #define Concat(a,b)a##b
  221. #else
  222. #define Concat(a,b)a/**/b
  223. #endif
  224. #endif
  225.  
  226. /*
  227.  * Concat3 - concatenates three strings.
  228.  */
  229. #ifndef Concat3
  230. #if (__STDC__ && !defined(UnixCpp)) || defined(AnsiCpp)
  231. #define Concat3(a,b,c)a##b##c
  232. #else
  233. #define Concat3(a,b,c)a/**/b/**/c
  234. #endif
  235. #endif
  236.  
  237. /*
  238.  * Concat4 - concatenates four strings.
  239.  */
  240. #ifndef Concat4
  241. #if (__STDC__ && !defined(UnixCpp)) || defined(AnsiCpp)
  242. #define Concat4(a,b,c,d)a##b##c##d
  243. #else
  244. #define Concat4(a,b,c,d)a/**/b/**/c/**/d
  245. #endif
  246. #endif
  247.  
  248. /*
  249.  * _XUse - makes a choice based on UseInstalledX11.
  250.  */
  251. #ifndef _XUse
  252. # if defined(UseInstalled) || UseInstalledX11
  253. #  define _XUse(a,b) a
  254. # else
  255. #  define _XUse(a,b) b
  256. # endif
  257. #endif /* _XUse */
  258.  
  259. /*
  260.  * _Use - makes a choice based on UseInstalled.
  261.  */
  262. #ifndef _Use
  263. # define _Use    _XUse
  264. #endif /* _Use */
  265.  
  266. /*
  267.  * _XUseCat - combination of _XUse and Concat.
  268.  *           exists to avoid problems with some preprocessors
  269.  */
  270. #ifndef _XUseCat
  271. # if (__STDC__ && !defined(UnixCpp)) || defined(AnsiCpp)
  272. #  if defined(UseInstalled) || UseInstalledX11
  273. #   define _XUseCat(a,b,c) a##c
  274. #  else
  275. #   define _XUseCat(a,b,c) b##c
  276. #  endif
  277. # else
  278. #  if defined(UseInstalled) || UseInstalledX11
  279. #   define _XUseCat(a,b,c) a/**/c
  280. #  else
  281. #   define _XUseCat(a,b,c) b/**/c
  282. #  endif
  283. # endif
  284. #endif /* _XUseCat */
  285.  
  286. /*
  287.  * _UseCat - combination of _Use and Concat.
  288.  *           exists to avoid problems with some preprocessors
  289.  */
  290. #ifndef _UseCat
  291. # define _UseCat    _XUseCat
  292. #endif /* _UseCat */
  293.  
  294. #ifndef ProgramTargetName
  295. #define ProgramTargetName(target)target
  296. #endif
  297.  
  298. #ifndef RunProgram
  299. #define RunProgram(progvar,options) $(progvar) options
  300. #endif
  301.  
  302. #ifndef RunProgramWithSetup
  303. #define RunProgramWithSetup(setup,progvar,options) setup $(progvar) options
  304. #endif
  305.  
  306. #ifndef RemoveFile
  307. #define RemoveFile(file) $(RM) file
  308. #endif /* RemoveFile */
  309.  
  310. #ifndef RemoveFiles
  311. #define RemoveFiles(files) $(RM) files
  312. #endif /* RemoveFiles */
  313.  
  314. /*
  315.  * CenterLoadTarget - generate rules to load files into CodeCenter
  316.  */
  317. #ifndef CenterLoadTarget
  318. #if HasCodeCenter
  319. #define CenterLoadTarget(target,srclist,libs,defines)            @@\
  320. ProgramTargetName(target):: srclist                    @@\
  321.     XCOMM load defines srclist libs
  322. #else
  323. #define CenterLoadTarget(target,srclist,libs,defines) /**/
  324. #endif
  325. #endif /* CenterLoadTarget */
  326.  
  327. /*
  328.  * CenterProgramTarget - generate rules to make CodeCenter read in sources
  329.  * and objects.
  330.  */
  331. #ifndef CenterProgramTarget
  332. #define CenterProgramTarget(program,srclist,objlist,locallibs,syslibs)    @@\
  333. CenterLoadTarget(Concat(debug_,program),srclist,$(EXTRA_LDOPTIONS) $(LOCAL_LDFLAGS) $(LDPRELIBS) locallibs $(LDLIBS) syslibs,$(ALLDEFINES)) @@\
  334.                                     @@\
  335. CenterLoadTarget(Concat(odebug_,program),objlist,$(EXTRA_LDOPTIONS) $(LOCAL_LDFLAGS) $(LDPRELIBS) locallibs $(LDLIBS) syslibs,$(ALLDEFINES))
  336. #endif /* CenterProgramTarget */
  337.  
  338. #ifndef SentinelLinkTarget
  339. #if HasSentinel
  340. #define SentinelLinkTarget(step,program,linklist)            @@\
  341. ProgramTargetName(step.sentinel):                    @@\
  342.     RemoveTargetProgram($@)                        @@\
  343.     $(CCENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CC) -o program.sentinel $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
  344. #else
  345. #define SentinelLinkTarget(step,program,linklist) /**/
  346. #endif
  347. #endif /* SentinelLinkTarget */
  348.  
  349. /*
  350.  * SentinelProgramTarget - generate rules to make Sentinel image
  351.  */
  352. #ifndef SentinelProgramTarget
  353. #if HasSentinel
  354. #define    SentinelProgramTarget(program,deplist,linklist)            @@\
  355. ProgramTargetName(program.sentinel): deplist                @@\
  356.     RemoveTargetProgram($@)                        @@\
  357.     $(CCENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  358.                                     @@\
  359. clean clean.sentinel::                            @@\
  360.     RemoveFile(program.sentinel)
  361. #else
  362. #define    SentinelProgramTarget(program,deplist,linklist) /**/
  363. #endif
  364. #endif /* SentinelProgramTarget */
  365.  
  366. /*
  367.  * SentinelCplusplusProgramTarget - generate rules to make Sentinel image 
  368.  */
  369. #ifndef SentinelCplusplusProgramTarget
  370. #if HasSentinel
  371. #define    SentinelCplusplusProgramTarget(program,deplist,linklist)    @@\
  372. ProgramTargetName(program.sentinel): deplist                @@\
  373.     RemoveTargetProgram($@)                        @@\
  374.     $(CXXENVSETUP) $(SENTINEL) $(SENTINELOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  375.                                     @@\
  376. clean clean.sentinel::                            @@\
  377.     RemoveFile(program.sentinel)
  378. #else
  379. #define    SentinelCplusplusProgramTarget(program,deplist,linklist) /**/
  380. #endif
  381. #endif /* SentinelCplusplusProgramTarget */
  382.  
  383. #ifndef PurifyLinkTarget
  384. #if HasPurify
  385. #define PurifyLinkTarget(step,program,linklist)                @@\
  386. ProgramTargetName(step.pure):                        @@\
  387.     RemoveTargetProgram($@)                        @@\
  388.     $(CCENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CC) -o program.pure $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
  389. #else
  390. #define PurifyLinkTarget(step,program,linklist) /**/
  391. #endif
  392. #endif /* PurifyLinkTarget */
  393.  
  394. /*
  395.  * PurifyProgramTarget - generate rules to make Purify'ed image
  396.  */
  397. #ifndef PurifyProgramTarget
  398. #if HasPurify
  399. #define    PurifyProgramTarget(program,deplist,linklist)            @@\
  400. ProgramTargetName(program.pure): deplist                @@\
  401.     RemoveTargetProgram($@)                        @@\
  402.     $(CCENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  403.                                     @@\
  404. clean clean.pure::                            @@\
  405.     RemoveFile(program.pure)
  406. #else
  407. #define    PurifyProgramTarget(program,deplist,linklist) /**/
  408. #endif
  409. #endif /* PurifyProgramTarget */
  410.  
  411. /*
  412.  * PurifyCplusplusProgramTarget - generate rules to make Purify'ed image
  413.  */
  414. #ifndef PurifyCplusplusProgramTarget
  415. #if HasPurify
  416. #define    PurifyCplusplusProgramTarget(program,deplist,linklist)        @@\
  417. ProgramTargetName(program.pure): deplist                @@\
  418.     RemoveTargetProgram($@)                        @@\
  419.     $(CXXENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  420.                                     @@\
  421. clean clean.pure::                            @@\
  422.     RemoveFile(program.pure)
  423. #else
  424. #define    PurifyCplusplusProgramTarget(program,deplist,linklist) /**/
  425. #endif
  426. #endif /* PurifyCplusplusProgramTarget */
  427.  
  428. #ifndef ProofLinkTarget
  429. #if HasTestCenter
  430. #define ProofLinkTarget(step,program,linklist)                @@\
  431. ProgramTargetName(step.tc):                        @@\
  432.     RemoveTargetProgram($@)                        @@\
  433.     $(CCENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CC) -o program.tc $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS)
  434. #else
  435. #define ProofLinkTarget(step,program,linklist) /**/
  436. #endif
  437. #endif /* ProofLinkTarget */
  438.  
  439. /*
  440.  * ProofProgramTarget - generate rules to make Proof'ed image
  441.  */
  442. #ifndef ProofProgramTarget
  443. #if HasTestCenter
  444. #define    ProofProgramTarget(program,deplist,linklist)            @@\
  445. ProgramTargetName(program.tc): deplist                    @@\
  446.     RemoveTargetProgram($@)                        @@\
  447.     $(CCENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CC) -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  448.                                     @@\
  449. clean clean.tc::                            @@\
  450.     RemoveFiles(program.tc program.tc.*.*)
  451. #else
  452. #define    ProofProgramTarget(program,deplist,linklist) /**/
  453. #endif
  454. #endif /* ProofProgramTarget */
  455.  
  456. /*
  457.  * ProofCplusplusProgramTarget - generate rules to make Proof'ed image
  458.  */
  459. #ifndef ProofCplusplusProgramTarget
  460. #if HasTestCenter
  461. #define    ProofCplusplusProgramTarget(program,deplist,linklist)        @@\
  462. ProgramTargetName(program.tc): deplist                    @@\
  463.     RemoveTargetProgram($@)                        @@\
  464.     $(CXXENVSETUP) $(PROOF) $(PROOFOPTIONS) $(CXX) -o $@ $(CXXLDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) @@\
  465.                                     @@\
  466. clean clean.tc::                            @@\
  467.     RemoveFiles(program.tc program.tc.*.*)
  468. #else
  469. #define    ProofCplusplusProgramTarget(program,deplist,linklist) /**/
  470. #endif
  471. #endif /* ProofCplusplusProgramTarget */
  472.  
  473. #ifndef ProofCleanTarget
  474. #if HasTestCenter
  475. #define ProofCleanTarget()                        @@\
  476. clean clean.tc::                            @@\
  477.     $(RM) -r TC.Cache
  478. #else
  479. #define ProofCleanTarget() /**/
  480. #endif
  481. #endif /* ProofCleanTarget */
  482.  
  483. #ifndef RemoveTargetProgram
  484. #if RemoveTargetProgramByMoving
  485. #define RemoveTargetProgram(program) \
  486. -if [ -f program ]; then RemoveFile(Concat(program,~)); $(MV) program Concat(program,~); fi
  487. #else
  488. #define RemoveTargetProgram(program) RemoveFile(program)
  489. #endif
  490. #endif /* RemoveTargetProgram */
  491.  
  492. #ifndef MakeDir
  493. #define MakeDir(dir) DirFailPrefix@if [ -d dir ]; then set +x; \    @@\
  494.         else (set -x; $(MKDIRHIER) dir); fi
  495. #endif /* MakeDir */
  496.  
  497. #ifndef BuildIncludesTop
  498. #define BuildIncludesTop(srclist)                    @@\
  499. includes:: srclist                            @@\
  500.     MakeDir($(BUILDINCDIR))                        @@\
  501.     @(set -x; cd $(BUILDINCDIR) && for i in srclist; do \        @@\
  502.         RemoveFile($$i); \                    @@\
  503.         $(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/$$i .; \        @@\
  504.     done)
  505. #endif /* BuildIncludesTop */
  506.  
  507. #ifndef BuildIncludes
  508. #define BuildIncludes(srclist,dstsubdir,dstupdir)            @@\
  509. includes:: srclist                            @@\
  510.     MakeDir($(BUILDINCDIR)/dstsubdir)                @@\
  511.     @(set -x; cd $(BUILDINCDIR)/dstsubdir && for i in srclist; do \    @@\
  512.         RemoveFile($$i); \                    @@\
  513.         $(LN) $(BUILDINCTOP)/dstupdir/$(CURRENT_DIR)/$$i .; \    @@\
  514.     done)
  515. #endif /* BuildIncludes */
  516.  
  517. /*
  518.  * LinkBuildBinary - export a binary from the build tree.
  519.  */
  520. #ifndef LinkBuildBinary
  521. #define LinkBuildBinary(binary)                        @@\
  522. all:: $(BUILDBINDIR)/binary binary                    @@\
  523.                                     @@\
  524. $(BUILDBINDIR)/binary: binary                        @@\
  525.     RemoveFile($@)                            @@\
  526.     cd $(BUILDBINDIR) && $(LN) $(BUILDBINTOP)/$(CURRENT_DIR)/binary .
  527. #endif /* LinkBuildBinary */
  528.  
  529. #ifndef BuildInterfaces
  530. #define BuildInterfaces(srclist,dstsubdir,dstupdir)            @@\
  531. interfaces::                                @@\
  532.     MakeDir($(BUILDINCDIR)/dstsubdir)                @@\
  533.     @(set -x; cd $(BUILDINCDIR)/dstsubdir && for i in srclist; do \    @@\
  534.         RemoveFile($$i); \                    @@\
  535.         $(LN) $(BUILDINCTOP)/dstupdir/$(CURRENT_DIR)/$$i .; \    @@\
  536.     done)
  537. #endif /* BuildInterfaces */
  538.  
  539. /*
  540.  * LinkRule - link a program
  541.  */
  542. #ifndef LinkRule
  543. #define LinkRule(program,options,objects,libraries) \
  544. $(CCLINK) -o program options objects libraries $(EXTRA_LOAD_FLAGS)
  545. #endif /* LinkRule */
  546.  
  547. /*
  548.  * HostLinkRule - link a utility to be used on the build host
  549.  * (differs from LinkRule if cross compiling)
  550.  */
  551. #ifndef HostLinkRule
  552. #define HostLinkRule LinkRule
  553. #endif
  554.  
  555. #ifndef CplusplusLinkRule
  556. #define CplusplusLinkRule(program,options,objects,libraries) \
  557. $(CXXLINK) -o program options objects libraries $(EXTRA_LOAD_FLAGS)
  558. #endif /* CplusplusLinkRule */
  559.  
  560. /*
  561.  * NormalProgramTarget - generate rules to compile and link the indicated 
  562.  * program; since it does not use any default object files, it may be used for
  563.  * multiple programs in the same Imakefile.
  564.  */
  565. #ifndef NormalProgramTarget
  566. #define    NormalProgramTarget(program,objects,deplibs,locallibs,syslibs)    @@\
  567. ProgramTargetName(program): objects deplibs                @@\
  568.     RemoveTargetProgram($@)                        @@\
  569.     LinkRule($@,$(LDOPTIONS),objects,locallibs $(LDLIBS) syslibs)    @@\
  570.                                     @@\
  571. SentinelProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  572. PurifyProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  573. ProofProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  574.                                     @@\
  575. clean::                                    @@\
  576.     RemoveFile(ProgramTargetName(program))
  577. #endif /* NormalProgramTarget */
  578.  
  579.  
  580. /*
  581.  * NormalCplusplusProgramTarget - Like NormalTargetProgram, but uses
  582.  * C++ linking rules.
  583.  */
  584. #ifndef NormalCplusplusProgramTarget
  585. #define    NormalCplusplusProgramTarget(program,objects,deplibs,locallibs,syslibs)    @@\
  586. ProgramTargetName(program): objects deplibs                @@\
  587.     RemoveTargetProgram($@)                        @@\
  588.     CplusplusLinkRule($@,$(CXXLDOPTIONS),objects,locallibs $(LDLIBS) syslibs) @@\
  589.                                     @@\
  590. SentinelCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  591. PurifyCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  592. ProofCplusplusProgramTarget(program,objects deplibs,objects locallibs $(LDLIBS) syslibs) @@\
  593.                                     @@\
  594. clean::                                    @@\
  595.     RemoveFile(ProgramTargetName(program))
  596. #endif /* NormalCplusplusProgramTarget */
  597.  
  598.  
  599. #ifndef SetUIDProgramTarget
  600. #define SetUIDProgramTarget NormalProgramTarget
  601. #endif
  602.  
  603.  
  604. /*
  605.  * SingleProgramTarget - obsolete version of NormalProgramTarget that does
  606.  * not have deplibs.
  607.  */
  608. #ifndef SingleProgramTarget
  609. #define    SingleProgramTarget(program,objects,locallibs,syslibs)        @@\
  610. NormalProgramTarget(program,objects,NullParameter,locallibs,syslibs)
  611. #endif /* SingleProgramTarget */
  612.  
  613. /*
  614.  * SimpleProgramTarget - generate rules for compiling and linking programs
  615.  * that only have one C source file.  It should only be used in Imakefiles 
  616.  * that describe a single program.
  617.  */
  618. #ifndef SimpleProgramTarget
  619. #define    SimpleProgramTarget(program)                    @@\
  620.            OBJS = program.o                        @@\
  621.            SRCS = program.c                        @@\
  622.                                     @@\
  623. ComplexProgramTarget(program)
  624. #endif /* SimpleProgramTarget */
  625.  
  626. #ifndef SimpleCplusplusProgramTarget
  627. #define SimpleCplusplusProgramTarget(program)                @@\
  628.            OBJS = program.o                        @@\
  629.            SRCS = program.CCsuf                        @@\
  630.                                     @@\
  631. ComplexCplusplusProgramTarget(program)
  632. #endif /* SimpleCplusplusProgramTarget */
  633.  
  634. #ifndef ProgramTargetHelper
  635. #define    ProgramTargetHelper(program,srcs,objs,deplib,locallib,syslib)    @@\
  636. ProgramTargetName(program): $(objs) $(deplib)                @@\
  637.     RemoveTargetProgram($@)                        @@\
  638.     LinkRule($@,$(LDOPTIONS),$(objs),locallib $(LDLIBS) syslib)    @@\
  639.                                     @@\
  640. CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)        @@\
  641. SentinelProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  642. PurifyProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  643. ProofProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  644.                                     @@\
  645. InstallProgram(program,$(BINDIR))                    @@\
  646. InstallManPage(program,$(MANDIR))
  647. #endif /* ProgramTargetHelper */
  648.  
  649. #ifndef ProgramTargetHelperNoMan
  650. #define ProgramTargetHelperNoMan(program,srcs,objs,deplib,locallib,syslib) @@\
  651. ProgramTargetName(program): $(objs) $(deplib)                @@\
  652.     RemoveTargetProgram($@)                        @@\
  653.     LinkRule($@,$(LDOPTIONS),$(objs),locallib $(LDLIBS) syslib)    @@\
  654.                                     @@\
  655. CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)        @@\
  656. SentinelProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  657. PurifyProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  658. ProofProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  659.                                     @@\
  660. InstallProgram(program,$(BINDIR))
  661. #endif /* ProgramTargetHelperNoMan */
  662.  
  663. #ifndef CplusplusProgramTargetHelper
  664. #define    CplusplusProgramTargetHelper(program,srcs,objs,deplib,locallib,syslib) @@\
  665. ProgramTargetName(program): $(objs) $(deplib)                @@\
  666.     RemoveTargetProgram($@)                        @@\
  667.     CplusplusLinkRule($@,$(CXXLDOPTIONS),$(objs),locallib $(LDLIBS) syslib) @@\
  668.                                     @@\
  669. CenterProgramTarget(program,$(srcs),$(objs),locallib,syslib)        @@\
  670. SentinelCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  671. PurifyCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  672. ProofCplusplusProgramTarget(program,$(objs) $(deplib),$(objs) locallib $(LDLIBS) syslib) @@\
  673.                                     @@\
  674. InstallProgram(program,$(BINDIR))                    @@\
  675. InstallManPage(program,$(MANDIR))
  676. #endif /* CplusplusProgramTargetHelper */
  677.  
  678. /*
  679.  * ComplexProgramTarget - generate rules for compiling and linking the 
  680.  * program specified by $(OBJS) and $(SRCS), installing the program and its
  681.  * man page, and generating dependencies.  It should only be used in 
  682.  * Imakefiles that describe a single program.
  683.  */
  684. #ifndef ComplexProgramTarget
  685. #define    ComplexProgramTarget(program)                    @@\
  686.         PROGRAM = program                        @@\
  687.                                     @@\
  688. AllTarget(program)                            @@\
  689.                                     @@\
  690. ProgramTargetHelper(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
  691.                                     @@\
  692. DependTarget()                                @@\
  693. LintTarget()                                @@\
  694.                                     @@\
  695. clean::                                    @@\
  696.     RemoveFile(ProgramTargetName(program))
  697. #endif /* ComplexProgramTarget */
  698.  
  699. #ifndef ComplexCplusplusProgramTarget
  700. #define    ComplexCplusplusProgramTarget(program)                @@\
  701.         PROGRAM = program                        @@\
  702.                                     @@\
  703. AllTarget(program)                            @@\
  704.                                     @@\
  705. CplusplusProgramTargetHelper(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
  706.                                     @@\
  707. DependTarget()                                @@\
  708. LintTarget()                                @@\
  709.                                     @@\
  710. clean::                                    @@\
  711.     RemoveFile(ProgramTargetName(program))
  712. #endif /* ComplexCplusplusProgramTarget */
  713.  
  714. /*
  715.  * ComplexProgramTargetNoMan - generate rules for compiling and linking
  716.  * the program specified by $(OBJS) and $(SRCS), installing the program 
  717.  * and generating dependencies.  It should only be used in Imakefiles
  718.  * that describe a single program.
  719.  */
  720. #ifndef ComplexProgramTargetNoMan
  721. #define ComplexProgramTargetNoMan(program)                @@\
  722.         PROGRAM = program                        @@\
  723.                                     @@\
  724. AllTarget(program)                            @@\
  725.                                     @@\
  726. ProgramTargetHelperNoMan(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\
  727.                                     @@\
  728. DependTarget()                                @@\
  729. LintTarget()                                @@\
  730.                                     @@\
  731. clean::                                    @@\
  732.     RemoveFile(ProgramTargetName(program))
  733. #endif /* ComplexProgramTargetNoMan */
  734.  
  735. /*
  736.  * ComplexProgramTarget_1 - generate rules for compiling and linking the
  737.  * program specified by $(OBJS1) and $(SRCS1), installing the program and its
  738.  * man page, and generating dependencies for it and any programs described
  739.  * by $(SRCS2) through $(SRCS10).  It should be used to build the primary 
  740.  * program in Imakefiles that describe multiple programs.
  741.  */
  742. #ifndef ComplexProgramTarget_1
  743. #define    ComplexProgramTarget_1(program,locallib,syslib)            @@\
  744.   OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) \            @@\
  745.          $(OBJS6) $(OBJS7) $(OBJS8) $(OBJS9) $(OBJS10)            @@\
  746.   SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4) $(SRCS5) \            @@\
  747.          $(SRCS6) $(SRCS7) $(SRCS8) $(SRCS9) $(SRCS10)            @@\
  748.                                     @@\
  749. AllTarget($(PROGRAMS))                            @@\
  750.                                     @@\
  751. ProgramTargetHelper(program,SRCS1,OBJS1,DEPLIBS1,locallib,syslib)    @@\
  752.                                     @@\
  753. DependTarget()                                @@\
  754. LintTarget()                                @@\
  755.                                     @@\
  756. clean::                                    @@\
  757.     RemoveFiles($(PROGRAMS))
  758. #endif /* ComplexProgramTarget_1 */
  759.  
  760. #ifndef ComplexCplusplusProgramTarget_1
  761. #define    ComplexCplusplusProgramTarget_1(program,locallib,syslib)    @@\
  762.   OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) \            @@\
  763.          $(OBJS6) $(OBJS7) $(OBJS8) $(OBJS9) $(OBJS10)            @@\
  764.   SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4) $(SRCS5) \            @@\
  765.          $(SRCS6) $(SRCS7) $(SRCS8) $(SRCS9) $(SRCS10)            @@\
  766.                                     @@\
  767. AllTarget($(PROGRAMS))                            @@\
  768.                                     @@\
  769. CplusplusProgramTargetHelper(program,SRCS1,OBJS1,DEPLIBS1,locallib,syslib)@@\
  770.                                     @@\
  771. DependTarget()                                @@\
  772. LintTarget()                                @@\
  773.                                     @@\
  774. clean::                                    @@\
  775.     RemoveFiles($(PROGRAMS))
  776. #endif /* ComplexCplusplusProgramTarget_1 */
  777.  
  778. /*
  779.  * ComplexProgramTarget_2 - generate rules for compiling and linking the
  780.  * program specified by $(OBJS2) and $(SRCS2) and installing the program and
  781.  * man page.  It should be used to build the second program in Imakefiles 
  782.  * describing more than one program.
  783.  */
  784. #ifndef ComplexProgramTarget_2
  785. #define    ComplexProgramTarget_2(program,locallib,syslib)            @@\
  786. ProgramTargetHelper(program,SRCS2,OBJS2,DEPLIBS2,locallib,syslib)
  787. #endif /* ComplexProgramTarget_2 */
  788.  
  789. #ifndef ComplexCplusplusProgramTarget_2
  790. #define    ComplexCplusplusProgramTarget_2(program,locallib,syslib)    @@\
  791. CplusplusProgramTargetHelper(program,SRCS2,OBJS2,DEPLIBS2,locallib,syslib)
  792. #endif /* ComplexCplusplusProgramTarget_2 */
  793.  
  794. /*
  795.  * ComplexProgramTarget_3 - generate rules for compiling and linking the
  796.  * program specified by $(OBJS3) and $(SRCS3) and installing the program and
  797.  * man page.  It should be used to build the third program in Imakefiles 
  798.  * describing more than one program.
  799.  */
  800. #ifndef ComplexProgramTarget_3
  801. #define    ComplexProgramTarget_3(program,locallib,syslib)            @@\
  802. ProgramTargetHelper(program,SRCS3,OBJS3,DEPLIBS3,locallib,syslib)
  803. #endif /* ComplexProgramTarget_3 */
  804.  
  805. #ifndef ComplexCplusplusProgramTarget_3
  806. #define    ComplexCplusplusProgramTarget_3(program,locallib,syslib)    @@\
  807. CplusplusProgramTargetHelper(program,SRCS3,OBJS3,DEPLIBS3,locallib,syslib)
  808. #endif /* ComplexCplusplusProgramTarget_3 */
  809.  
  810. /*
  811.  * ComplexProgramTarget_4 - generate rules for compiling and linking the
  812.  * program specified by $(OBJS4) and $(SRCS4) and installing the program and
  813.  * man page.  It should be used to build the third program in Imakefiles 
  814.  * describing more than one program.
  815.  */
  816. #ifndef ComplexProgramTarget_4
  817. #define    ComplexProgramTarget_4(program,locallib,syslib)            @@\
  818. ProgramTargetHelper(program,SRCS4,OBJS4,DEPLIBS4,locallib,syslib)
  819. #endif /* ComplexProgramTarget_4 */
  820.  
  821. #ifndef ComplexCplusplusProgramTarget_4
  822. #define    ComplexCplusplusProgramTarget_4(program,locallib,syslib)    @@\
  823. CplusplusProgramTargetHelper(program,SRCS4,OBJS4,DEPLIBS4,locallib,syslib)
  824. #endif /* ComplexCplusplusProgramTarget_4 */
  825.  
  826. /*
  827.  * ComplexProgramTarget_5 - generate rules for compiling and linking the
  828.  * program specified by $(OBJS5) and $(SRCS5) and installing the program and
  829.  * man page.  It should be used to build the third program in Imakefiles 
  830.  * describing more than one program.
  831.  */
  832. #ifndef ComplexProgramTarget_5
  833. #define    ComplexProgramTarget_5(program,locallib,syslib)            @@\
  834. ProgramTargetHelper(program,SRCS5,OBJS5,DEPLIBS5,locallib,syslib)
  835. #endif /* ComplexProgramTarget_5 */
  836.  
  837. #ifndef ComplexCplusplusProgramTarget_5
  838. #define    ComplexCplusplusProgramTarget_5(program,locallib,syslib)    @@\
  839. CplusplusProgramTargetHelper(program,SRCS5,OBJS5,DEPLIBS5,locallib,syslib)
  840. #endif /* ComplexCplusplusProgramTarget_5 */
  841.  
  842. /*
  843.  * ComplexProgramTarget_6 - generate rules for compiling and linking the
  844.  * program specified by $(OBJS6) and $(SRCS6) and installing the program and
  845.  * man page.  It should be used to build the third program in Imakefiles 
  846.  * describing more than one program.
  847.  */
  848. #ifndef ComplexProgramTarget_6
  849. #define    ComplexProgramTarget_6(program,locallib,syslib)            @@\
  850. ProgramTargetHelper(program,SRCS6,OBJS6,DEPLIBS6,locallib,syslib)
  851. #endif /* ComplexProgramTarget_6 */
  852.  
  853. #ifndef ComplexCplusplusProgramTarget_6
  854. #define    ComplexCplusplusProgramTarget_6(program,locallib,syslib)    @@\
  855. CplusplusProgramTargetHelper(program,SRCS6,OBJS6,DEPLIBS6,locallib,syslib)
  856. #endif /* ComplexCplusplusProgramTarget_6 */
  857.  
  858. /*
  859.  * ComplexProgramTarget_7 - generate rules for compiling and linking the
  860.  * program specified by $(OBJS7) and $(SRCS7) and installing the program and
  861.  * man page.  It should be used to build the third program in Imakefiles 
  862.  * describing more than one program.
  863.  */
  864. #ifndef ComplexProgramTarget_7
  865. #define    ComplexProgramTarget_7(program,locallib,syslib)            @@\
  866. ProgramTargetHelper(program,SRCS7,OBJS7,DEPLIBS7,locallib,syslib)
  867. #endif /* ComplexProgramTarget_7 */
  868.  
  869. #ifndef ComplexCplusplusProgramTarget_7
  870. #define    ComplexCplusplusProgramTarget_7(program,locallib,syslib)    @@\
  871. CplusplusProgramTargetHelper(program,SRCS7,OBJS7,DEPLIBS7,locallib,syslib)
  872. #endif /* ComplexCplusplusProgramTarget_7 */
  873.  
  874. /*
  875.  * ComplexProgramTarget_8 - generate rules for compiling and linking the
  876.  * program specified by $(OBJS8) and $(SRCS8) and installing the program and
  877.  * man page.  It should be used to build the third program in Imakefiles 
  878.  * describing more than one program.
  879.  */
  880. #ifndef ComplexProgramTarget_8
  881. #define    ComplexProgramTarget_8(program,locallib,syslib)            @@\
  882. ProgramTargetHelper(program,SRCS8,OBJS8,DEPLIBS8,locallib,syslib)
  883. #endif /* ComplexProgramTarget_8 */
  884.  
  885. #ifndef ComplexCplusplusProgramTarget_8
  886. #define    ComplexCplusplusProgramTarget_8(program,locallib,syslib)    @@\
  887. CplusplusProgramTargetHelper(program,SRCS8,OBJS8,DEPLIBS8,locallib,syslib)
  888. #endif /* ComplexCplusplusProgramTarget_8 */
  889.  
  890. /*
  891.  * ComplexProgramTarget_9 - generate rules for compiling and linking the
  892.  * program specified by $(OBJS9) and $(SRCS9) and installing the program and
  893.  * man page.  It should be used to build the third program in Imakefiles 
  894.  * describing more than one program.
  895.  */
  896. #ifndef ComplexProgramTarget_9
  897. #define    ComplexProgramTarget_9(program,locallib,syslib)            @@\
  898. ProgramTargetHelper(program,SRCS9,OBJS9,DEPLIBS9,locallib,syslib)
  899. #endif /* ComplexProgramTarget_9 */
  900.  
  901. #ifndef ComplexCplusplusProgramTarget_9
  902. #define    ComplexCplusplusProgramTarget_9(program,locallib,syslib)    @@\
  903. CplusplusProgramTargetHelper(program,SRCS9,OBJS9,DEPLIBS9,locallib,syslib)
  904. #endif /* ComplexCplusplusProgramTarget_9 */
  905.  
  906. /*
  907.  * ComplexProgramTarget_10 - generate rules for compiling and linking the
  908.  * program specified by $(OBJS10) and $(SRCS10) and installing the program and
  909.  * man page.  It should be used to build the third program in Imakefiles 
  910.  * describing more than one program.
  911.  */
  912. #ifndef ComplexProgramTarget_10
  913. #define    ComplexProgramTarget_10(program,locallib,syslib)        @@\
  914. ProgramTargetHelper(program,SRCS10,OBJS10,DEPLIBS10,locallib,syslib)
  915. #endif /* ComplexProgramTarget_10 */
  916.  
  917. #ifndef ComplexCplusplusProgramTarget_10
  918. #define    ComplexCplusplusProgramTarget_10(program,locallib,syslib)    @@\
  919. CplusplusProgramTargetHelper(program,SRCS10,OBJS10,DEPLIBS10,locallib,syslib)
  920. #endif /* ComplexCplusplusProgramTarget_10 */
  921.  
  922. #ifndef MoveToBakFile
  923. #define MoveToBakFile(file) -@if [ -f file ]; then set -x; \        @@\
  924.     $(MV) file file.bak; else exit 0; fi
  925. #endif /* MoveToBakFile */
  926.  
  927. #ifndef RMoveToBakFile
  928. #define RMoveToBakFile(file) -@if [ -f file ]; then set -x; \        @@\
  929.     RemoveFile(file.bak); $(MV) file file.bak; \            @@\
  930.     else exit 0; fi
  931. #endif /* RMoveToBakFile */
  932.  
  933. /*
  934.  * ServerTargetWithFlags - generate rules to compile, link, and relink a server
  935.  */
  936. #ifndef ServerTargetWithFlags
  937. #define    ServerTargetWithFlags(server,subdirs,objects,libs,syslibs,flags) @@\
  938. AllTarget(ProgramTargetName(server))                    @@\
  939. ProgramTargetName(server): subdirs objects libs                @@\
  940.     MoveToBakFile($@)                        @@\
  941.     LinkRule($@,$(LDOPTIONS),objects,libs $(LDLIBS) syslibs) @@\
  942.                                     @@\
  943. Concat(load,server):                            @@\
  944.     MoveToBakFile(ProgramTargetName(server))            @@\
  945.     LinkRule(ProgramTargetName(server),$(LDOPTIONS),objects,libs $(LDLIBS) syslibs) @@\
  946.                                     @@\
  947. loadX:: Concat(load,server)                        @@\
  948.                                     @@\
  949. SentinelProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
  950. SentinelLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
  951. PurifyProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
  952. PurifyLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
  953. ProofProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\
  954. ProofLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\
  955.                                     @@\
  956. InstallProgramWithFlags(server,$(BINDIR),flags)                @@\
  957.                                     @@\
  958. clean::                                    @@\
  959.     RemoveFile(ProgramTargetName(server))
  960. #endif /* ServerTargetWithFlags */
  961.  
  962. /*
  963.  * ServerTarget - rules to compile, link, and relink a normal server
  964.  */
  965. #ifndef ServerTarget
  966. #define    ServerTarget(server,subdirs,objects,libs,syslibs)        @@\
  967. ServerTargetWithFlags(server,subdirs,objects,libs,syslibs,$(_NOOP_))
  968. #endif /* ServerTarget */
  969.  
  970. #if DoRanlibCmd
  971. #define RanLibrary(args) $(RANLIB) args
  972. #else
  973. #define RanLibrary(args) $(_NULLCMD_)
  974. #endif
  975.  
  976. #ifndef LibraryTargetName
  977. #define LibraryTargetName(libname)Concat(lib,libname.a)
  978. #endif
  979.  
  980. #ifndef LibraryTargetNameSuffix
  981. #define LibraryTargetNameSuffix(libname,suffix)Concat3(lib,libname,suffix.a)
  982. #endif
  983.  
  984. #ifndef InstallNamedTarget
  985. #define InstallNamedTarget(step,srcname,flags,dest,dstname)        @@\
  986. step:: srcname                                @@\
  987.     MakeDir($(DESTDIR)dest)                        @@\
  988.     $(INSTALL) $(INSTALLFLAGS) flags srcname $(DESTDIR)dest/dstname
  989. #endif /* InstallNamedTarget */
  990.  
  991. /*
  992.  * InstallNamedTargetNoClobber - Like InstallNamedTarget, but doesn't
  993.  * do the install if an installed version already exists.  Useful
  994.  * for files that might have local customizations that you don't
  995.  * want to clobber.  Config files are good candidates for this.
  996.  */
  997. #ifndef InstallNamedTargetNoClobber
  998. #define InstallNamedTargetNoClobber(step,srcname,flags,dest,dstname)    @@\
  999. step:: srcname                                @@\
  1000.     MakeDir($(DESTDIR)dest)                        @@\
  1001.     @if [ -f $(DESTDIR)dest/dstname ]; then \            @@\
  1002.      echo "Not overwriting existing" $(DESTDIR)dest/dstname; \    @@\
  1003.     else set -x; \                            @@\
  1004.      $(INSTALL) $(INSTALLFLAGS) flags srcname $(DESTDIR)dest/dstname; fi
  1005. #endif /* InstallNamedTargetNoClobber */
  1006.  
  1007. #ifndef InstallTarget
  1008. #define InstallTarget(step,file,flags,dest)                @@\
  1009. InstallNamedTarget(step,file,flags,dest,file)
  1010. #endif /* InstallTarget */
  1011.  
  1012. /*
  1013.  * InstallLibrary - generate rules to install the indicated library.
  1014.  */
  1015. #ifndef InstallLibrary
  1016. #define    InstallLibrary(libname,dest)                    @@\
  1017. install:: LibraryTargetName(libname)                    @@\
  1018.     MakeDir($(DESTDIR)dest)                        @@\
  1019.     $(INSTALL) $(INSTALLFLAGS) $(INSTLIBFLAGS) LibraryTargetName(libname) $(DESTDIR)dest @@\
  1020.     RanLibrary($(RANLIBINSTFLAGS) $(DESTDIR)dest/LibraryTargetName(libname))
  1021. #endif /* InstallLibrary */
  1022.  
  1023.  
  1024. /*
  1025.  * InstallLinkKitLibrary - rule to install Link Kit library.
  1026.  *                         (only used for XFree86). This is a no-op
  1027.  *                         rule so that Imakefiles on non-XFree86 systems
  1028.  *                         continue to build Makefiles correctly.
  1029.  */
  1030. #ifndef InstallLinkKitLibrary
  1031. #define InstallLinkKitLibrary(lib,dir)
  1032. #endif
  1033.  
  1034.  
  1035. /*
  1036.  * InstallLinkKitNamedLibrary - rule to install Link Kit library.
  1037.  *                         (only used for XFree86). This is a no-op
  1038.  *                         rule so that Imakefiles on non-XFree86 systems
  1039.  *                         continue to build Makefiles correctly.
  1040.  */
  1041. #ifndef InstallLinkKitNamedLibrary
  1042. #define InstallLinkKitNamedLibrary(lib,dlib,dir)
  1043. #endif
  1044.  
  1045.  
  1046. /*
  1047.  * MergeIntoInstalledLibrary - generate rules to merge one library into another
  1048.  */
  1049. #ifndef MergeIntoInstalledLibrary
  1050. #define MergeIntoInstalledLibrary(tolib,fromlib)            @@\
  1051. install::  fromlib                            @@\
  1052.     $(SCRIPTSRC)/mergelib $(DESTDIR)tolib fromlib
  1053. #endif /* MergeIntoInstalledLibrary */
  1054.  
  1055. /*
  1056.  * InstallLibraryAlias - generate rules to create a link from one library name
  1057.  * to another for the purposes of aliasing.
  1058.  */
  1059. #ifndef InstallLibraryAlias
  1060. #define    InstallLibraryAlias(libname,alias,dest)                @@\
  1061. install::                                @@\
  1062.     -(cd $(DESTDIR)dest && ( \                    @@\
  1063.         RemoveFile(LibraryTargetName(alias)); \            @@\
  1064.         $(LN) LibraryTargetName(libname) LibraryTargetName(alias)))
  1065. #endif /* InstallLibraryAlias */
  1066.  
  1067.  
  1068. /*
  1069.  * InstallLintLibrary - generate rules to install the indicated lint library.
  1070.  */
  1071. #ifndef InstallLintLibrary
  1072. #define    InstallLintLibrary(libname,dest)                @@\
  1073. InstallTarget(install.ln,Concat(llib-l,libname.ln),$(INSTLIBFLAGS),dest)
  1074. #endif /* InstallLintLibrary */
  1075.  
  1076.  
  1077. /*
  1078.  * InstallManPageLong - generate rules to install the indicated manual page,
  1079.  * giving it an alternate name.  This is used for installing man pages whose
  1080.  * base name without the .man suffix would normally be longer than 8 characters
  1081.  * (the limit for using source code control systems on files systems with 
  1082.  * short file names).
  1083.  */
  1084. #ifndef InstallManPageLong
  1085. #define    InstallManPageLong(file,destdir,dest)                @@\
  1086. InstallNamedTarget(install.man,file.man,$(INSTMANFLAGS),destdir,dest.$(MANSUFFIX))
  1087. #endif /* InstallManPageLong */
  1088.  
  1089.  
  1090. /*
  1091.  * InstallManPage - generate rules to install the indicated manual page.
  1092.  */
  1093. #ifndef InstallManPage
  1094. #define    InstallManPage(file,destdir)                    @@\
  1095. InstallManPageLong(file,destdir,file)
  1096. #endif /* InstallManPage */
  1097.  
  1098.  
  1099. /*
  1100.  * InstallManPageAliases - generate rules to install manual page aliases.
  1101.  */
  1102. #ifndef InstallManPageAliases
  1103. #define    InstallManPageAliases(file,destdir,aliases)            @@\
  1104. install.man::                                @@\
  1105.     @(TMP=/tmp/tmp.$$$$; \                        @@\
  1106.     RemoveFile($${TMP}); \                        @@\
  1107.     echo .so `basename destdir`/file.$(MANSUFFIX) > $${TMP}; \    @@\
  1108.     for i in aliases; do (set -x; \                    @@\
  1109.     $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) $${TMP} $(DESTDIR)destdir/$$i.$(MANSUFFIX)); \ @@\
  1110.     done; \                                @@\
  1111.     RemoveFile($${TMP}))
  1112. #endif /* InstallManPageAliases */
  1113.  
  1114.  
  1115. /*
  1116.  * InstallGenManPageLong - More general rules for installing manual pages --
  1117.  * doesn't assume MANSUFFIX.
  1118.  */
  1119. #ifndef InstallGenManPageLong
  1120. #define    InstallGenManPageLong(file,destdir,dest,suffix)            @@\
  1121. install.man:: file.man                            @@\
  1122.     MakeDir($(DESTDIR)destdir)                    @@\
  1123.     $(INSTALL) -c $(INSTMANFLAGS) file.man $(DESTDIR)destdir/dest.suffix
  1124. #endif /* InstallGenManPageLong */
  1125.  
  1126.  
  1127. /*
  1128.  * InstallGenManPage - general equivalent of InstallManPage
  1129.  */
  1130. #ifndef InstallGenManPage
  1131. #define    InstallGenManPage(file,destdir,suffix)                @@\
  1132. InstallGenManPageLong(file,destdir,file,suffix)
  1133. #endif /* InstallGenManPage */
  1134.  
  1135.  
  1136. /*
  1137.  * InstallGenManPageAliases - general equivalent of InstallManPageAliases
  1138.  */
  1139. #ifndef InstallGenManPageAliases
  1140. #define    InstallGenManPageAliases(file,destdir,suffix,aliases)        @@\
  1141. install.man::                                @@\
  1142.     @(TMP=/tmp/tmp.$$$$; \                        @@\
  1143.     RemoveFile($${TMP}); \                        @@\
  1144.     echo .so `basename destdir`/file.suffix > $${TMP}; \        @@\
  1145.     for i in aliases; do (set -x; \                    @@\
  1146.     $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) $${TMP} $(DESTDIR)destdir/$$i.suffix); \ @@\
  1147.     done; \                                @@\
  1148.     RemoveFile($${TMP}))
  1149. #endif /* InstallGenManPageAliases */
  1150.  
  1151. /*
  1152.  * ManKeywordsTarget - generate the database used by "man -k".
  1153.  * This rule updates the index in the directory "manpath", which
  1154.  * indexes all the manual pages in the section subdirectories under
  1155.  * it.  An update command is defined only on systems that have a
  1156.  * per MANPATH element index.  If the OS supports only one system-wide
  1157.  * database, we don't update it, because then we can't do cross
  1158.  * installations or use a non-empty DESTDIR for testing.
  1159.  */
  1160. #ifndef ManKeywordsTarget
  1161. #define ManKeywordsTarget(manpath) man_keywords::
  1162. #endif
  1163.  
  1164. /*
  1165.  * InstallNamedNonExec - generate rules to install a data file
  1166.  */
  1167. #ifndef InstallNamedNonExec
  1168. #define    InstallNamedNonExec(srcname,dstname,dest)            @@\
  1169. InstallNamedTarget(install,srcname,$(INSTDATFLAGS),dest,dstname)
  1170. #endif /* InstallNamedNonExec */
  1171.  
  1172.  
  1173. /*
  1174.  * InstallLinkKitNamedNonExec - rule for installing server Link Kit files.
  1175.  *                         (only used for XFree86). This is a no-op
  1176.  *                         rule so that Imakefiles on non-XFree86 systems
  1177.  *                         continue to build Makefiles correctly.
  1178.  */
  1179. #ifndef InstallLinkKitNamedNonExec
  1180. #define InstallLinkKitNamedNonExec(srcname,dstname,dest)
  1181. #endif
  1182.  
  1183.  
  1184. /*
  1185.  * InstallNonExecFile - generate rules to install a data file
  1186.  */
  1187. #ifndef InstallNonExecFile
  1188. #define InstallNonExecFile(file,dest)                    @@\
  1189. InstallTarget(install,file,$(INSTDATFLAGS),dest)
  1190. #endif /* InstallNonExecFile */
  1191.  
  1192.  
  1193. /*
  1194.  * InstallNonExecFileNoClobber - install a data file once
  1195.  */
  1196. #ifndef InstallNonExecFileNoClobber
  1197. #define InstallNonExecFileNoClobber(file,dest)                @@\
  1198. InstallNamedTargetNoClobber(install,file,$(INSTDATFLAGS),dest,file)
  1199. #endif /* InstallNonExecFileNoClobber */
  1200.  
  1201.  
  1202. /*
  1203.  * InstallLinkKitNonExecFile - rule for installing server Link Kit files.
  1204.  *                         (only used for XFree86). This is a no-op
  1205.  *                         rule so that Imakefiles on non-XFree86 systems
  1206.  *                         continue to build Makefiles correctly.
  1207.  */
  1208. #ifndef InstallLinkKitNonExecFile
  1209. #define InstallLinkKitNonExecFile(file,dir)
  1210. #endif
  1211.  
  1212.  
  1213. /*
  1214.  * InstallNonExec - generate rules to install a data file, but does not
  1215.  * try to create the destination directory (deprecated)
  1216.  */
  1217. #ifndef InstallNonExec
  1218. #define    InstallNonExec(file,dest)                    @@\
  1219. install:: file                                @@\
  1220.     $(INSTALL) $(INSTALLFLAGS) $(INSTDATFLAGS) file $(DESTDIR)dest
  1221. #endif /* InstallNonExec */
  1222.  
  1223.  
  1224. /*
  1225.  * InstallProgramWithFlags - generate rules to install an executable program
  1226.  * using given install flags.
  1227.  */
  1228. #ifndef InstallProgramWithFlags
  1229. #define InstallProgramWithFlags(program,dest,flags)            @@\
  1230. InstallTarget(install,ProgramTargetName(program),$(INSTPGMFLAGS) flags,dest)
  1231. #endif /* InstallProgramWithFlags */
  1232.  
  1233.  
  1234. /*
  1235.  * InstallProgram - generate rules to install an executable program using any
  1236.  * special install flags set in $(INSTALLFLAGS).
  1237.  */
  1238. #ifndef InstallProgram
  1239. #define    InstallProgram(program,dest)                    @@\
  1240. InstallProgramWithFlags(program,dest,NullParameter)
  1241. #endif /* InstallProgram */
  1242.  
  1243.  
  1244.  
  1245. /*
  1246.  * InstallScript - install a shell script.
  1247.  */
  1248. #ifndef InstallScript
  1249. #define    InstallScript(program,dest)                    @@\
  1250. InstallNamedTarget(install,program.script,$(INSTBINFLAGS),dest,program)
  1251. #endif /* InstallScript */
  1252.  
  1253.  
  1254. /*
  1255.  * InstallNamedProg - install a program with renaming and no stripping.
  1256.  */
  1257. #ifndef InstallNamedProg
  1258. #define InstallNamedProg(srcname,dstname,dest)                @@\
  1259. InstallNamedTarget(install,srcname,$(INSTBINFLAGS),dest,dstname)
  1260. #endif /* InstallNamedProg */
  1261.  
  1262.  
  1263. /*
  1264.  * InstallNamedProgNoClobber - Like InstallNamedProg, but doesn't
  1265.  * do the install if an installed version already exists.
  1266.  */
  1267. #ifndef InstallNamedProgNoClobber
  1268. #define InstallNamedProgNoClobber(srcname,dstname,dest)            @@\
  1269. InstallNamedTargetNoClobber(install,srcname,$(INSTBINFLAGS),dest,dstname)
  1270. #endif /* InstallNamedProgNoClobber */
  1271.  
  1272.  
  1273. /*
  1274.  * InstallLinkKitNamedProg - rule for installing server Link Kit files.
  1275.  *                         (only used for XFree86). This is a no-op
  1276.  *                         rule so that Imakefiles on non-XFree86 systems
  1277.  *                         continue to build Makefiles correctly.
  1278.  */
  1279. #ifndef InstallLinkKitNamedProg
  1280. #define InstallLinkKitNamedProg(srcname,dstname,dest)
  1281. #endif
  1282.  
  1283.  
  1284. /*
  1285.  * MakeFlagsToShellFlags - set variables before starting a loop.
  1286.  * makeflags is the set of "make" flags to check.
  1287.  * shellcmd is the shell command to execute if any of the flags are set.
  1288.  *
  1289.  * The usual use of this rule is to translate make's "don't quit on error"
  1290.  * flags into the equivalent for the shell.  To do this, "make -i" always
  1291.  * becomes "set +e".  "make -k" should also turn on "set +e" if the target
  1292.  * is building subdirectories.  That is, subdirectories are independent
  1293.  * and should appear to be multiple targets, even though they are
  1294.  * implemented in a loop in a single target.
  1295.  */
  1296. #ifndef MakeFlagsToShellFlags
  1297. #define MakeFlagsToShellFlags(makeflags,shellcmd)\
  1298.     for flag in ${MAKEFLAGS} ''; do \                @@\
  1299.       case "$$flag" in *=*) ;; *[makeflags]*) shellcmd;; esac; done
  1300. #endif
  1301.  
  1302. /*
  1303.  * MakeNamedTargetSubdir - do make in a subdir.
  1304.  */
  1305. #ifndef MakeNamedTargetSubdir
  1306. #define MakeNamedTargetSubdir(dir,flags,subname)\
  1307.         (cd dir && $(MAKE) $(MFLAGS) $(PARALLELMFLAGS) \    @@\
  1308.             flags subname)
  1309. #endif
  1310.  
  1311. /*
  1312.  * LinkFileList - link a list of files from one place to another
  1313.  */
  1314. #ifndef LinkFileList
  1315. #define LinkFileList(step,list,dir,sub)                    @@\
  1316. step:: list                                @@\
  1317.     @MakeFlagsToShellFlags(i,set +e); \                @@\
  1318.     echo "    cd" dir; cd dir && \                    @@\
  1319.     for i in list; do (set -x; RemoveFile($$i); $(LN) sub/$$i .); done
  1320. #endif
  1321.  
  1322.  
  1323. /*
  1324.  * LinkVarDirectory
  1325.  *
  1326.  * Make links from $LIBDIR (<ProjectRoot>/lib/X11) to /var/X11/
  1327.  * For example /usr/X11R6/lib/X11/xdm ==> /var/X11/xdm so that X can be
  1328.  * run from a read-only volume like a CD-ROM.
  1329.  *
  1330.  * Since the link is used in the installation process, we need to
  1331.  * make the link relative in order to honor $(DESTDIR) if it is set
  1332.  */
  1333. #ifndef LinkVarDirectory
  1334. #if HasVarDirectory && HasSymLinks
  1335. #define LinkVarDirectory(mdir,cdir,rdir,ldir)                @@\
  1336. install::                                @@\
  1337.     MakeDir(Concat($(DESTDIR)$(LIBDIR)/,cdir))            @@\
  1338.     MakeDir(Concat($(DESTDIR)$(VARDIR)/,mdir))            @@\
  1339.     @MakeFlagsToShellFlags(i,set +e); \                @@\
  1340.     if [ -d Concat($(DESTDIR)$(LIBDIR)/,cdir) ]; then \        @@\
  1341.       RELPATH=`echo Concat($(LIBDIR)/,cdir) | \            @@\
  1342.         sed -e 's:^.::' -e 's:[^/.][^/]*:..:'g`; \        @@\
  1343.       cd Concat($(DESTDIR)$(LIBDIR)/,cdir); \            @@\
  1344.       if [ -d rdir -a ! -h rdir ]; then \                @@\
  1345.         (cd rdir; tar cf - . | \                    @@\
  1346.         (cd Concat($(DESTDIR)$(VARDIR)/,mdir);\            @@\
  1347.          tar xf -; exit 0); exit 0); \                 @@\
  1348.       fi; \                                @@\
  1349.       $(RM) -r rdir; \                        @@\
  1350.       $(LN) Concat($${RELPATH}$(VARDIR)/,mdir) ldir; \        @@\
  1351.     fi
  1352. #else
  1353. #define LinkVarDirectory(mdir,cdir,rdir,ldir)
  1354. #endif
  1355. #endif
  1356.  
  1357.  
  1358. /*
  1359.  * InstallMultipleDestFlags - generate rules to install multiple files at
  1360.  * once during a particular step in the build using a specific set of install 
  1361.  * flags.
  1362.  */
  1363. #ifndef InstallMultipleDestFlags
  1364. #define InstallMultipleDestFlags(step,list,dest,flags)            @@\
  1365. step:: list                                @@\
  1366.     MakeDir($(DESTDIR)dest)                        @@\
  1367.     @MakeFlagsToShellFlags(i,set +e); \                @@\
  1368.     for i in list; do \                        @@\
  1369.         (set -x; $(INSTALL) $(INSTALLFLAGS) flags $$i $(DESTDIR)dest); \    @@\
  1370.     done
  1371. #endif /* InstallMultipleDestFlags */
  1372.  
  1373.  
  1374. /*
  1375.  * InstallLinkKitMultipleDestFlags - rule for installing server Link Kit files.
  1376.  *                         (only used for XFree86). This is a no-op
  1377.  *                         rule so that Imakefiles on non-XFree86 systems
  1378.  *                         continue to build Makefiles correctly.
  1379.  */
  1380. #ifndef InstallLinkKitMultipleDestFlags
  1381. #define InstallLinkKitMultipleDestFlags(list,dest,flags)
  1382. #endif
  1383.  
  1384.  
  1385. /*
  1386.  * InstallMultipleDest - generate rules to install multiple files at once
  1387.  * during a particular step in the build using any install flags set in 
  1388.  * $(INSTDATFLAGS).
  1389.  */
  1390. #ifndef InstallMultipleDest
  1391. #define InstallMultipleDest(step,list,dest)                @@\
  1392. InstallMultipleDestFlags(step,list,dest,$(INSTDATFLAGS))
  1393. #endif /* InstallMultipleDest */
  1394.  
  1395. /*
  1396.  * InstallMultiple - generate rules to install multiple files at once 
  1397.  * during the install step of the build using any install flags set in 
  1398.  * $(INSTALLFLAGS).
  1399.  */
  1400. #ifndef InstallMultiple
  1401. #define    InstallMultiple(list,dest)                    @@\
  1402. InstallMultipleDest(install,list,dest)
  1403. #endif /* InstallMultiple */
  1404.  
  1405.  
  1406. /*
  1407.  * InstallMultipleFlags - generate rules to install multiple files at once
  1408.  * during the install step of the build using the given install flags.
  1409.  */
  1410. #ifndef InstallMultipleFlags
  1411. #define InstallMultipleFlags(list,dest,flags)                @@\
  1412. InstallMultipleDestFlags(install,list,dest,flags)
  1413. #endif /* InstallMultipleFlags */
  1414.  
  1415.  
  1416. /*
  1417.  * InstallMultipleMan - generate rules to install a variety of manual pages
  1418.  * during the install.man step of the build.
  1419.  */
  1420. #ifndef InstallMultipleMan
  1421. #define InstallMultipleMan(list,dest)                    @@\
  1422. InstallMultipleDestFlags(install.man,list,dest,$(INSTMANFLAGS))
  1423. #endif /* InstallMultipleMan */
  1424.  
  1425. /*
  1426.  * IncludeMakefile - rule to include another Makefile.
  1427.  * Must not generate an error or even a warning if the named file
  1428.  * is not present, since we use this to include Makefile.dep, which
  1429.  * may not be built yet.
  1430.  * This is defined non-null iff HasMakefileSafeInclude is YES.
  1431.  * The double-@ is to ensure no leading spaces on the line.
  1432.  */
  1433. #ifndef IncludeMakefile
  1434. #if HasClearmake
  1435. #define IncludeMakefile(file) @@sinclude file
  1436. #else
  1437. #if HasBsdMake
  1438. #define IncludeMakefile(file) @@# dependencies are in .depend
  1439. #else
  1440. #define IncludeMakefile(file) /**/
  1441. #endif
  1442. #endif
  1443. #endif
  1444.  
  1445. /*
  1446.  * DependDependencyStatement - Used by DependDependency to set up the
  1447.  * most specific dependency, which differs based on whether we support
  1448.  * a separate Makefile.dep on this platform.
  1449.  */
  1450. #ifndef DependDependencyStatement
  1451. #if HasMakefileSafeInclude
  1452. #define DependDependencyStatement()                    @@\
  1453. DependFileName:: ProgramTargetName($(DEPEND))
  1454. #else
  1455. #define DependDependencyStatement()                    @@\
  1456. depend:: ProgramTargetName($(DEPEND))
  1457. #endif
  1458. #endif
  1459.  
  1460. /*
  1461.  * DependDependency - generate rules to build the makedepend program if 
  1462.  * this Imakefile is within the source tree.
  1463.  */
  1464. #ifndef DependDependency
  1465. #ifdef UseInstalled
  1466. #define DependDependency() /**/
  1467. #else
  1468. #define DependDependency()                         @@\
  1469. DependDependencyStatement()                        @@\
  1470.                                     @@\
  1471. NoCmpScript(ProgramTargetName($(DEPEND)))                @@\
  1472.                                     @@\
  1473. ProgramTargetName($(DEPEND)):                        @@\
  1474.     @echo "checking $@ over in $(DEPENDSRC) first..."; \        @@\
  1475.     cd $(DEPENDSRC) && $(MAKE); \                    @@\
  1476.     echo "okay, continuing in $(CURRENT_DIR)"
  1477.  
  1478. #endif /* UseInstalled */
  1479. #endif /* DependDependency */
  1480.  
  1481.  
  1482. /*
  1483.  * DependTarget - generate rules to compute dependencies for all files listed
  1484.  * in $(SRCS).
  1485.  */
  1486. #ifndef DependTarget
  1487. #if HasMakefileSafeInclude
  1488. #define DependTarget()                            @@\
  1489. DependDependency()                            @@\
  1490.                                     @@\
  1491. depend:: DependFileName                            @@\
  1492.                                     @@\
  1493. DependFileName::                            @@\
  1494.     RemoveFile($@)                            @@\
  1495.     RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- $(SRCS)) > $@
  1496. #else /* HasMakefileSafeInclude */
  1497. #define    DependTarget()                            @@\
  1498. DependDependency()                            @@\
  1499.                                     @@\
  1500. depend::                                @@\
  1501.     RunProgram(DEPEND,$(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- $(SRCS))
  1502. #endif /* HasMakefileSafeInclude else */
  1503. #endif /* DependTarget */
  1504.  
  1505. /*
  1506.  * DependTarget3 - generate rules to compute dependencies for all files given.
  1507.  */
  1508. #ifndef DependTarget3
  1509. #if HasMakefileSafeInclude
  1510. #define DependTarget3(srcs1,srcs2,srcs3)                @@\
  1511. DependDependency()                            @@\
  1512.                                     @@\
  1513. depend:: DependFileName                            @@\
  1514.                                     @@\
  1515. DependFileName::                            @@\
  1516.     RemoveFile($@)                            @@\
  1517.     RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs1) > $@    @@\
  1518.     RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs2) >> $@    @@\
  1519.     RunProgram(DEPEND,-f- $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs3) >> $@
  1520. #else /* HasMakefileSafeInclude */
  1521. #define    DependTarget3(srcs1,srcs2,srcs3)                @@\
  1522. DependDependency()                            @@\
  1523.                                     @@\
  1524. depend::                                @@\
  1525.     RunProgram(DEPEND,$(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs1)    @@\
  1526.     RunProgram(DEPEND,-a $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs2)    @@\
  1527.     RunProgram(DEPEND,-a $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- srcs3)
  1528. #endif /* HasMakefileSafeInclude else */
  1529. #endif /* DependTarget3 */
  1530.  
  1531.  
  1532. /*
  1533.  * CleanTarget - generate rules to remove any garbage files
  1534.  */
  1535. #ifndef CleanTarget
  1536. #define    CleanTarget()                            @@\
  1537. clean::                                    @@\
  1538.     $(RM) FilesToClean ExtraFilesToClean "#"*            @@\
  1539.                                     @@\
  1540. ProofCleanTarget()
  1541. #endif /* CleanTarget */
  1542.  
  1543.  
  1544. /*
  1545.  * TagsTarget - generate rules to compute tags files for C source code.
  1546.  */
  1547. #ifndef TagsTarget
  1548. #define    TagsTarget()                            @@\
  1549. tags::                                    @@\
  1550.     $(TAGS) -w *.[ch]                        @@\
  1551.     $(TAGS) -xw *.[ch] > TAGS
  1552. #endif /* TagsTarget */
  1553.  
  1554.  
  1555. /*
  1556.  * ImakeDependency - generate rules to compile imake if this Imakefile is
  1557.  * within the source tree.
  1558.  */
  1559. #ifndef ImakeDependency
  1560. #ifdef UseInstalled
  1561. #define ImakeDependency(target) /**/
  1562. #else
  1563. #define ImakeDependency(target)                        @@\
  1564. target:: ProgramTargetName($(IMAKE))                    @@\
  1565.                                     @@\
  1566. NoCmpScript(ProgramTargetName($(IMAKE)) $(IMAKE).Osuf)            @@\
  1567.                                     @@\
  1568. ProgramTargetName($(IMAKE)) $(IMAKE).Osuf:                @@\
  1569.     -@(cd $(IMAKESRC) && if [ -f Makefile ]; then \            @@\
  1570.     echo "checking $@ in $(IMAKESRC) first..."; $(MAKE) all; else \    @@\
  1571.     echo "bootstrapping $@ from Makefile.ini in $(IMAKESRC) first..."; \    @@\
  1572.     $(MAKE) -f Makefile.ini BOOTSTRAPCFLAGS="$(BOOTSTRAPCFLAGS)"; fi; \    @@\
  1573.     echo "okay, continuing in $(CURRENT_DIR)")
  1574. #endif /* UseInstalled */
  1575. #endif /* ImakeDependency */
  1576.  
  1577.  
  1578. /*
  1579.  * BuildMakefileTarget - generate rules to build a Makefile from an Imakefile
  1580.  * and any special imake flags.  This is generally done automatically by the
  1581.  * template or by any special Imakefiles.  The first argument exists just
  1582.  * because imakeflags is usually empty and some preprocessors will complain
  1583.  * if an empty argument is passed as the sole argument to a macro.
  1584.  */
  1585. #ifndef BuildMakefileTarget
  1586. #define    BuildMakefileTarget(notused,imakeflags)                @@\
  1587. ImakeDependency(Makefile)                        @@\
  1588.                                     @@\
  1589. Makefile::                                 @@\
  1590.     RMoveToBakFile(Makefile)                    @@\
  1591.     $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) imakeflags
  1592.  
  1593. #endif /* BuildMakefileTarget */
  1594.  
  1595.  
  1596. /*
  1597.  * MakefileTarget - generate rules to build a normal Makefile.
  1598.  */
  1599. #ifndef MakefileTarget
  1600. #define MakefileTarget()                        @@\
  1601. BuildMakefileTarget(Imakefile,NullParameter)
  1602. #endif /* MakefileTarget */
  1603.  
  1604.  
  1605. /*
  1606.  * LibMkdir - helper for creating library object subdirectories
  1607.  */
  1608. #ifndef LibMkdir
  1609. #define LibMkdir(dir) DirFailPrefix@if [ -d dir ]; then exit 0; else set -x; mkdir dir; fi
  1610. #endif
  1611.  
  1612. #ifndef LibMkdirLinkSubdirs
  1613. #define LibMkdirLinkSubdirs(dir) DirFailPrefix@if [ -d dir ]; then \    @@\
  1614.         exit 0; \                            @@\
  1615.     else \                                @@\
  1616.         echo "mkdir dir"; mkdir dir; \                @@\
  1617.         for i in $(SUBDIRS); do \                    @@\
  1618.           j=`echo "$$i" | sed -e 's;[^/]\{1,\};..;g'`; \        @@\
  1619.           $(MKDIRHIER) "dir/`dirname $$i`"; \            @@\
  1620.           echo $(LN) "$$j/$$i/dir" "dir/$$i"; \            @@\
  1621.           $(LN) "$$j/$$i/dir" "dir/$$i"; \                @@\
  1622.         done; \                            @@\
  1623.     fi
  1624. #endif
  1625.  
  1626. /*
  1627.  * LibCleanDir - helper for cleaning library object subdirectories
  1628.  */
  1629. #ifndef LibCleanDir
  1630. #define LibCleanDir(dir) -@if [ -d dir ]; then \            @@\
  1631.         set -x; $(RM) -r dir; else exit 0; fi
  1632. #endif
  1633.  
  1634. /*
  1635.  * LintLibReferences - variables for lint libraries
  1636.  */
  1637. #ifndef LintLibReferences
  1638. #define LintLibReferences(varname,libname,libsource)            @@\
  1639. Concat(LINT,varname) = _UseCat($(LINTLIBDIR)/llib-l,libsource/llib-,libname.ln)
  1640. #endif
  1641.  
  1642.  
  1643. /*
  1644.  * UnsharedLibReferences - variables for unshared libraries
  1645.  */
  1646. #ifndef UnsharedLibReferences
  1647. #define UnsharedLibReferences(varname,libname,libsource)        @@\
  1648. ProjectUnsharedLibReferences(varname,libname,libsource,$(BUILDLIBDIR))
  1649. #endif
  1650.  
  1651. /*
  1652.  * ProjectUnsharedLibReferences - variables for unshared libraries
  1653.  */
  1654. #ifndef ProjectUnsharedLibReferences
  1655. #define ProjectUnsharedLibReferences(varname,libname,libsource,buildlibdir)    @@\
  1656. Concat3(DEP,varname,LIB) = _UseCat($(USRLIBDIR)/,buildlibdir/,LibraryTargetName(libname))    @@\
  1657. Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)        @@\
  1658. LintLibReferences(varname,libname,libsource)
  1659. #endif
  1660.  
  1661. /*
  1662.  * SharedLibDependencies - shared library dependencies
  1663.  */
  1664. #ifndef SharedLibDependencies
  1665. #define SharedLibDependencies(libname,libsource,revname) /**/
  1666. #endif
  1667.  
  1668. /*
  1669.  * SharedDSLibDependencies - shared library dependencies with data separation
  1670.  */
  1671. #ifndef SharedDSLibDependencies
  1672. #define SharedDSLibDependencies(libname,libsource,revname) /**/
  1673. #endif
  1674.  
  1675. /*
  1676.  * SharedLibReferences - variables for shared libraries
  1677.  */
  1678. #ifndef SharedLibReferences
  1679. #define SharedLibReferences(varname,libname,libsource,revname,rev)    @@\
  1680. revname = rev                                @@\
  1681. Concat3(DEP,varname,LIB) = SharedLibDependencies(libname,libsource,revname) @@\
  1682. Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)        @@\
  1683. LintLibReferences(varname,libname,libsource)
  1684. #endif
  1685.  
  1686. /*
  1687.  * SharedDSLibReferences - variables for shared libraries with data separation
  1688.  */
  1689. #ifndef SharedDSLibReferences
  1690. #define SharedDSLibReferences(varname,libname,libsource,revname,rev)    @@\
  1691. revname = rev                                @@\
  1692. Concat3(DEP,varname,LIB) = SharedDSLibDependencies(libname,libsource,revname) @@\
  1693. Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname)        @@\
  1694. LintLibReferences(varname,libname,libsource)
  1695. #endif
  1696.  
  1697. /*
  1698.  * CPPOnlyCompile - run C compiler's preprocessor only
  1699.  */
  1700. #ifndef CPPOnlyCompile
  1701. #define CPPOnlyCompile(src,options) RemoveFile($@)            @@\
  1702.     ClearmakeOSName \
  1703.     $(CC) -E $(CFLAGS) options src > $@
  1704. #endif
  1705.  
  1706. /*
  1707.  * ObjectCompile - compile fragment for a normal object file
  1708.  */
  1709. #ifndef ObjectCompile
  1710. #define ObjectCompile(options) RemoveFile($@)                @@\
  1711.     ClearmakeOSName \
  1712.     $(CC) -c $(CFLAGS) options $*.c
  1713. #endif
  1714.  
  1715. #ifndef ObjectCplusplusCompile
  1716. #define ObjectCplusplusCompile(options) RemoveFile($@)            @@\
  1717.     ClearmakeOSName \
  1718.     $(CXX) -c $(CXXFLAGS) options $*.CCsuf
  1719. #endif
  1720.  
  1721. /*
  1722.  * NormalLibObjCompile - compile fragment for a normal library object file
  1723.  */
  1724. #ifndef NormalLibObjCompile
  1725. #define NormalLibObjCompile(options) ObjectCompile(options)
  1726. #endif
  1727.  
  1728. #ifndef NormalLibObjCplusplusCompile
  1729. #define NormalLibObjCplusplusCompile(options) ObjectCplusplusCompile(options)
  1730. #endif
  1731.  
  1732. /*
  1733.  * NormalSharedLibObjCompile - compile fragment for shared objects
  1734.  */
  1735. #ifndef NormalSharedLibObjCompile
  1736. #define NormalSharedLibObjCompile(options) NormalLibObjCompile(options $(SHLIBDEF) $(SHAREDCODEDEF) $(PICFLAGS))
  1737. #endif
  1738.  
  1739. #ifndef NormalSharedLibObjCplusplusCompile
  1740. #define NormalSharedLibObjCplusplusCompile(options) NormalLibObjCplusplusCompile(options $(SHLIBDEF) $(SHAREDCODEDEF) $(CXXPICFLAGS))
  1741. #endif
  1742.  
  1743. /*
  1744.  * LibObjCompile - compile fragment for unshared/profiled/debugged objects
  1745.  */
  1746. #ifndef LibObjCompile
  1747. #if HasGcc || HasGcc2
  1748. #define LibObjCompile(dir,options) RemoveFiles($@ dir/$@)        @@\
  1749.     ClearmakeOSName \
  1750.     $(CC) -c $(CCOPTIONS) $(ALLDEFINES) options $*.c -o dir/$@
  1751. #else
  1752. #define LibObjCompile(dir,options) RemoveFiles($@ dir/$@)        @@\
  1753.     ClearmakeOSName \
  1754.     $(CC) -c $(CCOPTIONS) $(ALLDEFINES) options $*.c        @@\
  1755.     $(MV) $@ dir/$@
  1756. #endif
  1757. #endif
  1758.  
  1759. #ifndef LibObjCplusplusCompile
  1760. #if HasGcc || HasGcc2
  1761. #define LibObjCplusplusCompile(dir,options) RemoveFiles($@ dir/$@)    @@\
  1762.     ClearmakeOSName \
  1763.     $(CXX) -c $(CXXOPTIONS) $(CXXDEFINES) options $*.CCsuf -o dir/$@
  1764. #else
  1765. #define LibObjCplusplusCompile(dir,options) RemoveFiles($@ dir/$@)    @@\
  1766.     ClearmakeOSName \
  1767.     $(CXX) -c $(CXXOPTIONS) $(CXXDEFINES) options $*.CCsuf        @@\
  1768.     $(MV) $@ dir/$@
  1769. #endif
  1770. #endif
  1771.  
  1772. /*
  1773.  * DebuggedLibObjCompile - compile fragment for debugged objects
  1774.  */
  1775. #ifndef DebuggedLibObjCompile
  1776. #define DebuggedLibObjCompile(options) LibObjCompile(debugger,DebuggableCDebugFlags options)
  1777. #endif
  1778.  
  1779. #ifndef DebuggedLibObjCplusplusCompile
  1780. #define DebuggedLibObjCplusplusCompile(options) LibObjCplusplusCompile(debugger,DebuggableCplusplusDebugFlags options)
  1781. #endif
  1782.  
  1783. /*
  1784.  * ProfiledLibObjCompile - compile fragment for profiled objects
  1785.  */
  1786. #ifndef ProfiledLibObjCompile
  1787. #define ProfiledLibObjCompile(options) LibObjCompile(profiled,ProfiledCDebugFlags options)
  1788. #endif
  1789.  
  1790. #ifndef ProfiledLibObjCplusplusCompile
  1791. #define ProfiledLibObjCplusplusCompile(options) LibObjCplusplusCompile(profiled,ProfiledCplusplusDebugFlags options)
  1792. #endif
  1793.  
  1794. /*
  1795.  * UnsharedLibObjCompile - compile fragment for unshared objects
  1796.  */
  1797. #ifndef UnsharedLibObjCompile
  1798. #define UnsharedLibObjCompile(options) LibObjCompile(unshared,$(CDEBUGFLAGS) options)
  1799. #endif
  1800.  
  1801. #ifndef UnsharedLibObjCplusplusCompile
  1802. #define UnsharedLibObjCplusplusCompile(options) LibObjCplusplusCompile(unshared,$(CXXDEBUGFLAGS) options)
  1803. #endif
  1804.  
  1805. /*
  1806.  * SharedLibObjCompile - compile fragment for shared objects
  1807.  */
  1808. #ifndef SharedLibObjCompile
  1809. #define SharedLibObjCompile(options) LibObjCompile(shared,options $(SHLIBDEF) $(SHAREDCODEDEF) $(PICFLAGS) $(CDEBUGFLAGS))
  1810. #endif
  1811.  
  1812. /*
  1813.  * NormalLibraryObjectRule - for simple libraries
  1814.  */
  1815. #ifndef NormalLibraryObjectRule
  1816. #define    NormalLibraryObjectRule()                    @@\
  1817. .c.Osuf:                                @@\
  1818.     NormalLibObjCompile($(_NOOP_))
  1819. #endif /* NormalLibraryObjectRule */
  1820.  
  1821. #ifndef NormalCplusplusObjectRule
  1822. #define NormalCplusplusObjectRule()                    @@\
  1823. .CCsuf.Osuf:                                @@\
  1824.     NormalLibObjCplusplusCompile($(_NOOP_))
  1825. #endif
  1826.  
  1827. #ifndef NormalFortranObjectRule
  1828. #define NormalFortranObjectRule()                    @@\
  1829. .f.Osuf:                                @@\
  1830.     RemoveFile($@)                            @@\
  1831.     ClearmakeOSName \
  1832.     $(FC) -c $(FCFLAGS) $*.f
  1833. #endif
  1834.  
  1835. /*
  1836.  * SpecialObjectRule - generate rules to compile a file with special flags.
  1837.  */
  1838. #ifndef SpecialObjectRule
  1839. #define SpecialObjectRule(objs,depends,options)                @@\
  1840. objs:    depends                                @@\
  1841.     ObjectCompile(options)
  1842. #endif /* SpecialObjectRule */
  1843.  
  1844. #ifndef SpecialCplusplusObjectRule
  1845. #define SpecialCplusplusObjectRule(baseobj,basedep,options)        @@\
  1846. baseobj.Osuf:    basedep.CCsuf                        @@\
  1847.     ObjectCplusplusCompile(options)
  1848. #endif /* SpecialCplusplusObjectRule */
  1849.  
  1850. /*
  1851.  * SpecialCObjectRule - generate rules to compile a C file with special flags.
  1852.  *            also handles CodeCenter rules
  1853.  */
  1854. #ifndef SpecialCObjectRule
  1855. #define SpecialCObjectRule(basename,depends,options)            @@\
  1856. SpecialObjectRule(basename.Osuf,basename.c depends,options)        @@\
  1857.                                     @@\
  1858. basename.i: basename.c depends                        @@\
  1859.     CPPOnlyCompile(basename.c,options)                @@\
  1860.                                     @@\
  1861. CenterLoadTarget(debug_src,basename.c,NullParameter,$(ALLDEFINES) options)
  1862. #endif /* SpecialCObjectRule */
  1863.  
  1864.  
  1865. #ifndef ObjectFromSpecialSource
  1866. #define ObjectFromSpecialSource(dst,src,flags)                @@\
  1867. NoConfigRec(dst.c)                            @@\
  1868.                                     @@\
  1869. dst.c:  src.c                                @@\
  1870.     RemoveFile($@)                            @@\
  1871.     $(LN) $? $@                            @@\
  1872.                                     @@\
  1873. SpecialCObjectRule(dst,NullParameter,flags)                @@\
  1874.                                     @@\
  1875. includes:: dst.c                            @@\
  1876.                                     @@\
  1877. depend::  dst.c                                @@\
  1878.                                     @@\
  1879. clean::                                    @@\
  1880.     RemoveFile(dst.c)
  1881. #endif /* ObjectFromSpecialSource */
  1882.  
  1883. #ifndef LexFileExplicit
  1884. #if HasClearmake        /* provide a place to hang ClearmakeOSName */
  1885. #define LexFileExplicit(file)                        @@\
  1886. file.c: file.l                                @@\
  1887.     ClearmakeOSName \
  1888.     $(LEX) $(LFLAGS) file.l                        @@\
  1889.     $(MV) lex.yy.c file.c
  1890. #else
  1891. #define LexFileExplicit(file) /* the default rule is fine */
  1892. #endif
  1893. #endif
  1894.  
  1895. #ifndef LexFile
  1896. #define LexFile(file)                            @@\
  1897. LexFileExplicit(file)                            @@\
  1898.                                     @@\
  1899. depend:: file.c                                @@\
  1900.                                     @@\
  1901. clean::                                    @@\
  1902.     RemoveFiles(lex.yy.c file.c)
  1903. #endif /* LexFile */
  1904.  
  1905. #ifndef YaccFile
  1906. #if HasGnuMake
  1907. #define YaccFile(file,flags)                        @@\
  1908. depend:: file.c                                @@\
  1909.                                     @@\
  1910. file.h: file.c                                @@\
  1911.                                     @@\
  1912. file.c: file.y                                @@\
  1913.     ClearmakeOSName \
  1914.     $(YACC) flags file.y                        @@\
  1915.     $(MV) y.tab.c file.c                        @@\
  1916.     @if [ -f y.tab.h ]; then set -x; $(MV) y.tab.h file.h; \    @@\
  1917.     else exit 0; fi                            @@\
  1918.                                     @@\
  1919. clean::                                    @@\
  1920.     RemoveFiles(y.tab.c y.tab.h file.h file.c)
  1921. #else
  1922. #define YaccFile(file,flags)                        @@\
  1923. depend:: file.c                                @@\
  1924.                                     @@\
  1925. file.h file.c: file.y                            @@\
  1926.     ClearmakeOSName \
  1927.     $(YACC) flags file.y                        @@\
  1928.     $(MV) y.tab.c file.c                        @@\
  1929.     @if [ -f y.tab.h ]; then set -x; $(MV) y.tab.h file.h; \    @@\
  1930.     else exit 0; fi                            @@\
  1931.                                     @@\
  1932. clean::                                    @@\
  1933.     RemoveFiles(y.tab.c y.tab.h file.h file.c)
  1934. #endif
  1935. #endif /* YaccFile */
  1936.  
  1937. #ifndef YaccFileNoFlags
  1938. #define YaccFileNoFlags(file)                        @@\
  1939. depend:: file.c                                @@\
  1940.                                     @@\
  1941. file.c: file.y                                @@\
  1942.     ClearmakeOSName \
  1943.     $(YACC) file.y                            @@\
  1944.     $(MV) y.tab.c file.c                        @@\
  1945.                                     @@\
  1946. clean::                                    @@\
  1947.     RemoveFiles(y.tab.c file.c)
  1948. #endif /* YaccFileNoFlags */
  1949.  
  1950.  
  1951. #ifndef MakeLibrary
  1952. #define MakeLibrary(libname,objlist) $(AR) libname objlist
  1953. #endif
  1954.  
  1955. #ifndef LinkBuildLibrary
  1956. #ifdef UseInstalled
  1957. #define LinkBuildLibrary(lib) $(_NULLCMD_)
  1958. #else
  1959. #define LinkBuildLibrary(lib) MakeDir($(BUILDLIBDIR))            @@\
  1960.     RemoveFile($(BUILDLIBDIR)/lib)                    @@\
  1961.     cd $(BUILDLIBDIR) && $(LN) $(BUILDLIBTOP)/$(CURRENT_DIR)/lib .
  1962. #endif
  1963. #endif /* LinkBuildLibrary */
  1964.  
  1965. #ifndef _LinkBuildLibrary /* will get redefined elsewhere */
  1966. #define _LinkBuildLibrary(lib) $(_NULLCMD_)
  1967. #endif /* _LinkBuildLibrary */
  1968.  
  1969. /*
  1970.  * NormalLibraryTarget - generate rules to create a library.
  1971.  */
  1972. #ifndef NormalLibraryTarget
  1973. #define    NormalLibraryTarget(libname,objlist)                @@\
  1974. AllTarget(LibraryTargetName(libname))                    @@\
  1975.                                     @@\
  1976. LibraryTargetName(libname): objlist $(EXTRALIBRARYDEPS)            @@\
  1977.     RemoveFile($@)                            @@\
  1978.     MakeLibrary($@,objlist)                        @@\
  1979.     RanLibrary($@)                            @@\
  1980.     _LinkBuildLibrary($@)
  1981. #endif /* NormalLibraryTarget */
  1982.  
  1983.  
  1984. /*
  1985.  * NormalLibraryTarget2 - generate rules to create a library in two steps.
  1986.  * This is used to create libraries with large numbers of files.
  1987.  */
  1988. #ifndef NormalLibraryTarget2
  1989. #define    NormalLibraryTarget2(libname,objlist1,objlist2)            @@\
  1990. AllTarget(LibraryTargetName(libname))                    @@\
  1991.                                     @@\
  1992. LibraryTargetName(libname): objlist1 objlist2 $(EXTRALIBRARYDEPS)    @@\
  1993.     RemoveFile($@)                            @@\
  1994.     MakeLibrary($@,objlist1)                    @@\
  1995.     MakeLibrary($@,objlist2)                    @@\
  1996.     RanLibrary($@)                            @@\
  1997.     _LinkBuildLibrary($@)
  1998. #endif /* NormalLibraryTarget2 */
  1999.  
  2000.  
  2001. /*
  2002.  * NormalLibraryTarget3 - generate rules to create a library in three steps.
  2003.  * This is used to create libraries with very large numbers of files.
  2004.  */
  2005. #ifndef NormalLibraryTarget3
  2006. #define    NormalLibraryTarget3(libname,objlist1,objlist2,objlist3)    @@\
  2007. AllTarget(LibraryTargetName(libname))                    @@\
  2008.                                     @@\
  2009. LibraryTargetName(libname): objlist1 objlist2 objlist3 $(EXTRALIBRARYDEPS)    @@\
  2010.     RemoveFile($@)                            @@\
  2011.     MakeLibrary($@,objlist1)                    @@\
  2012.     MakeLibrary($@,objlist2)                    @@\
  2013.     MakeLibrary($@,objlist3)                    @@\
  2014.     RanLibrary($@)                            @@\
  2015.     _LinkBuildLibrary($@)
  2016. #endif /* NormalLibraryTarget3 */
  2017.  
  2018.  
  2019. /*
  2020.  * NormalDepLibraryTarget - generate rules to create a library.
  2021.  */
  2022. #ifndef NormalDepLibraryTarget
  2023. #define    NormalDepLibraryTarget(libname,deplist,objlist)            @@\
  2024. AllTarget(LibraryTargetName(libname))                    @@\
  2025.                                     @@\
  2026. LibraryTargetName(libname): deplist $(EXTRALIBRARYDEPS)            @@\
  2027.     RemoveFile($@)                            @@\
  2028.     MakeLibrary($@,objlist)                        @@\
  2029.     RanLibrary($@)                            @@\
  2030.     _LinkBuildLibrary($@)
  2031. #endif /* NormalDepLibraryTarget */
  2032.  
  2033.  
  2034. /*
  2035.  * UnsharedLibraryTarget - generate rules to create a library.
  2036.  */
  2037. #ifndef UnsharedLibraryTarget
  2038. #define    UnsharedLibraryTarget(libname,objlist,down,up)            @@\
  2039. AllTarget(LibraryTargetName(libname))                    @@\
  2040.                                     @@\
  2041. LibraryTargetName(libname): objlist $(EXTRALIBRARYDEPS)            @@\
  2042.     RemoveFile($@)                            @@\
  2043.     (cd down && MakeLibrary(up/$@,objlist))                @@\
  2044.     RanLibrary($@)                            @@\
  2045.     _LinkBuildLibrary($@)
  2046. #endif /* UnsharedLibraryTarget */
  2047.  
  2048.  
  2049. /*
  2050.  * UnsharedLibraryTarget3 - generate rules to create a library in three steps.
  2051.  * This is used to create libraries with very large numbers of files.
  2052.  */
  2053. #ifndef UnsharedLibraryTarget3
  2054. #define    UnsharedLibraryTarget3(libname,objlist1,objlist2,objlist3,down,up) @@\
  2055. AllTarget(LibraryTargetName(libname))                    @@\
  2056.                                     @@\
  2057. LibraryTargetName(libname): objlist1 objlist2 objlist3 $(EXTRALIBRARYDEPS)    @@\
  2058.     RemoveFile($@)                            @@\
  2059.     (cd down && MakeLibrary(up/$@,objlist1))            @@\
  2060.     (cd down && MakeLibrary(up/$@,objlist2))            @@\
  2061.     (cd down && MakeLibrary(up/$@,objlist3))            @@\
  2062.     RanLibrary($@)                            @@\
  2063.     _LinkBuildLibrary($@)
  2064. #endif /* UnsharedLibraryTarget3 */
  2065.  
  2066.  
  2067. /*
  2068.  * SubdirLibraryRule -
  2069.  */
  2070. #ifndef SubdirLibraryRule
  2071. #define    SubdirLibraryRule(objlist)                    @@\
  2072. all:: DONE                                @@\
  2073.                                     @@\
  2074. DONE: objlist                                @@\
  2075.     RemoveFile($@)                            @@\
  2076.     touch $@                            @@\
  2077.                                     @@\
  2078. clean::                                    @@\
  2079.     RemoveFile(DONE)
  2080. #endif /* SubdirLibraryRule */
  2081.  
  2082.  
  2083. /*
  2084.  * ProfiledLibraryTarget - generate rules to create a profiled library.
  2085.  */
  2086. #ifndef ProfiledLibraryTarget
  2087. #define    ProfiledLibraryTarget(libname,objlist)                @@\
  2088. AllTarget(LibraryTargetNameSuffix(libname,_p))                @@\
  2089.                                     @@\
  2090. LibraryTargetNameSuffix(libname,_p): objlist $(EXTRALIBRARYDEPS)    @@\
  2091.     RemoveFile($@)                            @@\
  2092.     cd profiled && MakeLibrary(../$@,objlist)            @@\
  2093.     RanLibrary($@)
  2094.  
  2095. #endif /* ProfiledLibraryTarget */
  2096.  
  2097.  
  2098. /*
  2099.  * DebuggedLibraryTarget - generate rules to create a debuggable library.
  2100.  */
  2101. #ifndef DebuggedLibraryTarget
  2102. #define    DebuggedLibraryTarget(libname,objlist)                @@\
  2103. AllTarget(LibraryTargetNameSuffix(libname,_d))                @@\
  2104.                                     @@\
  2105. LibraryTargetNameSuffix(libname,_d): objlist $(EXTRALIBRARYDEPS)    @@\
  2106.     RemoveFile($@)                            @@\
  2107.     cd debugger && MakeLibrary(../$@,objlist)            @@\
  2108.     RanLibrary($@)
  2109.  
  2110. #endif /* DebuggedLibraryTarget */
  2111.  
  2112.  
  2113. /*
  2114.  * AliasedLibraryTarget - generate rules to link one library to another.
  2115.  */
  2116. #ifndef AliasedLibraryTarget
  2117. #define    AliasedLibraryTarget(libname,alias)                @@\
  2118. AllTarget(LibraryTargetName(alias))                    @@\
  2119.                                     @@\
  2120. LibraryTargetName(alias): LibraryTargetName(libname)            @@\
  2121.     RemoveFile($@)                            @@\
  2122.     $(LN) LibraryTargetName(libname) $@                @@\
  2123.                                     @@\
  2124. clean::                                    @@\
  2125.     RemoveFile(LibraryTargetName(alias))
  2126. #endif /* AliasedLibraryTarget */
  2127.  
  2128.  
  2129. /*
  2130.  * NormalRelocatableTarget - generate rules to produce a relocatable object
  2131.  * file instead of a library.  
  2132.  */
  2133. #ifndef NormalRelocatableTarget
  2134. #define    NormalRelocatableTarget(objname,objlist)            @@\
  2135. AllTarget(objname.Osuf)                            @@\
  2136.                                     @@\
  2137. objname.Osuf: objlist $(EXTRALIBRARYDEPS)                @@\
  2138.     RemoveFile($@)                            @@\
  2139.     $(LD) $(LDCOMBINEFLAGS) objlist -o $@
  2140. #endif /* NormalRelocatableTarget */
  2141.  
  2142.  
  2143. /*
  2144.  * ProfiledRelocatableTarget - generate rules to produce a profiled relocatable
  2145.  * object file instead of a library.
  2146.  */
  2147. #ifndef ProfiledRelocatableTarget
  2148. #define    ProfiledRelocatableTarget(objname,objlist)            @@\
  2149. AllTarget(Concat(objname,_p.Osuf))                    @@\
  2150.                                     @@\
  2151. Concat(objname,_p.Osuf): objlist $(EXTRALIBRARYDEPS)            @@\
  2152.     RemoveFile($@)                            @@\
  2153.     $(LD) -X -r objlist -o $@
  2154.  
  2155. #endif /* ProfiledRelocatableTarget */
  2156.  
  2157.  
  2158. /*
  2159.  * DebuggedRelocatableTarget - generate rules to produce a debuggable 
  2160.  * relocatable object file instead of a library.
  2161.  */
  2162. #ifndef DebuggedRelocatableTarget
  2163. #define    DebuggedRelocatableTarget(objname,objlist)            @@\
  2164. AllTarget(Concat(objname,_d.Osuf))                    @@\
  2165.                                     @@\
  2166. Concat(objname,_d.Osuf): objlist $(EXTRALIBRARYDEPS)            @@\
  2167.     RemoveFile($@)                            @@\
  2168.     $(LD) -X -r objlist -o $@
  2169.  
  2170. #endif /* DebuggedRelocatableTarget */
  2171.  
  2172.  
  2173. /*
  2174.  * LintLibraryTarget - generate rules to create a lint library.  Note that the
  2175.  * lint library is always forced to be newer than the library itself.
  2176.  */
  2177. #ifndef LintLibraryTarget
  2178. #define    LintLibraryTarget(libname,srclist)                @@\
  2179. lintlib:: Concat(llib-l,libname.ln)                    @@\
  2180.                                     @@\
  2181. Concat(llib-l,libname.ln): srclist $(EXTRALIBRARYDEPS)            @@\
  2182.     RemoveFile($@)                            @@\
  2183.     $(LINT) Concat($(LINTLIBFLAG),libname) $(LINTFLAGS) srclist
  2184. #endif /* LintLibraryTarget */
  2185.  
  2186.  
  2187. /*
  2188.  * NormalLintTarget - generate rules to lint a set of sources.
  2189.  */
  2190. #ifndef NormalLintTarget
  2191. #define NormalLintTarget(srclist)                    @@\
  2192. lint:                                    @@\
  2193.     $(LINT) $(LINTFLAGS) srclist $(LINTLIBS)            @@\
  2194. lint1:                                    @@\
  2195.     $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
  2196. #endif /* NormalLintTarget */
  2197.  
  2198.  
  2199. /*
  2200.  * LintTarget - generate rules to lint $(SRCS)
  2201.  */
  2202. #ifndef LintTarget
  2203. #define LintTarget()                            @@\
  2204. NormalLintTarget($(SRCS))
  2205. #endif
  2206.  
  2207.  
  2208. /*
  2209.  * LinkSourceFile - snag source file from some other directory
  2210.  */
  2211. #ifndef LinkSourceFile
  2212. #define LinkSourceFile(src,dir)                        @@\
  2213. src:  dir/src                                @@\
  2214.     RemoveFile($@)                            @@\
  2215.     $(LN) $? $@                            @@\
  2216.                                     @@\
  2217. NoConfigRec(src)                            @@\
  2218.                                     @@\
  2219. includes:: src                                @@\
  2220.                                     @@\
  2221. depend:: src                                @@\
  2222.                                     @@\
  2223. clean::                                    @@\
  2224.     RemoveFile(src)
  2225. #endif
  2226.  
  2227.  
  2228. /*
  2229.  * LinkFile - link a file
  2230.  */
  2231. #ifndef LinkFile
  2232. #define LinkFile(tofile,fromfile)                    @@\
  2233. tofile:: fromfile                            @@\
  2234.     RemoveFile($@)                            @@\
  2235.     $(LN) $? $@                            @@\
  2236.                                     @@\
  2237. NoConfigRec(tofile)                            @@\
  2238.                                     @@\
  2239. includes:: tofile                            @@\
  2240.                                     @@\
  2241. depend:: tofile                                @@\
  2242.                                     @@\
  2243. clean::                                    @@\
  2244.     RemoveFile(tofile)
  2245. #endif
  2246.  
  2247.  
  2248. #ifndef MakeSubincludesForBuild
  2249. #define MakeSubincludesForBuild(step,dir,srclist)            @@\
  2250. step::  dir srclist                            @@\
  2251.     @-(list=`echo srclist | sed -e 's/[^ ]*\///g'`; \        @@\
  2252.         set -x; cd dir && RemoveFiles($$list))            @@\
  2253.     @for i in srclist; do \                        @@\
  2254.         (set -x; cd dir && $(LN) ../$$i .); \            @@\
  2255.     done                                @@\
  2256.                                     @@\
  2257. dir::                                    @@\
  2258.     $(MKDIRHIER) dir                        @@\
  2259.                                     @@\
  2260. clean::                                    @@\
  2261.     @-(if [ -d dir ]; then \                    @@\
  2262.         list=`echo srclist | sed -e 's/[^ ]*\///g'`; \        @@\
  2263.         set -x; cd dir && RemoveFile($$list); else exit 0; fi)
  2264. #endif
  2265.  
  2266.  
  2267. /*
  2268.  * LangNamedTargetSubdirs - recursively make a series of steps
  2269.  */
  2270. #ifndef LangNamedTargetSubdirs
  2271. #define LangNamedTargetSubdirs(lang,name,dirs,verb,flags,subname)    @@\
  2272. name::                                    @@\
  2273.     @MakeFlagsToShellFlags(ik,set +e); \                @@\
  2274.     for i in dirs ;\                        @@\
  2275.     do \                                @@\
  2276.         echo verb "in $(CURRENT_DIR)/$$i..."; \            @@\
  2277.         (cd $$i && LANG=lang $(MAKE) $(MFLAGS) flags subname);\ @@\
  2278.     done
  2279. #endif
  2280.  
  2281.  
  2282. /*
  2283.  * NamedMakeSubdirs - generate rules to do makes in the given subdirectories.
  2284.  * If you want CDEBUGFLAGS passed along to subdirectories, provide a line like
  2285.  * the following in the appropriate Imakefile
  2286.  * 
  2287.  *         #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)'
  2288.  */
  2289. #ifndef LangNamedMakeSubdirs
  2290. #define LangNamedMakeSubdirs(lang,name,dirs) \
  2291. LangNamedTargetSubdirs(lang,name,dirs,"making" name,PassCDebugFlags,all)
  2292. #endif /* LangNamedMakeSubdirs */
  2293.  
  2294. #ifndef LangMakeSubdirs
  2295. #define LangMakeSubdirs(lang,dirs)                    @@\
  2296. LangNamedMakeSubdirs(lang,all,dirs)
  2297. #endif /* LangMakeSubdirs */
  2298.  
  2299.  
  2300.  
  2301. /*
  2302.  * NamedTargetSubdirs - recursively make a series of steps
  2303.  */
  2304. #ifndef NamedTargetSubdirs
  2305. #define NamedTargetSubdirs(name,dirs,verb,flags,subname)        @@\
  2306. name::                                    @@\
  2307.     @MakeFlagsToShellFlags(ik,set +e); \                @@\
  2308.     for i in dirs ;\                        @@\
  2309.     do \                                @@\
  2310.         echo verb "in $(CURRENT_DIR)/$$i..."; \            @@\
  2311.         MakeNamedTargetSubdir($$i,flags,subname); \        @@\
  2312.     done
  2313. #endif
  2314.  
  2315.  
  2316. /*
  2317.  * NamedMakeSubdirs - generate rules to do makes in the given subdirectories.
  2318.  * If you want CDEBUGFLAGS passed along to subdirectories, provide a line like
  2319.  * the following in the appropriate Imakefile
  2320.  * 
  2321.  *         #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)'
  2322.  */
  2323. #ifndef NamedMakeSubdirs
  2324. #define NamedMakeSubdirs(name,dirs) \
  2325. NamedTargetSubdirs(name,dirs,"making" name,PassCDebugFlags,all)
  2326. #endif /* NamedMakeSubdirs */
  2327.  
  2328. #ifndef MakeSubdirs
  2329. #define MakeSubdirs(dirs)                        @@\
  2330. NamedMakeSubdirs(all,dirs)
  2331. #endif /* MakeSubdirs */
  2332.  
  2333.  
  2334. /*
  2335.  * DependSubdirs - generate rules to recursively compute dependencies as
  2336.  * part of the make depend step.
  2337.  */
  2338. #ifndef DependSubdirs
  2339. #define DependSubdirs(dirs) \
  2340. NamedTargetSubdirs(depend,dirs,"depending",NullParameter,depend)
  2341. #endif /* DependSubdirs */
  2342.  
  2343.  
  2344. /*
  2345.  * ForceSubdirs - force make to build subdirectories
  2346.  */
  2347. #ifndef ForceSubdirs
  2348. #if !HasBsdMake
  2349. #define ForceSubdirs(dirs)                        @@\
  2350. dirs: FRC                                @@\
  2351.     @echo "making all in $(CURRENT_DIR)/$@..."            @@\
  2352.     @MakeNamedTargetSubdir($@,PassCDebugFlags,all)            @@\
  2353.                                     @@\
  2354. FRC:
  2355. #else
  2356. /* For BSD 4.4 make */
  2357. #define ForceSubdirs(dirs)                        @@\
  2358. dirs: .EXEC                                @@\
  2359.     @cd $@ ; echo "making all in $(CURRENT_DIR)/$@..."; \        @@\
  2360.     $(MAKE) $(MFLAGS) PassCDebugFlags all                @@\
  2361.                                     @@\
  2362. .EXEC:
  2363. #endif
  2364. #endif /* ForceSubdirs */
  2365.  
  2366. /*
  2367.  * InstallSubdirs - generate rules to recursively install programs and files.
  2368.  */
  2369. #ifndef InstallSubdirs
  2370. #define InstallSubdirs(dirs) \
  2371. NamedTargetSubdirs(install,dirs,"installing",DESTDIR=$(DESTDIR),install)
  2372. #endif /* InstallSubdirs */
  2373.  
  2374.  
  2375. /*
  2376.  * InstallManSubdirs - generate rules to recursively install manual pages.
  2377.  */
  2378. #ifndef InstallManSubdirs
  2379. #define InstallManSubdirs(dirs) \
  2380. NamedTargetSubdirs(install.man,dirs,"installing man pages",DESTDIR=$(DESTDIR),install.man)
  2381. #endif /* InstallManSubdirs */
  2382.  
  2383.  
  2384. /*
  2385.  * IncludesSubdirs - generate rules to recursively put include files in build
  2386.  */
  2387. #ifndef IncludesSubdirs
  2388. #define IncludesSubdirs(dirs) \
  2389. NamedTargetSubdirs(includes,dirs,including,NullParameter,includes)
  2390. #endif
  2391.  
  2392.  
  2393. /*
  2394.  * InstallLinkKitSubdirs - generate rules to recursively install server Link
  2395.  *                         Kit (only used for XFree86). This is a no-op
  2396.  *                         rule so that Imakefiles on non-XFree86 systems
  2397.  *                         continue to build Makefiles correctly.
  2398.  */
  2399. #ifndef InstallLinkKitSubdirs
  2400. #define InstallLinkKitSubdirs(dirs)
  2401. #endif
  2402.  
  2403.  
  2404. /*
  2405.  * CleanSubdirs - generate rules to recursively clean out garbage files.
  2406.  */
  2407. #define BootstrapCleanSubdirs /**/    /* used at top-level */
  2408. #ifndef NamedCleanSubdirs
  2409. #define NamedCleanSubdirs(name,dirs) \
  2410. NamedTargetSubdirs(name,dirs,"cleaning",BootstrapCleanSubdirs,clean)
  2411. #endif /* NamedCleanSubdirs */
  2412.  
  2413. #ifndef CleanSubdirs
  2414. #define CleanSubdirs(dirs) \
  2415. NamedCleanSubdirs(clean,dirs)
  2416. #endif
  2417.  
  2418.  
  2419. /*
  2420.  * TagSubdirs - generate rules to recursively create tags files.
  2421.  */
  2422. #ifndef NamedTagSubdirs
  2423. #define NamedTagSubdirs(name,dirs) \
  2424. NamedTargetSubdirs(name,dirs,"tagging",TAGS='$(TAGS)',tags)
  2425. #endif /* TagSubdirs */
  2426.  
  2427. #ifndef TagSubdirs
  2428. #define TagSubdirs(dirs) \
  2429. NamedTagSubdirs(tags,dirs)
  2430. #endif
  2431.  
  2432. /*
  2433.  * MakeLintSubdirs - generate rules to recursively lint directories as part 
  2434.  * of the named step.
  2435.  */
  2436. #ifndef MakeLintSubdirs
  2437. #define MakeLintSubdirs(dirs,target,subtarget) \
  2438. NamedTargetSubdirs(target,dirs,"linting" for target and subtarget,DESTDIR=$(DESTDIR) LINTOPTS='$(LINTOPTS)',subtarget)
  2439. #endif /* MakeLintSubdirs */
  2440.  
  2441.  
  2442. /*
  2443.  * LintSubdirs - generate rules to recursively lint directories as part of 
  2444.  * the make lint step.
  2445.  */
  2446. #ifndef LintSubdirs
  2447. #define LintSubdirs(dirs)                        @@\
  2448. MakeLintSubdirs(dirs,lint,lint)
  2449. #endif /* LintSubdirs */
  2450.  
  2451.  
  2452. /*
  2453.  * MakeLintLibSubdirs - generate rules to recursively create lint libraries.
  2454.  */
  2455. #ifndef MakeLintLibSubdirs
  2456. #define MakeLintLibSubdirs(dirs)                    @@\
  2457. MakeLintSubdirs(dirs,lintlib,lintlib)
  2458. #endif /* MakeLintLibSubdirs */
  2459.  
  2460.  
  2461. /*
  2462.  * MakeMakeSubdirs - generate rules to recursively recreate Makefiles as part
  2463.  * of the specified step in the build.  If $(TOP) is set to an absolute path, 
  2464.  * do not prepend the ../ prefix.  This makes running things outside of the 
  2465.  * source tree much easier.
  2466.  * $(ONESUBDIR)/Makefile exists as a separate, explicit target so that
  2467.  * clearmake will know what its goal is and do wink-in.
  2468.  */
  2469. #ifndef MakeMakeSubdirs
  2470. #define MakeMakeSubdirs(dirs,target)                    @@\
  2471. $(ONESUBDIR)/Makefile:                            @@\
  2472.     @MakeFlagsToShellFlags(n,executeit="no"); \            @@\
  2473.     cd $(ONESUBDIR) && \                        @@\
  2474.     if [ "$$executeit" != "no" ]; then \                @@\
  2475.         ImakeSubCmdHelper -DTOPDIR=$(IMAKETOP) -DCURDIR=$(ONECURDIR)$(ONESUBDIR); \ @@\
  2476.     fi;                                @@\
  2477.                                     @@\
  2478. target::                                @@\
  2479.     -@MakeFlagsToShellFlags(ik,set +e); \                @@\
  2480.     MakeFlagsToShellFlags(n,executeit="no"); \            @@\
  2481.     for i in dirs ;\                        @@\
  2482.     do \                                @@\
  2483.         case "$(CURRENT_DIR)" in \                @@\
  2484.         .) curdir= ;; \                        @@\
  2485.         *) curdir=$(CURRENT_DIR)/ ;; \                @@\
  2486.         esac; \                            @@\
  2487.         echo "making Makefiles in $$curdir$$i..."; \        @@\
  2488.         itmp=`echo $$i | sed -e 's;^\./;;g' -e 's;/\./;/;g'`; \    @@\
  2489.         curtmp="$(CURRENT_DIR)" \                @@\
  2490.         toptmp=""; \                        @@\
  2491.         case "$$itmp" in \                    @@\
  2492.             ../?*) \                         @@\
  2493.             while echo "$$itmp" | grep '^\.\./' > /dev/null;\    @@\
  2494.               do \                        @@\
  2495.                  toptmp="/`basename $$curtmp`$$toptmp"; \    @@\
  2496.                  curtmp="`dirname $$curtmp`"; \        @@\
  2497.                  itmp="`echo $$itmp | sed 's;\.\./;;'`"; \    @@\
  2498.               done \                    @@\
  2499.             ;; \                        @@\
  2500.         esac; \                            @@\
  2501.         case "$$itmp" in \                    @@\
  2502.         */?*/?*/?*/?*)    newtop=../../../../..;; \        @@\
  2503.         */?*/?*/?*)    newtop=../../../..;; \            @@\
  2504.         */?*/?*)    newtop=../../..;; \            @@\
  2505.         */?*)        newtop=../..;; \            @@\
  2506.         *)        newtop=..;; \                @@\
  2507.         esac; \                            @@\
  2508.         newtop="$$newtop$$toptmp"; \                @@\
  2509.         case "$(TOP)" in \                    @@\
  2510.         /?*) imaketop=$(TOP) \                    @@\
  2511.              imakeprefix= ;; \                    @@\
  2512.         .) imaketop=$$newtop \                    @@\
  2513.            imakeprefix=$$newtop/ ;; \                @@\
  2514.         *) imaketop=$$newtop/$(TOP) \                @@\
  2515.            imakeprefix=$$newtop/ ;; \                @@\
  2516.         esac; \                            @@\
  2517.         RemoveFile($$i/Makefile.bak); \                @@\
  2518.         if [ -f $$i/Makefile ]; then \                @@\
  2519.             echo "    $(MV) Makefile Makefile.bak"; \        @@\
  2520.             if [ "$$executeit" != "no" ]; then \        @@\
  2521.                 $(MV) $$i/Makefile $$i/Makefile.bak; \    @@\
  2522.             fi; \                        @@\
  2523.         fi; \                            @@\
  2524.         $(MAKE) $(MFLAGS) $(MAKE_OPTS) ONESUBDIR=$$i ONECURDIR=$$curdir IMAKETOP=$$imaketop IMAKEPREFIX=$$imakeprefix $$i/Makefile; \    @@\
  2525.         if [ -d $$i ] ; then \                    @@\
  2526.             cd $$i; \                    @@\
  2527.             $(MAKE) $(MFLAGS) Makefiles; \            @@\
  2528.             cd $$newtop; \                    @@\
  2529.         else \                            @@\
  2530.             exit 1; \                    @@\
  2531.         fi; \                            @@\
  2532.     done
  2533.  
  2534. #ifdef UseInstalled
  2535. #define ImakeSubCmdHelper $(IMAKE_CMD)
  2536. #else
  2537. #define ImakeSubCmdHelper $(IMAKEPREFIX)$(IMAKE) -I$(IMAKEPREFIX)$(IRULESRC) $(IMAKE_DEFINES)
  2538. #endif
  2539.  
  2540. #endif /* MakeMakeSubdirs */
  2541.  
  2542.  
  2543. /*
  2544.  * MakefileSubdirs - generate rules to create Makefiles.
  2545.  */
  2546. #ifndef MakefileSubdirs
  2547. #define MakefileSubdirs(dirs)                        @@\
  2548. MakeMakeSubdirs(dirs,Makefiles)
  2549. #endif /* MakefileSubdirs */
  2550.  
  2551. /*
  2552.  * Translate XCOMM into pound sign with sed, rather than passing -DXCOMM=XCOMM
  2553.  * to cpp, because that trick does not work on all ANSI C preprocessors.
  2554.  * Also delete line numbers from the cpp output (-P is not portable, I guess).
  2555.  */
  2556. #ifndef CppSedMagic
  2557. #define CppSedMagic sed -e '/^#  *[0-9][0-9]*  *.*$$/d' -e '/^XCOMM$$/s//#/' -e '/^XCOMM[^a-zA-Z0-9_]/s/^XCOMM/#/'
  2558. #endif /* CppSedMagic */
  2559.  
  2560. #ifndef CppFileTarget
  2561. #define CppFileTarget(dst,src,defs,deplist)                @@\
  2562. dst::  src deplist                            @@\
  2563.     RemoveFile($@)                            @@\
  2564.     ClearmakeOSName \
  2565.     $(CPP) CppNoLineInfoOption defs <src | CppSedMagic >$@        @@\
  2566.                                     @@\
  2567. clean::                                    @@\
  2568.     RemoveFiles(dst)
  2569. #endif /* CppFileTarget */
  2570.  
  2571. /*
  2572.  * CppScriptTarget - generate rules to create a shell script by running the
  2573.  * input through cpp.  If the ExecableScripts configuration parameter is not
  2574.  * set, then make sure that the first line begins with a colon.
  2575.  */
  2576. #ifndef CppScriptTarget
  2577. #if ExecableScripts        /* can use #! instead of colon */
  2578. #define CppScriptTarget(dst,src,defs,deplist)                @@\
  2579. dst::    src deplist                            @@\
  2580.     RemoveFile($@)                            @@\
  2581.     ClearmakeOSName \
  2582.     $(CPP) CppNoLineInfoOption defs <src | CppSedMagic >$@        @@\
  2583.     chmod a+x $@                            @@\
  2584.                                     @@\
  2585. clean::                                    @@\
  2586.     RemoveFiles(dst)
  2587. #else
  2588. #define CppScriptTarget(dst,src,defs,deplist)                @@\
  2589. dst::  src deplist                            @@\
  2590.     RemoveFile($@)                            @@\
  2591.     ClearmakeOSName \
  2592.     echo \: >$@                            @@\
  2593.     sed '1d' src | $(CPP) CppNoLineInfoOption defs | CppSedMagic >>$@    @@\
  2594.     chmod a+x $@                            @@\
  2595.                                     @@\
  2596. clean::                                    @@\
  2597.     RemoveFile(dst)
  2598. #endif /* ExecableScripts */
  2599. #endif /* CppScriptTarget */
  2600.  
  2601.  
  2602. /*
  2603.  * MakeScriptFromCpp - generate rules to create a script from a file with a
  2604.  * .cpp suffix.
  2605.  */
  2606. #ifndef MakeScriptFromCpp
  2607. #define MakeScriptFromCpp(name,defs)                    @@\
  2608. CppScriptTarget(name,name.cpp,defs,NullParameter)
  2609. #endif /* MakeScriptFromCpp */
  2610.  
  2611. #ifndef CppSourceFile
  2612. #define CppSourceFile(dst,src,defs,deplist)                @@\
  2613. CppFileTarget(dst,src,defs,deplist)                    @@\
  2614.                                     @@\
  2615. includes:: dst                                @@\
  2616.                                     @@\
  2617. depend:: dst
  2618. #endif /* CppFileTarget */
  2619.  
  2620. /*
  2621.  * MakeDirectories - generate rules to create a hierarchy of directories.
  2622.  */
  2623. #ifndef MakeDirectories
  2624. #define MakeDirectories(step,dirs)                    @@\
  2625. step::                                    @@\
  2626.     DirFailPrefix@MakeFlagsToShellFlags(i,set +e); \        @@\
  2627.     for i in dirs; do if [ -d $(DESTDIR)$$i ]; then \        @@\
  2628.         set +x; else (set -x; $(MKDIRHIER) $(DESTDIR)$$i); fi; \ @@\
  2629.     done
  2630. #endif /* MakeDirectories */
  2631.  
  2632.  
  2633. /*
  2634.  * AllTarget - generate rules to build necessary things during make all.
  2635.  */
  2636. #ifndef AllTarget
  2637. #define AllTarget(depends)                        @@\
  2638. all:: depends
  2639. #endif /* AllTarget */
  2640.  
  2641. #ifdef DefineOldLibraryRules
  2642. #include <oldlib.rules>
  2643. #endif
  2644.  
  2645. #ifndef StaticLibrary
  2646. #define StaticLibrary(libpath,libname) Concat3(libpath,/,LibraryTargetName(libname))
  2647. #endif
  2648.  
  2649. /*
  2650.  * MakeMutex - generate mutex rules for parallel make
  2651.  */
  2652. #ifndef MakeMutex
  2653. #ifdef MutexDirective
  2654. #define MakeMutex(targets)                        @@\
  2655. MutexDirective:    targets
  2656. #endif /* MutexDirective */
  2657. #endif /* MakeMutex */
  2658.