]>
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 | ||
f30c4b6a DK |
9 | # This works out very well and allows a good degree of flexibility. |
10 | # To accommodate some of the features we introduce the concept of | |
094a497d AL |
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) | |
f30c4b6a DK |
14 | # This works very well but it is important to remember that within |
15 | # a rule the LOCAL var is unavailable, it will have to be constructed | |
16 | # from the information in the rule invocation. For stock rules like | |
094a497d AL |
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' | |
46976ca4 AL |
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 | |
f30c4b6a | 23 | # with the generated names will provide a very powerful solution indeed! |
094a497d AL |
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 <>) | |
f30c4b6a | 28 | # but by explicitly setting the BUILD variable. Make is invoked from |
094a497d AL |
29 | # within the source itself which is much more compatible with compilation |
30 | # environments. | |
93bf083d | 31 | ifndef NOISY |
118a5e95 | 32 | .SILENT: |
93bf083d | 33 | endif |
094a497d | 34 | |
118a5e95 AL |
35 | # Search for the build directory |
36 | ifdef BUILD | |
93641593 | 37 | BUILD_POSSIBLE := $(BUILD) $(BASE)/$(BUILD) |
118a5e95 | 38 | else |
f40e3a64 | 39 | BUILD_POSSIBLE := $(BASE) $(BASE)/build-$(shell uname -m) $(BASE)/build |
118a5e95 AL |
40 | endif |
41 | ||
93641593 | 42 | BUILDX:= $(foreach i,$(BUILD_POSSIBLE),$(wildcard $(i)/environment.mak*)) |
118a5e95 | 43 | |
93641593 | 44 | ifeq ($(words $(BUILDX)),0) |
101030ab AL |
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. | |
70fbac25 | 51 | error-out-and-die |
101030ab AL |
52 | else |
53 | error-all/environment.mak: | |
b2e465d6 | 54 | echo Can not find the build directory in $(BUILD_POSSIBLE) -- use BUILD= |
70fbac25 | 55 | error-out-and-die |
094a497d AL |
56 | endif |
57 | ||
101030ab AL |
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 | ||
93641593 AL |
64 | override BUILD := $(BUILDX) |
65 | ||
094a497d AL |
66 | # Base definitions |
67 | INCLUDE := $(BUILD)/include | |
68 | BIN := $(BUILD)/bin | |
69 | LIB := $(BIN) | |
3164dff9 | 70 | OBJ := $(BUILD)/obj/$(SUBDIR) |
094a497d | 71 | DEP := $(OBJ) |
93bf083d | 72 | DOC := $(BUILD)/docs |
80948457 AL |
73 | PO := $(BUILD)/po |
74 | LOCALE := $(BUILD)/locale | |
75 | PO_DOMAINS := $(BUILD)/po/domains | |
094a497d AL |
76 | |
77 | # Module types | |
ac966541 | 78 | LIBRARY_H = $(BASE)/buildlib/library.mak |
a034d852 | 79 | DOCBOOK_H = $(BASE)/buildlib/docbook.mak |
ac966541 | 80 | MANPAGE_H = $(BASE)/buildlib/manpage.mak |
1164783d | 81 | PROGRAM_H = $(BASE)/buildlib/program.mak |
b2e465d6 | 82 | PYTHON_H = $(BASE)/buildlib/python.mak |
c3c459fc | 83 | COPY_H = $(BASE)/buildlib/copy.mak |
b01390ea | 84 | PO4A_MANPAGE_H = $(BASE)/buildlib/po4a_manpage.mak |
b2e465d6 | 85 | FAIL_H = $(BASE)/buildlib/fail.mak |
80948457 | 86 | PODOMAIN_H = $(BASE)/buildlib/podomain.mak |
094a497d | 87 | |
b0c76450 | 88 | include $(BUILD)/environment.mak |
f58a97d3 | 89 | |
e1b1ae50 AL |
90 | ifdef STATICLIBS |
91 | LIBRARY_H += $(BASE)/buildlib/staticlibrary.mak | |
92 | endif | |
93 | ||
c1a22377 AL |
94 | ifdef ONLYSTATICLIBS |
95 | LIBRARY_H = $(BASE)/buildlib/staticlibrary.mak | |
96 | endif | |
97 | ||
094a497d AL |
98 | # Source location control |
99 | # SUBDIRS specifies sub components of the module that | |
f30c4b6a | 100 | # may be located in subdirectories of the source dir. |
094a497d AL |
101 | # This should be declared before including this file |
102 | SUBDIRS+= | |
103 | ||
104 | # Header file control. | |
f30c4b6a | 105 | # TARGETDIRS indicates all of the locations that public headers |
094a497d AL |
106 | # will be published to. |
107 | # This should be declared before including this file | |
108 | HEADER_TARGETDIRS+= | |
109 | ||
110 | # Options | |
1164783d AL |
111 | CPPFLAGS+= -I$(INCLUDE) |
112 | LDFLAGS+= -L$(LIB) | |
094a497d | 113 | |
b2e465d6 | 114 | # Directors to create |
80948457 | 115 | MKDIRS := $(BIN) |
b2e465d6 | 116 | |
094a497d AL |
117 | # Phony rules. Other things hook these by appending to the dependency |
118 | # list | |
b2e465d6 | 119 | .PHONY: headers library clean veryclean all binary program doc dirs |
93641593 | 120 | .PHONY: maintainer-clean dist-clean distclean pristine sanity |
7c69574c | 121 | all: dirs binary doc |
094a497d | 122 | binary: library program |
9031a668 | 123 | maintainer-clean dist-clean distclean pristine sanity: veryclean |
a034d852 | 124 | startup headers library clean veryclean program test update-po manpages docbook: |
094a497d | 125 | |
f00ce0ae AL |
126 | veryclean: |
127 | echo Very Clean done for $(SUBDIR) | |
128 | clean: | |
129 | echo Clean done for $(SUBDIR) | |
b2e465d6 AL |
130 | dirs: |
131 | mkdir -p $(patsubst %/,%,$(sort $(MKDIRS))) | |
132 | ||
094a497d | 133 | # Header file control. We want all published interface headers to go |
f30c4b6a | 134 | # into the build directory from their source dirs. We setup some |
094a497d AL |
135 | # search paths here |
136 | vpath %.h $(SUBDIRS) | |
137 | $(INCLUDE)/%.h $(addprefix $(INCLUDE)/,$(addsuffix /%.h,$(HEADER_TARGETDIRS))) : %.h | |
138 | cp $< $@ | |
139 | ||
140 | # Dependency generation. We want to generate a .d file using gnu cpp. | |
141 | # For GNU systems the compiler can spit out a .d file while it is compiling, | |
142 | # this is specified with the INLINEDEPFLAG. Other systems might have a | |
f30c4b6a | 143 | # makedep program that can be called after compiling, that's illustrated |
094a497d AL |
144 | # by the DEPFLAG case. |
145 | # Compile rules are expected to call this macro after calling the compiler | |
62c96834 AL |
146 | ifdef GCC3DEP |
147 | DFILE = $(DEP)/$(basename $(@F)).d | |
148 | else | |
149 | DFILE = $(basename $(@F)).d | |
150 | endif | |
6f27a7fc | 151 | ifdef INLINEDEPFLAG |
094a497d | 152 | define DoDep |
62c96834 AL |
153 | sed -e "1s/.*:/$(subst /,\\/,$@):/" $(DFILE) > $(DEP)/$(@F).d |
154 | #sed -e "1s/.*:/$(subst /,\\/,$@):/" $(DEP)/$(basename $(@F)).d > $(DEP)/$(@F).d | |
094a497d AL |
155 | -rm -f $(basename $(@F)).d |
156 | endef | |
157 | else | |
158 | ifdef DEPFLAG | |
159 | define DoDep | |
160 | $(CXX) $(DEPFLAG) $(CPPFLAGS) -o $@ $< | |
e1b1ae50 | 161 | sed -e "1s/.*:/$(subst /,\\/,$@):/" $(basename $(@F)).d > $(DEP)/$(@F).d |
094a497d AL |
162 | -rm -f $(basename $(@F)).d |
163 | endef | |
164 | else | |
165 | define DoDep | |
166 | endef | |
167 | endif | |
168 | endif | |
f43579d1 | 169 | |
70fbac25 | 170 | # Automatic -j support |
f43579d1 AL |
171 | ifeq ($(NUM_PROCS),1) |
172 | PARALLEL_RUN=no | |
173 | endif | |
174 | ||
0cedc6b3 DK |
175 | ifndef PARALLEL_RUN |
176 | PARALLEL_RUN=yes | |
177 | export PARALLEL_RUN | |
178 | # handle recursion | |
179 | ifneq ($(NUM_PROCS),) | |
180 | MAKEFLAGS += -j $(NUM_PROCS) | |
181 | endif | |
182 | endif | |
be9dbd06 JAK |
183 | |
184 | # This makes sorting predictable | |
185 | export LC_COLLATE=C.UTF-8 |