/*
 * Library imakefile info  - this contains any special redefinitions, etc.
 * that Imakefiles in the various library subtrees will need.
 *
 * Before including this, you must set the following boolean variables:
 * DoNormalLib, DoSharedLib, DoDebugLib, DoProfileLib
 *
 * To get automatic generation of standard rules, also set the variables:
 * LibName, SoRev, HasSharedData, and optionally HugeLibrary and IncSubdir.
 *
 * To suppress installation of the library define LibInstall NO.
 * To suppress creating (and installing) the library define LibCreate NO.
 * To suppress installing headers define LibHeaders NO.
 * Define LargePICTable YES if large (32-bit) PIC tables are needed.
 */

XCOMM $Xorg: Library.tmpl,v 1.3 2000/08/17 19:41:46 cpqbld Exp $




XCOMM $XFree86: xc/config/cf/Library.tmpl,v 3.23tsi Exp $

#ifndef DoNormalLib
#define DoNormalLib NO
#endif
#ifndef DoSharedLib
#define DoSharedLib NO
#endif
#ifndef DoDebugLib
#define DoDebugLib NO
#endif
#ifndef DoProfileLib
#define DoProfileLib NO
#endif
#ifndef DoExtraLib
#define DoExtraLib NO
#endif

#ifndef HasSharedData
#define HasSharedData NO
#endif
#ifndef HugeLibrary
#define HugeLibrary NO
#endif

#ifndef ShlibBindGlobals
#define ShlibBindGlobals NO
#endif

#if ShlibBindGlobals && defined(ShlibGlobalsFlags)
SHLIBGLOBALSFLAGS = ShlibGlobalsFlags
#endif

#ifndef LibraryCplusplusOptions
# if DoSharedLib && defined(SharedLibraryCplusplusOptions)
#  define LibraryCplusplusOptions SharedLibraryCplusplusOptions
# else
#  define LibraryCplusplusOptions DefaultCplusplusOptions
# endif
#endif
#ifndef LibraryDefines
# define LibraryDefines StandardDefines
#endif
#ifndef LibraryDebugOpt
# define LibraryDebugOpt /**/
#endif
/* Note: Changing LibraryCDebugFlags has no effect because CDEBUGFLAGS is over-
   ridden by PassCDebugFlags in the parent Makefile or toplevel xmakefile. */
#ifndef LibraryCDebugFlags
# define LibraryCDebugFlags DefaultCDebugFlags
#endif
#ifndef LibraryCplusplusDebugFlags
# define LibraryCplusplusDebugFlags DefaultCplusplusDebugFlags
#endif
#ifndef SeparateSharedCompile
# define SeparateSharedCompile YES
#endif

#ifdef CrossCompileDir
# ifndef StripPath
#  define StripPath(x) `echo x|sed "s%.*/%%"`
# endif
#endif

#ifndef CplusplusSource
# ifndef LibraryCcCmd
#  if DoSharedLib && defined(SharedLibraryCcCmd)
#   define LibraryCcCmd SharedLibraryCcCmd
#  else
#   define LibraryCcCmd CcCmd
#  endif
# endif
# ifndef LibraryCCOptions
#  if DoSharedLib && defined(SharedLibraryCCOptions)
#   define LibraryCCOptions SharedLibraryCCOptions
#  else
#   define LibraryCCOptions DefaultCCOptions
#  endif
# endif

#ifdef CrossCompileDir
# ifndef CrossLibraryCcCmd
#  define CrossLibraryCcCmd Concat3(CrossCompileDir,/,StripPath(LibraryCcCmd))
# endif
#endif

#ifdef CrossCompileDir
         CC = CrossLibraryCcCmd
#else
         CC = LibraryCcCmd
#endif
  CCOPTIONS = LibraryCCOptions
STD_DEFINES = LibraryDefines $(PROJECT_DEFINES)
CDEBUGFLAGS = LibraryCDebugFlags
CLIBDEBUGFLAGS = LibraryDebugOpt
     CFLAGS = $(CDEBUGFLAGS) $(CLIBDEBUGFLAGS) $(CCOPTIONS) $(THREADS_CFLAGS) $(ALLDEFINES)
