aboutsummaryrefslogtreecommitdiffstats
path: root/Makefile.rules
blob: 89c5fc113782b8fd1eabbd038bbd9f55905070db (plain)
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
#
# Asterisk -- A telephony toolkit for Linux.
# 
# Makefile rules
#
# Copyright (C) 2006-2008, Digium, Inc.
#
# Kevin P. Fleming <kpfleming@digium.com>
#
# This program is free software, distributed under the terms of
# the GNU General Public License
#

# Each command is preceded by a short comment on what to do.
# Prefixing one or the other with @\# or @ or nothing makes the desired
# behaviour. ECHO_PREFIX prefixes the comment, CMD_PREFIX prefixes the command.

-include $(ASTTOPDIR)/makeopts

.PHONY: dist-clean

# If 'make' decides to create intermediate files to satisfy a build requirement
# (like producing a .i from a .c), we want to keep them, so tell make to keep
# all intermediate files
.SECONDARY:

# extra cflags to build dependencies. Recursively expanded.
MAKE_DEPS=-MD -MT $@ -MF .$(subst /,_,$@).d -MP

ifeq ($(NOISY_BUILD),)
    ECHO_PREFIX=@
    CMD_PREFIX=@
else
    ECHO_PREFIX=@\# 
    CMD_PREFIX=
endif

OPTIMIZE?=-O6
ifneq ($(findstring darwin,$(OSARCH)),)
  ifeq ($(shell /usr/bin/sw_vers -productVersion | cut -c1-4),10.6)
    # Snow Leopard has an issue with this optimization flag on large files (like chan_sip)
    OPTIMIZE+=-fno-inline-functions
  endif
endif

ifeq ($(findstring DONT_OPTIMIZE,$(MENUSELECT_CFLAGS)),)
    _ASTCFLAGS+=$(OPTIMIZE)
else
    _ASTCFLAGS+=-O0
endif

# shortcuts for common combinations of flags; these must be recursively expanded so that
# per-target settings will be applied
CC_CFLAGS=$(PTHREAD_CFLAGS) $(_ASTCFLAGS) $(ASTCFLAGS)
CXX_CFLAGS=$(PTHREAD_CFLAGS) $(filter-out -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(AST_DECLARATION_AFTER_STATEMENT),$(_ASTCFLAGS) $(ASTCFLAGS))
CC_LDFLAGS_SO=$(PTHREAD_CFLAGS) $(_ASTLDFLAGS) $(SOLINK) $(ASTLDFLAGS)
CXX_LDFLAGS_SO=$(PTHREAD_CFLAGS) $(_ASTLDFLAGS) $(SOLINK) $(ASTLDFLAGS)
CC_LIBS=$(PTHREAD_LIBS) $(LIBS)
CXX_LIBS=$(PTHREAD_LIBS) $(LIBS)

# determine whether to double-compile so that the optimizer can report code path problems
# this is only done when developer mode and DONT_OPTIMIZE are both enabled
# in that case, we run the preprocessor to produce a .i or .ii file from the source
# code, then compile once with optimizer enabled (and the output to /dev/null),
# and if that doesn't fail then compile again with optimizer disabled
ifeq ($(findstring DONT_OPTIMIZE,$(MENUSELECT_CFLAGS))$(AST_DEVMODE),DONT_OPTIMIZEyes)
COMPILE_DOUBLE=yes
endif

%.o: %.s
	$(ECHO_PREFIX) echo "   [AS] $< -> $@"
ifeq ($(COMPILE_DOUBLE),yes)
	$(CMD_PREFIX) $(CC) -o /dev/null -c $< $(OPTIMIZE) $(CC_CFLAGS)
endif
	$(CMD_PREFIX) $(CC) -o $@ -c $< $(CC_CFLAGS)

%.o: %.i
	$(ECHO_PREFIX) echo "   [CCi] $< -> $@"
ifeq ($(COMPILE_DOUBLE),yes)
	$(CMD_PREFIX) $(CC) -o /dev/null -c $< $(OPTIMIZE) $(CC_CFLAGS)
endif
	$(CMD_PREFIX) $(CC) -o $@ -c $< $(CC_CFLAGS)

ifneq ($(COMPILE_DOUBLE),yes)
%.o: %.c
	$(ECHO_PREFIX) echo "   [CC] $< -> $@"
	$(CMD_PREFIX) $(CC) -o $@ -c $< $(MAKE_DEPS) $(CC_CFLAGS)
endif

%.i: %.c
	$(ECHO_PREFIX) echo "   [CPP] $< -> $@"
	$(CMD_PREFIX) $(CC) -o $@ -E $< $(MAKE_DEPS) $(CC_CFLAGS)

%.oo: %.ii
	$(ECHO_PREFIX) echo "   [CXXi] $< -> $@"
ifeq ($(COMPILE_DOUBLE),yes)
	$(CMD_PREFIX) $(CXX) -o /dev/null -c $< $(OPTIMIZE) $(CXX_CFLAGS)
endif
	$(CMD_PREFIX) $(CXX) -o $@ -c $< $(CXX_CFLAGS)

ifneq ($(COMPILE_DOUBLE),yes)
%.oo: %.cc
	$(ECHO_PREFIX) echo "   [CXX] $< -> $@"
	$(CMD_PREFIX) $(CXX) -o $@ -c $< $(MAKE_DEPS) $(CXX_CFLAGS)
endif

%.ii: %.cc
	$(ECHO_PREFIX) echo "   [CPP] $< -> $@"
	$(CMD_PREFIX) $(CXX) -o $@ -E $< $(MAKE_DEPS) $(CXX_CFLAGS)

%.so: %.o
	$(ECHO_PREFIX) echo "   [LD] $^ -> $@"
	$(CMD_PREFIX) $(CC) $(STATIC_BUILD) -o $@ $(CC_LDFLAGS_SO) $^ $(CC_LIBS)

%.so: %.oo
	$(ECHO_PREFIX) echo "   [LDXX] $^ -> $@"
	$(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(CXX_LDFLAGS_SO) $^ $(CXX_LIBS)

%.eo: %.o
	$(ECHO_PREFIX) echo "   [EMBED] $< -> $@"
	$(CMD_PREFIX) $(ASTTOPDIR)/build_tools/make_linker_eo_script $* > .$@.ld
	$(CMD_PREFIX) $(LD) -r -T .$@.ld -o $@ $<
	$(CMD_PREFIX) rm -f .$@.ld

%.eo: %.oo
	$(ECHO_PREFIX) echo "   [EMBED] $< -> $@"
	$(CMD_PREFIX) $(ASTTOPDIR)/build_tools/make_linker_eo_script $* > .$@.ld
	$(CMD_PREFIX) $(LD) -r -T .$@.ld -o $@ $<
	$(CMD_PREFIX) rm -f .$@.ld

%: %.o
	$(ECHO_PREFIX) echo "   [LD] $^ -> $@"
	$(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(PTHREAD_CFLAGS) $(_ASTLDFLAGS) $^ $(CXX_LIBS) $(ASTLDFLAGS)

dist-clean:: clean