Subversion Repositories DevTools

Rev

Rev 4728 | Rev 4949 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
227 dpurdie 1
###############################################################################
2
# File:     TOOLSET/gcc.rul[e]
3
# Contents: GCC rules
4
#
5
###############################################################################
6
 
7
###############################################################################
8
#..     Remove "undef" warnings
9
#
10
cc_includes	+=
11
cc_defines	+=
12
cxx_includes	+=
13
cxx_defines	+=
14
as_includes	+=
15
as_defines	+=
16
 
17
 
18
###############################################################################
19
#..     Toolset defaults
383 dpurdie 20
#           mkdepend is a lot faster that gcc
227 dpurdie 21
#
383 dpurdie 22
USE_GCCDEPEND	= 0
227 dpurdie 23
 
24
###############################################################################
25
#..     Parse user options
26
#       Global options already parsed
27
#       These options extend the global options
28
#
29
ifdef OPTIONS
30
 
31
ifneq "$(findstring purify,$(OPTIONS))" ""	# Enable purify
32
CC_PRE		+= purify
33
else
34
ifneq "$(findstring purecov,$(OPTIONS))" ""	# Enable pure coverage
35
CC_PRE		+= purecov
36
endif
37
endif
38
 
39
ifneq "$(findstring metrics,$(OPTIONS))" ""	# Build source metrixs
40
USE_METRICS	= 1
41
endif
42
 
43
ifneq "$(findstring checker,$(OPTIONS))" ""
44
USE_CHECKER	= 1
45
endif
46
 
47
ifneq "$(findstring profile,$(OPTIONS))" ""
48
USE_PROFILE	= 1
49
endif
50
 
51
ifneq "$(findstring ccdepend,$(OPTIONS))" ""	# Build depends using gcc
52
USE_GCCDEPEND	= 1
53
endif
54
ifneq "$(findstring gccdepend,$(OPTIONS))" ""
55
USE_GCCDEPEND	= 1
56
endif
57
ifneq "$(findstring mkdepend,$(OPTIONS))" ""
58
USE_GCCDEPEND	= 0
59
endif
60
 
61
ifneq "$(findstring wall,$(OPTIONS))" ""	# Enable all warnings
62
USE_WALL	= 1
63
endif
64
 
65
endif	#OPTIONS
66
 
67
###############################################################################
377 dpurdie 68
#..     C and C++ Compiler warning filter
69
#
70
cc_filter_name  := warnings.gcc
71
cc_filter	:= "$(notdir $(wildcard $(GBE_ROOT)/$(cc_filter_name)))"
72
 
73
ifeq ($(strip $(cc_filter)),"$(cc_filter_name)")
74
    cc_filter      := $(GBE_ROOT)/$(cc_filter_name)
75
else
76
    cc_filter  :=
77
endif
78
 
79
ifdef cc_filter
80
cc_redirect_stderr = 1
81
cc_error_filter = $(awk) -f $(cc_filter)
82
endif
83
 
84
###############################################################################
227 dpurdie 85
#..     C Compiler definition
86
#
87
 
88
	# Standard defines
89
	#
90
	#..
91
ifdef GCC_DEFINES
92
gcc_defines	+= $(GCC_DEFINES)
93
endif
94
 
95
gcc_defines	+= -D_REENTRANT
96
 
97
ifeq "$(DEBUG)" "1"
373 dpurdie 98
gcc_defines	+= -DDEBUG
227 dpurdie 99
else
100
gcc_defines	+=
101
endif
102
 
103
ifdef ALVL
104
gcc_defines	+= -DALVL=$(ALVL)
105
endif
106
 
107
ifdef DLVL
108
gcc_defines	+= -DDLVL=$(DLVL)
109
endif
110
 
111
gcc_defines	+= -D__SOURCE__=\"$(notdir $<)\"
112
 
113
	# Standard flags
114
	#
115
	#  -Wall implies:
116
	#       -Wimplicit, -Wreturn-type, -Wunused, -Wswitch
117
	#       -Wformat, -Wchar-subscripts, -Wparentheses
118
	#       -Wmissing-braces
119
	#..
