forked from maemo-leste/libdsme
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRules.make
271 lines (225 loc) · 7.9 KB
/
Rules.make
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
.PHONY: all_dependok clean depend all install local_install
#
# Default values
#
CC := gcc
# C++ suffix
CXX_SUFFIX := cxx
# Dynamic library version
LIBRARY_VERSION := 0.0.0
#
# Subdirectory variables
#
BUILD_SUBDIRS := $(addprefix _subbuild_,$(SUBDIRS))
INSTALL_SUBDIRS := $(addprefix _subinstall_,$(SUBDIRS))
CLEAN_SUBDIRS := $(addprefix _subclean_,$(SUBDIRS))
DEPEND_SUBDIRS := $(addprefix _subdepend_,$(SUBDIRS))
DISTCLN_SUBDIRS += $(addprefix _distclean_,$(SUBDIRS))
.PHONY: $(BUILD_SUBDIRS) $(INSTALL_SUBDIRS) $(CLEAN_SUBDIRS) $(DEPEND_SUBDIRS) $(DISTCLN_SUBDIRS)
#
# Complete library names
#
C_A_LIBS := $(addsuffix .a,$(A_LIBRARIES))
C_SO_LIBS := $(addsuffix .so,$(SO_LIBRARIES))
vpath %.so $(LD_LIBPATHS)
vpath %.a $(LD_LIBPATHS)
#
# C(XX)FLAGS and MKDEP_C(XX)FLAGS (make depend)
#
# Don't try to optimize this, especially do not try single CFLAGS definition
# and conditional assignment OPTFLAGS = DBGFLAGS. It would break overrides.
# CFLAGS may not be immediately evaluated for same reason.
#
ifndef DEBUG
CFLAGS = $(C_GENFLAGS) $(C_EXTRA_GENFLAGS) \
$(C_OPTFLAGS) $(C_EXTRA_OPTFLAGS) \
$(addprefix -I,$(C_INCDIRS)) \
$(addprefix -I,$(C_EXTRA_INCDIRS)) \
$(addprefix -D,$(C_DEFINES)) \
$(addprefix -D,$(C_EXTRA_DEFINES))
CXXFLAGS = $(CXX_GENFLAGS) $(CXX_EXTRA_GENFLAGS) \
$(CXX_OPTFLAGS) $(CXX_EXTRA_OPTFLAGS) \
$(addprefix -I,$(CXX_INCDIRS)) \
$(addprefix -I,$(CXX_EXTRA_INCDIRS)) \
$(addprefix -D,$(CXX_DEFINES)) \
$(addprefix -D,$(CXX_EXTRA_DEFINES))
else
CFLAGS = $(C_GENFLAGS) $(C_EXTRA_GENFLAGS) \
$(C_DBGFLAGS) $(C_EXTRA_DBGFLAGS) \
$(addprefix -I,$(C_INCDIRS)) \
$(addprefix -I,$(C_EXTRA_INCDIRS)) \
$(addprefix -D,$(C_DEFINES)) \
$(addprefix -D,$(C_EXTRA_DEFINES))
CXXFLAGS = $(CXX_GENFLAGS) $(CXX_EXTRA_GENFLAGS) \
$(CXX_DBGFLAGS) $(CXX_EXTRA_DBGFLAGS) \
$(addprefix -I,$(CXX_INCDIRS)) \
$(addprefix -I,$(CXX_EXTRA_INCDIRS)) \
$(addprefix -D,$(CXX_DEFINES)) \
$(addprefix -D,$(CXX_EXTRA_DEFINES))
endif
MKDEP_CFLAGS = $(addprefix -I,$(C_INCDIRS)) \
$(addprefix -I,$(C_EXTRA_INCDIRS)) \
$(MKDEP_INCFLAGS) \
$(addprefix -D,$(C_DEFINES)) \
$(addprefix -D,$(C_EXTRA_DEFINES))
MKDEP_CXXFLAGS = $(addprefix -I,$(CXX_INCDIRS)) \
$(addprefix -I,$(CXX_EXTRA_INCDIRS)) \
$(addprefix -D,$(CXX_DEFINES)) \
$(addprefix -D,$(CXX_EXTRA_DEFINES))
LDFLAGS = $(LD_GENFLAGS) $(LD_EXTRA_GENFLAGS) \
$(addprefix -L,$(LD_LIBPATHS)) \
$(addprefix -L,$(LD_EXTRA_LIBPATHS))
#
# All object files
#
C_OBJS := $(sort $(foreach BINARY, $(BINARIES) $(A_LIBRARIES) $(SO_LIBRARIES), $($(BINARY)_C_OBJS)))
CXX_OBJS := $(sort $(foreach BINARY, $(BINARIES) $(A_LIBRARIES) $(SO_LIBRARIES), $($(BINARY)_CXX_OBJS)))
ASM_OBJS := $(sort $(foreach BINARY, $(BINARIES) $(A_LIBRARIES) $(SO_LIBRARIES), $($(BINARY)_ASM_OBJS)))
OBJS := $(C_OBJS) $(CXX_OBJS) $(ASM_OBJS)
#
# Source files
#
C_SRCS := $(C_OBJS:.o=.c)
CXX_SRCS := $(CXX_OBJS:.o=.$(CXX_SUFFIX))
ASM_SRCS := $(ASM_OBJS:.o=.S)
SRCS := $(C_SRCS) $(CXX_SRCS) $(ASM_SRCS)
#
# Helper variable, not to be expanded here. Used to manage target dependencies.
#
TARGET_OBJS = $($(1)_C_OBJS) $($(1)_CXX_OBJS) $($(1)_ASM_OBJS)
TARGET_NONSTD_LIBS = $(patsubst %,lib%.so,$($(1)_SO_LIBS)) \
$(patsubst %,lib%.a,$($(1)_A_LIBS))
#
# "make all" targets
#
BUILD_TARGETS := $(BINARIES) \
$(C_A_LIBS) \
$(C_SO_LIBS) \
$(BUILD_SUBDIRS)
#
# Depend is built recursively so possible overrides affect results properly
# Use different .depend file for debug/nondebug
#
ifdef DEBUG
DEPENDNAME := .depend-debug
else
DEPENDNAME := .depend
endif
#
# Targets
#
# all: make sure .depend is up to date, then recursively do real work
all: $(DEPENDNAME)
@$(MAKE) --no-print-directory all_dependok
all_dependok: $(BUILD_TARGETS)
@true
install: $(DEPENDNAME)
@$(MAKE) --no-print-directory install_dependok
install_dependok: $(INSTALL_BINARIES) $(INSTALL_A_LIBRARIES) \
$(INSTALL_SO_LIBRARIES) $(INSTALL_OTHER)
@$(MAKE) --no-print-directory install_targetsok INSTALLING=x
ifdef INSTALL_SUBDIRS
@$(MAKE) $(INSTALL_SUBDIRS)
else
@true
endif
install_targetsok: $(INSTALL_BINARIES) $(INSTALL_A_LIBRARIES) \
$(INSTALL_SO_LIBRARIES) $(INSTALL_INCLUDES) \
$(INSTALL_OTHER) local_install
@true
# clean: clean up in subdirectories, then delete targets and intermediates
clean: $(CLEAN_SUBDIRS)
rm -f $(BINARIES) $(C_A_LIBS) $(addsuffix *,$(C_SO_LIBS)) $(OBJS)
# distclean: clean and rinse in subdirectiories, then locally.
distclean: $(DISTCLN_SUBDIRS)
rm -f $(BINARIES) $(C_A_LIBS) $(addsuffix *,$(C_SO_LIBS)) $(OBJS) $(DISTCLEAN_FILES) .depend .depend-debug
ifdef DISTCLEAN_DIRS
rm -rf $(DISTCLEAN_DIRS)
endif
# Subdirectory rules
$(BUILD_SUBDIRS):
@echo Building in directory $(patsubst _subbuild_%, %, $@)...
@$(MAKE) --no-print-directory -C $(patsubst _subbuild_%, %, $@)
$(INSTALL_SUBDIRS):
@echo Installing in directory $(patsubst _subinstall_%, %, $@)...
@$(MAKE) --no-print-directory -C $(patsubst _subinstall_%, %, $@) install
$(CLEAN_SUBDIRS):
@echo Cleaning in directory $(patsubst _subclean_%, %, $@)...
@$(MAKE) --no-print-directory -C $(patsubst _subclean_%, %, $@) clean
$(DEPEND_SUBDIRS):
@echo Depend in directory $(patsubst _subdepend_%, %, $@)...
@$(MAKE) -o $(DEPENDNAME) --no-print-directory -C $(patsubst _subdepend_%, %, $@) depend
$(DISTCLN_SUBDIRS):
@echo Distcleaning in directory $(patsubst _distclean_%, %, $@)...
@$(MAKE) --no-print-directory -C $(patsubst _distclean_%, %, $@) distclean
# Common rule for all executables
ifndef INSTALLING
$(BINARIES):
$(CC) -o $@ $(LDFLAGS) $(call TARGET_OBJS,$@) $(addprefix -l,$($@_SO_LIBS) $($@_A_LIBS) $($@_LIBS))
endif
# Common rule for all static libraries
ifndef INSTALLING
$(C_A_LIBS):
$(AR) rf $@ $^
endif
# Common rule for all dynamic libraries
$(C_SO_LIBS):
ifndef INSTALLING
$(CC) -o $@.$(LIBRARY_VERSION) $(LD_GENFLAGS) -fPIC -shared -Wl,-soname -Wl,$@.$(LIBRARY_VERSION) $(addprefix -l,$($(patsubst %.so,%,$@)_SO_LIBS)) $($(patsubst %.so,%,$@)_EXTRA_LDFLAGS) $^
ln -sf $@.$(LIBRARY_VERSION) $@
else
@install -d $(INSTALL_DIR)
install -m $(INSTALL_PERM) -o $(INSTALL_OWNER) -g $(INSTALL_GROUP) $@.$(LIBRARY_VERSION) $(INSTALL_DIR)
ln -sf $@.$(LIBRARY_VERSION) $(INSTALL_DIR)/$@
endif
# Other (install) rules
ifdef INSTALLING
.PHONY: $(INSTALL_BINARIES) $(INSTALL_A_LIBRARIES) $(INSTALL_INCLUDES) $(INSTALL_OTHER) $(INSTALL_SO_LIBRARIES)
$(INSTALL_BINARIES) $(INSTALL_A_LIBRARIES) $(INSTALL_INCLUDES) $(INSTALL_OTHER):
@install -d $(INSTALL_DIR)
install -m $(INSTALL_PERM) -o $(INSTALL_OWNER) -g $(INSTALL_GROUP) $@ $(INSTALL_DIR)
endif
# Common rule for all C-files. (Note: CFLAGS is evaluated for each target
# separetely.)
.c.o:
$(CC) -c -o $@ $(CFLAGS) $<
# Common rule for all C++-files. (Note: CXXFLAGS is evaluated for each target
# separetely.)
.$(CXX_SUFFIX).o:
$(CXX) -c -o $@ $(CXXFLAGS) $<
# .depend and .depend-debug
$(DEPENDNAME) depend: Makefile $(TOPDIR)/Rules.make
@rm -f $(DEPENDNAME)
@touch $(DEPENDNAME)
ifneq "" "$(C_OBJS)$(CXX_OBJS)"
@$(MAKE) -o $(DEPENDNAME) --no-print-directory LOCAL_DEPEND=$(DEPENDNAME) $(C_OBJS) $(CXX_OBJS) $(DEPEND_SUBDIRS)
endif
ifneq "" "$(BINARIES)"
@echo -e $(foreach BINARY,$(BINARIES),"\n"$(BINARY): $(call TARGET_OBJS,$(BINARY)) $(call TARGET_NONSTD_LIBS,$(BINARY))) >> $(DEPENDNAME)
endif
ifneq "" "$(A_LIBRARIES)"
@echo -e $(foreach LIB,$(A_LIBRARIES),"\n"$(LIB).a: $(call TARGET_OBJS,$(LIB))) >> $(DEPENDNAME)
endif
ifneq "" "$(SO_LIBRARIES)"
@echo -e $(foreach LIB,$(SO_LIBRARIES),"\n"$(LIB).so: $(call TARGET_OBJS,$(LIB))) >> $(DEPENDNAME)
endif
ifdef LOCAL_DEPEND
.PHONY: $(C_OBJS) $(CXX_OBJS)
$(C_OBJS): %.o: %.c
@$(CC) >> $(LOCAL_DEPEND) -M $(MKDEP_CFLAGS) $<
$(CXX_OBJS): %.o: %.$(CXX_SUFFIX)
@$(CXX) >> $(LOCAL_DEPEND) -M $(MKDEP_CXXFLAGS) $<
endif
ifeq ($(DEPENDNAME), $(wildcard $(DEPENDNAME)))
include $(DEPENDNAME)
endif
#
# Variables for sub-makes
#
export CC CXX LD AR MAKE
export CXX_SUFFIX
export C_GENFLAGS C_OPTFLAGS C_DBGFLAGS C_DEFINES C_INCDIRS
export LD_GENFLAGS LD_LIBPATHS
export TOPDIR
export DEBUG
unexport LOCAL_DEPEND INSTALLING