# if defined(LargePICTable) && LargePICTable && defined(LargePositionIndependentCFlags)
   PICFLAGS = LargePositionIndependentCFlags
# endif
#else
# ifndef CrossCompileDir
#  ifndef LibraryCplusplusCmd
#   if DoSharedLib && defined(SharedLibraryCplusplusCmd)
#    define LibraryCplusplusCmd SharedLibraryCplusplusCmd
#   else
#    define LibraryCplusplusCmd CplusplusCmd
#   endif
#  endif
# else
#  ifndef CrossLibraryCplusplusCmd
#   if DoSharedLib && defined(SharedLibraryCplusplusCmd)
#    define CrossLibraryCplusplusCmd Concat3(CrossCompileDir,/,StripPath(SharedLibraryCplusplusCmd))
#   else
#    define CrossLibraryCplusplusCmd Concat3(CrossCompileDir,/,StripPath(CplusplusCmd))
#   endif
#  endif
# endif

# ifndef LibraryCplusplusOptions
#  if DoSharedLib && defined(SharedLibraryCplusplusOptions)
#   define LibraryCplusplusOptions SharedLibraryCplusplusOptions
#  else
#   define LibraryCplusplusOptions DefaultCplusplusOptions
#  endif
# endif

#ifdef CrossCompileDir
          CXX = CrossLibraryCplusplusCmd
#else
          CXX = LibraryCplusplusCmd
#endif
   CXXOPTIONS = LibraryCplusplusOptions
  STD_DEFINES = LibraryDefines $(PROJECT_DEFINES)
CXXDEBUGFLAGS = LibraryCplusplusDebugFlags
CXXLIBDEBUGFLAGS = LibraryDebugOpt
     CXXFLAGS = $(CXXDEBUGFLAGS) $(CXXLIBDEBUGFLAGS) $(CXXOPTIONS) $(THREADS_CXXFLAGS) $(CXXDEFINES)
# if defined(LargePICTable) && LargePICTable
#  ifdef LargePositionIndependentCplusplusFlags
  CXXPICFLAGS = LargePositionIndependentCplusplusFlags
#  elif defined(LargePositionIndependentCFlags)
  CXXPICFLAGS = LargePositionIndependentCFlags
#  endif
# endif
#endif

#ifdef LibraryMTDefines
LIB_MT_DEFINES = LibraryMTDefines
#endif

#if defined(IHaveSubdirs) && HasSymLinks && !defined(NoLibSubdirs)
#define _LibMkdir LibMkdirLinkSubdirs
#else
#define _LibMkdir LibMkdir
#endif

#if DoDebugLib
# define _DebuggedLibMkdir() _LibMkdir(debugger)
# define _DebuggedObjCompile(options) DebuggedLibObjCompile(options)
# define _DebuggedObjCplusplusCompile(options) DebuggedLibObjCplusplusCompile(options)
# define _DebuggedCleanDir() LibCleanDir(debugger)
#else
# define _DebuggedLibMkdir() $(_NULLCMD_)
# define _DebuggedObjCompile(options) $(_NULLCMD_)
# define _DebuggedObjCplusplusCompile(options) $(_NULLCMD_)
# define _DebuggedCleanDir() $(_NULLCMD_)
#endif

#if DoProfileLib
# define _ProfiledLibMkdir() _LibMkdir(profiled)
# define _ProfiledObjCompile(options) ProfiledLibObjCompile(options)
# define _ProfiledObjCplusplusCompile(options) ProfiledLibObjCplusplusCompile(options)
# define _ProfiledCleanDir() LibCleanDir(profiled)
#else
# define _ProfiledLibMkdir() $(_NULLCMD_)
# define _ProfiledObjCompile(options) $(_NULLCMD_)
# define _ProfiledObjCplusplusCompile(options) $(_NULLCMD_)
# define _ProfiledCleanDir() $(_NULLCMD_)
#endif