120
gcc_flags	+= -c
121
gcc_flags	+= -Wall
122
ifdef USE_WALL
123
#gcc_flags	+= -Wuninitialized		# only makes sense with `-O'
124
gcc_flags	+= -Wwrite-strings
125
gcc_flags	+= -Wcast-qual
126
gcc_flags	+= -Wbad-function-cast
127
gcc_flags	+= -Wpointer-arith
128
gcc_flags	+= -Wstrict-prototypes
129
gcc_flags	+= -Wmissing-prototypes
130
gcc_flags	+= -Wmissing-declarations
131
gcc_flags	+= -Wnested-externs
132
gcc_flags	+= -Wtraditional
133
gcc_flags	+= -Wconversion
134
gcc_flags	+= -Wcomment
135
gcc_flags	+= -Wcast-align
136
#gcc_flags	+= -Winline
137
gcc_flags	+= -Wshadow
138
gcc_flags	+= -Wredundant-decls
4309 dpurdie 139
#gcc_flags	+= -Wid-clash-31
227 dpurdie 140
endif
141
 
142
ifdef GCC_CFLAGS
143
gcc_flags	+= $(GCC_CFLAGS)
144
endif
145
 
146
ifdef FORCE_C_COMPILE
147
endif
148
 
149
ifdef FORCE_CC_COMPILE
150
endif
151
 
152
ifdef USE_OPTIMISE				# default for production
153
else
154
endif
155
 
156
ifdef USE_DEBUGINFO				# default for debug
373 dpurdie 157
gcc_flags	+= -g3 -ggdb
227 dpurdie 158
else
373 dpurdie 159
gcc_flags	+= -g3 -ggdb
227 dpurdie 160
endif
161
 
162
ifeq "$(DEBUG)" "1"				# debug/prod specific
163
ifdef GCC_CFLAGSD
4034 dpurdie 164
gcc_flags	+= $(GCC_CFLAGSD)
227 dpurdie 165
endif
166
else
167
ifdef GCC_CFLAGSP
4034 dpurdie 168
gcc_flags	+= $(GCC_CFLAGSP)
227 dpurdie 169
endif
170
endif
171
 
172
ifdef USE_STRICT_ANSI				# default NO
173
gcc_flags	+= -ansi
174
endif
175
 
176
ifdef USE_PROFILE				# default NO
177
gcc_flags	+= -pg
178
endif
179
 
180
ifdef LEAVETMP					# default NO
181
gcc_flags	+= -save-temps
182
endif
183
 
4928 dpurdie 184
ifdef WARNINGS_AS_ERRORS
185
gcc_flags	+= -Werror
186
endif
187
 
227 dpurdie 188
SHCFLAGS	+= -fpic
189
SHCXXFLAGS	+= -fpic
190
 
191
	# Standard includes
192
	#
193
	#..
194
gcc_includes	+=
195
 
196
ifdef GCC_INCLUDES
197
gcc_includes	+= $(GCC_INCLUDES)
198
endif
199
 
200
	# Command
201
	#
202
	#..
203
ifdef USE_CHECKER
204
cc		= @checkergcc
205
else
206
cc		= $(CC_PRE) $(GCC_CC)
207
endif
208
cc_init		=
209
cc_o_switch	= -o $@
210
cc_source	= $<
211
cc_flags	= \
212
		$(patsubst %,%,$(CFLAGS)) \
213
		$(patsubst %,%,$(gcc_flags)) \
214
		$(patsubst %,%,$(gcc_defines)) \
215
		$(patsubst %,-D%,$(cc_defines)) \
216
		$(patsubst %,-I %,$(INCDIRS)) \
217
		$(patsubst %,-I %,$(cc_includes)) \
218
		$(patsubst %,-I %,$(gcc_includes))
219
cc_term		=
220
 
221
define cc_pre
222
	@echo [$<] compiling..
223
endef
224
 
225
ifdef USE_METRICS
226
define cc_post
227
	$(cc) -E $(cc_flags) $(cc_source) | mcstrip | cyclo -c > $(basename $@).met
228
endef
229
else
230
define cc_post
231
endef
232
endif
233
 
234
###############################################################################
235
#..     C/C++ dependencies
236
#
237
 
238
	# Additional defines
239
	#
240
	#..
241
gcc_depend	+=
242
 
243
ifeq ($(USE_GCCDEPEND),0)
244
	# Build GCC predefs and default include paths
