/**/#	$Source: /afs/sipb.mit.edu/project/sipb-athena/repository/src/moira/config/Imake.rules,v $
/**/#

#ifdef __STDC__
#define concat(x,y) x##y
#define concat3(x,y,z) x##y##z
#define concat4(w,x,y,z) w##x##y##z
#define concat5(v,w,x,y,z) v##w##x##y##z
#define requote(x) #x
#else
#define concat(x,y)x/**/y
#define concat3(x,y,z)x/**/y/**/z
#define concat4(w,x,y,z)w/**/x/**/y/**/z
#define concat5(v,w,x,y,z)v/**/w/**/x/**/y/**/z
#define requote(x) "x"
#endif

#ifdef PROFILED_LIBS
/*
 * Rule for building objects in libraries.
 */

#if defined(mips) || defined(_AIX) || defined(SOLARIS)
/*
 * The MIPS, AIX & SOLARIS loaders don't have the -X flag or its functionality.
 * Solaris to make it worse does not have -x
 */
#if !defined(SOLARIS)
#define library_obj_rule()						@@\
.c.o:									@@\
	$(CC) PROF_FLAG -c $(CFLAGS) $*.c				@@\
	$(MV) $*.o profiled/$*.o					@@\
	$(CC) -c $(CFLAGS) $*.c						@@\
	-$(LD) -x -r -o a.out $*.o					@@\
	$(MV) a.out $*.o
#else
#define library_obj_rule()						@@\
.c.o:									@@\
	$(CC) PROF_FLAG -c $(CFLAGS) $*.c				@@\
	$(MV) $*.o profiled/$*.o					@@\
	$(CC) -c $(CFLAGS) $*.c						@@\
	-$(LD) -r -o a.out $*.o						@@\
	$(MV) a.out $*.o
#endif
#else /* ! mips && ! _AIX */
#define library_obj_rule()						@@\
.c.o:									@@\
	$(CC) PROF_FLAG -c $(CFLAGS) $*.c				@@\
	-$(LD) -X -r -o profiled/$*.o $*.o				@@\
	$(CC) -c $(CFLAGS) $*.c						@@\
	-$(LD) -x -r -o a.out $*.o					@@\
	$(MV) a.out $*.o
#endif /* mips */
/*
 * cc -R breaks profiling with -p on 4.3BSD on the VAX 
 * (and probably elsewhere), so we don't do it for the profiled version.
 */

#define library_ro_object(cfile)					@@\
concat(cfile,.o): concat(cfile,.c)					@@\
	$(CC) PROF_FLAG -c $(CFLAGS) concat(cfile,.c)			@@\
	-$(LD) -X -r -o profiled/$*.o $*.o				@@\
	$(CCRO) -c $(CFLAGS) concat(cfile,.c)				@@\
	-$(LD) -x -r -o a.out $*.o					@@\
	$(MV) a.out $*.o

#define library_asm_object(ofile,sfile)					@@\
ofile: sfile								@@\
	$(CP) sfile x.c							@@\
	$(CPP) -DPROF x.c | $(AS) - 					@@\
	-$(LD) -X -r -o profiled/$*.o a.out				@@\
	$(CPP) x.c | $(AS) -						@@\
	-$(LD) -x -r -o $*.o a.out					@@\
	$(RM) a.out x.c

#ifdef USELINT
#define install_library_lint(libname)					@@\
all:: concat3(llib-l,libname,.ln)					@@\
									@@\
install::								@@\
	$(INSTALLFILE) concat3(llib-l,libname,.ln) concat4($(DESTDIR)$(LINTLIBDIR)/,llib-l,libname,.ln)	@@\

#else
#define install_library_lint(libname)
#endif


#define	install_library_target(libname,objs,srcs,lintlibs)		@@\
									@@\
all:: concat3(lib,libname,.a) concat3(lib,libname,_p.a)			@@\
									@@\
concat3(lib,libname,.a): objs						@@\
	$(RM) $@.bak							@@\
	-$(MV) $@ $@.bak						@@\
	$(ARCHIVE) $@ objs						@@\
	$(RANLIB) $@							@@\
									@@\
concat3(lib,libname,_p.a): objs						@@\
	$(RM) $@.bak							@@\
	-$(MV) $@ $@.bak						@@\
	cd profiled; $(ARCHIVE) ../$@ objs				@@\
	$(RANLIB) $@							@@\
									@@\
lint:: concat3(llib-l,libname,.ln)					@@\
									@@\
concat3(llib-l,libname,.ln): srcs					@@\
	$(LINT) concat($(LINTLIBFLAG),libname) $(LINTFLAGS) srcs lintlibs 		@@\
									@@\