#if !DoNormalLib
# define _NormalLibMkdir() $(_NULLCMD_)
# define _NormalObjCompile(options) $(_NULLCMD_)
# define _NormalObjCplusplusCompile(options) $(_NULLCMD_)
# define _NormalCleanDir() $(_NULLCMD_)
#else
# if DoSharedLib && SeparateSharedCompile
#  define _NormalLibMkdir() _LibMkdir(unshared)
#  define _NormalObjCompile(options) UnsharedLibObjCompile(options)
#  define _NormalObjCplusplusCompile(options) UnsharedLibObjCplusplusCompile(options)
#  define _NormalCleanDir() LibCleanDir(unshared)
# else
#  define _NormalLibMkdir() $(_NULLCMD_)
#  if !DoSharedLib &&  defined(IncludeSharedObjectInNormalLib)
#   define _NormalObjCompile(options) NormalRelocLibObjCompile(options)
#  else
#   define _NormalObjCompile(options) NormalLibObjCompile(options)
#  endif
#  define _NormalObjCplusplusCompile(options) NormalLibObjCplusplusCompile(options)
#  define _NormalCleanDir() $(_NULLCMD_)
# endif
#endif

#if !DoSharedLib || (DoNormalLib && !SeparateSharedCompile)
# define _SharedObjCompile(options) $(_NULLCMD_)
# define _SharedObjCplusplusCompile(options) $(_NULLCMD_)
#else
# if SeparateSharedCompile
#  define _SharedObjCompile(options) NormalSharedLibObjCompile(options)
#  define _SharedObjCplusplusCompile(options) NormalSharedLibObjCplusplusCompile(options)
#else
# define _SharedObjCompile(options) NormalLibObjCompile(options)
# define _SharedObjCplusplusCompile(options) NormalLibObjCplusplusCompile(options)
#endif
#endif

#ifndef LibInstallBuild
#define LibInstallBuild NO
#endif

#if DoExtraLib && defined(ExtraLibRules)
# define _ExtraLibMkdir() ExtraLibMkdir()
# define _ExtraObjCompile(options) ExtraObjCompile(options)
# define _ExtraObjCplusplusCompile(options) ExtraObjCplusplusCompile(options)
# define _ExtraCleanDir() ExtraCleanDir()
#else
# define _ExtraLibMkdir() $(_NULLCMD_)
# define _ExtraObjCompile(options) $(_NULLCMD_)
# define _ExtraObjCplusplusCompile(options) $(_NULLCMD_)
# define _ExtraCleanDir() $(_NULLCMD_)
#endif

#ifndef CplusplusSource
# define SRCsuf c
# define Isuf i
#else
# define SRCsuf CCsuf
# define Isuf ii
# ifdef SunArchitecture
.SUFFIXES: Concat(.,CCsuf)
# endif
#endif

#define _CompileObj(target, options)					@@\
target									@@\
	_DebuggedObjCompile(options)					@@\
	_ProfiledObjCompile(options)					@@\
	_NormalObjCompile(options)					@@\
	_ExtraObjCompile(options)					@@\
	_SharedObjCompile(options)

#ifndef SeparateSharedCompile
# define _CompileObjSeparateOpts(target,staticopts,sharedopts) \
	_CompileObj(target,sharedopts)
#else
# define _CompileObjSeparateOpts(target,staticopts,sharedopts)		@@\
target									@@\
	_DebuggedObjCompile(staticopts)					@@\
	_ProfiledObjCompile(staticopts)					@@\
	_NormalObjCompile(staticopts)					@@\
	_ExtraObjCompile(staticopts)					@@\
	_SharedObjCompile(sharedopts)
#endif

#ifdef CplusplusSource
# define _CompileObjCplusplus(target, options)				@@\
target									@@\
	_DebuggedObjCplusplusCompile(options)				@@\
	_ProfiledObjCplusplusCompile(options)				@@\
	_NormalObjCplusplusCompile(options)				@@\
	_ExtraObjCplusplusCompile(options)				@@\
	_SharedObjCplusplusCompile(options)
#else
# define _CompileObjCplusplus(target, options)
#endif