245
	#..
246
GCC_MACHINE	=$(shell $(GCC_CC) -dumpmachine)
247
GCC_VERSION	=$(shell $(GCC_CC) -dumpversion)
248
 
249
gcc_depend	+= -D__GNUC__=$(word 1,$(subst .,$(space),$(GCC_VERSION)))
250
gcc_depend	+= -D__GNUC_MINOR__=$(word 2,$(subst .,$(space),$(GCC_VERSION)))
251
gcc_depend	+= -D__STDC__ -D__STDC_HOSTED__
252
 
253
ifdef GCC_TARGET
254
ifneq "$(findstring Linux,$(GCC_TARGET))" ""
255
gcc_depend	+= -Dunix -D__unix -D__unix__
256
gcc_depend	+= -Dlinux -D__linux -D__linux__
257
endif
258
ifneq "$(findstring i386,$(GCC_TARGET))" ""
259
gcc_depend	+= -Di386 -D__i386 -D__i386__
260
endif
261
ifneq "$(findstring armv4,$(GCC_TARGET))" ""
262
gcc_depend	+= -Darm -D__arm -D__arm__
263
gcc_depend	+= -D__ARM_ARCH__=4
264
endif
265
ifneq "$(findstring armv9,$(GCC_TARGET))" ""
266
gcc_depend	+= -Darm -D__arm -D__arm__
267
gcc_depend	+= -D__ARM_ARCH__=9
268
endif
269
 
270
endif
271
 
272
gcc_depend	+= -Y $(GCC_ROOT)/lib/gcc-lib/$(GCC_MACHINE)/$(GCC_VERSION)/include
273
gcc_depend	+= -Y $(GCC_ROOT)/include
274
endif
275
 
276
ifdef GCC_DEPEND
277
gcc_depend	+= $(GCC_DEPEND)
278
endif
279
 
280
	# Command
281
	#
282
	#..
283
ifeq ($(USE_GCCDEPEND),0)
367 dpurdie 284
ccdep		= $(XX_PRE) $(GBE_BIN)/mkdepend
227 dpurdie 285
ccdep_init	=
286
ccdep_o_switch	= -f -
287
ccdep_flags	= -MM -b -We -p '$$(OBJDIR)/' -o ".$(o)"
4538 dpurdie 288
ccdep_source	= $(filter %.c %.cc %.cpp, $+) > $(subst /,/,$@).tmp 2> $(OBJDIR)/depend.err
227 dpurdie 289
else
290
ccdep		= -$(XX_PRE) $(GCC_CC)
291
ccdep_init	=
292
ccdep_o_switch	=
293
ccdep_flags	= -E -MM -MG
294
ccdep_source	= $(filter %.c %.cc %.cpp, $+) > $(subst /,/,$@).tmp 2> $(OBJDIR)/depend.err
295
endif
296
 
297
ccdep_flags	+= \
298
		$(patsubst %,%,$(CFLAGS)) \
299
		$(patsubst %,%,$(gcc_depend)) \
300
		$(patsubst %,%,$(gcc_defines)) \
301
		$(patsubst %,-D%,$(cc_defines)) \
302
		$(patsubst %,-I %,$(INCDIRS)) \
303
		$(patsubst %,-I %,$(cc_includes))
304
 
305
ifeq ($(USE_GCCDEPEND),0)
306
ccdep_flags	+= \
307
		$(patsubst %,-Y %,$(gcc_includes))
308
endif
309
 
310
	#
311
	#   Parse the depend output:
312
	#
313
	#   s/^.*/\(.*\.${o}\:\)/$(OBJDIR)/\1/g
314
	#        replace all object rules which contain / seperated
315
	#        subdirs with a stripped prefixed object name.
316
	#
317
	#        eg. subdir/dir/object.o:        $(OBJDIR)/object.o
318
	#
319
	#   s/^\([^/].*\.${o}\:\)/$(OBJDIR)/\1/g
320
	#        prefix all object rules without subdirs.
321
	#
322
	#        eg. object.o:                   $(OBJDIR)/object.o
323
	#..
324
 
325
ccdep_pre	=
326
 
327
ccdep_sed	= \
328
	-sed -e 's/^.*\/\(.*\.${o}\:\)/\$$\(OBJDIR\)\/\1/g' \
