makelib/rules.make
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 21 Sep 2018 23:14:41 +0100
changeset 255 6d6880749905
parent 208 616e1ecf4d89
child 266 633db64ad5a3
permissions -rw-r--r--
Add `tmp` to `.hgignore`

#------------------ start of rules/stdRules ---------------------
#
# $Header: /cvs/stx/stx/rules/stdRules,v 1.439 2017-02-21 17:10:56 cg Exp $
#
# MIMEType: application/x-make
#
# Notice: on systems where make does not support the include
# directive, this file is included as a whole into the generated
# Makefile, and the following comment applies:
#   these rules come from $(TOP)/rules/stdRules - do not change
#   anything below, the changes will be lost when Makefiles are
#   recreated.
# If the make command does support include, this file is
# referenced to by the generated Makefile with an include directive.
#
# Do not blame me about the complexity here - nowadays, I would use
# configure. But I am happy to have a setup which runs on all those wierd
# machines and have other things to do ...
#
# these rules enable the Makefiles to:
#
#     make mf                   -- recreate the makefile after a definition change
#
#     make Makefiles            -- recursively walk down and (re)create Makefiles
#
#     make depend               -- extract dependencies from ST sourcefiles
#                                  and replace BEGINMAKEDEPEND..ENDMAKEDEPEND
#                                  in Makefile
#
#     make check                -- syntax check all ST-files
#
#     make <Class>.check        -- check syntax of an individual ST-file
#
#     make debug                -- compile without -O / -g instead
#
#     make objs                 -- compile to all .o-files
#
#     make obj                  -- make a prelinked obj-library file
#
#     make clobber              -- remove all that can be reconstructed
#
#     make clean                -- remove all .o-files, but leave libraries and executables
#
#     make cleanjunk            -- clean junk (intermediate) files
#
#     make notes                -- for stc-developpers only
#                                  output notes about internal actions
#
#     make warnings             -- for stc-developpers only
#                                  output warning messages
#
#     make abbrev.stc           -- process local ST-files and collect
#                                  classname-to-filename abbreviations in
#                                  a local abbrev.stc file
#
#     make updAbbrev            -- merge all local abbreviations into the
#                                  global abbrev.stc file (in include/)
#
#     make rmLocalAbbrevs       -- remove all local abbreviations from the
#                                  global abbrev.stc file (in include/)
#
#     make collectAbbrev        -- recursively process all ST-files and collect
#                                  className-to-fileName abbreviations
#                                  in $(INCLUDE)/abbrev.stc
#                                  (i.e. a recursive updAbbrev)
#
# ---- internal rules
#
#     make newobj               -- make a prelinked obj-library file
#                                  including a classlibrary init-function
#
#     make sharedobj            -- make a prelinked shared obj-library file
#                                  including a classlibrary init-function


# controls if a 'lib' subdirectory is to be made
# when linking against shared objects
NO_LINK_LIBDIR="yes"


# redefinableAll: Makefile $(ALL_TARGET) postMake
redefinableAll: $(ALL_TARGET) postMake

postMake::

#
# notice: the rule below used to be the Makefile rule;
# however, since gmake automatically executes this rule upon entry,
# this may lead to trouble, if you are on an NFS mounted file system,
# and the machines times are not completely in sync (i.e. withing a second).
# To avoid endless make recursion, this rule is now called 'mf'
#

MAKEFILE=makefile
#MAKEFILE=makefile.gen
RELEASE=`cat $(TOP)/RELEASE`
MF=mf

.PHONY: $(MF) $(MF)_2 additionalMakefiles

#
# creates a Makefile from Make.proto, rules and configuration
#
$(MF): Make.proto $(RULEDIR)/stdHeader $(RULEDIR)/stdHeader2 $(RULEDIR)/stdRules \
		     $(CONFDIR)/COMMON/defines \
		     $(CONFDIR)/vendorConf \
		     $(CONFDIR)/myConf
	@-echo "making $(MAKEFILE) for $(CONF) $(CONF_PACKS) ..."
	@$(MAKE) additionalMakefiles
	@$(MAKE) $(MF)_2

additionalMakefiles::

$(MF)_2:
	@-rm -f $(MAKEFILE).bak
	@-mv $(MAKEFILE) $(MAKEFILE).bak
	@echo '#' > $(MAKEFILE)
	@echo '# DO NOT EDIT ' >> $(MAKEFILE)
	@echo '# automagically generated from Make.proto (by make mf)' >> $(MAKEFILE)
	@echo "#" >> $(MAKEFILE)
	@-if [ "$(MAKE_INCLUDE)" != "" ]; then \
	    echo "$(MAKE_INCLUDE) $(TOP)/rules/stdHeader" >>$(MAKEFILE); \
	else \
	    cat $(RULEDIR)/stdHeader >> $(MAKEFILE) ; \
	    echo "$(MAKEFILE):: $(TOP)/rules/stdHeader" >>$(MAKEFILE); \
	fi
	@-if [ -r $(CONFDIR)/COMMON/defines ]; then \
	  if [ "$(MAKE_INCLUDE)" != "" ]; then \
	    echo "$(MAKE_INCLUDE) $(TOP)/configurations/COMMON/defines" >> $(MAKEFILE); \
	  else \
	    cat $(CONFDIR)/COMMON/defines >> $(MAKEFILE); \
	    echo "$(MAKEFILE):: $(CONFDIR)/COMMON/defines" >>$(MAKEFILE); \
	  fi ;\
	fi
	@-if [ -r $(CONFDIR)/vendorConf ]; then \
	  if [ "$(MAKE_INCLUDE)" != "" ]; then \
	    echo "$(MAKE_INCLUDE) $(TOP)/configurations/vendorConf" >> $(MAKEFILE); \
	  else \
	    cat $(CONFDIR)/vendorConf >> $(MAKEFILE); \
	  fi ; \
	fi
	@-if [ -r $(CONFDIR)/myTools ]; then \
	  if [ "$(MAKE_INCLUDE)" != "" ]; then \
	    echo "$(MAKE_INCLUDE) $(TOP)/configurations/myTools" >> $(MAKEFILE); \
	  else \
	    cat $(CONFDIR)/myTools >> $(MAKEFILE); \
	  fi ;\
	else \
	  if [ "$(CONF_TOOLS)" != "" ]; then \
	    if [ -r $(CONFDIR)/COMMON/$(CONF_TOOLS) ]; then \
	      cat $(CONFDIR)/COMMON/$(CONF_TOOLS) >>$(MAKEFILE) ; \
	    fi ; \
	  fi ;\
	fi
	@-if [ "$(MAKE_INCLUDE)" != "" ]; then \
	  echo "$(MAKE_INCLUDE) $(TOP)/configurations/myConf"  >> $(MAKEFILE); \
	else \
	  cat $(CONFDIR)/myConf  >>$(MAKEFILE); \
	fi
	@-if [ -r $(CONFDIR)/myPack ]; then \
	  if [ "$(MAKE_INCLUDE)" != "" ]; then \
	    echo "$(MAKE_INCLUDE) $(TOP)/configurations/myPack" >> $(MAKEFILE); \
	  else \
	    cat $(CONFDIR)/myPack >> $(MAKEFILE); \
	    echo "$(MAKEFILE):: $(CONFDIR)/myPack" >>$(MAKEFILE); \
	  fi ;\
	else \
	    if [ "$(CONF_PACKS)" != "" ]; then \
		if [ -r $(CONFDIR)/PACKS/$(CONF_PACKS) ]; then \
		    cat $(CONFDIR)/PACKS/$(CONF_PACKS) >>$(MAKEFILE) ; \
		fi ;\
	    fi ;\
	fi
	@-if [ "$(MAKE_INCLUDE)" != "" ]; then \
	  echo "$(MAKE_INCLUDE) $(TOP)/rules/stdHeader2" >>$(MAKEFILE); \
	else \
	  cat $(RULEDIR)/stdHeader2         >>$(MAKEFILE); \
	  echo "$(MAKEFILE):: $(RULEDIR)/stdHeader2" >>$(MAKEFILE); \
	fi
	@-if [ -r Make.spec ]; then                    \
	  if [ "$(MAKE_INCLUDE)" != "" ]; then \
	    echo "$(MAKE_INCLUDE) Make.spec"  >> $(MAKEFILE); \
	  else \
	    cat Make.spec  >>$(MAKEFILE); \
	  fi; \
	fi
	@-if [ $$TOP"x" != "x" ]; then \
	    echo "TOP="$$TOP  >>$(MAKEFILE); \
	    sed '/^TOP=/d' < Make.proto > Make.proto.edit; \
	    cat Make.proto.edit >>$(MAKEFILE); \
	else \
	    if [ $(TOPOVERWRITE)"x" != "x" ]; then \
		echo "TOP="$(TOP) >>$(MAKEFILE);  \
		sed '/^TOP=/d' < Make.proto > Make.proto.edit; \
		cat Make.proto.edit >>$(MAKEFILE); \
	    else \
		if [ "$(MAKE_INCLUDE)" != "" ]; then \
		    echo $(MAKE_INCLUDE) Make.proto >>$(MAKEFILE); \
		else \
		    cat Make.proto >>$(MAKEFILE); \
		    echo "$(MAKEFILE):: Make.proto" >>$(MAKEFILE); \
		fi ;\
	    fi ;\
	fi
	@echo ""                           >>$(MAKEFILE)
	@echo "BASE_CONF="$(CONF)               >>$(MAKEFILE)
	@echo "BASE_CONF_VENDOR="$(CONF_VENDOR) >>$(MAKEFILE)
	@echo "CONF_PACKS="$(CONF_PACKS)   >>$(MAKEFILE)
	@echo "CONF_TOOLS="$(CONF_TOOLS)   >>$(MAKEFILE)
	@-if [ $$TOP"x" != "x" ]; then                  \
	    echo "TOP="$$TOP              >>$(MAKEFILE);        \
	    echo "TOPOVERWRITE="$$TOP     >>$(MAKEFILE);        \
	    echo "STC="stc                >>$(MAKEFILE);   \
	    echo "INCLUDE="$(INCLUDE)     >>$(MAKEFILE);        \
	    echo "INCLUDE_OUT="$(INCLUDE_OUT) >>$(MAKEFILE); \
	else                                            \
	    if [ $(TOPOVERWRITE)"x" != "x" ]; then      \
		echo "TOP="$(TOP)          >>$(MAKEFILE);  \
		echo "TOPOVERWRITE="$(TOP) >>$(MAKEFILE);  \
		echo "STC="stc             >>$(MAKEFILE);  \
		echo "INCLUDE="$(INCLUDE)  >>$(MAKEFILE);       \
		echo "INCLUDE_OUT="$(INCLUDE_OUT) >>$(MAKEFILE); \
	    fi;                                          \
	fi
	@echo ""                           >>$(MAKEFILE)
	@-if [ "$(MAKE_INCLUDE)" != "" ]; then \
	  echo "$(MAKE_INCLUDE) $(TOP)/rules/stdRules" >> $(MAKEFILE); \
	else \
	  cat $(RULEDIR)/stdRules           >>$(MAKEFILE); \
	  echo "$(MAKEFILE):: $(RULEDIR)/stdRules" >>$(MAKEFILE); \
	fi
	@-if [ "$(TOUCH)" != "echo" ]; then \
	    $(TOUCH) $(MAKEFILE); \
	fi
	@if [ "$(OTHER_MAKE_FILES)" != "" ]; then \
	    $(MAKE) $(OTHER_MAKE_FILES); \
	fi
# No longer -- dependencies, abbrev and libInit.stc
# are created by smalltalk!
#
#       @$(MAKE) depend MAKEFILE=$(MAKEFILE)
#       @-if [ "$(MAKE_NT_MAKEFILES)" = "yes" ]; then \
#           $(MAKE) nt.mak; \
#           $(MAKE) bmake.bat; \
#       fi
#       @-if [ "$(MAKE_VMS_MAKEFILES)" = "yes" ]; then \
#           $(MAKE) vms.mak; \
#       fi
#       @-if [ "$(SUPPRESS_LOCAL_ABBREVS)" = "" ]; then \
#           $(MAKE) updateAbbrev; \
#       fi
	#cp $(TOP)/rules/samples/Makefile .

#
# unconditionally makes a new makefile
# o$lete.
#
makeMakefile:
	@echo "making $(MAKEFILE) for $(CONF) $(CONF_PACKS) ..."
	@echo "1b"
	@-rm -f $(MAKEFILE).bak
	@-mv $(MAKEFILE) $(MAKEFILE).bak
	@cat $(RULEDIR)/stdHeader       >$(MAKEFILE)
	@-if [ -r $(CONFDIR)/COMMON/defines ]; then \
	    cat $(CONFDIR)/COMMON/defines >> $(MAKEFILE); \
	fi
	@-if [ -r $(CONFDIR)/vendorConf ]; then \
	    cat $(CONFDIR)/vendorConf >> $(MAKEFILE); \
	fi
	@-if [ -r $(CONFDIR)/myTools ]; then \
	    cat $(CONFDIR)/myTools >> $(MAKEFILE); \
	fi
	@cat $(CONFDIR)/myConf  >>$(MAKEFILE)
	@-if [ -r $(CONFDIR)/myPack ]; then \
	    cat $(CONFDIR)/myPack >> $(MAKEFILE); \
	else \
	    if [ "$(CONF_PACKS)" != "" ]; then \
		if [ -r $(CONFDIR)/PACKS/$(CONF_PACKS) ]; then \
		    cat $(CONFDIR)/PACKS/$(CONF_PACKS) >>$(MAKEFILE) ; \
		fi; \
	    fi; \
	fi
	@cat $(RULEDIR)/stdHeader2         >>$(MAKEFILE)
	@-if [ -r Make.spec ]; then                    \
	    cat Make.spec                 >>$(MAKEFILE); \
	fi
	@cat Make.proto                    >>$(MAKEFILE)
	@echo ""                           >>$(MAKEFILE)
	@echo "BASE_CONF="$(CONF)               >>$(MAKEFILE)
	@echo "BASE_CONF_VENDOR="$(CONF_VENDOR) >>$(MAKEFILE)
	@echo "CONF_PACKS="$(CONF_PACKS)   >>$(MAKEFILE)
	@echo "CONF_TOOLS="$(CONF_TOOLS)   >>$(MAKEFILE)
	@-if [ $$TOP"x" != "x" ]; then \
	    echo "TOP="$$TOP          >>$(MAKEFILE);    \
	    echo "TOPOVERWRITE="$$TOP >>$(MAKEFILE);    \
	    echo "STC="stc            >>$(MAKEFILE);       \
	    echo "INCLUDE="$(INCLUDE)   >>$(MAKEFILE);  \
	    echo "INCLUDE_OUT="$(INCLUDE_OUT) >>$(MAKEFILE); \
	else                                            \
	    if [ $(TOPOVERWRITE)"x" != "x" ]; then      \
		echo "TOP="$(TOP)          >>$(MAKEFILE);       \
		echo "TOPOVERWRITE="$(TOP) >>$(MAKEFILE);  \
		echo "STC="stc             >>$(MAKEFILE);  \
		echo "INCLUDE="$(INCLUDE)   >>$(MAKEFILE); \
		echo "INCLUDE_OUT="$(INCLUDE_OUT) >>$(MAKEFILE); \
	    fi;                                          \
	fi
	@echo ""                           >>$(MAKEFILE)
	@cat $(RULEDIR)/stdRules         >>$(MAKEFILE)
	@-if [ "$(TOUCH)" != "echo" ]; then \
	    $(TOUCH) $(MAKEFILE); \
	fi
	@if [ "$(OTHER_MAKE_FILES)" != "" ]; then \
	    $(MAKE) $(OTHER_MAKE_FILES);          \
	fi
# No longer -- dependencies, abbrev and libInit.stc
# are created by smalltalk!
#
#        @-if [ "$(SUPPRESS_DEPEND)" = "" ]; then    \
#            $(MAKE) depend MAKEFILE=$(MAKEFILE); \
#        fi
#        @-if [ "$(MAKE_NT_MAKEFILES)" = "yes" ]; then \
#            $(MAKE) nt.mak;    \
#            $(MAKE) bmake.bat; \
#        fi
#        @-if [ "$(MAKE_VMS_MAKEFILES)" = "yes" ]; then \
#            $(MAKE) vms.mak;   \
#        fi
#        @-if [ "$(SUPPRESS_LOCAL_ABBREVS)" = "" ]; then \
#            $(MAKE) updateAbbrev; \
#        fi

#
# same, without make depend
#
qmakeMakefile:
	$(MAKE) makeMakefile SUPPRESS_DEPEND=y MAKEFILE=$(MAKEFILE)

#
# same - lazy of typing
#
qmf:    qmakeMakefile

# $(MAKEFILE): Make.proto
#       $(MAKE) mf

#
# recursively goes down SUBDIRS and creates Makefiles
#
Makefiles:: checkForSTC
	@echo "making Makefiles for $(CONF) $(CONF_PACKS) ..."
	@$(MAKE) Makefiles_2

