summaryrefslogtreecommitdiff
path: root/contrib/utility/BuildRules
diff options
context:
space:
mode:
authorturkaye <turkaye@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2005-05-24 04:33:13 +0000
committerturkaye <turkaye@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2005-05-24 04:33:13 +0000
commit711701c42d16c84440b025ef6488785cbbe0036b (patch)
treeec9195a1c672c4fe1c1c4ad9d991fb3428b50907 /contrib/utility/BuildRules
parentc7ce0f6c2430cb6dcec63c01e4aa68f2516a7ba9 (diff)
downloadATCD-711701c42d16c84440b025ef6488785cbbe0036b.tar.gz
ChangeLogTag: Mon May 23 23:11:14 2005 Emre Turkay <turkaye@dre.vanderbilt.edu>
Diffstat (limited to 'contrib/utility/BuildRules')
-rw-r--r--contrib/utility/BuildRules/Archive.gcc.post.rules47
-rw-r--r--contrib/utility/BuildRules/Archive.gcc.pre.rules28
-rw-r--r--contrib/utility/BuildRules/Archive.post.rules7
-rw-r--r--contrib/utility/BuildRules/Archive.pre.rules7
-rw-r--r--contrib/utility/BuildRules/Bootstrap.rules95
-rw-r--r--contrib/utility/BuildRules/Documentation.post.rules35
-rw-r--r--contrib/utility/BuildRules/Documentation.pre.rules18
-rw-r--r--contrib/utility/BuildRules/Executable.gcc.post.rules46
-rw-r--r--contrib/utility/BuildRules/Executable.gcc.pre.rules26
-rw-r--r--contrib/utility/BuildRules/Executable.generic.post.rules55
-rw-r--r--contrib/utility/BuildRules/Executable.generic.pre.rules26
-rw-r--r--contrib/utility/BuildRules/Executable.post.rules8
-rw-r--r--contrib/utility/BuildRules/Executable.pre.rules8
-rw-r--r--contrib/utility/BuildRules/Object.gcc.post.rules38
-rw-r--r--contrib/utility/BuildRules/Object.gcc.pre.rules22
-rw-r--r--contrib/utility/BuildRules/Object.post.rules7
-rw-r--r--contrib/utility/BuildRules/Object.pre.rules7
-rw-r--r--contrib/utility/BuildRules/Recursion.post.rules37
-rw-r--r--contrib/utility/BuildRules/Recursion.pre.rules13
-rw-r--r--contrib/utility/BuildRules/Shared.gcc.post.rules43
-rw-r--r--contrib/utility/BuildRules/Shared.gcc.pre.rules26
-rw-r--r--contrib/utility/BuildRules/Shared.generic.post.rules51
-rw-r--r--contrib/utility/BuildRules/Shared.generic.pre.rules26
-rw-r--r--contrib/utility/BuildRules/Shared.post.rules7
-rw-r--r--contrib/utility/BuildRules/Shared.pre.rules7
-rw-r--r--contrib/utility/BuildRules/Thoughts55
26 files changed, 745 insertions, 0 deletions
diff --git a/contrib/utility/BuildRules/Archive.gcc.post.rules b/contrib/utility/BuildRules/Archive.gcc.post.rules
new file mode 100644
index 00000000000..11b052d5200
--- /dev/null
+++ b/contrib/utility/BuildRules/Archive.gcc.post.rules
@@ -0,0 +1,47 @@
+# file : BuildRules/Archive.gcc.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+
+#
+# Note: normally you wouldn't want to change anything below.
+#
+
+FULL_MODULE_PREFIX := $(MODULE_PREFIX)$(module_prefix)
+FULL_MODULE_SUFFIX := $(module_suffix)$(MODULE_SUFFIX)
+MODULE := $(FULL_MODULE_PREFIX)$(module_base)$(FULL_MODULE_SUFFIX)
+
+#
+# Pattern rules catalog.
+# {
+
+# Defined pattern rule to build .o from .cpp
+%.o : %.cpp
+ $(CXX) $(CXX_PREPROCESS_FLAGS) $(CXX_COMPILE_FLAGS) -MD -MP -MT $(@:.o=.d) -MF $(@:.o=.d) -c $< -o $@
+
+# }
+
+# Defines the rule to build module from tarnslated c++ translation units.
+$(MODULE) : $(cxx_translation_units:.cpp=.o) $(translated_units)
+ $(AR) $(AR_FLAGS) $@ $^
+
+# Defines a phony target to clean all what's been generated
+.PHONY : clean
+clean :
+ -rm -f $(cxx_translation_units:.cpp=.o)
+ -rm -f $(cxx_translation_units:.cpp=.d)
+ -rm -f $(MODULE)
+
+
+# Include dependencies for c++ translation units.
+# @@ empty-check should be done in all cases.
+##
+ifneq ($(strip $(cxx_translation_units)),)
+-include $(cxx_translation_units:.cpp=.d)
+endif
+
+
+# The following catch-all rule will skip unknown targets
+%:: ;@:
+# $Id$
diff --git a/contrib/utility/BuildRules/Archive.gcc.pre.rules b/contrib/utility/BuildRules/Archive.gcc.pre.rules
new file mode 100644
index 00000000000..fbeb0329055
--- /dev/null
+++ b/contrib/utility/BuildRules/Archive.gcc.pre.rules
@@ -0,0 +1,28 @@
+# file : BuildRules/Archive.gcc.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+# Forces make to delete targets whos rebuild commands failed but
+# updated the target.
+.DELETE_ON_ERROR:
+
+# Empties the suffix list for which old-fassion implicit rules would
+# be used. The net effect is that all predefined implicit rules are
+# disabled now.
+.SUFFIXES:
+
+CXX ?= g++
+CXX_DEP ?= $(CXX) -M
+
+CXX_PREPROCESS_FLAGS :=
+CXX_COMPILE_FLAGS := -Wall
+CXX_LINK_FLAGS :=
+CXX_LINK_LIBS :=
+
+AR ?= ar
+AR_FLAGS := -rc
+
+MODULE_PREFIX := lib
+MODULE_SUFFIX := .a
+# $Id$
diff --git a/contrib/utility/BuildRules/Archive.post.rules b/contrib/utility/BuildRules/Archive.post.rules
new file mode 100644
index 00000000000..ffd1dc833f0
--- /dev/null
+++ b/contrib/utility/BuildRules/Archive.post.rules
@@ -0,0 +1,7 @@
+# file : BuildRules/Archive.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+$(call include, $(dir $(MAKEFILE))/Archive.gcc.post.rules)
+# $Id$
diff --git a/contrib/utility/BuildRules/Archive.pre.rules b/contrib/utility/BuildRules/Archive.pre.rules
new file mode 100644
index 00000000000..7547d7176f6
--- /dev/null
+++ b/contrib/utility/BuildRules/Archive.pre.rules
@@ -0,0 +1,7 @@
+# file : BuildRules/Archive.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+$(call include, $(dir $(MAKEFILE))/Archive.gcc.pre.rules)
+# $Id$
diff --git a/contrib/utility/BuildRules/Bootstrap.rules b/contrib/utility/BuildRules/Bootstrap.rules
new file mode 100644
index 00000000000..32d28e12038
--- /dev/null
+++ b/contrib/utility/BuildRules/Bootstrap.rules
@@ -0,0 +1,95 @@
+# file : BuildRules/Bootstrap.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+# basics
+#
+#
+
+define set
+$(eval $1 := $(strip $2))
+endef
+
+define get
+$(value $(strip $1))
+endef
+
+define sub
+$(shell expr $1 - $2)
+endef
+
+define add
+$(shell expr $1 + $2)
+endef
+
+# stack
+#
+#
+
+define push
+$(eval $1 +=$(strip $2))
+endef
+
+define pop
+$(eval $1 :=$(wordlist 1,$(call sub, $(words $(value $(strip $1))), 1),$(value $(strip $1))))
+endef
+
+define top
+$(word $(words $(value $(strip $1))),$(value $(strip $1)))
+endef
+
+# local
+#
+#
+
+define path_to_id
+$(subst /,_,$(subst .,_,$(strip $1)))
+endef
+
+MAKEFILE := $(word $(call sub,$(words $(MAKEFILE_LIST)),1),$(MAKEFILE_LIST))
+INCLUSION_ID := $(call path_to_id,$(MAKEFILE))
+
+define get_inclusion_id
+$(INCLUSION_ID)
+endef
+
+define local_set
+$(eval $(strip $(call get_inclusion_id))_$1 := $(strip $2))
+endef
+
+define local_get
+$($(strip $(call get_inclusion_id))_$1)
+endef
+
+define local_origin
+$(origin $(strip $(call get_inclusion_id))_$1)
+endef
+
+
+define _get_inclusion_count
+$(if $(call local_get,INCLUSION_COUNT),$(call local_get,INCLUSION_COUNT),0)
+endef
+
+define _set_inclusion_count
+$(call local_set,INCLUSION_COUNT,$1)
+endef
+
+# include
+#
+#
+
+define include
+$(strip
+ $(eval $(call push, include_stack, $(MAKEFILE))) \
+ $(eval MAKEFILE :=$(strip $1)) \
+ $(eval $(call push, inclusion_id_stack, $(INCLUSION_ID))) \
+ $(eval $(call _set_inclusion_count,$(call add,$(call _get_inclusion_count),1))) \
+ $(eval INCLUSION_ID :=$(INCLUSION_ID)_$(call local_get,INCLUSION_COUNT)_$(call path_to_id,$1)) \
+ $(eval include $1) \
+ $(eval INCLUSION_ID :=$(call top, inclusion_id_stack)) \
+ $(eval $(call pop, inclusion_id_stack)) \
+ $(eval MAKEFILE :=$(call top, include_stack)) \
+ $(eval $(call pop, include_stack)))
+endef
+# $Id$
diff --git a/contrib/utility/BuildRules/Documentation.post.rules b/contrib/utility/BuildRules/Documentation.post.rules
new file mode 100644
index 00000000000..33fd0c2942f
--- /dev/null
+++ b/contrib/utility/BuildRules/Documentation.post.rules
@@ -0,0 +1,35 @@
+# file : BuildRules/Documentation.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+#
+# Note: normally you wouldn't want to change anything below.
+#
+
+#
+# Pattern rules catalog.
+# {
+
+# Defined pattern rule to build .hpp.html from .hpp
+%.html : %
+ $(DOC) $(DOC_FLAGS) -o $@ $<
+
+# }
+
+# The following rule will inhibit treatment of documentation as
+# default target.
+.PHONY : all
+all: ;@:
+
+.PHONY : documentation
+documentation : $(patsubst %,%.html,$(doc_translation_units))
+
+# Defines a phony target to clean all what's been generated
+.PHONY : clean
+clean :
+ -rm -f $(patsubst %,%.html,$(doc_translation_units))
+
+# The following catch-all rule will skip unknown targets
+%:: ;@:
+# $Id$
diff --git a/contrib/utility/BuildRules/Documentation.pre.rules b/contrib/utility/BuildRules/Documentation.pre.rules
new file mode 100644
index 00000000000..33161d03d40
--- /dev/null
+++ b/contrib/utility/BuildRules/Documentation.pre.rules
@@ -0,0 +1,18 @@
+# file : BuildRules/Documentation.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+# Forces make to delete targets whos rebuild commands failed but
+# updated the target.
+.DELETE_ON_ERROR:
+
+# Empties the suffix list for which old-fassion implicit rules would
+# be used. The net effect is that all predefined implicit rules are
+# disabled now.
+.SUFFIXES:
+
+DOC ?= cpp_to_html
+CXX_FLAGS :=
+
+# $Id$
diff --git a/contrib/utility/BuildRules/Executable.gcc.post.rules b/contrib/utility/BuildRules/Executable.gcc.post.rules
new file mode 100644
index 00000000000..6587cbf0757
--- /dev/null
+++ b/contrib/utility/BuildRules/Executable.gcc.post.rules
@@ -0,0 +1,46 @@
+# file : BuildRules/Executable.gcc.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+#
+# Note: normally you wouldn't want to change anything below.
+#
+
+FULL_MODULE_PREFIX := $(MODULE_PREFIX)$(module_prefix)
+FULL_MODULE_SUFFIX := $(module_suffix)$(MODULE_SUFFIX)
+MODULE := $(FULL_MODULE_PREFIX)$(module_base)$(FULL_MODULE_SUFFIX)
+
+#
+# Pattern rules catalog.
+# {
+
+# Defined pattern rule to build .o from .cpp
+%.o : %.cpp
+ $(CXX) $(CXX_PREPROCESS_FLAGS) $(CXX_COMPILE_FLAGS) -MD -MP -MT $(@:.o=.d) -MF $(@:.o=.d) -c $< -o $@
+
+# }
+
+# Defines the rule to build module from tarnslated c++ translation units.
+$(MODULE) : $(cxx_translation_units:.cpp=.o) $(translated_units)
+ $(CXX) $(CXX_LINK_FLAGS) -o $@ $^ $(CXX_LINK_LIBS)
+
+# Defines a phony target to clean all what's been generated
+.PHONY : clean
+clean :
+ -rm -f $(cxx_translation_units:.cpp=.o)
+ -rm -f $(cxx_translation_units:.cpp=.d)
+ -rm -f $(MODULE)
+
+
+# Define a phony target to invoke the test driver.
+.PHONY : test
+test : $(MODULE)
+ ./$(MODULE)
+
+# Include dependencies for c++ translation units.
+-include $(cxx_translation_units:.cpp=.d)
+
+# The following catch-all rule will skip unknown targets
+%:: ;@:
+# $Id$
diff --git a/contrib/utility/BuildRules/Executable.gcc.pre.rules b/contrib/utility/BuildRules/Executable.gcc.pre.rules
new file mode 100644
index 00000000000..f7a0798c824
--- /dev/null
+++ b/contrib/utility/BuildRules/Executable.gcc.pre.rules
@@ -0,0 +1,26 @@
+# file : BuildRules/Executable.gcc.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+# Forces make to delete targets whos rebuild commands failed but
+# updated the target.
+.DELETE_ON_ERROR:
+
+# Empties the suffix list for which old-fassion implicit rules would
+# be used. The net effect is that all predefined implicit rules are
+# disabled now.
+.SUFFIXES:
+
+CXX ?= g++
+
+CXX_PREPROCESS_FLAGS :=
+CXX_COMPILE_FLAGS := -Wall
+CXX_LINK_FLAGS :=
+CXX_LINK_LIBS :=
+
+
+MODULE_PREFIX :=
+MODULE_SUFFIX :=
+
+# $Id$
diff --git a/contrib/utility/BuildRules/Executable.generic.post.rules b/contrib/utility/BuildRules/Executable.generic.post.rules
new file mode 100644
index 00000000000..26fa9b3b515
--- /dev/null
+++ b/contrib/utility/BuildRules/Executable.generic.post.rules
@@ -0,0 +1,55 @@
+# file : BuildRules/Executable.generic.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+#
+# Note: normally you wouldn't want to change anything below.
+#
+
+FULL_MODULE_PREFIX := $(MODULE_PREFIX)$(module_prefix)
+FULL_MODULE_SUFFIX := $(module_suffix)$(MODULE_SUFFIX)
+MODULE := $(FULL_MODULE_PREFIX)$(module_base)$(FULL_MODULE_SUFFIX)
+
+#
+# Pattern rules catalog.
+# {
+
+# Defines pattern rule to build .d from .cpp
+%.d: %.cpp
+ set -e; $(CXX_DEP) $(CXX_PREPROCESS_FLAGS) $< \
+ | sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
+ [ -s $@ ] || rm -f $@
+
+
+
+# Defined pattern rule to build .o from .cpp
+%.o : %.cpp
+ $(CXX) $(CXX_PREPROCESS_FLAGS) $(CXX_COMPILE_FLAGS) -c $< -o $@
+
+# }
+
+# Defines the rule to build module from tarnslated c++ translation units.
+$(MODULE) : $(cxx_translation_units:.cpp=.o)
+ $(CXX) $(CXX_LINK_FLAGS) -o $@ $^ $(CXX_LINK_LIBS)
+
+# Defines a phony target to clean all what's been generated
+.PHONY : clean
+clean :
+ -rm -f $(cxx_translation_units:.cpp=.o)
+ -rm -f $(cxx_translation_units:.cpp=.d)
+ -rm -f $(MODULE)
+
+
+# Define a phony target to invoke the test driver.
+.PHONY : test
+test : $(MODULE)
+ ./$(MODULE)
+
+# Include dependencies for c++ translation units.
+# Optimization: if we are cleaning there is no reason to calculate
+# dependencies because they will be removed a second later.
+ifneq ($(MAKECMDGOALS),clean)
+ include $(cxx_translation_units:.cpp=.d)
+endif
+# $Id$
diff --git a/contrib/utility/BuildRules/Executable.generic.pre.rules b/contrib/utility/BuildRules/Executable.generic.pre.rules
new file mode 100644
index 00000000000..995dabeebda
--- /dev/null
+++ b/contrib/utility/BuildRules/Executable.generic.pre.rules
@@ -0,0 +1,26 @@
+# file : BuildRules/Executable.generic.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+# Forces make to delete targets whos rebuild commands failed but
+# updated the target.
+.DELETE_ON_ERROR:
+
+# Empties the suffix list for which old-fassion implicit rules would
+# be used. The net effect is that all predefined implicit rules are
+# disabled now.
+.SUFFIXES:
+
+CXX ?= g++
+CXX_DEP ?= $(CXX) -M
+
+CXX_PREPROCESS_FLAGS :=
+CXX_COMPILE_FLAGS := -Wall
+CXX_LINK_FLAGS :=
+CXX_LINK_LIBS :=
+
+
+MODULE_PREFIX :=
+MODULE_SUFFIX :=
+# $Id$
diff --git a/contrib/utility/BuildRules/Executable.post.rules b/contrib/utility/BuildRules/Executable.post.rules
new file mode 100644
index 00000000000..da146baf162
--- /dev/null
+++ b/contrib/utility/BuildRules/Executable.post.rules
@@ -0,0 +1,8 @@
+# file : BuildRules/Executable.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+$(call include, $(dir $(MAKEFILE))/Executable.gcc.post.rules)
+
+# $Id$
diff --git a/contrib/utility/BuildRules/Executable.pre.rules b/contrib/utility/BuildRules/Executable.pre.rules
new file mode 100644
index 00000000000..10a1796450b
--- /dev/null
+++ b/contrib/utility/BuildRules/Executable.pre.rules
@@ -0,0 +1,8 @@
+# file : BuildRules/Executable.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+$(call include, $(dir $(MAKEFILE))/Executable.gcc.pre.rules)
+
+# $Id$
diff --git a/contrib/utility/BuildRules/Object.gcc.post.rules b/contrib/utility/BuildRules/Object.gcc.post.rules
new file mode 100644
index 00000000000..a58c2369435
--- /dev/null
+++ b/contrib/utility/BuildRules/Object.gcc.post.rules
@@ -0,0 +1,38 @@
+# file : BuildRules/Object.gcc.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+
+#
+# Note: normally you wouldn't want to change anything below.
+#
+
+#
+# Pattern rules catalog.
+# {
+
+# Defined pattern rule to build .o from .cpp
+%.o : %.cpp
+ $(CXX) $(CXX_PREPROCESS_FLAGS) $(CXX_COMPILE_FLAGS) -MD -MP -MT $(@:.o=.d) -MF $(@:.o=.d) -c $< -o $@
+
+# }
+
+# Defines the rule to build object files from c++ translation units.
+.PHONY : object
+object : $(cxx_translation_units:.cpp=.o)
+
+# Defines a phony target to clean all that's been generated
+.PHONY : clean
+clean :
+ -rm -f $(cxx_translation_units:.cpp=.o)
+ -rm -f $(cxx_translation_units:.cpp=.d)
+
+
+# Include dependencies for c++ translation units.
+-include $(cxx_translation_units:.cpp=.d)
+
+
+# The following catch-all rule will skip unknown targets
+%:: ;@:
+# $Id$
diff --git a/contrib/utility/BuildRules/Object.gcc.pre.rules b/contrib/utility/BuildRules/Object.gcc.pre.rules
new file mode 100644
index 00000000000..8b8d5527abd
--- /dev/null
+++ b/contrib/utility/BuildRules/Object.gcc.pre.rules
@@ -0,0 +1,22 @@
+# file : BuildRules/Object.gcc.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+# Forces make to delete targets whos rebuild commands failed but
+# updated the target.
+.DELETE_ON_ERROR:
+
+# Empties the suffix list for which old-fassion implicit rules would
+# be used. The net effect is that all predefined implicit rules are
+# disabled now.
+.SUFFIXES:
+
+CXX ?= g++
+CXX_DEP ?= $(CXX) -M
+
+CXX_PREPROCESS_FLAGS :=
+CXX_COMPILE_FLAGS := -Wall
+CXX_LINK_FLAGS :=
+CXX_LINK_LIBS :=
+# $Id$
diff --git a/contrib/utility/BuildRules/Object.post.rules b/contrib/utility/BuildRules/Object.post.rules
new file mode 100644
index 00000000000..383f759a25a
--- /dev/null
+++ b/contrib/utility/BuildRules/Object.post.rules
@@ -0,0 +1,7 @@
+# file : BuildRules/Object.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+$(call include, $(dir $(MAKEFILE))/Object.gcc.post.rules)
+# $Id$
diff --git a/contrib/utility/BuildRules/Object.pre.rules b/contrib/utility/BuildRules/Object.pre.rules
new file mode 100644
index 00000000000..54c75e0643d
--- /dev/null
+++ b/contrib/utility/BuildRules/Object.pre.rules
@@ -0,0 +1,7 @@
+# file : BuildRules/Object.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+$(call include, $(dir $(MAKEFILE))/Object.gcc.pre.rules)
+# $Id$
diff --git a/contrib/utility/BuildRules/Recursion.post.rules b/contrib/utility/BuildRules/Recursion.post.rules
new file mode 100644
index 00000000000..e842f0f4b67
--- /dev/null
+++ b/contrib/utility/BuildRules/Recursion.post.rules
@@ -0,0 +1,37 @@
+# file : BuildRules/Recursion.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+.PHONY: $(target_directory_list) $(target_makefile_list)
+
+_submodules:: $(target_directory_list) $(target_makefile_list)
+
+ifneq ($(strip $(target_directory_list)),)
+$(target_directory_list):
+ $(MAKE) -C $@ -f $(default_makefile_name) $(MAKECMDGOALS)
+endif
+
+ifneq ($(strip $(target_makefile_list)),)
+$(target_makefile_list):
+ $(MAKE) --no-print-directory -f $@ $(MAKECMDGOALS)
+endif
+
+# These rules keep make from trying to use the match-anything rule below to
+# rebuild the makefiles.
+#
+ifneq ($(strip $(default_makefile_name)),)
+$(default_makefile_name) : ;
+endif
+
+%.mk :: ;
+%.rules :: ;
+
+
+# Anything we don't know how to build will use this rule. The command is a
+# do-nothing command, but the prerequisites ensure that the appropriate
+# recursive invocations of make will occur.
+#
+% :: $(target_directory_list) $(target_makefile_list) ;
+
+# $Id$
diff --git a/contrib/utility/BuildRules/Recursion.pre.rules b/contrib/utility/BuildRules/Recursion.pre.rules
new file mode 100644
index 00000000000..1f03311fbc8
--- /dev/null
+++ b/contrib/utility/BuildRules/Recursion.pre.rules
@@ -0,0 +1,13 @@
+# file : BuildRules/Recursion.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+.SUFFIXES:
+
+.PHONY: _submodules
+
+_submodules::
+
+default_makefile_name := Makefile
+# $Id$
diff --git a/contrib/utility/BuildRules/Shared.gcc.post.rules b/contrib/utility/BuildRules/Shared.gcc.post.rules
new file mode 100644
index 00000000000..641f79dfc1d
--- /dev/null
+++ b/contrib/utility/BuildRules/Shared.gcc.post.rules
@@ -0,0 +1,43 @@
+# file : BuildRules/Shared.gcc.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+
+#
+# Note: normally you wouldn't want to change anything below.
+#
+
+FULL_MODULE_PREFIX := $(MODULE_PREFIX)$(module_prefix)
+FULL_MODULE_SUFFIX := $(module_suffix)$(MODULE_SUFFIX)
+MODULE := $(FULL_MODULE_PREFIX)$(module_base)$(FULL_MODULE_SUFFIX)
+
+#
+# Pattern rules catalog.
+# {
+
+# Defined pattern rule to build .o from .cpp
+%.o : %.cpp
+ $(CXX) $(CXX_PREPROCESS_FLAGS) $(CXX_COMPILE_FLAGS) -MD -MP -MT $(@:.o=.d) -MF $(@:.o=.d) -c $< -o $@
+
+# }
+
+# Defines the rule to build module from tarnslated c++ translation units.
+$(MODULE) : $(cxx_translation_units:.cpp=.o) $(translated_units)
+ $(CXX) $(CXX_LINK_FLAGS) -o $@ $^ $(CXX_LINK_LIBS)
+
+# Defines a phony target to clean all what's been generated
+.PHONY : clean
+clean :
+ -rm -f $(cxx_translation_units:.cpp=.o)
+ -rm -f $(cxx_translation_units:.cpp=.d)
+ -rm -f $(MODULE)
+
+
+# Include dependencies for c++ translation units.
+-include $(cxx_translation_units:.cpp=.d)
+
+
+# The following catch-all rule will skip unknown targets
+%:: ;@:
+# $Id$
diff --git a/contrib/utility/BuildRules/Shared.gcc.pre.rules b/contrib/utility/BuildRules/Shared.gcc.pre.rules
new file mode 100644
index 00000000000..d32c42f5260
--- /dev/null
+++ b/contrib/utility/BuildRules/Shared.gcc.pre.rules
@@ -0,0 +1,26 @@
+# file : BuildRules/Shared.gcc.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+# Forces make to delete targets whos rebuild commands failed but
+# updated the target.
+.DELETE_ON_ERROR:
+
+# Empties the suffix list for which old-fassion implicit rules would
+# be used. The net effect is that all predefined implicit rules are
+# disabled now.
+.SUFFIXES:
+
+CXX ?= g++
+CXX_DEP ?= $(CXX) -M
+
+CXX_PREPROCESS_FLAGS :=
+CXX_COMPILE_FLAGS := -fPIC -Wall
+CXX_LINK_FLAGS := -shared
+CXX_LINK_LIBS :=
+
+
+MODULE_PREFIX := lib
+MODULE_SUFFIX := .so
+# $Id$
diff --git a/contrib/utility/BuildRules/Shared.generic.post.rules b/contrib/utility/BuildRules/Shared.generic.post.rules
new file mode 100644
index 00000000000..19315b5d7ec
--- /dev/null
+++ b/contrib/utility/BuildRules/Shared.generic.post.rules
@@ -0,0 +1,51 @@
+# file : BuildRules/Shared.generic.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+
+#
+# Note: normally you wouldn't want to change anything below.
+#
+
+FULL_MODULE_PREFIX := $(MODULE_PREFIX)$(module_prefix)
+FULL_MODULE_SUFFIX := $(module_suffix)$(MODULE_SUFFIX)
+MODULE := $(FULL_MODULE_PREFIX)$(module_base)$(FULL_MODULE_SUFFIX)
+
+#
+# Pattern rules catalog.
+# {
+
+# Defines pattern rule to build .d from .cpp
+%.d: %.cpp
+ set -e; $(CXX_DEP) $(CXX_PREPROCESS_FLAGS) $< \
+ | sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
+ [ -s $@ ] || rm -f $@
+
+
+
+# Defined pattern rule to build .o from .cpp
+%.o : %.cpp
+ $(CXX) $(CXX_PREPROCESS_FLAGS) $(CXX_COMPILE_FLAGS) -c $< -o $@
+
+# }
+
+# Defines the rule to build module from tarnslated c++ translation units.
+$(MODULE) : $(cxx_translation_units:.cpp=.o)
+ $(CXX) $(CXX_LINK_FLAGS) -o $@ $^ $(CXX_LINK_LIBS)
+
+# Defines a phony target to clean all what's been generated
+.PHONY : clean
+clean :
+ -rm -f $(cxx_translation_units:.cpp=.o)
+ -rm -f $(cxx_translation_units:.cpp=.d)
+ -rm -f $(MODULE)
+
+
+# Include dependencies for c++ translation units.
+# Optimization: if we are cleaning there is no reason to calculate
+# dependencies because they will be removed a second later.
+ifneq ($(MAKECMDGOALS),clean)
+ include $(cxx_translation_units:.cpp=.d)
+endif
+# $Id$
diff --git a/contrib/utility/BuildRules/Shared.generic.pre.rules b/contrib/utility/BuildRules/Shared.generic.pre.rules
new file mode 100644
index 00000000000..77b2a055956
--- /dev/null
+++ b/contrib/utility/BuildRules/Shared.generic.pre.rules
@@ -0,0 +1,26 @@
+# file : BuildRules/Shared.generic.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+# Forces make to delete targets whos rebuild commands failed but
+# updated the target.
+.DELETE_ON_ERROR:
+
+# Empties the suffix list for which old-fassion implicit rules would
+# be used. The net effect is that all predefined implicit rules are
+# disabled now.
+.SUFFIXES:
+
+CXX ?= g++
+
+CXX_PREPROCESS_FLAGS :=
+CXX_COMPILE_FLAGS := -fPIC -Wall
+CXX_LINK_FLAGS := -shared
+CXX_LINK_LIBS :=
+
+
+MODULE_PREFIX := lib
+MODULE_SUFFIX := .so
+
+# $Id$
diff --git a/contrib/utility/BuildRules/Shared.post.rules b/contrib/utility/BuildRules/Shared.post.rules
new file mode 100644
index 00000000000..1f098c99b7b
--- /dev/null
+++ b/contrib/utility/BuildRules/Shared.post.rules
@@ -0,0 +1,7 @@
+# file : BuildRules/Shared.post.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+$(call include, $(dir $(MAKEFILE))/Shared.gcc.post.rules)
+# $Id$
diff --git a/contrib/utility/BuildRules/Shared.pre.rules b/contrib/utility/BuildRules/Shared.pre.rules
new file mode 100644
index 00000000000..9ebbeb534dd
--- /dev/null
+++ b/contrib/utility/BuildRules/Shared.pre.rules
@@ -0,0 +1,7 @@
+# file : BuildRules/Shared.pre.rules
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2002-2003 Boris Kolpackov
+# license : http://kolpackov.net/license.html
+
+$(call include, $(dir $(MAKEFILE))/Shared.gcc.pre.rules)
+# $Id$
diff --git a/contrib/utility/BuildRules/Thoughts b/contrib/utility/BuildRules/Thoughts
new file mode 100644
index 00000000000..486a44f108b
--- /dev/null
+++ b/contrib/utility/BuildRules/Thoughts
@@ -0,0 +1,55 @@
+
+Makefile variable naming style.
+
+* Each target is usually invoking one or more commands of the following type:
+
+ (1) translator which translates target's prerequsites to target(s)
+
+ (2) arbitrary command which doesn't create target (aka PHONY targets)
+
+Examples of type (1) are:
+
+ - translation of c++ source to object code
+
+ - translation of object code to executable/shared
+
+Examples of type (2) are:
+
+ - test: terget
+
+ - clean: target
+
+
+Some properties of these types of targets:
+
+ (1) - usually implemented as an implicit rule
+
+ - sometimes the same program is used as two separate translators
+ (e.g. CXX is used as a compiler and as a linker)
+
+
+
+ (2) - seldom (never?) implemented as an implicit rule
+
+
+
+Approach #1
+
+For type (1) name is derived from the translator's name e.g.
+
+CXX_COMPILE_FLAGS
+CXX_PREPROCESS_FLAGS
+CXX_LINK_FLAGS
+CXX_LINK_LIBS
+
+CC_
+LD_
+
+
+For type (2) name is derived from the target's name e.g.
+
+TEST_FLAGS
+CLEAN_FLAGS
+INSTALL_FLAGS
+
+$Id$