329
	     -e 's/^\([^/]*\.${o}\:\)/\$$\(OBJDIR\)\/\1/g' \
330
		$(subst /,/,$@).tmp > $@ 2> $(OBJDIR)/depend.err;
331
ifdef SHNAMES
332
ccdep_sedsh	= \
333
	sed  -e 's/^.*\/\(.*\.${o}\:\)/\$$\(OBJDIR\)\/$(shname)\/\1/g' \
334
	     -e 's/^\([^/]*\.${o}\:\)/\$$\(OBJDIR\)\/$(shname)\/\1/g' \
335
		$(subst /,/,$@).tmp >> $@ 2>> $(OBJDIR)/depend.err;
336
ccdep_sed	+= \
337
		$(foreach shname,$(SHNAMES),$(ccdep_sedsh))
338
endif
339
 
340
ifndef LEAVETMP
341
define ccdep_post
342
	@$(ccdep_sed)
343
	@rm $(subst /,/,$@).tmp
344
endef
345
else
346
define ccdep_post
347
	@$(ccdep_sed)
348
endef
349
endif
350
 
351
#..     C++ Compiler definition
352
#
353
ifdef USE_CHECKER
354
cxx		= @checkergcc
355
else
356
cxx		= $(CC_PRE) $(GCC_CC)
357
endif
358
cxx_init	=
359
cxx_o_switch	= -o $@
360
cxx_source	= $<
361
cxx_flags	= \
362
		$(patsubst %,%,$(CXXFLAGS)) \
363
		$(patsubst %,%,$(gcc_flags)) \
364
		$(patsubst %,%,$(gcc_defines)) \
365
		$(patsubst %,-d%,$(cxx_defines)) \
366
		$(patsubst %,-I %,$(INCDIRS)) \
367
		$(patsubst %,-I %,$(cxx_includes)) \
368
		$(patsubst %,-I %,$(gcc_includes))
369
 
370
define cxx_pre
371
	@echo [$<] compiling..
372
endef
373
 
374
define cxx_post
375
endef
376
 
377
###############################################################################
378
#..     Assembler definition
379
#
380
 
381
#..     Assembler (GCC)
382
#
383
as		= $(CC_PRE) $(GCC_CC)
384
as_init		=
385
as_i_switch	= -I$(space)
386
as_o_switch	=
387
as_object	= -o $@
388
as_source	= $<
389
 
390
gas_flags	= -Wall -x assembler-with-cpp -c
391
ifeq "$(DEBUG)" "1"
392
gas_flags	+= -g -DDEBUG
393
endif
394
ifdef DLVL
395
gas_flags	+= -DDLVL=$(DLVL)
396
endif
397
ifdef ALVL
398
gas_flags	+= -DALVL=$(ALVL)
399
endif
400
as_defines	:= $(addprefix -D,$(as_defines))
401
as_defines	+= $(gas_flags)
402
 
403
as_flags	= \
251 dpurdie 404
		$(ASFLAGS) \
405
		$(as_defines) \
227 dpurdie 406
		$(patsubst %,$(as_i_switch)%,$(INCDIRS)) \
407
		$(patsubst %,$(as_i_switch)%,$(as_includes)) \
408
		$(as_object)
409
 
410
define as_pre
411
	@echo [$<] compiling..
412
endef
413
 
414
define as_post
415
endef
416
 
417
 
418
###############################################################################
419
#..     Archiver definition
420
#
421
 
422
#..     Archiver
423
#
424
ar		= $(XX_PRE) $(GCC_AR)
425
ar_o_switch	=
4034 dpurdie 426
ar_flags	= -scr $@ \
227 dpurdie 427
		$(patsubst %,%,$^)
428
 
429
define ar_pre
4034 dpurdie 430
	@echo [$@] Create archive..
227 dpurdie 431
endef
432
 
433
define ar_post
434
endef
435
 
436
#..     Archive Merge
437
#
438
armerge		= $(XX_PRE) $(GBE_TOOLS)/armerge
439
armerge_init	=
261 dpurdie 440
armerge_flags	= -d $(MLIBDIR) -t unix -a $(GCC_AR)
227 dpurdie 441
armerge_o_switch= $@ $^
442
 