Makefiles_2:
	@-if [ "$(ALLSUBDIRS)"x != x ]; then         \
	  $(MAKE) subMakefiles MAKEFILE=$(MAKEFILE); \
	fi

checkForSTC:
	@-if [ ! -f $(STC) ]; then \
	  (cd $(TOP)/stc && $(MAKE)); \
	fi

#
# same without make depend
#
qMakefiles::
	@-if [ "$(ALLSUBDIRS)"x != x ]; then                            \
	  $(MAKE) subMakefiles SUPPRESS_DEPEND=y MAKEFILE=$(MAKEFILE);  \
	fi

subMakefiles::
	@-for i in $(ALLSUBDIRS); do \
	  if [ -d $$i ]; then \
	   if [ -f $$i/Make.proto ]; then \
	     $(MAKE) subMakefile SUBDIR=$$i ; \
	   else \
	     echo "*** oops no Make.proto in directory $$i ?? (non fatal)"; \
	   fi; \
	  else \
	    echo "*** oops where is directory $$i ?? in "`pwd`" (non fatal)"; \
	  fi; \
	done

subMakefile::
	$(RULEDIR)/stmkmf --cd $(SUBDIR)

#
# sorry - the -nt operator is not available on most shells ... shame to them
#

# CHECKMAKEFILEISUPTODATE=checkMakefileIsUpToDate

checkMakefileIsUpToDate:
	@-if [ Make.proto -nt $(MAKEFILE) ]; then  \
	   $(MAKE) mf;                         \
	fi


#
# cross-make of makefiles & config files
# for systems with poor make/sed/awk etc. support
#
# bmake.bat:
#         @echo "mkdir objbc" > bmake.bat
#         @echo "make.exe -N -f nt.mak %1 %2" >> bmake.bat

bmake.bat:
	@echo "make.exe -N -f nt.mak %1 %2" >> bmake.bat

nt.mak: Make.proto $(TOP)/rules/stdRules
	@$(MAKE) SYSDEP_OBJS="$(WIN32_OBJS)" do_nt.mak

NT_ADDITIONAL_DEFS::
	@echo "#"
	@echo "# additional defines"
	@echo "#"

NT_ADDITIONAL_RULES::
	@echo "#"
	@echo "# additional rules"
	@echo "#"

do_nt.mak:
	@echo "making nt.mak from Make.proto ..."
	@echo '#' > nt_mak
	@echo '# DO NOT EDIT ' >> nt_mak
	@echo '# automagically generated from Make.proto (by make nt.mak)' >> nt_mak
	@echo "#" >> nt_mak
	@echo -n "TOP=" >> nt_mak
	@echo $(TOP) | sed -e 's:/:\\:g' >> nt_mak
	@echo "#" >> nt_mak
	@echo '!INCLUDE $$(TOP)\rules\'$(STDHEADER_NT) >> nt_mak
	@echo "#" >> nt_mak
	@-if [ "$(LIBNAME)" != "" ]; then \
	    echo "MODULE="$(MODULE) >> nt_mak; \
	    echo "MODULE_DIR="$(MODULE_DIR) >> nt_mak; \
	    echo "PACKAGE=$$"'('MODULE')'":$$"'('MODULE_DIR')' >> nt_mak; \
	    echo "LIBNAME="$(LIBNAME) >> nt_mak; \
	    if [ "$(NM_LIB_BASE)" != "" ]; then \
		echo "LIB_BASE=$$"'('$(NM_LIB_BASE)')' >> nt_mak; \
		echo '!ifdef USEBC' >> nt_mak; \
		echo "LIB_BASE_LD_ARG=-b:$$"'('$(NM_LIB_BASE)')' >> nt_mak; \
		echo '!endif' >> nt_mak; \
	    fi; \
	    echo LOCALINCLUDES='"'$(LOCALINCLUDES)'"' | sed -e 's:/:\\:g'  >> nt_mak; \
	    echo 'CLOCAL_INCL=$$(LOCALINCLUDES)' >>nt_mak; \
	    echo STCOPT='"'$(STCOPT)'"' >> nt_mak; \
	    echo 'STCLOCALOPT=-package=$$(PACKAGE) $$(COMMONSYMBOLS) $$(SEPINITCODE) $$(RELOCINSTVARS) -varPrefix=$$(LIBNAME) $$(LOCALINCLUDES)' >> nt_mak; \
	    echo '#STCLOCALOPT="'$(STCLOCALOPT)'"' >> nt_mak; \
	    echo >> nt_mak; \
	    echo 'ALL: $(NT_ADDITIONAL_ALL_TARGETS) $$(LIBDIR)\$$(LIBNAME).lib $$(BINDIR)\$$(LIBNAME).dll' >>nt_mak; \
	    echo >> nt_mak; \
	fi
	@$(MAKE) NT_ADDITIONAL_DEFS >> nt_mak
	@echo >> nt_mak
	@echo 'OBJS=\' >> nt_mak
	@for i in $(OBJS); do \
	  BASE=`basename $$i .$(O)`; \
	  W32BASE=`basename $$i .$(O)`_win32; \
	  W32ST=`basename $$i .$(O)`_win32.st; \
	  if [ -f $$W32ST ]; then \
	    BASE=$$W32BASE; \
	  fi; \
	  if [ "$$BASE" != "XWorkstation" ]; then \
	    if [ "$$BASE" != "GLXWorkstation" ]; then \
	      if [ "$$BASE" != "WinWorkstation" ]; then \
		echo '  $$(OUTDIR)'$$BASE'.$$(O)'" \\" >> nt_mak; \
	      fi; \
	    fi; \
	  fi; \
	done
	@echo >> nt_mak
	@echo >> nt_mak
	@echo '!INCLUDE $$(TOP)\rules\'$(STDRULES_NT) >> nt_mak
	@echo >> nt_mak
	@$(MAKE) NT_ADDITIONAL_RULES >> nt_mak
	@echo >> nt_mak
	@echo "# BEGINMAKEDEPEND --- do not remove this line; make depend needs it" >> nt_mak
	@for i in $(OBJS); do \
	  BASE=`basename $$i .$(O)`; \
	  W32BASE=`basename $$i .$(O)`_win32; \
	  W32ST=`basename $$i .$(O)`_win32.st; \
	  if [ -f $$W32ST ]; then \
	    BASE=$$W32BASE; \
	  fi; \
	  if [ "$$BASE" != "XWorkstation" ]; then \
	    if [ "$$BASE" != "GLXWorkstation" ]; then \
	      if [ "$$BASE" != "WinWorkstation" ]; then \
		echo '$$(OUTDIR)'$$BASE'.$$(O): '$$BASE'.st' >> nt_mak; \
	      fi; \
	    fi; \
	  fi; \
	done
	@echo "# ENDMAKEDEPEND --- do not remove this line" >> nt_mak
	@-if [ -f nt.mak ]; then \
	    mv nt.mak nt.mak.bak; \
	fi
	@$(MAKE) stDepend MAKEFILE=nt_mak
	@mv nt_mak nt.mak

nt.def: $(MAKEFILE) $(TOP)/rules/stdRules
	@echo "making nt.def from Make.proto ..."
	@echo 'LIBRARY '$(LIBNAME) > nt_def
	@echo 'CODE EXECUTE READ SHARED' >> nt_def
	@echo 'DATA READ WRITE' >> nt_def
	@echo 'SECTIONS' >> nt_def
	@echo '    INITCODE    READ EXECUTE SHARED' >> nt_def
	@echo '    INITDATA    READ WRITE' >> nt_def
	@echo '    RODATA      READ SHARED' >> nt_def
	@echo 'EXPORTS ' >> nt_def
	@echo '    _'$(LIBNAME)'_Init' >> nt_def
	@-mv nt.def nt.def.bak
	@mv nt_def nt.def

bc.def: $(MAKEFILE) $(TOP)/rules/stdRules
	@echo "making bc.def from Make.proto ..."
	@echo 'LIBRARY '$(LIBNAME) > bc_def
	@echo 'CODE PRELOAD MOVEABLE DISCARDABLE' >> bc_def
	@echo 'SEGMENTS' >> bc_def
	@echo '   INITCODE    PRELOAD DISCARDABLE' >> bc_def
	@echo 'EXPORTS ' >> bc_def
	@echo '    _'$(LIBNAME)'_Init   @1' >> bc_def
	@-mv bc.def bc.def.bak
	@mv bc_def bc.def

vms.mak: $(MAKEFILE) $(TOP)/rules/stdRules
	@$(MAKE) SYSDEP_OBJS="$(VMS_OBJS)" do_vms.mak

do_vms.mak:
	@echo "making vms.mak from Make.proto ..."
	@echo '#' > vms_mak
	@echo '# DO NOT EDIT ' >> vms_mak
	@echo '# automagically  generated from Make.proto (by make vms.mak)' >> vms_mak
	@echo "#" >> vms_mak
	@echo "TOP="$(TOP) >> vms_mak
#       @echo '!INCLUDE $$(TOP)\rules\stdHeader_vms' >> vms_mak
	@echo "LIBNAME="$(LIBNAME) >> vms_mak
#       @grep $(GREP_ARGS) "LIB_BASE=" Make.proto >> vms_mak
	@echo STCOPT='"'$(STCOPT)'"' >> vms_mak
	@echo 'STCLOCALOPT=-package=$$(MODULE):$$(MODULE_DIR) $$(COMMONSYMBOLS) $$(SEPINITCODE) $$(RELOCINSTVARS) -varPrefix=$$(LIBNAME)' >> vms_mak
	@echo 'ALL: $$(LIBDIR)\$$(LIBNAME).olb' >>vms_mak
	@echo >>vms_mak
	@echo 'OBJS=\' >> vms_mak
	@for i in $(OBJS); do \
	  BASE=`basename $$i .$(O)`; \
	  echo '  $$(OUTDIR)'$$BASE'.$$(O)'" \\" >> vms_mak; \
	done
	@echo >> vms_mak
	@echo >> vms_mak
	@echo 'theLib:: $$(LIBNAME).olb' >> vms_mak
	@echo 'Xwrite sys$$output "making class objects ..."' | tr X "\\011" >> vms_mak
	@echo 'X$$(MAKE) objs' | tr X "\\011" >> vms_mak
	@echo 'X$$(MAKE) libinit' | tr X "\\011" >> vms_mak
	@echo 'Xwrite sys$$output "classlibrary $$(LIBNAME).olb made."' | tr X "\\011" >> vms_mak
	@echo >> vms_mak
	@echo '$$(LIBNAME).olb:' >> vms_mak
	@echo 'Xwrite sys$$output "creating initial $$(LIBNAME).olb ..."' | tr X "\\011" >> vms_mak
	@echo 'Xlib/cre $$(LIBNAME).olb' | tr X "\\011" >> vms_mak
	@echo >> vms_mak
	@echo 'objs:  $$(OBJS1)' >> vms_mak
	@echo >> vms_mak
	@echo >> vms_mak
	@echo >> vms_mak
	@echo '# BEGINMAKEDEPEND' >> vms_mak
	@for i in $(OBJS); do \
	  BASE=`basename $$i .$(O)`; \
	  echo '$$(OUTDIR)'$$BASE'.$$(O): '$$BASE'.st' >> vms_mak; \
	done
	@echo '# ENDMAKEDEPEND' >> vms_mak
	@-mv vms.mak vms.mak.bak
	@$(MAKE) stDepend MAKEFILE=vms_mak
	@mv vms_mak vms.mak

# libInit.cc is now in CVS - do not overwrite!
#
#libInit.cc: Make.proto Make.spec $(MAKEFILE) $(TOP)/rules/stdRules
libInit.cc:
	$(MAKE) doLibInit.cc SYSDEP_OBJS=

doLibInit.cc:
	@echo "making libInit.cc from Make.proto ..."
	@echo '/*' > libInit_cc
	@echo ' * DO NOT EDIT ' >> libInit_cc
	@echo ' * automagically generated from Make.proto (by make libInit.cc)' >> libInit_cc
	@echo ' */' >> libInit_cc
	@echo '#define __INDIRECTVMINITCALLS__' >> libInit_cc
	@echo '#include <stc.h>' >> libInit_cc
	@echo '#define INIT_TEXT_SECT /* as nothing */' >> libInit_cc
	@echo '#ifdef WIN32' >> libInit_cc
	@echo '# pragma codeseg INITCODE "INITCODE"' >> libInit_cc
	@echo '#else /* not WIN32 */' >> libInit_cc
	@echo '# if defined(__GNUC__) && !defined(NO_SECTION_ATTRIBUTES)' >> libInit_cc
	@echo '#  if (__GNUC__  == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ > 2' >> libInit_cc
	@echo '#   undef INIT_TEXT_SECT' >> libInit_cc
	@echo '#   define INIT_TEXT_SECT __attribute__((section(".stxitext")))' >> libInit_cc
	@echo '#  endif' >> libInit_cc
	@echo '# endif /* not GNUC */' >> libInit_cc
	@echo '#endif /* not WIN32 */' >> libInit_cc
	@echo '#ifdef INIT_TEXT_SECT' >> libInit_cc
	@echo 'extern void _'$(LIBNAME)'_Init() INIT_TEXT_SECT;' >> libInit_cc
	@echo '#endif' >> libInit_cc
	@echo 'void _'$(LIBNAME)'_Init(pass, __pRT__, snd)' >> libInit_cc
	@echo 'OBJ snd; struct __vmData__ *__pRT__; {' >> libInit_cc
	@echo '__BEGIN_PACKAGE2__("'$(LIBNAME)'", _'$(LIBNAME)'_Init, "'$(PACKAGE)'");' >> libInit_cc
	@for i in $(OBJS); do \
	  BASE=`basename $$i .$(O)`; \
	  if [ "$$BASE" = "XWorkstation" ]; then \
	      echo "#ifdef WANT_XWorkstation" >> libInit_cc; \
	  fi; \
	  if [ "$$BASE" = "GLXWorkstation" ]; then \
	      echo "#ifdef WANT_GLXWorkstation" >> libInit_cc; \
	  fi; \
	  if [ "$$BASE" = "WinWorkstation" ]; then \
	      echo "#ifdef WANT_WinWorkstation" >> libInit_cc; \
	  fi; \
	  CLASS=`$(STC) -extractCInit $$BASE.st`; \
	  echo "_"$$CLASS'_Init(pass,__pRT__,snd);' >> libInit_cc; \
	  if [ "$$BASE" = "XWorkstation"  ]; then \
	      echo "#endif" >> libInit_cc; \
	  fi; \
	  if [ "$$BASE" = "GLXWorkstation"  ]; then \
	      echo "#endif" >> libInit_cc; \
	  fi; \
	  if [ "$$BASE" = "WinWorkstation"  ]; then \
	      echo "#endif" >> libInit_cc; \
	  fi; \
	done
	@if [ "$(WIN32_OBJS)" != "" ]; then \
	    $(MAKE) libInit_xxx xxx_OBJS="$(WIN32_OBJS)" xxx_define=WIN32; \
	fi
	@if [ "$(VMS_OBJS)" != "" ]; then \
	    $(MAKE) libInit_xxx xxx_OBJS="$(VMS_OBJS)" xxx_define=VMS; \
	fi
	@if [ "$(UNIX_OBJS)" != "" ]; then \
	    $(MAKE) libInit_xxx xxx_OBJS="$(UNIX_OBJS)" xxx_define=UNIX; \
	fi
	@if [ "$(MACOS_OBJS)" != "" ]; then \
	    $(MAKE) libInit_xxx xxx_OBJS="$(MACOS_OBJS)" xxx_define=MACOS; \
	fi
	@if [ "$(OS2_OBJS)" != "" ]; then \
	    $(MAKE) libInit_xxx xxx_OBJS="$(OS2_OBJS)" xxx_define=OS2; \
	fi
	@if [ "$(BEOS_OBJS)" != "" ]; then \
	    $(MAKE) libInit_xxx xxx_OBJS="$(BEOS_OBJS)" xxx_define=BEOS; \
	fi
	@echo '__END_PACKAGE__();' >> libInit_cc
	@echo '}' >> libInit_cc
	@-if [ -f libInit.cc ]; then \
	    mv libInit.cc libInit.cc.bak; \
	fi
	@mv libInit_cc libInit.cc

libInit_xxx:
	@echo "#ifdef "$(xxx_define) >> libInit_cc
	@for i in $(xxx_OBJS); do \
	  BASE=`basename $$i .$(O)`; \
	  if [ -f $$BASE.st ]; then \
	    CLASS=`$(STC) -extractCInit $$BASE.st`; \
	    echo "_"$$CLASS'_Init(pass,__pRT__,snd);' >> libInit_cc; \
	  else \
	    echo "skipped missing classFile: "$$BASE.st; \
	  fi \
	done
	@echo "#endif" >> libInit_cc