#ifndef LibraryObjectRule
# define LibraryObjectRule()						@@\
all::									@@\
	_DebuggedLibMkdir()						@@\
	_ProfiledLibMkdir()						@@\
	_NormalLibMkdir()						@@\
	_ExtraLibMkdir()						@@\
									@@\
includes::								@@\
	_DebuggedLibMkdir()						@@\
	_ProfiledLibMkdir()						@@\
	_NormalLibMkdir()						@@\
	_ExtraLibMkdir()						@@\
									@@\
_CompileObj(.c.Osuf:,$(_NOOP_))						@@\
_CompileObjCplusplus(.SRCsuf.Osuf:,$(_NOOP_))				@@\
									@@\
clean::									@@\
	_DebuggedCleanDir()						@@\
	_ProfiledCleanDir()						@@\
	_NormalCleanDir()						@@\
	_ExtraCleanDir()						@@\

#endif /* LibraryObjectRule */

#ifndef SpecialLibObjectRule
# define SpecialLibObjectRule(objs,depends,options)			@@\
_CompileObj(objs: depends,options)
#endif /* SpecialLibObjectRule */

#ifndef SpecialCLibObjectRule
# define SpecialCLibObjectRule(basename,depends,options)		@@\
_CompileObj(basename.Osuf: basename.SRCsuf depends,options)		@@\
									@@\
basename.Isuf: basename.SRCsuf depends					@@\
	CPPOnlyCompile(basename.SRCsuf,options)				@@\
									@@\
CenterLoadTarget(debug_src,basename.SRCsuf,NullParameter,$(ALLDEFINES) options)
#endif /* SpecialCLibObjectRule */

#ifndef SpecialCLibObjectRuleSeparateOpts
# define SpecialCLibObjectRuleSeparateOpts(basename,depends,staticopts,shopts) @@\
_CompileObjSeparateOpts(basename.Osuf: basename.SRCsuf depends,staticopts,shopts)	@@\
									@@\
basename.Isuf: basename.SRCsuf depends					@@\
	CPPOnlyCompile(basename.SRCsuf,sharedopts)			@@\
									@@\
CenterLoadTarget(debug_src,basename.SRCsuf,NullParameter,$(ALLDEFINES) options)
#endif /* SpecialCLibObjectRuleSepareateOpts */

#ifndef SpecialCplusplusLibObjectRule
# define SpecialCplusplusLibObjectRule(basename,depends,options)	@@\
_CompileObjCplusplus(basename.Osuf: basename.SRCsuf depends,options)	@@\
									@@\
CenterLoadTarget(debug_src,basename.SRCsuf,NullParameter,$(ALLDEFINES) options)
#endif /* SpecialCplusplusLibObjectRule */

/*
 * ToolkitMakeStrings generates a string-table, i.e., a C source
 * file and the matching header(s), e.g., Xt's StringDefs.c, StringDefs.h,
 * and Shell.h files; or Motif's XmStrDefs.c and XmStrDefs.h files.
 *
 * The 'files' argument is the list of files that will be produced by
 * this rule, e.g., for Xt they would be "Shell.h StringDefs.c StringDefs.h"
 * and for Motif they would be "XmStrDefs.c XmStrDefs.h".
 *
 * The 'source' argument is the string-list file to be parsed, e.g., in
 * Xt that would be "util/string.list".  For Motif 2.0 it would be
 * "../../tools/makestr/xmstring.list", and for Motif-CDE1 it would be
 * "util/xmstring.list".
 *
 * The 'options' argument is passed by the library's Imakefile, see the
 * Xt Imakefile for an example.  Typically this would be nothing, -intelabi,
 * or -sparcabi; there are other choices, but these are typical.
 *
 * The 'depends' argument names additional files the target files
 * depend on.  It should name the #ctmpl and #htmpl files from the
 * 'source' file.
 *
 * The 'dest' argument is the C source output file.  For Xt this should
 * be "StringDefs.c", and for all versions of Motif it would be "XmStrDefs.c"
 *
 * Headers are generated and named according to data in the 'source'
 * file.
 */