clean:: 								@@\
	$(RM) concat3(lib,libname,.a) concat3(lib,libname,_p.a)		@@\
	$(RM) concat3(llib-l,libname,.ln)				@@\
	$(RM) objs							@@\
	$(RM) profiled/?*.o						@@\
									@@\
install:: 								@@\
	$(INSTALLRAW) -c -m 644 concat3(lib,libname,.a) concat4($(DESTDIR)$(LIBDIR)/,lib,libname,.a)	@@\
	$(RANLIB) -t concat4($(DESTDIR)$(LIBDIR)/,lib,libname,.a)	@@\
	$(CHMOD) 444 concat4($(DESTDIR)$(LIBDIR)/,lib,libname,.a)	@@\
	$(INSTALLRAW) -c -m 644 concat3(lib,libname,_p.a) concat4($(DESTDIR)$(LIBDIR)/,lib,libname,_p.a)	@@\
	$(RANLIB) -t concat4($(DESTDIR)$(LIBDIR)/,lib,libname,_p.a)	@@\
	$(CHMOD) 444 concat4($(DESTDIR)$(LIBDIR)/,lib,libname,_p.a)	@@\
									@@\
install_library_lint(libname)						@@\

#else /* !PROFILED_LIBS */
/*
 * Rule for building objects in libraries.
 */

#if defined(DEBUG_LIBS) || defined(DONT_DO_LD)
/* When debugging, leave symbols alone (don't do LD) */
#define library_obj_rule()						@@\
.c.o:									@@\
	$(CC) -c $(CFLAGS) $*.c
#else
#define library_obj_rule()						@@\
.c.o:									@@\
	$(CC) -c $(CFLAGS) $*.c						@@\
	-$(LD) -x -r -o a.out $*.o					@@\
	$(MV) a.out $*.o
#endif

#define library_ro_object(cfile)					@@\
concat(cfile,.o): concat(cfile,.c)					@@\
	$(CCRO) -c $(CFLAGS) concat(cfile,.c)				@@\
	-$(LD) -x -r -o a.out $*.o					@@\
	$(MV) a.out $*.o

#define library_asm_object(ofile,sfile)					@@\
ofile: sfile								@@\
	$(CPP) x.c | $(AS) -						@@\
	-$(LD) -x -r -o $*.o a.out					@@\
	$(RM) a.out x.c

#ifdef USELINT
#define install_library_lint(libname)					@@\
all:: concat3(llib-l,libname,.ln)					@@\
									@@\
install::								@@\
	$(INSTALLFILE) concat3(llib-l,libname,.ln) concat4($(DESTDIR)$(LINTLIBDIR)/,llib-l,libname,.ln)	@@\

#else
#define install_library_lint(libname)
#endif

#define	install_library_target(libname,objs,srcs,lintlibs)		@@\
									@@\
all:: concat3(lib,libname,.a) 						@@\
									@@\
concat3(lib,libname,.a): objs						@@\
	$(RM) $@.bak							@@\
	-$(MV) $@ $@.bak						@@\
	$(ARCHIVE) $@ objs						@@\
	$(RANLIB) $@							@@\
									@@\
lint:: concat3(llib-l,libname,.ln)					@@\
									@@\
concat3(llib-l,libname,.ln): srcs					@@\
	$(LINT) concat($(LINTLIBFLAG),libname) $(LINTFLAGS) srcs lintlibs 		@@\
									@@\
clean:: 								@@\
	$(RM) concat3(lib,libname,.a)					@@\
	$(RM) concat3(llib-l,libname,.ln)				@@\
	$(RM) objs							@@\
									@@\
install:: 								@@\
	$(INSTALLRAW) -c -m 644 concat3(lib,libname,.a) concat4($(DESTDIR)$(LIBDIR)/,lib,libname,.a)	@@\
	$(RANLIB) -t concat4($(DESTDIR)$(LIBDIR)/,lib,libname,.a)	@@\
	$(CHMOD) 444 concat4($(DESTDIR)$(LIBDIR)/,lib,libname,.a)	@@\
									@@\
install_library_lint(libname)						@@\


#endif /* PROFILED_LIBS */

/*
 * Rule for building utilities (binaries which don't get installed)
 */
#define genutil(pgm,objs,localdeps,syslibs)				@@\
all:: pgm								@@\
									@@\
pgm: objs localdeps							@@\
	$(CC) $(CFLAGS) -o $@ objs syslibs $(OSLIBS)			@@\
									@@\
clean:: 								@@\
	$(RM) pgm objs							@@\

/*
 * Rule for building "generator" programs.
 */

#define generate(file,pgm,libs)						@@\
									@@\
pgm: concat(pgm,.c) libs						@@\
	$(HCC) $(HCFLAGS) -o $@ $@.c libs $(OSLIBS)			@@\
									@@\
file: pgm								@@\
	./pgm file							@@\
									@@\