#
# check:
#    quick ST-syntax check over all st-files
#
check::
	@-if [ "*.st" != '\*.st' ]; then  \
	  for i in *.st; do               \
	    echo checking $$i ...;        \
	    $(STC) -check $(STCFLAGS) $(STC_MSGFORMAT) $$i;\
	  done;                           \
	fi
	@-if [ "$(SUBDIRS)"x != x ]; then \
	  for i in $(SUBDIRS)" "; do      \
	    if [ -d $$i ]; then           \
	      echo "checking in $$i";     \
	      (cd $$i && $(MAKE) check );  \
	    fi;                           \
	  done;                           \
	fi

#
# debug - make with -g instead of -O
#
debug:
	$(MAKE) OPT="-g $(OPT)" LIBRUN_OPT="-g $(LIBRUN_OPT)" STCOPT="$(STCOPT)"

cfiles:
	  for i in ""*.st""; do                          \
	    $(MAKE) $$(echo $$i | sed "s/\.st/\.c/1"); \
	  done;                                          \

#
# notes:
#    output notes on st-code (for compiler writer only)
#
notes::
	@-if [ "*.st" != '\*.st' ]; then                 \
	  for i in ""*.st""; do                          \
	    echo notes on $$i ...;                       \
	    $(STC) -check +notice +hint $(STCFLAGS) $(STC_MSGFORMAT) $$i; \
	  done;                                          \
	fi
	@-if [ "$(SUBDIRS)"x != x ]; then  \
	  for i in $(SUBDIRS)" "; do       \
	    if [ -d $$i ]; then            \
	      echo "notes in $$i";         \
	      (cd $$i && $(MAKE) notes );   \
	    fi;                            \
	  done;                            \
	fi

#
# warnings:
#    output warning on st-code (for compiler writer only)
#
warnings::
	@-if [ "*.st" != '\*.st' ]; then                 \
	  for i in ""*.st""; do                          \
	    echo warnings on $$i ...;                       \
	    $(STC) -check +hint $(STCFLAGS) $(STC_MSGFORMAT) $$i; \
	  done;                                          \
	fi
	@-if [ "$(SUBDIRS)"x != x ]; then  \
	  for i in $(SUBDIRS)" "; do       \
	    if [ -d $$i ]; then            \
	      echo "warnings in $$i";         \
	      (cd $$i && $(MAKE) warnings );   \
	    fi;                            \
	  done;                            \
	fi

#
# hints:
#    output hints on st-code (mostly for compiler writer)
#
hints::
	@-for i in *.st; do                           \
	    echo hints on $$i ...;                    \
	    $(STC) -check +hint $(STCFLAGS) $(STC_MSGFORMAT) $$i;      \
	done

#
# fullcheck:
#    outputs notice + hints
#
fullcheck::
	@-if [ "*.st" != '\*.st' ]; then                 \
	  for i in *.st; do                              \
	    echo checking $$i ...;                       \
	    $(STC) -check $(STCFLAGS) $(STC_MSGFORMAT) +notice +hint $$i; \
	  done;                                          \
	fi
	@-if [ "$(SUBDIRS)"x != x ]; then    \
	  for i in $(SUBDIRS)" "; do         \
	    if [ -d $$i ]; then              \
	      echo "check in $$i";           \
	      (cd $$i && $(MAKE) fullcheck ); \
	    fi;                              \
	  done;                              \
	fi

#
# defaultMakefile
# create an initial Make.proto.
# use as: make -f <some-existing-makefile> Make.proto
#

Make.spec:
	@-if [ -r Make.spec ]; then         \
	    echo "Make.spec exists";        \
	    exit 1;                          \
	fi
	@echo -n '# $$Header' > Make.spec
	@echo '$$' >> Make.spec
	@echo "#" >> Make.spec
	@echo "# --- Automatically created Make.spec" >> Make.spec
	@echo >> Make.spec
	@echo "TOP="$(TOP) >> Make.spec
	@echo "SUBDIRS=" >> Make.spec
	@echo >> Make.spec
	@echo >> Make.spec
	@echo "# ***************************** modify the next line ***" >> Make.spec
	@echo "LIBNAME=libprivate" >> Make.spec
	@echo >> Make.spec
	@echo >> Make.spec
	@echo "EXTRA_TARGTES=" >> Make.spec
	@echo >> Make.spec
	@echo -n "OBJS= " >> Make.spec
	@-if [ "*.st" != '\*.st' ]; then                        \
	  for i in ""*.st""; do                                 \
	    echo " \\" >> Make.spec;                           \
	    echo -n "   " $$(OUTDIR)`basename $$i .st`.'$$(O)' >> Make.spec; \
	  done;                                                 \
	fi
	@echo >> Make.spec
	@echo >> Make.spec


Make.proto:
	@-if [ -r Make.proto ]; then         \
	    echo "Make.proto exists";        \
	    exit 1;                          \
	fi
	@echo -n '# $$Header' > Make.proto
	@echo '$$' >> Make.proto
	@echo "#" >> Make.proto
	@echo "# --- Automatically created Make.proto" >> Make.proto
	@echo >> Make.proto
	@echo "# ***************************** modify the next line ***" >> Make.proto
	@echo "STCLOCALOPT='-Pprivate-classes-(module:directory)'" >> Make.proto
	@echo "STCOPT=$(LIBBASIC2_STCOPT)" >> Make.proto
	@echo >> Make.proto
	@echo >> Make.proto
	@echo "all:: classLibRule $(EXTRA_TARGETS)" >> Make.proto
	@echo >> Make.proto
	@echo "cleanjunk::" >> Make.proto
	@echo >> Make.proto
	@echo "clean::" >> Make.proto
	@echo " -rm -f *.H" >> Make.proto
	@echo >> Make.proto
	@echo "clobber::" >> Make.proto
	@echo " -rm -f *.o" >> Make.proto
	@echo >> Make.proto
	@echo "# BEGINMAKEDEPEND --- do not remove this line; make depend needs it" >> Make.proto
	@echo "# ENDMAKEDEPEND --- do not remove this line" >> Make.proto


#
# collectAbbrev
# recursively work thru subdirectories and collect abbreviations
# into $(INCLUDE)/abbrev.stc for classname-to-filename translations
#
#
collectAbbrev::
	@-$(MAKE) abbrev.stc
	@-if [ "$(SUPPRESS_LOCAL_ABBREVS)" = "" ]; then \
	    $(MAKE) updateAbbrev; \
	fi
	@-if [ "$(ALLSUBDIRS)"x != x ]; then \
	    $(MAKE) collectSubdirAbbrev;     \
	fi

collectSubdirAbbrev::
	@-for i in $(ALLSUBDIRS); do         \
	    if [ -d $$i ]; then              \
	      if [ -f $$i/Make.proto ]; then \
		if [ -f $$i/$(MAKEFILE) ]; then            \
		  echo "collect abbreviations in $$i";  \
		  if [ "$(NOSUBAUTOLOAD)" = "1" ]; then \
		      (cd $$i && $(MAKE) collectAbbrev NOSUBAUTOLOAD=1 NOAUTOLOAD=1 ); \
		  else                                  \
		      (cd $$i && $(MAKE) collectAbbrev);     \
		  fi;                        \
		fi                           \
	      fi                             \
	    fi;                              \
	done

UNCRITICAL:
	$(MAKE) $(SPACEOPT_O_RULE) STFILE=$(NAME) STCOPT="$(STCOPT) $(UNCRITICALOPT)" CLASSLIB_CC="$(CLASSLIB_CC)" CLASSLIB_OPT="$(CLASSLIB_OPT)" CC="$(CLASSLIB_CC)" OPT="$(OPT)"

$(UNCRITICALOBJS):
	@$(MAKE) UNCRITICAL CC="$(CLASSLIB_CC)" OPT="$(OPT)" CLASSLIB_CC="$(CLASSLIB_CC)" CLASSLIB_OPT="$(CLASSLIB_OPT)" NAME=$*

AUTOLOADED:
	@-if [ -f i_$(NAME).o ]; then \
	    echo "assuming stubObject i_$(NAME).o is up-to-date"; \
	else \
	    $(MAKE) $(SPACEOPT_O_RULE) STFILE=$(NAME) STCOPT="$(STCOPT)" FORCEAUTOLOAD="+autoload -sepInitCode" CLASSLIB_CC="$(CLASSLIB_CC)" CLASSLIB_OPT="$(CLASSLIB_OPT)" OPT="$(OPT)" CC="$(CLASSLIB_CC)"; \
	fi

$(AUTOLOADEDOBJS):
	@$(MAKE) AUTOLOADED CLASSLIB_CC="$(CLASSLIB_CC)" CLASSLIB_OPT="$(CLASSLIB_OPT)" CC="$(CC)" OPT="$(OPT)" NAME=$*

#
# objs:
#    generate all .o-files
#

subDirObjsIfBeforeObjs:
	@-if [ "$(SUBDIRS_AFTER_OBJS)" = "" ]; then \
	    $(MAKE) subDirObjsIfPresent; \
	fi

subDirObjsIfAfterObjs:
	@-if [ "$(SUBDIRS_AFTER_OBJS)" != "" ]; then \
	    $(MAKE) subDirObjsIfPresent; \
	fi

subDirObjsIfPresent:
	@-if [ "$(OBJ_SUBDIRS)" != "" ]; then \
	    $(MAKE) subDirObjs;           \
	fi

subDirObjs::
	@-for i in $(OBJ_SUBDIRS); do         \
	    if [ -d $$i ]; then           \
	      echo "making obj in $$i ...";\
	      (cd $$i && $(MAKE) CC="$(CC)" OPT="$(OPT)" obj );   \
	    fi;                           \
	done

objs:: pre_objs pre_local_objs $(OBJS) post_local_objs

pre_objs::

pre_local_objs::
	@$(MAKE) subDirObjsIfBeforeObjs

post_local_objs::
	@$(MAKE) subDirObjsIfAfterObjs

clsFiles:: pre_cls subDirClassFiles
	@test  "$(CLS)" = "" || $(MAKE) cls_files

cls_files:: $(CLS)

#
# The makefile in SUBDIR may not have been built yet...
#
subDirClassFiles::
	@-if [ "$(SUBDIRS)" != "" ]; then \
	    $(MAKE) subDirClassFilesPresent;    \
	fi

subDirClassFilesPresent::
	@for i in $(SUBDIRS); do \
	    if [ -d "$$i" ]; then \
		echo "making cls-files in $$i ..."; \
		(cd $$i && $(MAKE) makefile && $(MAKE) clsFiles) || exit $? ;  \
	    fi;  \
	done

pre_cls::

# systems which support hiding symbols from libs,
# may add the following lines in the config-file:
#
# PRE_LD_ACTION=createHiddenSymFile
# POST_LD_ACTION=removeHiddenSymFile


emptyRule:
	@true

createHiddenSymFile: hiddenSyms.stc
	@-echo > /dev/null

removeHiddenSymFile:
	@-rm -f hiddenSyms.stc


#
# make without optimizer ...
#
nonopt:
	$(MAKE) OPT=


#
# those two are no longer needed
#
CLASSLIST_OR_EMPTY=

#
# rule to build a class Library
#
lib: classLibRule

classLibRule: clsFiles $(LOCAL_EXTRA_TARGETS) $(OBJTARGET) registerClassLib

#
# create a symbolic link to the shared library in the projects/smalltalk/packages
# folder. This folder can later be scanned quickly and presented in the Launcher's
# load package menu item.
#
REGISTERED_PACKAGES_DIR=$(TOP)/projects/smalltalk/packages

registerClassLib: $(REGISTERED_PACKAGES_DIR)
	@echo "registering $(MODULE):$(MODULE_DIR)/$(LIBNAME) in $(REGISTERED_PACKAGES_DIR)"
	rm -f $(REGISTERED_PACKAGES_DIR)/$(LIBNAME)$(SONAME)
	echo "lib ../../../../$(MODULE)/$(MODULE_DIR)/$(LIBNAME)$(SONAME)" > $(REGISTERED_PACKAGES_DIR)/$(LIBNAME)$(SONAME)

$(REGISTERED_PACKAGES_DIR):
	@mkdir $(REGISTERED_PACKAGES_DIR)

registerApplication:
	@-if [ "$(APPNAME)"x != ""x ]; then \
	    echo "registering $(MODULE):$(MODULE_DIR)/$(APPNAME) in $(REGISTERED_PACKAGES_DIR)";  \
	    rm -f $(REGISTERED_PACKAGES_DIR)/$(APPNAME); \
	    echo "app ../../../../$(MODULE)/$(MODULE_PATH)/$(APPNAME)" > $(REGISTERED_PACKAGES_DIR)/$(APPNAME); \
	fi

#
# rule to build a program (application)
#
progRule:
	@-if [ "$(PROGS)"x != ""x ]; then \
	  for i in $(PROGS)" "; do        \
	    echo "making $$i";            \
	    $(MAKE) PROGTARGET$(TARGET_RULE_EXTENSION) PROG=$$i; \
	  done;                           \
	fi

#
# one of the two below is performed by the $(OBJTARGET) target;
# create a library for either static or dynamic linking
# (this is controlled by the TARGET_EXTENSION, set in an architecture specific config file)
#

obj::    obj$(TARGET_RULE_EXTENSION)

obj_shared: newobj $(LIBNAME)$(SONAME)


obj_shared_stub:
	@-if [ -f $(STUBLIBNAME)$(OBJNAME) ]; then \
	  echo "making shared stub object $(STUBLIBNAME)$(SONAME)"; \
	  $(MAKE) $(STUBLIBNAME)$(SONAME); \
	else \
	  echo " ** $(STUBLIBNAME)$(SONAME) not made - no $(STUBLIBNAME)$(OBJNAME)"; \
	fi

obj_static: newobj

static_obj:
	$(MAKE) newobj LINKOBJRULE=newobj_staticLink

#
# newobj:
#    generate all .o-files, pre-link them into one big lib.o file
#    create a lib-init function and include it in library
#

newobj_prelink::
	@true "nothing done here"

newobj_postlink::
	@true "nothing done here"

newobj: objs $(LINKOBJS)
	@if [ "$(NEWOBJ_SUBDIRS)"x != x ]; then \
	  for i in "$(NEWOBJ_SUBDIRS)"; do \
	    if [ -d $$i ]; then \
	      echo "making newobj in $$i"; \
	      (cd $$i && $(MAKE) newobj); \
	    fi; \
	  done; \
	fi
	@if [ "$(LIBNAME)" != "" ]; then \
	  if [ "$(LINKOBJS)" != "" ]; then \
	      echo "making init code ..." && \
	      $(MAKE) LINKOBJS="$(LINKOBJS)" LIBNAME=$(LIBNAME) \
	      	$(PRE_LD_ACTION) \
	      	newobj_prelink \
	      	$(LINKOBJRULE) \
	      	newobj_postlink \
	      	$(POST_LD_ACTION); \
	  else \
	    echo " ** $(LIBNAME)$(OBJNAME) not made - no object files (LINKOBJS=) defined";   \
	  fi \
	else \
	  echo " ** no library name (LIBNAME=) defined"; \
	fi
	@if [ "$(STUBLIBNAME)" != "" ]; then \
	  $(MAKE) stubobj STUBLIBNAME=$(STUBLIBNAME) LIBNAME=$(LIBNAME); \
	fi

stubobj:
	@echo "making stubobj ..."
	@echo "making stub init code ..."
	@$(MAKE) $(STUBLIBNAME)Stub.o STUBLIBNAME=$(STUBLIBNAME) LIBNAME=$(LIBNAME)
	@rm -f $(STUBLIBNAME)$(OBJNAME)
	@$(MAKE) stub_link LIBNAME=$(LIBNAME)
	@chmod -x,+w $(STUBLIBNAME)$(OBJNAME)
	@rm -f $(STUBLIBNAME)Stub.o $(STUBLIBNAME)Stub.c

newobj_link:: $(LIBNAME)$(OBJNAME)

$(LIBNAME)$(OBJNAME): $(LIBNAME)Init.o $(LINKOBJS)
	@echo "linking class object ..."
	$(CLASSLIB_LD) $(LD_REL_FLAG) $(LD_OBJ_FLAGS) $^ $(LD_OBJ_LIBS) $(LD_REL_OBJ_LIBS) -o $@

$(LIBNAME).$(SO): $(LIBNAME)$(OBJNAME)
	@echo "linking class library ..."
	$(LD) -shared $(LDFLAGS) -o $@ $< $(LOCAL_SHARED_LIBS) $(EXTRA_SHARED_LIBS)
	$(OBJCOPY) --only-keep-debug $@ $@.debug
	$(CHMOD) ugo-x $@.debug
	$(STRIP) --strip-debug --strip-unneeded $@
	$(OBJCOPY) --add-gnu-debuglink="$@.debug" $@

newobj_staticLink::
	@echo "linking static classLib object ..."
	@$(CLASSLIB_LD) $(LD_REL_FLAG) $(LD_OBJ_FLAGS) \
	    $(LIBNAME)Init.o $(LINKOBJS) $(LD_OBJ_LIBS) $(LD_REL_OBJ_LIBS) -o $(LIBNAME).$(O)