/*
 * The NoCmpScript
 * prevents clearmake from trying to remake makestrs if it exists.
 * Including both $(MAKESTRS) and $(MAKESTRS).o as primary targets
 * prevents clearmake from trying to recompile makestrs from here.
 * We have includes, not files, depend on makestrs to try to get
 * clearmake to wink in the files.  Bug in clearmake 2.0.2?
 */

#ifndef MakeStringsDependency
# ifndef UseInstalled
#  define MakeStringsDependency						@@\
MAKESTRS = $(CONFIGSRC)/util/makestrs					@@\
NoCmpScript(HostProgramTargetName($(MAKESTRS)) $(MAKESTRS).Osuf)	@@\
									@@\
HostProgramTargetName($(MAKESTRS)) $(MAKESTRS).Osuf:			@@\
	cd $(CONFIGSRC)/util && $(MAKE) HostProgramTargetName(makestrs)	@@\
									@@\
includes:: HostProgramTargetName($(MAKESTRS))
# else
#  define MakeStringsDependency  /**/
# endif
#endif

#ifndef ToolkitMakeStrings
# if defined(LibTookitMakeStringsDependency) && LibTookitMakeStringsDependency
#  define ToolkitMakeStrings(files,source,options,depends,dest)		@@\
files: source depends							@@\
	RemoveFiles(files)						@@\
	RunProgram(MAKESTRS,options < source > dest)			@@\
									@@\
AllTarget(files)							@@\
									@@\
includes:: files							@@\
									@@\
depend:: files								@@\
									@@\
clean::									@@\
	RemoveFiles(files)
# else
#  define ToolkitMakeStrings(files,source,options,depends,dest)		@@\
MakeStringsDependency							@@\
									@@\
files: source depends							@@\
	RemoveFiles(files)						@@\
	RunProgram(MAKESTRS,options < source > dest)			@@\
									@@\
AllTarget(files)							@@\
									@@\
includes:: files							@@\
									@@\
depend:: files								@@\
									@@\
clean::									@@\
	RemoveFiles(files)
# endif
#endif /* ToolkitMakeStrings */

#ifdef LibName

LIBNAME = LibName

# if defined(LibTookitMakeStringsDependency) && LibTookitMakeStringsDependency
/*
 * Do ToolkitMakeStrings() before BuildIncludes so makestrs is still
 * built first, even if the generated header will be installed.
 */
MakeStringsDependency
# endif

LibraryObjectRule()

# undef _LinkBuildLibrary
# if !defined(LibInstall) || LibInstall || LibInstallBuild
#  define _LinkBuildLibrary(lib) LinkBuildLibrary(lib)
# else
#  define _LinkBuildLibrary(lib) $(_NULLCMD_)
# endif

# if defined(LibBuild) && !LibBuild
#  define LibCreate NO
# endif