clean::									@@\
	$(RM) file pgm concat(pgm,.o)					

#define generate_depend(file,pgm,libs)					@@\
	generate(file,pgm,libs)						@@\
									@@\
depend:: file


/*
 * Rule for building test programs (something which is not installed)
 */

#define test_program(pgm,locallibs,syslibs)				@@\
									@@\
all:: pgm								@@\
									@@\
pgm: concat(pgm,.c) locallibs						@@\
	$(CC) $(CFLAGS) -o $@ $@.c locallibs syslibs $(OSLIBS)		@@\
									@@\
clean::									@@\
	$(RM) pgm concat(pgm,.o) 					@@\

/* 
 * Rule for compileing files with "et"
 */

#define comp_et(tbl)							@@\
concat(tbl,.h) concat(tbl,.c): concat(tbl,.et)				@@\
	$(COMPILE_ET) concat(tbl,.et)					@@\
clean::									@@\
	$(RM) concat(tbl,.c) concat(tbl,.h)

#define comp_et_depend(src)						@@\
	comp_et(src)							@@\
									@@\
depend:: concat(src,.h)

#define mk_cmds(tbl)							@@\
concat(tbl,.c): concat(tbl,.ct)						@@\
	$(MAKE_COMMANDS) concat(tbl,.ct)				@@\
clean::									@@\
	$(RM) concat(tbl,.o) concat(tbl,.c)

/*
 * Rule for building some random object module
 */

#define host_simple_object(obj,src)					@@\
obj:	src								@@\
	$(HCC) $(HCFLAGS) -c src					@@\
									@@\
clean::									@@\
	$(RM) obj							@@\

#define ro_object(obj,src)						@@\
obj:	src								@@\
	$(CCRO) $(CFLAGS) -c src					@@\
									@@\
clean::									@@\
	$(RM) obj							@@\
	
/*
 * Rule for building some random object module with compile flags and
 * other dependendcies
 */

#define host_flag_object(obj,src,flags,localdeps)			@@\
obj:	src localdeps							@@\
	$(HCC) $(HCFLAGS) flags -c src					@@\
									@@\
clean::									@@\
	$(RM) obj							@@\

#define ro_flag_object(obj,src,flags,localdeps)				@@\
obj:	src localdeps							@@\
	$(CCRO) $(CFLAGS) flags -c src					@@\
									@@\
clean::									@@\
	$(RM) obj							@@\
	
/*
 * Rule for building some random object module with compile flags, an
 * intermediate output, and some other dependencies
 */

#define host_cplx_object(obj,interim,src,flags,localdeps)		@@\
obj:	interim	src localdeps 						@@\
	$(HCC) $(HCFLAGS) flags -c src					@@\
	$(MV) interim obj						@@\
									@@\
clean::									@@\
	$(RM) obj							@@\

#define ro_cplx_object(obj,interim,src,flags,localdeps)			@@\
obj:	src localdeps interim						@@\
	$(CCRO) $(CFLAGS) flags -c src					@@\
	$(MV) interim obj						@@\
									@@\
clean::									@@\
	$(RM) obj							@@\
	
/*
 * Rule for building a program which is to be installed:
 */

#define program(pgm,objs,localdeps,syslibs,installdir)			@@\
all:: pgm								@@\
									@@\
pgm: localdeps objs							@@\
	$(CC) $(CFLAGS) -o $@ objs syslibs $(OSLIBS)			@@\
									@@\
install::								@@\
	$(INSTALLPROG) pgm ${DESTDIR}installdir/pgm			@@\
									@@\
clean:: 								@@\
	$(RM) pgm objs							@@\

/*
 * Rule for building a specially installed program
 */

#define program_spinst(pgm,objs,localdeps,syslibs,installdir,instopts)	@@\
all:: pgm								@@\
									@@\
pgm: objs localdeps							@@\
	$(CC) $(CFLAGS) -o $@ objs syslibs $(OSLIBS)			@@\
									@@\
install::								@@\
	$(INSTALLRAW) instopts pgm ${DESTDIR}installdir/pgm		@@\
									@@\
clean:: 								@@\
	$(RM) pgm objs							@@\

/*
 * Rule for installing man pages.  Section installing into should match
 * suffix, or the man page won't show up when using man(1).
 */

#define manpage(section,page)						@@\
all::									@@\
install:: page								@@\
	$(INSTALLFILE) page concat4(${DESTDIR}${MANDIR}/man,section,/,`basename page`) @@\

/*
 * Rule for building makefile dependencies.
 */

#define	depend_target()							@@\
depend:: $(SRCS)							@@\
	@echo "### Now computing dependencies"				@@\
	@$(DEPEND) -s "# DO NOT DELETE" -- $(CFLAGS) -- $(SRCS)		@@\