newobj_linkSep::
	@-echo "linking sepInit class object ..."
	@-echo $(CLASSLIB_LD) $(LD_REL_FLAG) $(LD_OBJ_FLAGS) \
	    $(LIBNAME)Init.o `$(TOP)/rules/i_list $(LINKOBJS)` $(LINKOBJS) $(LD_OBJ_LIBS) $(LD_REL_OBJ_LIBS) -o $(LIBNAME)$(OBJNAME)
	@$(CLASSLIB_LD) $(LD_REL_FLAG) $(LD_OBJ_FLAGS) \
	    $(LIBNAME)Init.o `$(TOP)/rules/i_list $(LINKOBJS)` $(LINKOBJS) $(LD_OBJ_LIBS) $(LD_REL_OBJ_LIBS) -o $(LIBNAME)$(OBJNAME)

newobj_link_sepInitCode::
	@-if [ "$(SEPINITCODE)" != "" ]; then   \
	    $(MAKE) newobj_linkSep LINKOBJS="$(LINKOBJS)" LIBNAME=$(LIBNAME);                     \
	else                                    \
	    echo "** oops - sepInit rule but no +sepInit specified (non fatal)"; \
	    $(MAKE) newobj_link LINKOBJS="$(LINKOBJS)" LIBNAME=$(LIBNAME);                        \
	fi

stub_link::
	@-echo "linking stub class object ..."
	@-echo $(CLASSLIB_LD) $(LD_REL_FLAG) $(LD_OBJ_FLAGS) $(STUBLIBNAME)Stub.o $(LINKOBJS) -o $(STUBLIBNAME)$(OBJNAME)
	@$(CLASSLIB_LD) $(LD_REL_FLAG) $(LD_OBJ_FLAGS) $(STUBLIBNAME)Stub.o $(LINKOBJS) -o $(STUBLIBNAME)$(OBJNAME)

iobjs:
	echo "making sepInit objs ..."
	@-if [ "$(OBJS)"x != x ]; then \
	  for i in $(OBJS); do         \
	      $(MAKE) i_$$i ;          \
	  done;                        \
	fi

#
# to force creation of a shared object, even if not defined in config
#
sharedobj: newobj
	@echo "making shared object $(LIBNAME)$(SONAME)"
	$(MAKE) $(LIBNAME)$(SONAME)

#
# objstrip:
#     like make obj, but strip debug syms
#
objstrip::
	@if [ "$(OBJ_SUBDIRS)"x != x ]; then               \
	  for i in $(OBJ_SUBDIRS)" "; do                    \
	    if [ -d $$i ]; then                         \
	      echo "making obj in $$i";                 \
	      (cd $$i && $(MAKE) obj );                  \
	    fi;                                         \
	  done;                                         \
	fi
	@if [ "$(LIBNAME)" != "" ]; then                \
	  $(MAKE) objs &&                               \
	  echo $(CLASSLIB_LD) $(LD_REL_FLAG) $(LD_STRIP_FLAG) $(LD_OBJ_FLAGS) $(LINKOBJS) -o $(LIBNAME)$(OBJNAME) && \
	  rm -f $(LIBNAME)$(OBJNAME) &&                 \
	  $(CLASSLIB_LD) $(LD_REL_FLAG) $(LD_STRIP_FLAG) $(LD_OBJ_FLAGS) $(LINKOBJS) -o $(LIBNAME)$(OBJNAME) && \
	  chmod -x,+w $(LIBNAME)$(OBJNAME);                \
	fi

