Commit | Line | Data |
---|---|---|
094a497d AL |
1 | # -*- make -*- |
2 | ||
3 | # This file configures the default environment for the make system | |
4 | # The way it works is fairly simple, each module is defined in it's | |
5 | # own *.mak file. It expects a set of variables to be set to values | |
6 | # for it to operate as expected. When included the module generates | |
7 | # the requested rules based on the contents of its control variables. | |
8 | ||
9 | # This works out very well and allows a good degree of flexability. | |
10 | # To accomidate some of the features we introduce the concept of | |
11 | # local variables. To do this we use the 'Computed Names' feature of | |
12 | # gmake. Each module declares a LOCAL scope and access it with, | |
13 | # $($(LOCAL)-VAR) | |
14 | # This works very well but it is important to rembember that within | |
15 | # a rule the LOCAL var is unavailble, it will have to be constructed | |
16 | # from the information in the rule invokation. For stock rules like | |
17 | # clean this is simple, we use a local clean rule called clean/$(LOCAL) | |
18 | # and then within the rule $(@F) gets back $(LOCAL)! Other rules will | |
19 | # have to use some other mechanism (filter perhaps?) The reason such | |
20 | # lengths are used is so that each directory can contain several 'instances' | |
21 | # of any given module | |
22 | ||
23 | # A build directory is used by default, all generated items get put into | |
24 | # there. However unlike automake this is not done with a VPATH build | |
25 | # (vpath builds break the distinction between #include "" and #include <>) | |
26 | # but by explicly setting the BUILD variable. Make is invoked from | |
27 | # within the source itself which is much more compatible with compilation | |
28 | # environments. | |
29 | ||
30 | ifndef BUILD | |
31 | BUILD=$(BASE)/build | |
32 | endif | |
33 | ||
34 | # Base definitions | |
35 | INCLUDE := $(BUILD)/include | |
36 | BIN := $(BUILD)/bin | |
37 | LIB := $(BIN) | |
38 | OBJ := $(BUILD)/obj | |
39 | DEP := $(OBJ) | |
40 | ||
41 | # Module types | |
42 | LIBRARY_H=$(BASE)/buildlib/library.mak | |
43 | ||
44 | # Source location control | |
45 | # SUBDIRS specifies sub components of the module that | |
46 | # may be located in subdrictories of the source dir. | |
47 | # This should be declared before including this file | |
48 | SUBDIRS+= | |
49 | ||
50 | # Header file control. | |
51 | # TARGETDIRS indicitates all of the locations that public headers | |
52 | # will be published to. | |
53 | # This should be declared before including this file | |
54 | HEADER_TARGETDIRS+= | |
55 | ||
56 | # Options | |
57 | CXX = c++ | |
58 | CC = cc | |
59 | CPPFLAGS+= -I$(INCLUDE) | |
60 | CXXFLAGS+= -Wall -g -fno-implicit-templates -fno-exceptions | |
61 | PICFLAGS+= -fPIC -DPIC | |
62 | LFLAGS+= | |
63 | INLINEDEPFLAG = -MD | |
64 | ||
65 | # Phony rules. Other things hook these by appending to the dependency | |
66 | # list | |
67 | .PHONY: headers library clean veryclean all binary program | |
68 | all: binary | |
69 | binary: library program | |
70 | headers library clean veryclean program: | |
71 | ||
72 | # Header file control. We want all published interface headers to go | |
73 | # into the build directory from thier source dirs. We setup some | |
74 | # search paths here | |
75 | vpath %.h $(SUBDIRS) | |
76 | $(INCLUDE)/%.h $(addprefix $(INCLUDE)/,$(addsuffix /%.h,$(HEADER_TARGETDIRS))) : %.h | |
77 | cp $< $@ | |
78 | ||
79 | # Dependency generation. We want to generate a .d file using gnu cpp. | |
80 | # For GNU systems the compiler can spit out a .d file while it is compiling, | |
81 | # this is specified with the INLINEDEPFLAG. Other systems might have a | |
82 | # makedep program that can be called after compiling, that's illistrated | |
83 | # by the DEPFLAG case. | |
84 | # Compile rules are expected to call this macro after calling the compiler | |
85 | ifdef INLINEDEPFLAG | |
86 | define DoDep | |
87 | sed -e "1s/.*:/$(subst /,\\/,$@):/" $(basename $(@F)).d > $(DEP)/$(basename $(@F)).d | |
88 | -rm -f $(basename $(@F)).d | |
89 | endef | |
90 | else | |
91 | ifdef DEPFLAG | |
92 | define DoDep | |
93 | $(CXX) $(DEPFLAG) $(CPPFLAGS) -o $@ $< | |
94 | sed -e "1s/.*:/$(subst /,\\/,$@):/" $(basename $(@F)).d > $(DEP)/$(basename $(@F)).d | |
95 | -rm -f $(basename $(@F)).d | |
96 | endef | |
97 | else | |
98 | define DoDep | |
99 | endef | |
100 | endif | |
101 | endif |