# if !defined(LibCreate) || LibCreate
#  if DoSharedLib
#   if HugeLibrary && defined(SharedLibraryTarget3)
SharedLibraryTarget3($(LIBNAME),$(SoRev),$(OBJS1),$(OBJS2),$(OBJS3) $(EXTRASHAREDOBJS),.,.)
#   else
#    if defined(SharedLibtoolRev) && defined(SharedLibtoolLibraryTarget)
SharedLibtoolLibraryTarget($(LIBNAME),SharedLibtoolRev,$(OBJS) $(EXTRASHAREDOBJS),.,.)
#    else
SharedLibraryTarget($(LIBNAME),$(SoRev),$(OBJS) $(EXTRASHAREDOBJS),.,.)
#    endif
#   endif
#   if !defined(LibInstall) || LibInstall
#    if defined(SharedLibtoolRev) && defined(InstallSharedLibtoolLibrary)
InstallSharedLibtoolLibrary($(LIBNAME),SharedLibtoolRev,$(SHLIBDIR))
#    else
InstallSharedLibrary($(LIBNAME),$(SoRev),$(SHLIBDIR))
#    endif
#   endif
#   if HasSharedData
SharedLibraryDataTarget($(LIBNAME),$(SoRev),$(UNSHAREDOBJS))
#    if !defined(LibInstall) || LibInstall
InstallSharedLibraryData($(LIBNAME),$(SoRev),$(SHLIBDIR))
#    endif
#   endif
#  endif
#  if DoNormalLib
#   if HugeLibrary
#    if DoSharedLib && SeparateSharedCompile
UnsharedLibraryTarget3($(LIBNAME),$(OBJS1),$(OBJS2),$(OBJS3) $(EXTRAUNSHAREDOBJS),unshared,..)
#    else
NormalLibraryTarget3($(LIBNAME),$(OBJS1),$(OBJS2),$(OBJS3) $(EXTRAUNSHAREDOBJS))
#    endif
#   else
#    if DoSharedLib && SeparateSharedCompile
UnsharedLibraryTarget($(LIBNAME),$(OBJS) $(EXTRAUNSHAREDOBJS),unshared,..)
#    else
NormalLibraryTarget($(LIBNAME),$(OBJS) $(EXTRAUNSHAREDOBJS))
#    endif
#   endif
#   if !defined(LibInstall) || LibInstall
InstallLibrary($(LIBNAME),$(USRLIBDIR))
#   endif
#  endif
#  if DoProfileLib
ProfiledLibraryTarget($(LIBNAME),$(OBJS) $(EXTRAUNSHAREDOBJS))
#   if !defined(LibInstall) || LibInstall
InstallLibrary($(LIBNAME)_p,$(USRLIBDIR))
#   endif
#  endif
#  if DoDebugLib
DebuggedLibraryTarget($(LIBNAME),$(OBJS) $(EXTRAUNSHAREDOBJS))
#   if !defined(LibInstall) || LibInstall
InstallLibrary($(LIBNAME)_d,$(USRLIBDIR))
#   endif
#  endif
#  if DoExtraLib && defined(ExtraLibRules)
ExtraLibraryTarget($(LIBNAME),$(SoRev),$(OBJS) $(EXTRAUNSHAREDOBJS))
#   if !defined(LibInstall) || LibInstall
ExtraInstallLibrary($(LIBNAME),$(SoRev))
#   endif
#  endif

LintLibraryTarget($(LIBNAME),$(SRCS))
#  if !defined(LibInstall) || LibInstall
InstallLintLibrary($(LIBNAME),$(LINTLIBDIR))
#  endif
# else /* not LibCreate */
#  if LibBuild
#   if HugeLibrary
AllTarget($(OBJS1))
AllTarget($(OBJS2))
AllTarget($(OBJS3))
#   else
AllTarget($(OBJS))
#   endif
#   if DoSharedLib
AllTarget($(EXTRASHAREDOBJS))
#   endif
#   if DoNormalLib
AllTarget($(EXTRAUNSHAREDOBJS))
#   endif
#  endif /* LibBuild */
# endif /* LibCreate */
# ifdef IncSubdir
#  ifdef IncSubSubdir
#   if !defined(LibHeaders) || LibHeaders
BuildIncludes($(HEADERS),IncSubdir/IncSubSubdir,../..)
#    if BuildLibraries
InstallMultipleFlags($(HEADERS),$(INCDIR)/IncSubdir/IncSubSubdir,$(INSTINCFLAGS))
#     endif
#   endif
#  else
#   if !defined(LibHeaders) || LibHeaders
BuildIncludes($(HEADERS),IncSubdir,..)
#    if BuildLibraries
InstallMultipleFlags($(HEADERS),$(INCDIR)/IncSubdir,$(INSTINCFLAGS))
#    endif
#   endif
#  endif
# else
#  ifndef CplusplusSource
#   if !defined(LibHeaders) || LibHeaders
BuildIncludesTop($(HEADERS))
#    if BuildLibraries
InstallMultipleFlags($(HEADERS),$(INCDIR),$(INSTINCFLAGS))
#    endif
#   endif
#  endif
# endif

NormalLintTarget($(SRCS))
#endif /* defined(LibName) */

#ifdef NoSoSymlink
SOSYMLINK = false
#else
SOSYMLINK = true
#endif