# cleanjunk:
#    remove all temporary stuff
#
cleanjunk::
	@echo cleaning junk
	@echo no -rm -f .dependencies
	@-rm -f nohup.out out .errors *.bak core .dir.*.old *.old *~ Make.log
	@-rm -f bitmaps/*.bak bitmaps/*~
	@-rm -f resources/*.bak resources/*~ resources/*.old
	@echo no $(MAKE) cleanLIBjunk
	@-if [ "$(ALLSUBDIRS)" != "" ]; then \
	  $(MAKE) cleanjunkALLSUBDIRS; \
	fi
	@-if [ "$(CLEANSUBDIRS)" != "" ]; then \
	  $(MAKE) cleanjunkCLEANSUBDIRS; \
	fi

cleanLIBjunk:
	@-if [ "$(LIBNAME)"x != x ]; then \
	    rm -f $(LIBNAME)Init.[co] $(STUBLIBNAME)Stub.[co]; \
	    if [ -f $(LIBNAME).so ]; then \
		    rm -f $(LIBNAME).o; \
	    fi; \
	fi

cleanjunkALLSUBDIRS::
	@-for i in $(ALLSUBDIRS); do \
	    if [ -d $$i ]; then \
	      if [ -f $$i/Make.proto ]; then \
		if [ -f $$i/$(MAKEFILE) ]; then \
		  echo "cleaning junk in $$i ..."; \
		  (cd $$i && $(MAKE) cleanjunk ); \
		fi \
	      fi \
	    fi; \
	done

cleanjunkCLEANSUBDIRS::
	@-for i in $(CLEANSUBDIRS); do \
	    if [ -d $$i ]; then \
	      if [ -f $$i/Make.proto ]; then \
		if [ -f $$i/$(MAKEFILE) ]; then \
		  echo "cleaning junk in $$i ...";\
		  (cd $$i && $(MAKE) cleanjunk ); \
		fi \
	      fi \
	    fi; \
	done

#
# clean:
#    remove all that is not needed to run/link
#

clean::
	@echo cleaning
	@-rm -f err out *.bak core .dir.*.old *.old *~ *.H ttt* i_[A-Z]*.[cso]
	@-rm -f .dependencies
	@-if [ "$(LIBNAME)"x != x ]; then \
	    rm -f $(LIBNAME)Init.[co] $(STUBLIBNAME)Stub.[co]; \
	    if [ -f $(LIBNAME).so ]; then \
		    rm -f $(LIBNAME).o; \
	    fi; \
	fi
	@-rm -f bitmaps/*.bak bitmaps/*~
	@-rm -f resources/*.bak resources/*~ resources/*.old
	@-if [ "$(ALLSUBDIRS)"x != x ]; then \
	  $(MAKE) cleanALLSUBDIRS; \
	fi
	@-if [ "$(CLEANSUBDIRS)"x != x ]; then \
	  $(MAKE) cleanCLEANSUBDIRS; \
	fi

cleanALLSUBDIRS::
	@-for i in $(ALLSUBDIRS); do \
	    if [ -d $$i ]; then \
	      if [ -f $$i/Make.proto ]; then \
		  echo "cleaning $$i ..."; \
		  (cd $$i && $(MAKE) clean); \
	      fi; \
	    fi; \
	done

cleanCLEANSUBDIRS::
	@-for i in $(CLEANSUBDIRS); do \
	    if [ -d $$i ]; then \
	      if [ -f $$i/Make.proto ]; then \
		  echo "cleaning $$i ..."; \
		  (cd $$i && $(MAKE) clean); \
	      fi; \
	    fi; \
	done

#
# clobber:
#    remove all that can be regenerated
#
CLOBBERED_OBJS=*.o

clobber::
	@-rm -f err out *.bak core .dir.*.old *.old *~ $(CLOBBERED_OBJS) \
	       *.H *.so *.obj obj \
	       liblist.stc \
	       .listOfSTfiles* .dependencies
	@rm -f *.a $(PROGS) $(TESTPROGS)
	@-if [ "$(LIBNAME)"x != x ]; then \
	    rm -f $(LIBNAME)Init.[co] $(STUBLIBNAME)Stub.[co] $(LIBNAME)zip; \
	fi
	@-rm -f bitmaps/*.bak bitmaps/*~
	@-rm -f resources/*.bak resources/*~ resources/*.old
	@-if [ "$(ALLSUBDIRS)"x != x ]; then \
	  $(MAKE) clobberALLSUBDIRS;         \
	fi
	@-if [ "$(CLEANSUBDIRS)"x != x ]; then \
	  $(MAKE) clobberCLEANSUBDIRS;         \
	fi

clobberALLSUBDIRS::
	@-for i in $(ALLSUBDIRS); do      \
	    if [ -d $$i ]; then           \
	      echo "clobbering $$i ...";  \
	      (cd $$i && $(MAKE) clobber); \
	    fi;                           \
	done

clobberCLEANSUBDIRS::
	@-for i in $(CLEANSUBDIRS); do    \
	    if [ -d $$i ]; then           \
	      echo "clobbering $$i ...";  \
	      (cd $$i && $(MAKE) clobber); \
	    fi;                           \
	done

#
# distClean:
#    cleanup for distribution
#
distClean:: clobber
	@-if [ "$(ALLSUBDIRS)"x != x ]; then \
	  $(MAKE) distCleanALLSUBDIRS;       \
	fi
	@-if [ "$(CLEANSUBDIRS)"x != x ]; then \
	  $(MAKE) distCleanCLEANSUBDIRS;       \
	fi

distCleanALLSUBDIRS::
	@-for i in $(ALLSUBDIRS); do        \
	    if [ -d $$i ]; then             \
	      if [ -f $$i/$(MAKEFILE) ]; then  \
		echo "distClean  $$i ...";  \
		(cd $$i && $(MAKE) distClean); \
	      fi;                           \
	    fi;                             \
	done

distCleanCLEANSUBDIRS::
	@-for i in $(CLEANSUBDIRS); do      \
	    if [ -d $$i ]; then             \
	      if [ -f $$i/$(MAKEFILE) ]; then  \
		echo "distClean $$i ...";   \
		(cd $$i && $(MAKE) distClean); \
	      fi;                           \
	    fi;                             \
	done
#
# copy all relevant files to $(DELIVERDIR)/full
#
preDeliverFull::

postDeliverFull::

deliverFull::
	@if [ "$(RELDIR)" = "" ]; then  \
	    echo "no RELDIR defined";   \
	    exit 1;                     \
	fi
	@if [ "$(DELIVERDIR)" = "" ]; then      \
	    echo "no DELIVERDIR defined";       \
	    exit 1;                             \
	fi
	-$(MAKE) preDeliverFull RELDIR=$(RELDIR) DELIVERDIR=$(DELIVERDIR)
	-$(MAKE) deliverFullLocal RELDIR=$(RELDIR) DELIVERDIR=$(DELIVERDIR)
	@-if [ "$(ALLSUBDIRS)"x != x ]; then            \
	  $(MAKE) deliverFullALLSUBDIRS RELDIR=$(RELDIR) DELIVERDIR=$(DELIVERDIR);              \
	fi
	@-if [ "$(DELIVERSUBDIRS)"x != x ]; then        \
	  $(MAKE) deliverFullDELIVERSUBDIRS RELDIR=$(RELDIR) DELIVERDIR=$(DELIVERDIR);          \
	fi
	$(MAKE) postDeliverFull RELDIR=$(RELDIR) DELIVERDIR=$(DELIVERDIR)

deliverFullLocal::
	@if [ "$(RELDIR)" = "" ]; then  \
	    echo "no RELDIR defined";   \
	    exit 1;                     \
	fi
	@if [ "$(DELIVERDIR)" = "" ]; then \
	    echo "no DELIVERDIR defined";  \
	    exit 1;                        \
	fi
	@test -d $(DELIVERDIR) || mkdir $(DELIVERDIR)
	@test -d $(DELIVERDIR)/$(RELDIR) || mkdir $(DELIVERDIR)/$(RELDIR)
	@-if [ "$(DELIVERSOURCES)" != "" ]; then \
	    (tar cf - $(DELIVERSOURCES) | (cd $(DELIVERDIR)/$(RELDIR) && tar xvf -)); \
	fi
	@-if [ "$(DELIVERMISC)" != "" ]; then \
	    (tar cf - $(DELIVERMISC) | (cd $(DELIVERDIR)/$(RELDIR) && tar xvf -)); \
	fi
	@-if [ "$(DELIVERBINARIES)" != "" ]; then \
	    (tar cf - $(DELIVERBINARIES) | (cd $(DELIVERDIR)/$(RELDIR) && tar xvf -)); \
	fi

deliverFullALLSUBDIRS::
	@-for i in $(ALLSUBDIRS); do                    \
	    if [ -d $$i ]; then                         \
		echo "deliver files in $$i ...";        \
		(cd $$i && $(MAKE) deliverFull RELDIR=$(RELDIR)/$$i DELIVERDIR=$(DELIVERDIR));           \
	    fi;                                         \
	done

deliverFullDELIVERSUBDIRS::
	@-for i in $(DELIVERSUBDIRS); do                \
	    if [ -d $$i ]; then                         \
		echo "deliver files in $$i ...";        \
		(cd $$i && $(MAKE) deliverFull RELDIR=$(RELDIR)/$$i DELIVERDIR=$(DELIVERDIR));           \
	    fi;                                         \
	done

#
# remake:
#    a clean followed my make
#
remake:
	$(MAKE) clean
	$(MAKE)

#
# update: first get any changed versions from cvs,
# then make all here.
#
update:
	@-if [ -d CVS ]; then \
	    cvs update; \
	    $(MAKE) mf; \
	    $(MAKE) Makefiles; \
	    $(MAKE) $(UPDATETARGET); \
	else \
	    echo "no CVS directory"; \
	fi

pre_all::

#
# all:
#    make what is appropriate here (library or application)
#
all::   pre_all
	@-if [ "$(SUBDIRS)"x != ""x ]; then \
	  $(MAKE) allSubDirs;               \
	fi

# full:
#    in addition to all, this also builds support stuff needed
#    by some subsystems using ant and possibly other tools.
#    for now, this is libjava only
full::   all

allSubDirs:
	@-for i in $(SUBDIRS); do     \
	  if [ -d $$i ]; then         \
	    $(MAKE) subDirMake SUBDIR=$$i; \
	  else                        \
	    echo "*** oops where is directory $$i ?? in "`pwd`" (non fatal)"; \
	  fi;                         \
	done

subDirMake:
	@-if [ -f $(SUBDIR)/$(MAKEFILE) ] ; then \
	    true; \
	else \
	    $(MAKE) subMakefile SUBDIR=$(SUBDIR); \
	fi
	@-echo "********************************"
	@-echo "making all in $(SUBDIR)"
	@-echo "********************************"
	@-cd $(SUBDIR) && $(MAKE) all

allLibs::
	@-if [ "$(LIBNAME)"x != ""x ]; then \
	  $(MAKE) lib;               \
	fi
	@-if [ "$(SUBDIRS)"x != ""x ]; then \
	  $(MAKE) allSubDirLibs;               \
	fi

allSubDirLibs:
	@-for i in $(SUBDIRS); do     \
	  if [ -d $$i ]; then         \
	    $(MAKE) subDirLibsMake SUBDIR=$$i; \
	  else                        \
	    echo "*** oops where is directory $$i ?? in "`pwd`" (non fatal)"; \
	  fi;                         \
	done

subDirLibsMake:
	@-if [ -f $(SUBDIR)/$(MAKEFILE) ] ; then \
	    true; \
	else \
	    $(MAKE) subMakefile SUBDIR=$(SUBDIR); \
	fi
	@-echo "********************************"
	@-echo "making libs in $(SUBDIR)"
	@-echo "********************************"
	@-cd $(SUBDIR) && $(MAKE) allLibs

APPLICATION:
	    @-rm -f main.o modulList.stc modulList.c modulList.o
	    $(MAKE) main.o \
		STARTUP_CLASS="$(STARTUP_CLASS)" \
		STARTUP_SELECTOR="$(STARTUP_SELECTOR)" \
		MAIN_DEFINES="$(MAIN_DEFINES)"
	    @-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	    $(MAKE) linkTarget \
		LIBLIST="$(LIBLIST)" \
		LIBOBJS="$(LIBOBJS)" \
		LINK_LIBOBJS="$(LINK_LIBOBJS)" \
		TARGET=$(TARGET) \
		ADDITIONAL_CLASSES="$(APPLICATION_CLASSES)" \
		ADDITIONAL_OBJS="$(APPLICATION_OBJS)" \
		ADDITIONAL_LINK_OBJS="$(APPLICATION_LINK_OBJS)"
	    @-rm -f main.o modulList.stc modulList.c modulList.o

#
# a standAlone target without graphical user interface
#
NON_GUI_APPLICATION:
	    @-rm -f main.o modulList.stc modulList.c modulList.o
	    $(MAKE) main.o \
		STARTUP_CLASS="$(STARTUP_CLASS)" \
		STARTUP_SELECTOR="$(STARTUP_SELECTOR)" \
		MAIN_DEFINES="$(MAIN_DEFINES)"
	    @-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	    $(MAKE) linkTarget \
		LIBLIST="$(APPLICATION_LIBLIST)" \
		LIBOBJS="$(APPLICATION_LIBOBJS)" \
		LINK_LIBOBJS="$(APPLICATION_LINK_LIBOBJS)" \
		TARGET=$(TARGET) \
		ADDITIONAL_CLASSES="$(APPLICATION_CLASSES)" \
		ADDITIONAL_OBJS="$(APPLICATION_OBJS)" \
		ADDITIONAL_LINK_OBJS="$(APPLICATION_LINK_OBJS)"
	    @-rm -f main.o modulList.stc modulList.c modulList.o

xNON_GUI_APPLICATION:
	    @-rm -f main.o modulList.stc modulList.c modulList.o
	    $(MAKE) main.o \
		STARTUP_CLASS="$(STARTUP_CLASS)" \
		STARTUP_SELECTOR="$(STARTUP_SELECTOR)" \
		MAIN_DEFINES="$(MAIN_DEFINES)"
	    @-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	    $(MAKE) linkTarget \
		LIBLIST="$(MINI_LIST) libstx_libbasic2 libstx_libboss $(APPLICATION_LIBLIST)" \
		LIBOBJS="$(MINI_LIB) $(LIBBASIC2) $(LIBBOSS) $(APPLICATION_LIBOBJS)" \
		LINK_LIBOBJS="$(LINK_MINI_LIB) $(LINK_LIBBASIC2) $(LINK_LIBBOSS) $(APPLICATION_LINK_LIBOBJS)" \
		TARGET=$(TARGET) \
		ADDITIONAL_CLASSES="$(APPLICATION_CLASSES)" \
		ADDITIONAL_OBJS="$(APPLICATION_OBJS)" \
		ADDITIONAL_LINK_OBJS="$(APPLICATION_LINK_OBJS)"
	    @-rm -f main.o modulList.stc modulList.c modulList.o

#
# a minimum standAlone target without graphical user interface
# (only links libbasic - no compiler etc.)
#
BARE_NON_GUI_APPLICATION:
	    @-rm -f main.o modulList.stc modulList.c modulList.o
	    $(MAKE) main.o \
		STARTUP_CLASS="$(STARTUP_CLASS)" \
		STARTUP_SELECTOR="$(STARTUP_SELECTOR)" \
		MAIN_DEFINES="$(MAIN_DEFINES)"
	    @-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	    $(MAKE) linkTarget \
		LIBLIST="$(BARE_LIST) $(APPLICATION_LIBLIST)" \
		LIBOBJS="$(BARE_LIB) $(APPLICATION_LIBOBJS)" \
		LINK_LIBOBJS="$(LINK_BARE_LIB) $(APPLICATION_LINK_LIBOBJS)" \
		TARGET=$(TARGET) \
		ADDITIONAL_CLASSES="$(APPLICATION_CLASSES)" \
		ADDITIONAL_OBJS="$(APPLICATION_OBJS)" \
		ADDITIONAL_LINK_OBJS="$(APPLICATION_LINK_OBJS)"
	    @-rm -f main.o modulList.stc modulList.c modulList.o

#
# with graphical user interface
#
BARE_GUI_APPLICATION:
	@-rm -f main.o modulList.stc modulList.c modulList.o
	$(MAKE) main.o \
	    STARTUP_CLASS="$(STARTUP_CLASS)" \
	    STARTUP_SELECTOR="$(STARTUP_SELECTOR)" \
	    MAIN_DEFINES="$(MAIN_DEFINES)"
	@-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	$(MAKE) linkTarget \
	    LIBLIST="$(EXTRA_UI_CLASSES) $(APPLICATION_LIBLIST)" \
	    LIBOBJS="$(EXTRA_UI_OBJ) $(APPLICATION_LIBOBJS)" \
	    LINK_LIBOBJS="$(EXTRA_LINK_UI_OBJ) $(APPLICATION_LINK_LIBOBJS)" \
	    TARGET=$(TARGET) \
	    ADDITIONAL_CLASSES="$(APPLICATION_CLASSES)" \
	    ADDITIONAL_OBJS="$(APPLICATION_OBJS)" \
	    ADDITIONAL_LINK_OBJS="$(APPLICATION_LINK_OBJS)"
	@-rm -f main.o modulList.stc modulList.c modulList.o

#
# with tool libraries
#
GUI_APPLICATION:
	@echo making GUI_APPLICATION...
	@echo EXTRA_UI_CLASSES=$(EXTRA_UI_CLASSES)
	@echo EXTRA_UI_OBJ=$(EXTRA_UI_OBJ)
	@echo EXTRA_LINK_UI_OBJ=$(EXTRA_LINK_UI_OBJ)
	@-rm -f main.o modulList.stc modulList.c modulList.o
	$(MAKE) main.o \
	    STARTUP_CLASS="$(STARTUP_CLASS)" \
	    STARTUP_SELECTOR="$(STARTUP_SELECTOR)" \
	    MAIN_DEFINES="$(MAIN_DEFINES)"
	@-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	$(MAKE) linkTarget \
	    LIBLIST="$(EXTRA_UI_CLASSES) $(APPLICATION_LIBLIST)" \
	    LIBOBJS="$(EXTRA_UI_OBJ) $(APPLICATION_LIBOBJS)" \
	    LINK_LIBOBJS="$(EXTRA_LINK_UI_OBJ) $(APPLICATION_LINK_LIBOBJS)" \
	    TARGET=$(TARGET) \
	    ADDITIONAL_CLASSES="$(APPLICATION_CLASSES)" \
	    ADDITIONAL_OBJS="$(APPLICATION_OBJS)" \
	    ADDITIONAL_LINK_OBJS="$(APPLICATION_LINK_OBJS)"
	@-rm -f main.o modulList.stc modulList.c modulList.o
	@$(MAKE) registerClassLib

#
# a program target
# needs: CLASSLIBRARIES,
#        STARTUP_SELECTOR, STARTUP_CLASS
#        LIBOBJS
#
PROGTARGET_shared::
	    @-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	    @-echo "Making PROGTARGET_shared ..."
	    $(MAKE) linkTarget                      \
		    LIBOBJS="$(LIBOBJS_SHARED)" \
		    ADDITIONAL_OBJS="$(ADDITIONAL_OBJS)"    \
		    ADDITIONAL_CLASSES="$(ADDITIONAL_CLASSES)"    \
		    ADDITIONAL_LIBS="$(ADDITIONAL_LIBS)"    \
		    EXTRA_LIBS="$(EXTRA_LIBS)" \
		    LINK_LIBRUN="$(LINK_LIBRUN)" \
		    LIBRUN=$(LIBRUN)

PROGTARGET_static:
	    @-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	    @-echo "Making PROGTARGET_static ..."
	    $(MAKE) linkTarget                      \
		    LIBOBJS="$(STATIC_LIBOBJS)" \
		    LINK_LIBOBJS="$(STATIC_LIBOBJS)" \
		    ADDITIONAL_OBJS="$(STATIC_ADDITIONAL_OBJS)"    \
		    ADDITIONAL_CLASSES="$(ADDITIONAL_CLASSES)"    \
		    ADDITIONAL_LIBS="$(ADDITIONAL_LIBS)"    \
		    EXTRA_LIBS="$(STATIC_EXTRA_LIBS)" \
		    EXTRA_UI_OBJ="$(STATIC_EXTRA_UI_OBJ)" \
		    LINK_LIBRUN="$(LIBRUN)" \
		    LIBRUN="$(LIBRUN)"

PROGTARGET_fullstatic:
	    @-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	    @-echo "Making PROGTARGET_fullstatic ..."
	    $(MAKE) linkTarget                      \
		    LIBOBJS="$(STATIC_LIBOBJS)" \
		    LINK_LIBOBJS="$(STATIC_LIBOBJS)" \
		    ADDITIONAL_OBJS="$(STATIC_ADDITIONAL_OBJS)"    \
		    ADDITIONAL_CLASSES="$(ADDITIONAL_CLASSES)"    \
		    ADDITIONAL_LIBS="$(ADDITIONAL_LIBS)"    \
		    LINK_LIBRUN="$(LIBRUN)" \
		    LIBRUN="$(LIBRUN)" \
		    MATHLIB="$(STATIC_MATHLIB)" \
		    EXTRA_LIBS="$(STATIC_EXTRA_LIBS)" \
		    EXTRA_UI_OBJ="$(STATIC_EXTRA_UI_OBJ)" \
		    SYSLIBS="$(STATIC_SYSLIBS)"

PROGTARGET::
	    @-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	    @-echo "Making PROGTARGET_shared ..."
	    $(MAKE) linkTarget                      \
		    LIBOBJS="$(LIBOBJS_SHARED)" \
		    ADDITIONAL_OBJS="$(ADDITIONAL_OBJS)"    \
		    ADDITIONAL_CLASSES="$(ADDITIONAL_CLASSES)"    \
		    ADDITIONAL_LIBS="$(ADDITIONAL_LIBS)"    \
		    EXTRA_LIBS="$(EXTRA_LIBS)" \
		    LINK_LIBRUN="$(LINK_LIBRUN)" \
		    LIBRUN=$(LIBRUN)

nullRebaseRule:
	    @-echo "No rebase done for this architecture/configuration"

linkTarget: main.$(O) $(LIBOBJS) checkSymbolsInLibrunAreUpToDate $(LIBRUN) $(EXTRA_OBJ)
	    @-echo "Making modulList (PACK = " $(CONF_PACKS) ") ..."
	    @-echo "LIBLIST=" $(LIBLIST)
	    @-echo "ADDITIONAL_CLASSES=" $(ADDITIONAL_CLASSES)
	    $(MAKE) modulList.$(O) \
		    LIBS="$(LIBOBJS)" \
		    LIBLIST="$(LIBLIST)" \
		    ADDITIONAL_CLASSES="$(ADDITIONAL_CLASSES)"
	    @-echo "OPTIONAL_SHARED_LIBS=" $(OPTIONAL_SHARED_LIBS)
	    @-echo "linking ..."
	    $(MAKE) linkLibs LINK_LIBDIR="$(LINK_LIBDIR)" LINK_LIBOBJS="$(LINK_LIBOBJS)" LIBOBJS="$(LIBOBJS)"
	    $(MAKE) $(rebaseLibsRule) LINK_LIBRUN="$(LINK_LIBRUN)" LINK_LIBOBJS="$(LINK_LIBOBJS)" LINK_ADDITIONAL_OBJS="$(LINK_ADDITIONAL_OBJS)"
	    $(LD) $(ST_LDFLAG) $(LDFLAGS) -o $(TARGET)$(EXE) \
		  $(CRT0) modulList.$(O) main.$(O) \
		  $(OPTIONAL_SHARED_LIBS) \
		  $(LINK_LIBOBJS) $(LINK_ADDITIONAL_OBJS) \
		  $(LINK_LIBRUN) \
		  $(ADDITIONAL_LIBS) $(MATHLIB) $(EXTRA_LIBS) $(SYSLIBS) $(CRTN)
	    @if [ "$(POST_LD)" != "" ]; then \
		echo $(POST_LD) $(TARGET)$(EXE); \
		$(POST_LD) $(TARGET)$(EXE); \
	    fi
	    @if [ "$(POST_LD2)" != "" ]; then \
		echo $(POST_LD2) $(TARGET)$(EXE); \
		$(POST_LD2) $(TARGET)$(EXE); \
	    fi

# a pure C library
cLibRule:
	@-echo "linking ..."
	$(LD) $(ST_LDFLAG) $(LDFLAGS) -shared -o $(CLIB)$(SONAME) \
	      $(CRT0) \
	      $(OPTIONAL_SHARED_LIB_PATH) \
	      $(COBJS) $(LINK_ADDITIONAL_OBJS) \
	      $(ADDITIONAL_LIBS) $(MATHLIB) $(EXTRA_LIBS) $(SYSLIBS) $(CRTN)

checkSymbolsInLibrunAreUpToDate:
	if [ -f $(LIBRUNDIR)/symbolAddress.h.timestamp ]; then \
	    $(MAKE) reallyCheckSymbolsInLibrunAreUpToDate; \
	fi

reallyCheckSymbolsInLibrunAreUpToDate: $(LIBRUNDIR)/symbolAddress.h.timestamp

$(LIBRUNDIR)/symbolAddress.h.timestamp: $(INCLUDE)/symbols.stc $(LIBRUNDIR)/symbols.h
	@-echo "Making librun for changed symbolList..."
	cd $(LIBRUNDIR); $(MAKE)

#
# install:
#     make all then install
#

install:: checkTargetPresent
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "making install in `pwd` ..."; \
	fi
	@$(MAKE) qinstall installSubdirsIf RELEASE=$(RELEASE)

verboseInstall::
	@$(MAKE) install VERBOSE=yes

installHere:: checkTargetPresent
	@$(MAKE) qinstall RELEASE=$(RELEASE)

installLocal:: checkTargetPresent
	@if [ "$(SILENT)"x = "x" ]; then \
	    echo "making installLocal in `pwd` ..."; \
	fi
	@$(MAKE) qinstall installSubdirsIf INSTALLBASE=$(TOP)/build

installHereLocal:: checkTargetPresent
	@$(MAKE) qinstall INSTALLBASE=$(TOP)/build

installBinOnly::
	@$(MAKE) qinstall installSubdirsIf RELEASE=$(RELEASE) SUPPRESS_INSTALL_SRC="yes"

#
# generate a self-extracting archive
#
installerFile::
	@if [ "$(INSTALLED_DIR)"x != ""x ]; then \
	     $(MAKE) createInstallerFile \
		    INSTALLED_DIR=$(INSTALLED_DIR) \
		    INSTALL_FILE=inst_$(MODULE)-`$(TOP)/support/check/config.guess`.sh; \
	else \
	  if [ "$(MODULE)"x = ""x ]; then \
	     $(MAKE) createInstallerFile \
		    INSTALLED_DIR=$(INSTALLBASE)/$(RELEASE) \
		    INSTALL_FILE=inst_STX$(RELEASE)-`$(TOP)/support/check/config.guess`.sh; \
	  else \
	     $(MAKE) createInstallerFile \
		    INSTALLED_DIR=$(INSTALLBASE)/$(RELEASE)/packages/$(MODULE) \
		    INSTALL_FILE=inst_$(MODULE)-`$(TOP)/support/check/config.guess`.sh; \
	  fi \
	fi

createInstallerFile::
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "Generating tar-file for "$(INSTALLED_DIR)"..."; \
	fi
	@( \
	  here=`pwd` ; \
	  cd / ; \
	  tar cf $$here/installFile.tar $(INSTALLED_DIR) \
	 )
	@if [ "$(COMPRESSOR)"x != "x" ]; then \
	    if [ "$(VERBOSE)"x != "x" ]; then \
		echo $(COMPRESSOR)"-ing tar-file..."; \
	    fi; \
	    $(COMPRESSOR) installFile.tar; \
	fi
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "Generating self extracting shell-command-file ..."; \
	fi
	@$(TOP)/support/mk-selfinstall \
	    --outfile=$(INSTALL_FILE) \
	    --type=$(COMPRESSED_FILETYPE) \
	    --installDirMsg="$(INSTALLED_DIR)"\
	    installFile.tar.*
	@rm installFile.tar.*

checkTargetPresent::

#$(INSTALLTOP_DIR)/bin:: $(INSTALLTOP_DIR)
#        @test -d $@ || mkdir $@
#
#$(INSTALLTOP_DIR)/lib:: $(INSTALLTOP_DIR)
#        @test -d $@ || mkdir $@
#
#$(INSTALLLIB_DIR)/lib:: $(INSTALLLIB_DIR)
#        @test -d $@ || mkdir $@
#
$(INSTALLLIB_DIR)/bitmaps:: $(INSTALLLIB_DIR)
	@test -d $@ || mkdir $@

$(INSTALLLIB_DIR)/fonts:: $(INSTALLLIB_DIR)
	test -d $(INSTALLLIB_DIR)/fonts || mkdir $(INSTALLLIB_DIR)/fonts

$(INSTALLLIB_DIR)/resources:: $(INSTALLLIB_DIR)
	@test -d $@ || mkdir $@

$(INSTALLLIB_DIR)/source:: $(INSTALLLIB_DIR)
	@test -d $@ || mkdir $@

$(INSTALLBASE)::
	@test -d $@ || mkdir $@

$(INSTALLBASE)/bin:: $(INSTALLBASE)
	@test -d $@ || mkdir $@

$(INSTALLBASE)/lib:: $(INSTALLBASE)
	@test -d $@ || mkdir $@

$(INSTALLBASE)/lib/lib:: $(INSTALLBASE)/lib
	@test -d $@ || mkdir $@

$(INSTALLBASE)/lib/bitmaps:: $(INSTALLBASE)/lib
	@test -d $@ || mkdir $@

$(INSTALLBASE)/packages:: $(INSTALLBASE)
	@test -d $@ || mkdir $@

$(INSTALLBASE)/packages/$(MODULE):: $(INSTALLBASE)/packages
	@test -d $@ || mkdir $@

$(INSTALLBASE)/packages/$(MODULE)/$(MODULE_DIR):: $(INSTALLBASE)/packages/$(MODULE)
	@case "$(MODULE_DIR)" in           \
	    "")                            \
		;;                         \
	    */*)                           \
		( md=`dirname $(MODULE_DIR)`; $(MAKE) installDir MODULE_DIR=$$md ); \
		;;                        \
	esac
	@test -d $@ || mkdir $@