#define clean_target()							@@\
clean::									@@\
	$(RM) *~ \#* *.bak $(TAGSFILE)				

#define tags_target()							@@\
tags:: 									@@\
	$(TAGGER) *.c *.h

#define makefile_target()						@@\
Makefile:: 	 							@@\
	-$(RM) Makefile.bak; $(MV) Makefile Makefile.bak		@@\
	$(IMAKE) -DNEW_TOP=$(NEWTOP) -DSYS_NAME=${ATHENA_SYS} -s Makefile @@\

#define foreach_subdirs(name,subdirs)					@@\
name::									@@\
	@for d in subdirs; \						@@\
	do \								@@\
		(cd $$d; echo "### Making" name "in" `pwd`;	\	@@\
			$(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) name ; \	@@\
			echo "### Done with" `pwd`);		\	@@\
	done

#define print_target()							@@\
print:: ${CODE}								@@\
	${LPR} ${CODE}
	
#define src_target()							@@\
src:: ${CODE}								@@\
									@@\
${CODE}:								@@\
	$(RM) $@							@@\
	-$(LN) ${SRCDIR}/$@ $@

#define do_subdirs_no_imakefile(subdirs)				@@\
	foreach_subdirs(all, subdirs)					@@\
	foreach_subdirs(install, subdirs)				@@\
	foreach_subdirs(clean, subdirs)					@@\
	foreach_subdirs(depend, subdirs)				@@\
	foreach_subdirs(tags, subdirs)					@@\
	foreach_subdirs(print, subdirs)					@@\
	foreach_subdirs(src, subdirs)					@@\

#define do_subdirs(subdirs)						@@\
	do_subdirs_no_imakefile(subdirs)				@@\
									@@\
Makefiles::								@@\
	@echo "### Making Makefiles in" `pwd`				@@\
	@for d in subdirs; \						@@\
	do \								@@\
		(cd $$d; echo "### Making Makefile in" `pwd`; \		@@\
			$(MAKE) $(MFLAGS) SRCTOP=$(SRCTOP) \		@@\
			NEWTOP=../$(BUILDTOP)		\		@@\
			BUILDTOP=../$(BUILDTOP)		\		@@\
			-f ../Makefile			\		@@\
			Makefile; \					@@\
			$(MAKE) $(MFLAGS) SRCTOP=$(SRCTOP) \		@@\
			NEWTOP=../$(BUILDTOP)		\		@@\
			Makefiles; \					@@\
			echo "### Done with" `pwd`); \			@@\
	done


/* Compile Embeded SQL source */

#ifdef INGRES
#define sqlrule()							@@\
.SUFFIXES: .sc .dc							@@\
.dc.sc:									@@\
	$(AWK) -f $(SRCTOP)/util/imake.includes/ingres.awk < $< > $*.sc	@@\
									@@\
.sc.c:									@@\
	/usr/ingres/bin/esqlc -p $*
#define sqlfile(file)							@@\
concat(file,.sc): concat(file,.dc)					@@\
concat(file,.c): concat(file,.sc)					@@\
clean::									@@\
	$(RM) concat(file,.sc) concat(file,.c)
#define sqlfile_with_esqlc_fix(file)					@@\
concat(file,.sc): concat(file,.dc)					@@\
concat(file,.c): concat(file,.sc)					@@\
	/usr/ingres/bin/esqlc -p $*					@@\
	esqlc_fix.pl concat(file,.c)					@@\
clean::									@@\
	$(RM) concat(file,.sc) concat(file,.c) concat(file,.c.bak)
#endif
#ifdef INFORMIX
#define sqlrule()							@@\
.SUFFIXES: .ec .dc							@@\
.dc.ec:									@@\
	$(AWK) -f $(SRCTOP)/util/imake.includes/informix.awk < $< > $*.ec @@\
									@@\
.ec.c:									@@\
	/usr/informix/bin/esql -e $*.ec
#define sqlfile(file)							@@\
concat(file,.ec): concat(file,.dc)					@@\
concat(file,.c): concat(file,.ec)					@@\
clean::									@@\
	$(RM) concat(file,.ec) concat(file,.c)
#endif
#ifdef ORACLE
#define sqlrule()							@@\
.SUFFIXES: .pc .dc							@@\
.dc.pc:									@@\
	$(AWK) -f $(SRCTOP)/util/imake.includes/oracle.awk < $< > $*.pc @@\
									@@\
.pc.c:									@@\
	/usr/oracle/bin/pcc INAME=$*.pc
#define sqlfile(file)							@@\
concat(file,.pc): concat(file,.dc)					@@\
concat(file,.c): concat(file,.pc)					@@\
clean::									@@\
	$(RM) concat(file,.pc) concat(file,.c)
#endif