443
armerge_pre	= -$(rm) -f $@
444
armerge_post	=
445
 
446
###############################################################################
447
#..     Linker definition
448
#
449
 
450
#..     Linked (shared library support)
451
#
452
#       The following are detailed within the context of TARGET definition:
453
#
454
#       SHNAME  Defines the shared library name (eg lib.so.1.1)
455
#       SHBASE  Defines the base library name (eg lib.so)
456
#
457
shld		= $(CC_PRE) $(GCC_CC)
458
shld_o_switch	= -o $@
459
 
460
shld_flags	+= -shared -fPIC
4034 dpurdie 461
shld_flags	+= -Wl,-z,defs,--warn-unresolved-symbols
227 dpurdie 462
shld_flags	+= -Xlinker -h'$(SHNAME)'
463
shld_flags	+= -Xlinker -Map '$(LIBDIR)/$(SHBASE).map'
464
 
465
ifeq "$(DEBUG)" "1"
466
shld_flags	+= -g
467
endif
468
shld_flags	+= \
469
		$(patsubst %,%,$(LDFLAGS)) \
4728 dpurdie 470
		$(patsubst %,%,$(GCC_LDFLAGS)) \
4518 dpurdie 471
		$(patsubst %,-L%,$(wildcard $(LIBDIRS))) \
227 dpurdie 472
		$($(notdir $(SHBASE))_shld)
473
 
474
define shld_pre
475
	@echo [$@] Linking shared library..; \
476
	$(touch) $(LIBDIR)/$(SHBASE).map
477
endef
478
 
479
define shld_post
480
endef
481
 
482
define SHLDDEPEND
341 dpurdie 483
	$(AA_PRE)export GCC_LIB; \
4518 dpurdie 484
		GCC_LIB="$(subst $(space),;,$(wildcard $(LIBDIRS)))"; \
335 dpurdie 485
	$(cmdfile) -wo$@ "@(vlibgcc,$(GCC_CC))$($(DPLIST))"
227 dpurdie 486
endef
487
 
488
 
489
#..     Linker
490
#
491
ifdef USE_CHECKER
492
ld		= @checkergcc
493
else
494
ld		= $(CC_PRE) $(GCC_CC)
495
endif
496
ld_init		=
497
ld_o_switch	= -o $@
498
 
499
ld_flags	+= -Xlinker -Map '$(basename $@).map'
500
 
501
ifeq "$(DEBUG)" "1"
502
ld_flags	+= -g
503
endif
504
ifdef USE_PROFILE
505
ld_flags	+= -pg
506
endif
507
 
508
ld_flags	+= \
509
		$(patsubst %,%,$(LDFLAGS)) \
4728 dpurdie 510
		$(patsubst %,%,$(GCC_LDFLAGS)) \
4518 dpurdie 511
		$(patsubst %,-L%,$(wildcard $(LIBDIRS))) \
512
		$(patsubst %,-Xlinker -rpath-link %,$(wildcard $(LIBDIRS))) \
227 dpurdie 513
		$($(notdir $(basename $@))_ld)
514
 
515
define ld_pre
516
	@echo [$@] Linking..; \
517
	$(touch) $(basename $@).map
518
endef
519
 
520
define ld_post
521
endef
522
 
523
define LDDEPEND
341 dpurdie 524
	$(AA_PRE)export GCC_LIB; \
4518 dpurdie 525
		GCC_LIB="$(subst $(space),;,$(wildcard $(LIBDIRS)))"; \
335 dpurdie 526
	$(cmdfile) -wo$@ "@(vlibgcc,$(GCC_CC))$($(DPLIST))"
227 dpurdie 527
endef
528
 
373 dpurdie 529
 
227 dpurdie 530
#
373 dpurdie 531
#   LDSTRIP
532
#       $1 - Full name of the ouput
533
#       $2 - Full name of debug file
534
define LDSTRIP
535
    $(GCC_OBJCOPY) --only-keep-debug $1 $2 || rm -f $1 $2
536
    $(GCC_OBJCOPY) --strip-debug $1 || rm -f $1 $2
537
    $(GCC_OBJCOPY) --add-gnu-debuglink=$2 $1 || rm -f $1 $2
538
 
539
endef