installDir:     $(INSTALLBASE)/packages/$(MODULE)/$(MODULE_DIR)

#
# qinstall: (quick install)
#     install only - assumes make all was done previously
#
qinstall:: installAux installProgsIf installLibsIf installSources

installProgsIf::
	@-if [ "$(INSTALLPROGS)"x != x ]; then          \
	  $(MAKE) installProgs; \
	fi

installProgs:: $(INSTALLBIN_DIR)
	@-for i in $(INSTALLPROGS); do \
	  if [ "$(VERBOSE)"x != "x" ]; then \
	      echo "installing program: "$$i"..."; \
	  fi; \
	  $(INSTALL_BIN_CMD) $$i $(INSTALLBIN_DIR); \
	done

installLibsIf::
	@-if [ "$(LIBNAME)" != "" ]; then \
	  $(MAKE) installLibs; \
	fi
	@-if [ "$(INSTALLED_LOAD_SCRIPTS)"x != ""x ]; then \
	  $(MAKE) installLoadScripts; \
	fi
	@-if [ -f $(LIBNAME).prj ]; then \
	  $(MAKE) installPrjFile; \
	fi

installLibs::
	@-if [ -f $(LIBNAME)$(SONAME) ]; then \
	  $(MAKE) installSharedLib; \
	else \
	  if [ -f $(LIBNAME)$(OBJNAME) ]; then \
	    $(MAKE) installStaticLib; \
	  fi \
	fi
	@-if [ -f $(LIBNAME).zip ]; then \
	  $(MAKE) installZippedClassFile; \
	fi

installSharedLib:: $(INSTALLLIB_DIR)
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing dynamic library: "$(LIBNAME)$(SONAME)" in "$(INSTALLLIB_DIR)" ..."; \
	fi
	$(INSTALL_LIB_CMD) $(LIBNAME)$(SONAME) $(INSTALLLIB_DIR)
	@-if [ "$(THIS_IS_A_BASE_LIBRARY)"x != ""x ]; then  \
	  if [ "$(MODULE)"x != ""x ]; then  \
	    if [ "$(MODULE_DIR)"x != ""x ]; then  \
	      if [ "$(INSTALLLIB_DIR)" = "$(INSTALLBASE)/packages/$(MODULE)/$(MODULE_DIR)" ]; then \
		if [ "$(INSTALLBASE)/lib" != "$(INSTALLLIB_DIR)" ]; then \
		  $(MAKE) installSharedLibSymbolicLink;\
		fi \
	      fi \
	    fi \
	  fi \
	fi

installSharedLibSymbolicLink:: $(INSTALLBASE)/lib/lib
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "generating symbolic link to shared object in $(INSTALLBASE)/lib/lib ..."; \
	fi
	@cd $(INSTALLBASE)/lib/lib && $(LNS) -f ../../packages/$(MODULE)/$(MODULE_DIR)/$(LIBNAME)$(SONAME) .

installStaticLib:: $(INSTALLLIB_DIR)
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing static library: "$(LIBNAME)$(OBJNAME)" in "$(INSTALLLIB_DIR)" ..."; \
	fi
	$(INSTALL_LIB_CMD) $(LIBNAME)$(OBJNAME) $(INSTALLLIB_DIR)

installZippedClassFile:: $(INSTALLLIB_DIR)
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing zip package: "$(LIBNAME).zip" in "$(INSTALLLIB_DIR)" ..."; \
	fi
	$(INSTALL_AUX_CMD) $(LIBNAME).zip $(INSTALLLIB_DIR)

installPrjFile:: $(INSTALLLIB_DIR)
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing prj file: "$(LIBNAME).prj" in "$(INSTALLLIB_DIR)" ..."; \
	fi
	$(INSTALL_AUX_CMD) $(LIBNAME).prj $(INSTALLLIB_DIR)

installLoadScript:: $(INSTALLLIB_DIR)
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing "$(LOAD_SCRIPT)" in "$(INSTALLLIB_DIR)" ..."; \
	fi
	$(INSTALL_AUX_CMD) $(LOAD_SCRIPT) $(INSTALLLIB_DIR)

installLoadScripts::
	@-for i in $(INSTALLED_LOAD_SCRIPTS); do \
	  if [ -f $$i ]; then \
	     $(MAKE) installLoadScript LOAD_SCRIPT=$$i; \
	  fi \
	done

installSources:: installSTSourceIf

installSTSourceIf::
	@-if [ "$(MODULE)"x != ""x ]; then  \
	  if [ "$(MODULE_DIR)"x != ""x ]; then  \
	    if [ "$(SUPPRESS_INSTALL_SRC)"x = ""x ]; then  \
	      if [ "*.st" != '\*.st' ]; then  \
		if ( zip -h >/dev/null ) ; then \
		  $(MAKE) installSTZipSource;        \
		else \
		  $(MAKE) installSTSource;        \
		fi \
	      fi \
	    fi \
	  fi \
	fi

installSTSource:: $(INSTALLLIB_DIR)/source
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing sources in $(INSTALLLIB_DIR)/source..."; \
	fi
	@-for i in *.st; do \
	  $(INSTALL_AUX_CMD) $$i $(INSTALLLIB_DIR)/source;\
	done

#
# only store (i.e. do not compress);
# ZipArchive cannot deflate/uncompress right now.
#
installSTZipSource:: $(INSTALLLIB_DIR)
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing zipped sources in $(INSTALLLIB_DIR)/source.zip..."; \
	fi
	@zip -0 /tmp/source.zip *.st > /dev/null
	@-rm -f $(INSTALLLIB_DIR)/source.zip
	@mv /tmp/source.zip $(INSTALLLIB_DIR)/source.zip
	@chmod 0644 $(INSTALLLIB_DIR)/source.zip

installSubdirsIf::
	@-if [ "$(INSTALL_SUBDIRS)" != "" ]; then          \
	  $(MAKE) installSubDirs; \
	fi

installSubDirs::
	@-for i in $(INSTALL_SUBDIRS); do          \
	  if [ -d $$i ]; then              \
	    if [ -f $$i/$(MAKEFILE) ]; then \
	      (cd $$i && $(MAKE) install  INSTALLBASE=$(INSTALLBASE)); \
	    fi;                            \
	  fi;                              \
	done

installLocalSubdirsIf::
	@-if [ "$(INSTALL_SUBDIRS)" != "" ]; then          \
	  $(MAKE) installLocalSubDirs;                 \
	fi

installLocalSubDirs::
	@-for i in $(INSTALL_SUBDIRS); do          \
	  if [ -d $$i ]; then              \
	    if [ -f $$i/$(MAKEFILE) ]; then \
	      (cd $$i && $(MAKE) installLocal); \
	    fi;                            \
	  fi;                              \
	done

installAux:: installAbbrevIf installBitmapsIf installResourcesIf

installAbbrevIf::
	@-if [ -f abbrev.stc ]; then \
	  if [ "$(MODULE)"x != ""x ]; then  \
	    if [ "$(MODULE_DIR)"x != ""x ]; then  \
	      $(MAKE) installAbbrev; \
	    fi \
	  fi \
	fi

installAbbrev:: $(INSTALLTOP_DIR)
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing abbrev.stc..."; \
	fi
	@$(MAKE) abbrev.stc
	cp abbrev.stc $(INSTALLTOP_DIR)

installBitmapsIf::
	@-if [ -d bitmaps ]; then \
	  if [ "$(SUPPRESS_INSTALL_BITMAPS)"x = "x" ]; then \
	    $(MAKE) installBitmaps; \
	  fi \
	fi

installBitmaps:: $(INSTALLBITMAPSLIB_DIR)
	@-if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing bitmaps..."; \
	fi
	-tar cf - bitmaps | (cd $(INSTALLBITMAPSLIB_DIR) && tar xf -)
	@-find $(INSTALLBITMAPSLIB_DIR)/bitmaps -name 'CVS' -exec rm -rf {} \;            2>/dev/null
	@-find $(INSTALLBITMAPSLIB_DIR)/bitmaps -name 'not_delivered' -exec rm -rf {} \;  2>/dev/null

installFonts:: $(INSTALLLIB_DIR)/fonts
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing fonts..."; \
	fi
	-(tar cf - fonts | (cd $(INSTALLLIB_DIR) ; tar xf -))
	@-find $(INSTALLLIB_DIR)/fonts -name 'CVS' -exec rm -rf {} \;              2>/dev/null
	@-find $(INSTALLLIB_DIR)/fonts -name 'not_delivered' -exec rm -rf {} \;    2>/dev/null

installResourcesIf::
	@-if [ -d resources ]; then \
	  if [ "$(SUPPRESS_INSTALL_RESOURCES)"x = "x" ]; then \
	    $(MAKE) installResources; \
	  fi \
	fi

installResources:: $(INSTALLLIB_DIR)/resources
	@if [ "$(VERBOSE)"x != "x" ]; then \
	    echo "installing resources..."; \
	fi
	-tar cf - resources | (cd $(INSTALLLIB_DIR) && tar xf -)
	@-find $(INSTALLLIB_DIR)/resources -name 'CVS' -exec rm -rf {} \;            2>/dev/null
	@-find $(INSTALLLIB_DIR)/resources -name 'not_delivered' -exec rm -rf {} \;  2>/dev/null

#
# rule to make an archive
#
$(LIB):     pre_lib $(DEPOBJS) $(DEPAUXOBJS) $(LIB_HELPER)
	-cp $(LIB) $(LIB).sav
	rm -f $(LIB)
	$(AR) $(AR_LIB_FLAG) $(LIB) $(AR_OBJS)
	-$(RANLIB) $(LIB)

pre_lib::

CONF_STRING="$(CONF):$(CONF_PACKS)"

#
# rule to make a main (either in smalltalk or application)
# main.o depends on Makefile, to be recompiled when the configuration
# changes (used to be in libbasic/Smalltalk.st)
#
# Now always rebuild main.o, to get the newest build number/date

#main.o::  $(MAIN) $(INCLUDE)/stc.h $(MAKEFILE)
main.o::
	  $(MAIN_CC) -o main.o -c $(MAIN_CFLAGS) $(MAIN_DEFINES) \
		-DSTARTUP_CLASS="\"$(STARTUP_CLASS)\"" \
		-DSTARTUP_SELECTOR="\"$(STARTUP_SELECTOR)\"" \
		-DCONFIGURATION_STRING="\"$(CONF_STRING)\"" \
		-DBUILD_DATE="\"`date '+%Y-%m-%d %R %Z'`\"" \
		-DBUILD_NUMBER="\"${BUILD_NUMBER}\"" \
		-I$(INCLUDE) -I. $(MAIN)

#
# liblist.stc:
#    automatic generate a liblist.stc - libinfo file from all OBJ files
#
liblist.stc:: Make.proto Make.spec
	@-if [ "*.st" != '\*.st' ]; then                \
	  if [ "$(LIBNAME)" != "" ]; then               \
	    echo "";                                    \
	    echo "generating libinfo liblist.stc ...";  \
	    echo "";                                    \
	    if [ -f liblist.stc ]; then                 \
		rm -f liblist.stc;                      \
	    fi;                                         \
	    for i in ""*.st"" ; do                      \
	      NAME=`basename $$i .st`;                  \
	      if [ -f "$$NAME".o ]; then                \
	       CLASS=`$(STC) -extractClass $$i`;        \
	       if [ "$$CLASS" != "" ]; then             \
		 echo "  adding "$$i;                   \
		 echo $$CLASS" "$(LIBNAME) >> liblist.stc;       \
	       fi;                                      \
	      fi;                                       \
	    done;                                       \
	    $(MAKE) patchLiblist;                       \
	  fi;                                           \
	fi


forceAbbrev::
	@-$(MAKE) saveAbbrev
	@-$(MAKE) abbrev.stc

saveAbbrev:
	@-if [ -f abbrev.stc ]; then \
	  rm -f abbrev.stc.bak ;     \
	  mv abbrev.stc abbrev.stc.bak ; \
	fi

#
# abbrev.stc:
#    generate an abbrev.stc - abbreviation file
#    from all .st files found here; leave as is, if no change
#
abbrev.stc:: Make.proto Make.spec $(TOP)/rules/rightstr .listOfSTfiles
	@-if [ "`echo *.st`" != "*.st" ]; then \
	  echo "generating abbrev.stc in "$(MODULE_DIR)"..."; \
	  LC_COLLATE=POSIX; export LC_COLLATE; \
	  $(MAKE) genAbbrev; \
	  if [ "$(TOUCH)" != "echo" ]; then   \
	    $(TOUCH) abbrev.stc; \
	  fi; \
	  if [ -f abbrev.stc.bak ]; then \
	    if (cmp abbrev.stc.bak abbrev.stc >/dev/null); then  \
	      echo "  abbrev.stc unchanged";  \
	      mv abbrev.stc.bak abbrev.stc;   \
	    else \
	      echo "  abbrev has changed";    \
	    fi \
	  fi \
	else \
	  echo "  no st-files -> no abbrevs"; \
	fi

#
# unconditionally generate a local abbrev.stc file
#
genAbbrev::
	@rm -f abbrev.stc
	echo RELNAME=`$(RULEDIR)/relname $(TOP) $(DIRNAME) $(RIGHTSTR)`
	@RELNAME=`$(RULEDIR)/relname $(TOP) $(DIRNAME) $(RIGHTSTR)`
	@for i in *.st ; do              \
	  case $$i in                   \
	    m_*)                        \
	      echo "  ** skipping "$$i; \
	      ;;                        \
	    *_win32.st)                 \
	      echo "  ** skipping win32 specific file in abbrev: "$$i;\
	      ;;                        \
	    *_vms.st)                   \
	      echo "  ** skipping vms specific file in abbrev: "$$i; \
	      ;;                        \
	    *_macos.st)                 \
	      echo "  ** skipping mac specific file in abbrev: "$$i; \
	      ;;                        \
	    *_beos.st)                 \
	      echo "  ** skipping be specific file in abbrev: "$$i; \
	      ;;                        \
	    *_os2.st)                 \
	      echo "  ** skipping os2 specific file in abbrev: "$$i; \
	      ;;                        \
	    *_unix.st)                 \
	      echo "  ** skipping unix specific file in abbrev: "$$i; \
	      ;;                        \
	    *)                          \
	      if [ "$(VERBOSE)" != "" ]; then \
		echo "  processing "$$i;\
	      fi;                       \
	      CLASS=`$(STC) -extractClass $$i 2>/dev/null`; \
	      if [ "$(PACKAGE)" != "" ]; then \
		PACKAGE=$(PACKAGE);     \
	      else                      \
		echo "Cannot figure out the package of $$i when generating abbrev.stc in "`pwd`; \
		exit 1;                 \
		PACKAGE=unknown;        \
	      fi;                       \
	      if [ "$(NOAUTOLOAD)" = "1" ]; then \
		if [ "$$CLASS" != "" ]; then  \
		  NAME=`basename $$i .st`;    \
		  if [ "$$CLASS" != "$$NAME" ]; then \
		    echo "  warning: className ~= fileName: "$$NAME".st" > /dev/null; \
		  fi; \
		  echo $$CLASS" "$$NAME" "$$PACKAGE  >> abbrev.stc; \
		  echo "  added " $$CLASS" -> "$$NAME >/dev/null;   \
		else                    \
		  echo "  ** ignore "$$i" in abbrevs (no valid class source ?)"; \
		fi;                     \
	      else                      \
		NCIVARS=`$(STC) -extractNumClassInstvars $$i  2>/dev/null`; \
		CAT=`$(STC) -extractCategory $$i  2>/dev/null`; \
		if [ "$$CLASS" != "" ]; then  \
		  NAME=`basename $$i .st`;    \
		  if [ "$$CLASS" != "$$NAME" ]; then \
		    echo "  warning: className ~= fileName: "$$NAME".st" > /dev/null; \
		  fi; \
		  echo $$CLASS" "$$NAME" "$$PACKAGE $$CAT $$NCIVARS>> abbrev.stc; \
		  echo "  added " $$CLASS" -> "$$NAME >/dev/null; \
		else    \
		  echo "  ** ignore "$$i" in abbrevs (no valid class source ?)"; \
		fi;     \
	      fi;       \
	      ;;        \
	  esac;       \
	done
	@sort < abbrev.stc | uniq > abbrev.stc.sorted
	@mv abbrev.stc.sorted abbrev.stc

$(TOP)/rules/rightstr:
	@-if [ "$(CONF)" = "NT/cygwin32-bc" ]; then \
	    (cd $(TOP)/rules && $(CC) -c rightstr.c); \
	    (cd $(TOP)/rules && $(CC) rightstr.$(O)); \
	else \
	    (cd $(TOP)/rules && $(CC) -o rightstr rightstr.c); \
	fi


#
# recursively walk down, updating abbrev file
#
updAbbrev:
	@$(MAKE) updLocalAbbrev
	@-if [ "$(ALLSUBDIRS)x" != "x" ]; then            \
	    $(MAKE) updSubdirAbbrev;                    \
	fi

