summaryrefslogtreecommitdiff
path: root/build-0.3/bootstrap.make
diff options
context:
space:
mode:
Diffstat (limited to 'build-0.3/bootstrap.make')
-rw-r--r--build-0.3/bootstrap.make341
1 files changed, 341 insertions, 0 deletions
diff --git a/build-0.3/bootstrap.make b/build-0.3/bootstrap.make
new file mode 100644
index 0000000..c45f952
--- /dev/null
+++ b/build-0.3/bootstrap.make
@@ -0,0 +1,341 @@
+# file : build/bootstrap.make
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2004-2010 Code Synthesis Tools CC
+# license : GNU GPL v2; see accompanying LICENSE file
+
+
+
+# First time bootstrap.make is read
+#
+ifndef %makefile%
+
+# Configure make.
+#
+
+# Forces make to delete targets whos rebuild commands failed but
+# updated the target.
+#
+.DELETE_ON_ERROR:
+
+# Remove all built-in rules.
+#
+.SUFFIXES:
+
+ifeq ($(filter -r,$(MAKEFLAGS)),)
+MAKEFLAGS += -r
+endif
+
+
+# Disable implicit phony misfeature.
+#
+#ifeq ($(filter --no-implicit-phony,$(MAKEFLAGS)),)
+#MAKEFLAGS += --no-implicit-phony
+#endif
+
+# Enable second expansion.
+#
+.SECONDEXPANSION:
+
+# Force target. Used to force rule executions.
+#
+.PHONY: FORCE
+
+
+# Export variables that could be useful for configuration scripts.
+#
+export bld_root
+export MAKE
+
+%replica% :=
+%foreign% :=
+%interactive% := t
+
+# List of realpath'ed include-once files.
+#
+%included_files% :=
+
+#$(warning init %included_files%: $(%included_files%))
+
+# @@ maybe I should set makefile to bootstrap and restore it at the end.
+# This way I will be able to use %makefile% below (instead of _self) and
+# also it will be consistent.
+#
+
+%makefile% := $(abspath $(firstword $(MAKEFILE_LIST)))
+%makefile_realpath% := $(realpath $(%makefile%))
+
+
+#
+# include facility
+#
+
+# Execute makefile search algorithm. Return abspath of the makefile if found
+# and empty string otherwise.
+#
+%frame_exclude% += include-find-makefile
+define include-find-makefile
+$(if $(wildcard $1),\
+$(abspath $1),\
+$(if $(filter-out /%,$1),\
+$(call include-search-dirs,$1,$(.INCLUDE_DIRS))))
+endef
+
+# Search for $1 in the list of directoris $2
+#
+%frame_exclude% += include-search-dirs
+define include-search-dirs
+$(if $(strip $2),\
+$(if $(wildcard $(firstword $2)/$1),\
+$(abspath $(firstword $2)/$1),\
+$(call include-search-dirs,$1,$(wordlist 2,$(words $2),$2))))
+endef
+
+# Test if $1 is a 'foreign' makefile, i.e., does not reside in
+# src_root, out_root, or bld_root.
+#
+%frame_exclude% += include-test-foreign
+define include-test-foreign
+$(if $(%foreign%),t,\
+$(if $(filter $(bld_root)/% $(src_root)/% $(out_root)/%,$1),,t))
+endef
+
+
+%frame_exclude% += include-body
+define include-body
+%interactive% :=
+%makefile% := $(call include-find-makefile,$2)
+%makefile_realpath% := $(realpath $(%makefile%))
+%foreign% := $(call include-test-foreign,$(%makefile%))
+
+$1 $$(if $$(%makefile%),$$(%makefile%),$2)
+
+%makefile_realpath% := $3
+%makefile% := $4
+%interactive% := $5
+%foreign% := $6
+endef
+
+%frame_exclude% += include
+define include
+$(eval $(foreach f,$1,\
+ $(call include-body,\
+ include,$f,$(%makefile_realpath%),$(%makefile%),$(%interactive%),$(%foreign%))))
+endef
+
+%frame_exclude% += -include
+define -include
+$(eval $(foreach f,$1,\
+ $(call include-body,\
+ -include,$f,$(%makefile_realpath%),$(%makefile%),$(%interactive%),$(%foreign%))))
+endef
+
+
+#
+# include-once
+#
+
+# This one simply delegates to the include directive to get the
+# error message.
+#
+# $1 : include/-include
+# $2 : file
+#
+%frame_exclude% += include-once-failed-body
+define include-once-failed-body
+$1 $2
+endef
+
+#
+# $1 : include/-include
+# $2 : file
+#
+%frame_exclude% += include-once-file-body
+define include-once-file-body
+%interactive% :=
+%makefile% := $2
+%makefile_realpath% := $(realpath $2)
+%foreign% := $(call include-test-foreign,$(%makefile%))
+
+%included_files% += $$(%makefile_realpath%)
+
+$1 $2
+
+%makefile_realpath% := $3
+%makefile% := $4
+%interactive% := $5
+%foreign% := $6
+endef
+
+
+%frame_exclude% += include-once-file-filter
+define include-once-file-filter
+$(if $(filter $(realpath $2),$(%included_files%)),,\
+ $(call include-once-file-body,\
+ $1,$2,$(%makefile_realpath%),$(%makefile%),$(%interactive%),$(%foreign%)))
+endef
+
+#
+# $1 : include/-include
+# $2 : file
+# $6 : value
+#
+
+%frame_exclude% += include-once-value-body
+define include-once-value-body
+%interactive% :=
+%makefile% := $2
+%makefile_realpath% := $(realpath $2)
+%foreign% := $(call include-test-foreign,$(%makefile%))
+
+%include_once_$$(%makefile_realpath%)% += $7
+
+$1 $2
+
+%makefile_realpath% := $3
+%makefile% := $4
+%interactive% := $5
+%foreign% := $6
+endef
+
+
+%frame_exclude% += include-once-value-filter
+define include-once-value-filter
+$(if $(filter $3,$(value %include_once_$(realpath $2)%)),,\
+ $(call include-once-value-body,\
+ $1,$2,$(%makefile_realpath%),$(%makefile%),$(%interactive%),$(%foreign%),$3))
+endef
+
+
+# $1 - include/-include
+# $2 - abspath or empty if not found
+# $3 - orginal path
+# $4 - value [optional]
+#
+%frame_exclude% += include-once-filter
+define include-once-filter
+$(if $2,\
+$(if $4,\
+$(call include-once-value-filter,$1,$2,$4),\
+$(call include-once-file-filter,$1,$2)),\
+$(call include-once-failed-body,$1,$3))
+endef
+
+%frame_exclude% += include-once
+define include-once
+$(eval $(call include-once-filter,\
+include,$(call include-find-makefile,$1),$1,$(strip $2)))
+endef
+
+%frame_exclude% += -include-once
+define -include-once
+$(eval $(call include-once-filter,\
+-include,$(call include-find-makefile,$1),$1,$(strip $2)))
+endef
+
+
+#$(warning include facility is up)
+
+endif # %makefile%
+
+#
+#
+bld_root := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
+
+# initialize {src,out}_{root,base}
+#
+%frame_exclude% += find-bootstrap-base
+define find-bootstrap-base
+$(if $(findstring $(abspath $(lastword $1)),$(%makefile%)),$2,\
+$(call find-bootstrap-base,\
+$(wordlist 1,$(words $(wordlist 2,$(words $1),$1)),$1),\
+$(lastword $1)))
+endef
+
+src_root := $(abspath $(dir $(call find-bootstrap-base,$(MAKEFILE_LIST)))..)
+src_base := $(abspath $(dir $(%makefile%)))
+
+ifneq ($(src_root),$(src_base))
+
+ifeq ($(origin out_root),undefined)
+ out_root := $(abspath $(patsubst \
+ %$(subst $(src_root)/,,$(src_base)),%,$(CURDIR)))
+endif
+
+out_base := $(out_root)/$(subst $(src_root)/,,$(src_base))
+
+else
+
+ifeq ($(origin out_root),undefined)
+ out_root := $(abspath $(CURDIR))
+endif
+
+out_base := $(out_root)
+
+endif
+
+scf_root := $(src_root)/build
+dcf_root := $(out_root)/build
+
+$(out_root)/%: export out_root := $(out_root)
+$(out_root)/%: export src_root := $(src_root)
+$(out_root)/%: export scf_root := $(scf_root)
+$(out_root)/%: export dcf_root := $(dcf_root)
+$(out_root)/%: export project_name := $(project_name)
+
+$(out_base)/%: out_root := $(out_root)
+$(out_base)/%: out_base := $(out_base)
+$(out_base)/%: src_base := $(src_base)
+
+ifdef build_debug
+
+$(warning "bld root: $(bld_root)")
+$(warning "scf root: $(scf_root)")
+$(warning "dcf root: $(dcf_root)")
+$(warning "src root: $(src_root)")
+$(warning "src base: $(src_base)")
+$(warning "out root: $(out_root)")
+$(warning "out base: $(out_base)")
+
+endif
+
+#$(warning paths are set)
+
+# frame facility
+#
+$(call include-once,$(bld_root)/frame.make)
+
+# import facility
+#
+$(call include-once,$(bld_root)/import.make)
+
+# Load some common facilities.
+#
+$(call include-once,$(bld_root)/literals.make)
+$(call include-once,$(bld_root)/message.make)
+$(call include-once,$(bld_root)/dir.make)
+
+
+# Static configuration.
+#
+$(call include,$(bld_root)/configuration-static.make)
+
+ifneq ($(bld_root),$(scf_root))
+$(call -include,$(scf_root)/configuration-static.make)
+endif
+
+
+# `disfigure' target.
+#
+.PHONY: disfigure
+
+disfigure:: $(build_absolute_clean_target)
+
+#@@ Is there a better way?
+#
+ifeq ($(.DEFAULT_GOAL),disfigure)
+.DEFAULT_GOAL :=
+endif
+
+# Dynamic configuration.
+#