]>
Commit | Line | Data |
---|---|---|
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. I notice that the very latest gmake has the concept | |
22 | # of local variables for rules. It is possible this feature in conjunction | |
23 | # with the generated names will provide a very powerfull solution indeed! | |
24 | ||
25 | # A build directory is used by default, all generated items get put into | |
26 | # there. However unlike automake this is not done with a VPATH build | |
27 | # (vpath builds break the distinction between #include "" and #include <>) | |
28 | # but by explicly setting the BUILD variable. Make is invoked from | |
29 | # within the source itself which is much more compatible with compilation | |
30 | # environments. | |
31 | ifndef NOISY | |
32 | .SILENT: | |
33 | endif | |
34 | ||
35 | # Search for the build directory | |
36 | ifdef BUILD | |
37 | BUILD_POSSIBLE := $(BUILD) $(BASE)/$(BUILD) | |
38 | else | |
39 | BUILD_POSSIBLE := $(BASE) $(BASE)/build-$(shell uname -m) $(BASE)/build | |
40 | endif | |
41 | ||
42 | BUILDX:= $(foreach i,$(BUILD_POSSIBLE),$(wildcard $(i)/environment.mak*)) | |
43 | ||
44 | ifeq ($(words $(BUILDX)),0) | |
45 | ||
46 | # Check for a busted wildcard function. We use this function in several | |
47 | # places, it must work. | |
48 | ifeq ($(words $(wildcard *)),0) | |
49 | error-all/environment.mak: | |
50 | echo You have a broken version of GNU Make - upgrade. | |
51 | error-out-and-die | |
52 | else | |
53 | error-all/environment.mak: | |
54 | echo Can not find the build directory in $(BUILD_POSSIBLE) -- use BUILD= | |
55 | error-out-and-die | |
56 | endif | |
57 | ||
58 | # Force include below to come to the error target | |
59 | BUILDX := error-all | |
60 | else | |
61 | BUILDX:= $(patsubst %/,%,$(firstword $(dir $(BUILDX)))) | |
62 | endif | |
63 | ||
64 | override BUILD := $(BUILDX) | |
65 | ||
66 | # Base definitions | |
67 | INCLUDE := $(BUILD)/include | |
68 | BIN := $(BUILD)/bin | |
69 | LIB := $(BIN) | |
70 | OBJ := $(BUILD)/obj/$(SUBDIR) | |
71 | DEP := $(OBJ) | |
72 | DOC := $(BUILD)/docs | |
73 | ||
74 | # Module types | |
75 | LIBRARY_H = $(BASE)/buildlib/library.mak | |
76 | DEBIANDOC_H = $(BASE)/buildlib/debiandoc.mak | |
77 | MANPAGE_H = $(BASE)/buildlib/manpage.mak | |
78 | PROGRAM_H = $(BASE)/buildlib/program.mak | |
79 | PYTHON_H = $(BASE)/buildlib/python.mak | |
80 | COPY_H = $(BASE)/buildlib/copy.mak | |
81 | YODL_MANPAGE_H = $(BASE)/buildlib/yodl_manpage.mak | |
82 | SGML_MANPAGE_H = $(BASE)/buildlib/sgml_manpage.mak | |
83 | FAIL_H = $(BASE)/buildlib/fail.mak | |
84 | ||
85 | include $(BUILD)/environment.mak | |
86 | ||
87 | ifdef STATICLIBS | |
88 | LIBRARY_H += $(BASE)/buildlib/staticlibrary.mak | |
89 | endif | |
90 | ||
91 | ifdef ONLYSTATICLIBS | |
92 | LIBRARY_H = $(BASE)/buildlib/staticlibrary.mak | |
93 | endif | |
94 | ||
95 | # Source location control | |
96 | # SUBDIRS specifies sub components of the module that | |
97 | # may be located in subdrictories of the source dir. | |
98 | # This should be declared before including this file | |
99 | SUBDIRS+= | |
100 | ||
101 | # Header file control. | |
102 | # TARGETDIRS indicitates all of the locations that public headers | |
103 | # will be published to. | |
104 | # This should be declared before including this file | |
105 | HEADER_TARGETDIRS+= | |
106 | ||
107 | # Options | |
108 | CPPFLAGS+= -I$(INCLUDE) | |
109 | LDFLAGS+= -L$(LIB) | |
110 | ||
111 | # Directors to create | |
112 | MKDIRS := $(BIN) | |
113 | ||
114 | # Phony rules. Other things hook these by appending to the dependency | |
115 | # list | |
116 | .PHONY: headers library clean veryclean all binary program doc dirs | |
117 | .PHONY: maintainer-clean dist-clean distclean pristine sanity | |
118 | all: binary doc | |
119 | binary: library program | |
120 | maintainer-clean dist-clean distclean pristine sanity: veryclean | |
121 | headers library clean veryclean program: | |
122 | ||
123 | veryclean: | |
124 | echo Very Clean done for $(SUBDIR) | |
125 | clean: | |
126 | echo Clean done for $(SUBDIR) | |
127 | dirs: | |
128 | mkdir -p $(patsubst %/,%,$(sort $(MKDIRS))) | |
129 | ||
130 | # Header file control. We want all published interface headers to go | |
131 | # into the build directory from thier source dirs. We setup some | |
132 | # search paths here | |
133 | vpath %.h $(SUBDIRS) | |
134 | $(INCLUDE)/%.h $(addprefix $(INCLUDE)/,$(addsuffix /%.h,$(HEADER_TARGETDIRS))) : %.h | |
135 | cp $< $@ | |
136 | ||
137 | # Dependency generation. We want to generate a .d file using gnu cpp. | |
138 | # For GNU systems the compiler can spit out a .d file while it is compiling, | |
139 | # this is specified with the INLINEDEPFLAG. Other systems might have a | |
140 | # makedep program that can be called after compiling, that's illistrated | |
141 | # by the DEPFLAG case. | |
142 | # Compile rules are expected to call this macro after calling the compiler | |
143 | ifdef GCC3DEP | |
144 | DFILE = $(DEP)/$(basename $(@F)).d | |
145 | else | |
146 | DFILE = $(basename $(@F)).d | |
147 | endif | |
148 | ifdef INLINEDEPFLAG | |
149 | define DoDep | |
150 | sed -e "1s/.*:/$(subst /,\\/,$@):/" $(DFILE) > $(DEP)/$(@F).d | |
151 | #sed -e "1s/.*:/$(subst /,\\/,$@):/" $(DEP)/$(basename $(@F)).d > $(DEP)/$(@F).d | |
152 | -rm -f $(basename $(@F)).d | |
153 | endef | |
154 | else | |
155 | ifdef DEPFLAG | |
156 | define DoDep | |
157 | $(CXX) $(DEPFLAG) $(CPPFLAGS) -o $@ $< | |
158 | sed -e "1s/.*:/$(subst /,\\/,$@):/" $(basename $(@F)).d > $(DEP)/$(@F).d | |
159 | -rm -f $(basename $(@F)).d | |
160 | endef | |
161 | else | |
162 | define DoDep | |
163 | endef | |
164 | endif | |
165 | endif | |
166 | ||
167 | # Automatic -j support | |
168 | ifeq ($(NUM_PROCS),1) | |
169 | PARALLEL_RUN=no | |
170 | endif | |
171 | ||
172 | ifndef PARALLEL_RUN | |
173 | PARALLEL_RUN=yes | |
174 | .EXPORT: PARALLEL_RUN | |
175 | # handle recursion | |
176 | ifneq ($(NUM_PROCS),) | |
177 | MAKEFLAGS += -j $(NUM_PROCS) | |
178 | endif | |
179 | endif |