updSubdirAbbrev::
	@-for i in $(ALLSUBDIRS); do                    \
	    if [ -d $$i ]; then                         \
	      if [ -f $$i/Make.proto ]; then            \
		if [ -f $$i/$(MAKEFILE) ]; then         \
		  echo "update abbreviations in $$i";   \
		  if [ "$(NOSUBAUTOLOAD)" = "1" ]; then \
		      (cd $$i && $(MAKE) updAbbrev NOSUBAUTOLOAD=1 NOAUTOLOAD=1 ); \
		  else                                  \
		      (cd $$i && $(MAKE) updAbbrev);     \
		  fi;                                   \
		fi                                      \
	      fi                                        \
	    fi;                                         \
	done


.listOfSTfiles: .
	@-if [ -r .listOfSTfiles ]; then                        \
	    ls *.st > .listOfSTfiles.new;                       \
	    if cmp .listOfSTfiles .listOfSTfiles.new; then      \
		rm -f .listOfSTfiles.new;                       \
	    else                                                \
		rm -f .listOfSTfiles;                           \
		mv .listOfSTfiles.new .listOfSTfiles;           \
	    fi;                                                 \
	else                                                    \
	    ls *.st > .listOfSTfiles;                           \
	fi


modulList.o: modulList.c
	$(CC) -c $(CFLAGS) -I$(INCLUDE) modulList.c
	@-echo "done with modulList.o"

modulList.c: modulList.stc
	@$(MAKE) $(CLASSLISTEDITRULE) CLASSLIST=modulList
	@-echo "done with modulList.c"

modulList.stc: $(MAKEFILE)
	@-rm -f modulList.stc modulList.c
	@$(MAKE) GENERICLIST CLASSLIST=modulList                \
		 ADDITIONAL_CLASSES="$(ADDITIONAL_CLASSES)"     \
		 LIBLIST="$(LIBLIST)"                           \
		 CLASSLIBRARIES="                               \
			$(LIBLIST)                              \
			$(OTHERLIBRARIES)                       \
		 "                                              \
		 CLASSLISTS="                                   \
			$(EXTRACLASSLISTS)                      \
			$(CLIENTCLASSLISTS)                     \
		 "

#
# edit a modulList.c file from a modulList.stc file
#
classListEdit:
	@echo "making $(CLASSLIST).c from $(CLASSLIST).stc"
	@echo "#include <stcIntern.h>" > $(CLASSLIST).c
	@echo "typedef void (*vf)();" >> $(CLASSLIST).c
	@sed '/^$$/d' < $(CLASSLIST).stc > $(CLASSLIST).tmp1
	@sed 's/ $$//' < $(CLASSLIST).tmp1 > $(CLASSLIST).tmp2
	@sed 's/ $$//' < $(CLASSLIST).tmp2 > $(CLASSLIST).tmp1
	@sed 's/^/extern void _/' < $(CLASSLIST).tmp1 > $(CLASSLIST).tmp2
	@sed -e '/[A-Za-z]/s/$$/_Init();/' -e 's/::/__/' < $(CLASSLIST).tmp2 >> $(CLASSLIST).c
	@echo "static vf modules[] = {" >> $(CLASSLIST).c
	@sed 's/^/_/' < $(CLASSLIST).tmp1 > $(CLASSLIST).tmp2
	@sed 's/::/__/' < $(CLASSLIST).tmp2 > $(CLASSLIST).tmp1
	@sed 's/$$/_Init,/' < $(CLASSLIST).tmp1 >> $(CLASSLIST).c
	@echo "(vf)0" >> $(CLASSLIST).c
	@echo "};" >> $(CLASSLIST).c
	@echo "vf *__modules__ = modules;" >> $(CLASSLIST).c
	@-rm -f $(CLASSLIST).tmp1 $(CLASSLIST).tmp2
	@-echo "done with classListEdit"

#
# generate a classList.stc/modulList.stc
# from LIBLIST, CLASSLISTS and EXTRA_CLASSES
# requires CLASSLIST to be set
#
GENERICLIST:   $(CLASSLISTS)
	    @echo "making $(CLASSLIST)"
	    @-rm -f $(CLASSLIST)
	    @-if [ "$(LIBLIST)" != "" ]; then                   \
		echo "   included class libraries:";            \
		$(MAKE) addNamesToList NAMES="$(LIBLIST)"; \
	     fi
	    @-if [ "$(CLASSLISTS)" = "" ]; then                 \
	      echo "(ignore any following syntax error ...)" >/dev/null;        \
	     fi
	    @-if [ "$(CLASSLISTS)" != "" ]; then                \
		echo "   included individual classes:";         \
		for i in "$(CLASSLISTS)"; do                    \
		    echo "     $$i";                            \
		done;                                           \
		cat $(CLASSLISTS) >> $(CLASSLIST).stc;          \
	     fi
	    @-if [ "$(ADDITIONAL_CLASSES)" != "" ]; then        \
		echo "   included additional (user) classes:";  \
		for i in $(ADDITIONAL_CLASSES); do              \
		    echo "     $$i" | sed 's/_/_137/g';         \
		    echo $$i | sed 's/_/_137/g'   >> $(CLASSLIST).stc;  \
		done; \
	    fi
	    @echo

addNamesToList:
	@-for i in $(NAMES); do \
	    echo "     $$i";    \
	    echo $$i    >> $(CLASSLIST).stc; \
	done

#
# generate a libXXXInit.c file from classList/modulList.stc
#
$(LIBNAME)Init.o: libInit.cc Make.proto Make.spec
	$(CC) $(CFLAGS) -x c -c $< -o $@

ntLibInit.c: $(LIBNAME)Init.c
	mv $(LIBNAME)Init.c ntLibInit.c


#
# generate a zip file containing the sources.
#
$(LIBNAME).zip:
	zip -0 $(LIBNAME).zip *.st

#
# generate an export file for AIX sharedlibrary building
#
#old$(LIBNAME).exp: $(CLASSLIST).stc
#        @-if [ -f $(CLASSLIST).stc ]; then \
#            echo "making export file $(LIBNAME).exp from $(CLASSLIST).stc"; \
#            echo "#! /usr/local/lib/smalltalk/lib/$(LIBNAME).so" > $(LIBNAME).exp; \
#            sed '/^$$/d' < $(CLASSLIST).stc > $(LIBNAME).tmp1; \
#            sed 's/ $$//' < $(LIBNAME).tmp1 > $(LIBNAME).tmp2; \
#            sed 's/ $$//' < $(LIBNAME).tmp2 > $(LIBNAME).tmp1; \
#            sed 's/^/_/' < $(LIBNAME).tmp1 > $(LIBNAME).tmp2; \
#            sed 's/::/__/' < $(LIBNAME).tmp2 > $(LIBNAME).tmp1; \
#            sed '/[A-Za-z]/s/$$/_Init/' < $(LIBNAME).tmp1 >> $(LIBNAME).exp ;\
#            rm -f $(LIBNAME).tmp1 $(LIBNAME).tmp2; \
#            echo "done with $(LIBNAME).exp"; \
#        else \
#            echo "skip making of $(LIBNAME).exp - no classList"; \
#        fi

$(LIBNAME).exp: $(LIB)
	@-echo "making export file $(LIBNAME).exp"
	@-echo "#! /usr/local/lib/smalltalk/lib/$(LIBNAME).so" > $(LIBNAME).exp
	@-echo "_"$(LIBNAME)"_Init" >> $(LIBNAME).exp

#
# generate a file containing symbols to be hidden in
# a classlib. Use for classLibs which are to be loaded completely
#
hiddenSyms.stc: $(CLASSLIST).stc
	@echo "making list of hidden syms ..."
	@sed '/^$$/d' < $(CLASSLIST).stc > hiddenSyms.tmp1
	@sed 's/ $$//' < hiddenSyms.tmp1 > hiddenSyms.tmp2
	@sed 's/ $$//' < hiddenSyms.tmp2 > hiddenSyms.tmp1
	@sed 's/^/_/' < hiddenSyms.tmp1 > hiddenSyms.tmp2
	@sed 's/::/__/' < hiddenSyms.tmp2 > hiddenSyms.tmp1
	@sed '/[A-Za-z]/s/$$/_Init/' < hiddenSyms.tmp1 > hiddenSyms.stc
	@rm -f hiddenSyms.tmp1 hiddenSyms.tmp2
	@-echo "done with hiddenSyms.stc"

#depend:
#       @-if grep "xx"STDEPEND $(MAKEFILE); then           \
#           sed '/"xx"STDEPEND/, $$ d' < $(MAKEFILE) > mf.tmp;     \
#           echo "# xx""STDEPENDxx" >> mf.tmp   ;       \
#           echo mv mf.tmp $(MAKEFILE);                    \
#       fi
#
allDepend:
	@-$(MAKE) depend
	@-if [ "$(SUBDIRS)"x != x ]; then \
	  for i in $(SUBDIRS)" "; do      \
	    if [ -d $$i ]; then           \
	      (cd $$i && $(MAKE) depend);  \
	    fi;                           \
	  done;                           \
	fi

depend:
	@-if grep "^# BEGINMAKEDEPEND" Make.proto > /dev/null; then \
	    if [ -f $(TOP)/stc/stc ]; then                          \
		$(MAKE) STC=$(STC) stDepend;                        \
	    else                                                    \
		if ($(STC) --version 2>/dev/null); then             \
		    $(MAKE) STC=$(STC) stDepend;                    \
		else                                                \
		    echo "**** oops, no stc ("$(STC)"). Cannot make dependencies"; \
		fi                                                  \
	    fi                                                      \
	fi

.dependencies:
	@-echo "  extracting dependencies ..."
	@-for i in *.st ; do                    \
	    if [ -f `basename $$i .st`_win32.st ]; then \
	      echo "  skipping $$i in dependencies"; \
	    else \
	      echo "  extracting dependencies for $$i ..." >/dev/null; \
	      $(STC) $(LOCALINCLUDES) -I$(INCLUDE) -I. -makeDepend $$i >> .dependencies 2>/dev/null; \
	      rslt=$$?; \
	      if [ $$rslt != 0 ]; then \
		echo "    *** superclass not compiled / no valid class source in "$$i" ? [exitCode="$$rslt"]" >/dev/null; \
	      fi \
	    fi \
	done

stDepend::
	@-rm -f .dependencies
	@$(MAKE) .dependencies
	@-sed 's/^\(.\)/$$(OUTDIR)\1/' < .dependencies > ttt1
	@-sed 's/\.H/\.$$(H)/g' < ttt1 > .dependencies
	@-for i in *.st ; do                    \
	  echo "genAbbrev:: $$i" >> .dependencies; \
	done
	@-sed '1,/^# BEGINMAKEDEPEND/w ttt1' < $(MAKEFILE) > /dev/null
	@-sed '/^# ENDMAKEDEPEND/,$$w ttt2' < $(MAKEFILE) > /dev/null
	@-cat ttt1              > $(MAKEFILE).new
	@-if grep "^# BEGINMAKEDEPEND" ttt1 > /dev/null; then \
	    echo "found BEGIN line" > /dev/null; \
	else \
	    echo "# BEGINMAKEDEPEND --- do not remove this line; make depend needs it" >> $(MAKEFILE).new; \
	fi
	@-cat .dependencies     >> $(MAKEFILE).new
	@-if grep "^# ENDMAKEDEPEND" ttt2 > /dev/null; then \
	    echo "found END line" > /dev/null; \
	else \
	    echo "# ENDMAKEDEPEND --- do not remove this line" >> $(MAKEFILE).new; \
	fi
	@-cat ttt2              >> $(MAKEFILE).new
	@-rm -f ttt1 ttt2
	@-rm -f $(MAKEFILE)
	@-rm -f .dependencies
	@-mv $(MAKEFILE).new $(MAKEFILE)

showDepend:: abbrev.stc
	@-for i in *.st ; do \
	    $(STC) $(LOCALINCLUDES) -I$(INCLUDE) -I. -makeDepend $$i; \
	done

unlink:
	@-for i in * ; do                       \
	  if [ -h $i ]; then                    \
	    echo $i;                            \
	    cp $i $i.X; mv $i.X $i;             \
	  fi;                                   \
	done

#
# create symbolic links for all used libraries in the LINK_LIBDIR
# directory. Req'd for sharedLib links.
#
mkLinkLibDir:
	@test -d $(LINK_LIBDIR) || mkdir $(LINK_LIBDIR)

linkLibsDir:
	@-if [ "$(LINK_LIBDIR)" = "" ]; then                            \
	    if [ "$(NO_LINK_LIBDIR)" != "yes" ]; then                   \
		test -d lib || mkdir lib;                               \
	    fi                                                          \
	else                                                            \
	    $(MAKE) mkLinkLibDir LINK_LIBDIR="$(LINK_LIBDIR)";          \
	fi

linkLibs:
	@if [ "$(LINK_LIBOBJS)" != "$(LIBOBJS)" ]; then                \
	    if [ "$(LIBOBJS)" != "" ]; then                             \
		$(MAKE) linkLibsDir LINK_LIBDIR="$(LINK_LIBDIR)";       \
		$(MAKE) linkObjs LIBOBJS="$(LIBOBJS)";                  \
	    fi;                                                         \
	fi
	@if [ "$(LINK_LIBRUN)" != "$(LIBRUN)" ]; then                  \
	    $(MAKE) linkLibsDir LINK_LIBDIR="$(LINK_LIBDIR)";           \
	    if [ "$(LINK_LIBDIR)" = "" ]; then                          \
		if [ "$(LIBRUN)" = "" ]; then                           \
		  echo "  symlinking to $(LIBRUNDIR)/$(LINK_LIBRUN) for linkage ..."; \
		  rm -f `basename $(LINK_LIBRUN)` lib/`basename $(LINK_LIBRUN)`;      \
		  $(LNS) $(LIBRUNDIR)/$(LINK_LIBRUN) .;                 \
		  if [ "$(NO_LINK_LIBDIR)" != "yes" ]; then             \
		    (cd lib && $(LNS) ../$(LIBRUNDIR)/$(LINK_LIBRUN) .); \
		  fi;                                                   \
		else                                                    \
		  echo "  symlinking to $(LIBRUN) for linkage ...";     \
		  rm -f `basename $(LIBRUN)` lib/`basename $(LIBRUN)`;  \
		  $(LNS) $(LIBRUN) .;                                   \
		  if [ "$(NO_LINK_LIBDIR)" != "yes" ]; then             \
		      (cd lib && $(LNS) ../$(LIBRUN) .);                 \
		  fi;                                                   \
		fi;                                                     \
	    else                                                        \
		if [ "$(FORCE_LINK_LIBRUN)" != "" ]; then               \
		    echo "  symlinking to $(LIBRUNDIR)/$(LINK_LIBRUN) for linkage ..."; \
		    rm -f `basename $(LINK_LIBRUN)` lib/`basename $(LINK_LIBRUN)`;      \
		    $(LNS) $(LIBRUNDIR)/$(LINK_LIBRUN) .;               \
		    if [ "$(NO_LINK_LIBDIR)" != "yes" ]; then           \
			(cd lib && $(LNS) ../$(LIBRUNDIR)/$(LINK_LIBRUN) .); \
		    fi;                                                 \
		else                                                    \
		    if [ "$(LINK_LIBDIR)" != "" ]; then                 \
			echo "  symlinking to ../$(LIBRUN) for linkage ..."; \
			rm -f $(LINK_LIBDIR)/`basename $(LIBRUN)`;      \
			(cd $(LINK_LIBDIR) && $(LNS) ../$(LIBRUN) .);    \
		    fi;                                                 \
		fi;                                                     \
	    fi;                                                         \
	fi
	@if [ "$(LINK_EXTRA_OBJ)" != "$(EXTRA_OBJ)" ]; then            \
	    $(MAKE) linkLibsDir LINK_LIBDIR="$(LINK_LIBDIR)";           \
	    $(MAKE) linkExtraObj EXTRA_OBJ="$(EXTRA_OBJ)";              \
	fi

linkObjs:
	@for i in $(LIBOBJS); do                                       \
	    echo "  symlinking to $$i for linkage ...";                 \
	    if [ "$(LINK_LIBDIR)" = "" ]; then                          \
		rm -f `basename $$i` lib/`basename $$i`;                \
		$(LNS) $$i .;                                           \
		if [ "$(NO_LINK_LIBDIR)" != "yes" ]; then               \
		    (cd lib && $(LNS) ../$$i .);                         \
		fi                                                      \
	    else                                                        \
		if [ "$(LINK_LIBDIR)" != "" ]; then                     \
		    rm -f $(LINK_LIBDIR)/`basename $$i`;                \
		    (cd $(LINK_LIBDIR) && $(LNS) ../$$i .);              \
		fi;                                                     \
	    fi;                                                         \
	done

