summaryrefslogtreecommitdiff
path: root/buildlib/defaults.mak
diff options
context:
space:
mode:
Diffstat (limited to 'buildlib/defaults.mak')
-rw-r--r--buildlib/defaults.mak101
1 files changed, 101 insertions, 0 deletions
diff --git a/buildlib/defaults.mak b/buildlib/defaults.mak
new file mode 100644
index 000000000..b268c4b9b
--- /dev/null
+++ b/buildlib/defaults.mak
@@ -0,0 +1,101 @@
+# -*- make -*-
+
+# This file configures the default environment for the make system
+# The way it works is fairly simple, each module is defined in it's
+# own *.mak file. It expects a set of variables to be set to values
+# for it to operate as expected. When included the module generates
+# the requested rules based on the contents of its control variables.
+
+# This works out very well and allows a good degree of flexability.
+# To accomidate some of the features we introduce the concept of
+# local variables. To do this we use the 'Computed Names' feature of
+# gmake. Each module declares a LOCAL scope and access it with,
+# $($(LOCAL)-VAR)
+# This works very well but it is important to rembember that within
+# a rule the LOCAL var is unavailble, it will have to be constructed
+# from the information in the rule invokation. For stock rules like
+# clean this is simple, we use a local clean rule called clean/$(LOCAL)
+# and then within the rule $(@F) gets back $(LOCAL)! Other rules will
+# have to use some other mechanism (filter perhaps?) The reason such
+# lengths are used is so that each directory can contain several 'instances'
+# of any given module
+
+# A build directory is used by default, all generated items get put into
+# there. However unlike automake this is not done with a VPATH build
+# (vpath builds break the distinction between #include "" and #include <>)
+# but by explicly setting the BUILD variable. Make is invoked from
+# within the source itself which is much more compatible with compilation
+# environments.
+
+ifndef BUILD
+BUILD=$(BASE)/build
+endif
+
+# Base definitions
+INCLUDE := $(BUILD)/include
+BIN := $(BUILD)/bin
+LIB := $(BIN)
+OBJ := $(BUILD)/obj
+DEP := $(OBJ)
+
+# Module types
+LIBRARY_H=$(BASE)/buildlib/library.mak
+
+# Source location control
+# SUBDIRS specifies sub components of the module that
+# may be located in subdrictories of the source dir.
+# This should be declared before including this file
+SUBDIRS+=
+
+# Header file control.
+# TARGETDIRS indicitates all of the locations that public headers
+# will be published to.
+# This should be declared before including this file
+HEADER_TARGETDIRS+=
+
+# Options
+CXX = c++
+CC = cc
+CPPFLAGS+= -I$(INCLUDE)
+CXXFLAGS+= -Wall -g -fno-implicit-templates -fno-exceptions
+PICFLAGS+= -fPIC -DPIC
+LFLAGS+=
+INLINEDEPFLAG = -MD
+
+# Phony rules. Other things hook these by appending to the dependency
+# list
+.PHONY: headers library clean veryclean all binary program
+all: binary
+binary: library program
+headers library clean veryclean program:
+
+# Header file control. We want all published interface headers to go
+# into the build directory from thier source dirs. We setup some
+# search paths here
+vpath %.h $(SUBDIRS)
+$(INCLUDE)/%.h $(addprefix $(INCLUDE)/,$(addsuffix /%.h,$(HEADER_TARGETDIRS))) : %.h
+ cp $< $@
+
+# Dependency generation. We want to generate a .d file using gnu cpp.
+# For GNU systems the compiler can spit out a .d file while it is compiling,
+# this is specified with the INLINEDEPFLAG. Other systems might have a
+# makedep program that can be called after compiling, that's illistrated
+# by the DEPFLAG case.
+# Compile rules are expected to call this macro after calling the compiler
+ ifdef INLINEDEPFLAG
+ define DoDep
+ sed -e "1s/.*:/$(subst /,\\/,$@):/" $(basename $(@F)).d > $(DEP)/$(basename $(@F)).d
+ -rm -f $(basename $(@F)).d
+ endef
+else
+ ifdef DEPFLAG
+ define DoDep
+ $(CXX) $(DEPFLAG) $(CPPFLAGS) -o $@ $<
+ sed -e "1s/.*:/$(subst /,\\/,$@):/" $(basename $(@F)).d > $(DEP)/$(basename $(@F)).d
+ -rm -f $(basename $(@F)).d
+ endef
+ else
+ define DoDep
+ endef
+ endif
+endif