linkExtraObj:
	@for i in $(EXTRA_OBJ); do                                     \
	    echo "  symlinking to $$i for linkage ...";                 \
	    if [ "$(LINK_LIBDIR)" = "" ]; then                          \
		rm -f `basename $$i` lib/`basename $$i`;                \
		$(LNS) $$i .;                                           \
		if [ "$(NO_LINK_LIBDIR)" != "yes" ]; then               \
		    (cd lib && $(LNS) ../$$i .);                         \
		fi                                                      \
	    else                                                        \
		if [ "$(LINK_LIBDIR)" != "" ]; then                     \
		    rm -f $(LINK_LIBDIR)/`basename $$i`;                \
		    (cd $(LINK_LIBDIR) && $(LNS) ../$$i .);              \
		fi;                                                     \
	    fi;                                                         \
	done

removeLinkLibs::
	@-if [ "$(LINK_LIBDIR)" = "" ]; then                            \
	    rm -f $(EXTRA_LINK_LIBS) $(EXTRA_LINK_OBJ)                  \
		  $(LINK_LIBOBJS) $(LINK_LIBRUN);                       \
	fi

#
# linking to bitmap files in a project directory
#
bitmapLink:
	@-if [ "$(COLLECT_BITMAPS)" != "" ]; then \
	  $(MAKE) do_bitmapLink; \
	fi

do_bitmapLink::
	test -d bitmaps || mkdir bitmaps
	for i in $(BITMAPLINK_DIRS) $(EXTRA_BITMAPLINK_DIRS); do      \
	  if [ -d $$i ]; then                                         \
	    if [ -d $$i/bitmaps ]; then                               \
	      if [ "`echo $$i/bitmaps/*`" != '$$i/bitmaps/*' ]; then  \
		echo linking bitmaps from $$i;                        \
		(cd bitmaps && $(LNS) ../$$i/bitmaps/* . 2>/dev/null);  \
		(cd bitmaps && rm -f CVS RCS \* not_delivered);         \
	      fi;                                                     \
	    fi;                                                       \
	  fi;                                                         \
	done

#
# linking to binary files in a project directory
#
binaryLink:
	@-if [ "$(COLLECT_BINARIES)" != "" ]; then \
	  $(MAKE) do_binaryLink; \
	fi

do_binaryLink::
	test -d binary || mkdir binary
	@-for i in $(BINARYLINK_DIRS); do                            \
	  if [ -d $$i ]; then                                        \
	    if [ "`echo $$i/*$(BIN_O)`" != '$$i/*$(BIN_O)' ]; then   \
	      echo linking binaries from $$i;                        \
	      (cd binary && $(LNS) ../$$i/*$(BIN_O) . 2>/dev/null);    \
	      (cd binary && $(LNS) ../$$i/*.cls . 2>/dev/null);        \
	      (cd binary && rm -f CVS RCS not_delivered \*.cls \*$(BIN_O) ); \
	    fi;                                                      \
	  fi;                                                        \
	done
	@-if [ "$(EXTRA_BINARYLINK_DIRS)" != "" ]; then              \
	    $(MAKE) binaryLinkExtra;                                 \
	fi

binaryLinkExtra:
	@-for i in $(EXTRA_BINARYLINK_DIRS); do                 \
	    echo linking binary $$i;                            \
	    rm -f binary/`basename $$i`;                        \
	    (cd binary && $(LNS) ../$$i .);                       \
	done

#
# linking to source files in a project directory
#
sourceLink:
	@-if [ "$(COLLECT_SOURCES)" != "" ]; then \
	  $(MAKE) do_sourceLink; \
	fi

do_sourceLink::
	test -d source || mkdir source
	@-for i in $(SOURCELINK_DIRS); do                       \
	      if [ -d $$i ]; then                               \
		if [ "`echo $$i/*.st`" != $$i'/*.st' ]; then    \
		  echo linking sourcefiles from $$i;            \
		  (cd source && $(LNS) ../$$i/*.st . 2> /dev/null || true);       \
		  (cd source && rm -f CVS RCS not_delivered \*.st); \
		fi;                                             \
	      else                                              \
		if [ -d $(TOP)/$$i ]; then                      \
		  if [ "`echo $(TOP)/$$i/*.st`" != $(TOP)/$$i'/*.st' ]; then \
		    echo linking sourcefiles from $(TOP)/$$i;   \
		    (cd source && $(LNS) ../$(TOP)/$$i/*.st . 2> /dev/null || true);      \
		    (cd source && rm -f CVS RCS not_delivered \*.st);       \
		  fi;                                           \
		fi;                                             \
	      fi;                                               \
	done

#
# create zip files containing sources
# (do not compress - ZipArchive class cannot do this right now
#
sourceZip:
	test -d source || mkdir source
	test -d source/stx || mkdir source/stx
	for i in $(SOURCELINK_DIRS); do                 \
	    if [ -d $$i ]; then                                 \
		if [ "`echo $$i/*.zip`" != $$i'/*.zip' ]; then  \
		    echo "copy zip-sourcefile from $$i";        \
		    cp $$i/*.zip source/stx;                    \
		fi                                              \
	    else                                                \
		if [ -d $(TOP)/$$i ]; then                      \
		    if [ "`echo $(TOP)/$$i/*.st`" != $(TOP)/$$i/'*.st' ]; then  \
			echo "copy zip-sourcefile from $(TOP)/$$i";             \
			cp $(TOP)/$$i/*.zip source/stx; \
		    fi                                          \
		fi                                              \
	    fi                                                  \
	done

#
# linking to resource files in a project directory
#
resourceLink:
	@-if [ "$(COLLECT_RESOURCES)" != "" ]; then \
	  $(MAKE) do_resourceLink; \
	fi

do_resourceLink::
	@test -d resources || mkdir resources
	@-for i in $(RESOURCELINK_DIRS); do                   \
	      if [ -d $$i ]; then                             \
		if [ "`echo $$i/*`" != '$$i/*' ]; then        \
		  echo linking resource files from $$i ...;   \
		  (cd resources && $(LNS) ../$$i/* . 2> /dev/null || true);       \
		  (cd resources && rm -f CVS RCS not_delivered \*); \
		fi;                                           \
	      else                                            \
		if [ -d $(TOP)/$$i ]; then                    \
		  if [ "`echo $(TOP)/$$i/*`" != '$(TOP)/$$i/*' ]; then    \
		    echo linking resource files from $(TOP)/$$i ...;      \
		    (cd resources && $(LNS) ../$(TOP)/$$i/* . 2> /dev/null || true);      \
		    (cd resources && rm -f CVS RCS not_delivered \*);       \
		  fi;                                                     \
		fi;                                                       \
	      fi;                                                         \
	done

styleLink:
	@-if [ "$(COLLECT_RESOURCES)" != "" ]; then \
	  $(MAKE) do_styleLink; \
	fi

do_styleLink::
	@test -d resources || mkdir resources
	@-echo "linking style files from $(LIBVIEWDIR)/styles ..."
	@-rm -f resources/*.style resources/*.common
	@-(cd resources && $(LNS) ../$(LIBVIEWDIR)/styles/* . 2> /dev/null || true)
	@rm -f resources/RCS resources/CVS resources/not_delivered

includeLink:
	@test -d include || mkdir include
	@-for i in $(INCLUDELINK_FILES); do                   \
	    if [ ! -r include/$$i ]; then                     \
		if [ -f $(INCLUDE)/$$i ]; then                \
		    echo "linking $$i ...";                   \
		    rm -f include/`basename $$i`;             \
		    (cd include && $(LNS) ../$(INCLUDE)/$$i .); \
		else                                          \
		    echo "oops - no $(INCLUDE)/$$i";          \
		fi;                                           \
	    fi;                                               \
	done

#
# checkin all changed files
#
checkin::
	@echo "comment: "
	@(read comment ; $(MAKE) doCheckin COMMENT="$$comment")

checkinlocal::
	@echo "comment: "
	@(read comment ; $(MAKE) doCheckin COMMENT="$$comment" LOCALCHECKIN="yes" )

#
# checkin; expects $(COMMENT) to be set
#
doCheckin::
	@-if [ -d CVS ]; then                                   \
	    if [ "$(LOCALCHECKIN)" != "yes" ]; then             \
		cvs commit -m"$(COMMENT)";                      \
	    else                                                \
		cvs commit -l -m"$(COMMENT)";                   \
	    fi                                                  \
	fi

ident::
	@-ident *.st Make.proto

releaseDir:
	@-if [ ! -d $(TOP)/releases ]; then                             \
	    echo "creating release directory";                          \
	    mkdir $(TOP)/releases;                                      \
	    echo 2 > $(TOP)/releases/NEXT_MAJOR;                        \
	    echo 10 > $(TOP)/releases/NEXT_MINOR;                       \
	    echo 5 > $(TOP)/releases/NEXT_VSN;                          \
	    echo 1 > $(TOP)/releases/NEXT_REL;                          \
	fi

incRelease:
	@(read rel < $(TOP)/releases/NEXT_REL ; \
	  expr $$rel + 1 > $(TOP)/releases/NEXT_REL)

incVersion:
	@(read vsn < $(TOP)/releases/NEXT_VSN ; \
	  expr $$vsn + 1 > $(TOP)/releases/NEXT_VSN)
	echo 1 > $(TOP)/releases/NEXT_REL

incMinor:
	@(read min < $(TOP)/releases/NEXT_MIN ; \
	  expr $$min + 1 > $(TOP)/releases/NEXT_MIN)
	echo 1 > $(TOP)/releases/NEXT_VSN
	echo 1 > $(TOP)/releases/NEXT_REL

#
# make a new release
#
release:
	@$(MAKE) releaseDir
	@$(MAKE) incRelease
	@(read maj<$(TOP)/releases/NEXT_MAJOR ; \
	  read min<$(TOP)/releases/NEXT_MINOR ; \
	  read vsn<$(TOP)/releases/NEXT_VSN ; \
	  read rel<$(TOP)/releases/NEXT_REL ; \
	  $(MAKE) doRelease REL=$$rel RELEASEID="$$maj.$$min.$$vsn.$$rel" )

#
# make a new version
#
version:
	@$(MAKE) releaseDir
	@$(MAKE) incVersion
	@(read maj<$(TOP)/releases/NEXT_MAJOR ; \
	  read min<$(TOP)/releases/NEXT_MINOR ; \
	  read vsn<$(TOP)/releases/NEXT_VSN ; \
	  read rel<$(TOP)/releases/NEXT_REL ; \
	  $(MAKE) doRelease VSN=$$vsn RELEASEID="$$maj.$$min.$$vsn.$$rel" )

#
# make a new minor
#
minor:
	@$(MAKE) releaseDir
	@$(MAKE) incMinor
	@(read maj<$(TOP)/releases/NEXT_MAJOR ; \
	  read min<$(TOP)/releases/NEXT_MINOR ; \
	  read vsn<$(TOP)/releases/NEXT_VSN ; \
	  read rel<$(TOP)/releases/NEXT_REL ; \
	  $(MAKE) doRelease MIN=$$min RELEASEID="$$maj.$$min.$$vsn.$$rel" )

doRelease:
	@-if [ -d $(TOP)/releases/$(RELEASEID) ]; then   \
	    echo "Release $(RELEASEID) already exists";  \
	    echo;                                        \
	    echo "stop make";                            \
	    sh -c "exit 1";                              \
	fi
	test -d $(TOP)/releases/$(RELEASEID) ||         \
	mkdir $(TOP)/releases/$(RELEASEID)
	@if [ -d $(TOP)/releases/$(RELEASEID) ]; then    \
	    echo "making new release $(RELEASEID) ... "; \
	    $(MAKE) manifest RELPATH="." RELEASEID=$(RELEASEID); \
	fi

#
# extract rcs ids and add to manifest file
# as $(TOP)/releases/$(RELEASEID)/MANIFEST
#
manifest:
	@-for i in $(RCSSOURCES); do                                    \
	    rlog -h $$i | grep "head:" | sed "s/head://" >/tmp/ID;      \
	    (read id</tmp/ID ; echo $(RELPATH)/$$i $$id >> $(TOP)/releases/$(RELEASEID)/MANIFEST); \
	    tail -1 $(TOP)/releases/$(RELEASEID)/MANIFEST; \
	done
	if [ "$(ALLSUBDIRS)"x != x ]; then                 \
	  for i in $(ALLSUBDIRS)" "; do                    \
	    if [ -d $$i ]; then                            \
	      echo "";                                     \
	      echo "manifest in $$i ... ";                 \
	      echo "";                                     \
	      (cd $$i && $(MAKE) makeMakefile);             \
	      (cd $$i && $(MAKE) manifest RELPATH="$(RELPATH)/$$i" RELEASEID=$(RELEASEID));       \
	    fi;                                            \
	  done;                                            \
	fi


stcinfo:
	$(STC) $(STCFLAGS) -V -version

echoObjs:
	@-if [ "$(OBJS)" != "" ]; then \
	    $(MAKE) doEchoObjs; \
	fi

doEchoObjs:
	@-for i in $(OBJS); do \
	    echo `basename $$i .$(O)` ;\
	done

#
# additional/changed rules
#
.SUFFIXES: .st .chg .c .o .tco .chk .note .i .copt .cls .dep .H .STH

__STANDARD_O_RULE__:
	$(STC) $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS_ARCH) $(CFLAGS) $(CFLAGS_LOCAL) -CC="$(CLASSLIB_CC)" -c $(PWD)/$(STFILE).st  && \
	    $(TOUCH) $(PWD)/$(STFILE).$(O)

__STANDARD_C_RULE__:
	$(STC) $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS_ARCH) $(CFLAGS) $(CFLAGS_LOCAL) -CC="$(CLASSLIB_CC)" -C $(PWD)/$(STFILE).st

__STANDARD_S_RULE__:
	$(STC) $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS_ARCH) $(CFLAGS) $(CFLAGS_LOCAL) -CC="$(CLASSLIB_CC)" -S $(PWD)/$(STFILE).st

__STANDARD_H_RULE__:
	$(STC) $(STCFLAGS) $(STC_MSGFORMAT) -H. -warn -headerOnly $(PWD)/$(STFILE).st  && \
	    $(TOUCH) $(PWD)/$(STFILE).$(H)

.st.STH:
	@$(MAKE) OPT="$(OPT)" STC="$(STC)" STFILE=$* $(H_RULE)

.SUFFIXES: .st .gdb
.st.gdb:
	(echo "r $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS_ARCH) $(CFLAGS) $(CFLAGS_LOCAL) -CC="$(CLASSLIB_CC)" -C $<" ; echo "bt" ; cat -) | gdb $(STC)

# Now the header files are no longer stored in stx/include, but together
# with the .st files. The .H files may be older then the .st files (if the
# class layout didn't change, so they should not be recreated implicitely!
#
#.st.H:
#       @$(MAKE) OPT="$(OPT)" STC="$(STC)" STFILE=$* $(H_RULE)


%.o: %.st
	$(STC) $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS_ARCH) $(CFLAGS) $(CFLAGS_LOCAL) -CC="$(CLASSLIB_CC)" -c $(PWD)/$<  && \
	    $(TOUCH) $(PWD)/$@

%.c: %.st
	$(STC) $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS_ARCH) $(CFLAGS) $(CFLAGS_LOCAL) -CC="$(CLASSLIB_CC)" -C $(PWD)/$<

.c.i:
	$(CC) $(CFLAGS_ARCH) $(CFLAGS) -E $*.c > $*.i

#.c.s:
#       $(CC)  $(CFLAGS_ARCH) $(CFLAGS) -S $*.c

.st.s:
	@$(MAKE) CC="$(CLASSLIB_CC)" OPT="$(CLASSLIB_OPT)" SEPINITCODE="$(SEPINITCODE)" STC="$(STC)" STFILE=$* $(S_RULE)

.chg.c:
	    $(STC) -VT $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS) -C $*.chg

.chg.$(O):
	    $(STC) $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS) -c $*.chg
	    @$(TOUCH) $*.$(O)

.st.dep:
	    $(STC) $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS) -makeDepend $*.st

.st.chk:
	    $(STC) $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS) -check $*.st

.st.note:
	    $(STC) $(STCFLAGS) $(STC_MSGFORMAT) $(CFLAGS) -check +notice +hint $*.st

.st.cls:
	    $(TOP)/projects/smalltalk/stx -I -noInfoPrint -q -f $(TOP)/projects/smalltalk/stbc $(STBC_ARGS) $*.st

#.st.cls:
#            $(TOP)/projects/smalltalk/stx -I -noInfoPrint -q -f $(TOP)/projects/smalltalk/stbc \
#                                         -s $(TOP)/projects/smalltalk/smalltalk $*.st

#
# all-rule for Make.protos that dont need one ...
#
AIX::   all

HP::    all

HP_ACC32::    all

HP_ACC64::    all

ULTRIX:: all

LINUX_i386:: all

LUNIX_i386_ELF:: all

SGI5::  all

SGI5_gcc::  all

SGI:: all

SGI_gcc:: all

REALIX_88k:: all

SUN_sparc:: all

OSF_ALPHA:: all

#------------------ end of rules/stdRules ---------------------