build: Pass --fno-partial-inlining to third-party when appropriate
[asterisk/asterisk.git] / third-party / pjproject / Makefile
1 .PHONY: _all all _install install clean distclean echo_cflags configure
2
3 .NOTPARALLEL:
4
5 include ../versions.mak
6 export PJDIR := $(shell pwd -P)/source
7
8 SPECIAL_TARGETS :=
9
10 ifneq ($(findstring configure,$(MAKECMDGOALS))$(findstring echo_cflags,$(MAKECMDGOALS)),)
11 # Run from $(ASTTOPDIR)/configure
12     SPECIAL_TARGETS += configure
13 endif
14
15 ifeq ($(findstring echo_cflags,$(MAKECMDGOALS)),echo_cflags)
16     -include build.mak
17     ECHO_PREFIX=@\#
18 endif
19
20 ifeq ($(findstring clean,$(MAKECMDGOALS)),clean)
21 # clean or distclean
22     SPECIAL_TARGETS += clean
23 endif
24
25 ifeq ($(findstring uninstall,$(MAKECMDGOALS)),uninstall)
26     SPECIAL_TARGETS += uninstall
27 endif
28
29
30 ifneq ($(wildcard ../../makeopts),)
31     include ../../makeopts
32 endif
33
34 TARGETS = build.mak
35
36 ifeq ($(SPECIAL_TARGETS),)
37 # Run locally or from $(ASTTOPDIR)/Makefile.  All include files should be present
38     ifeq ($(wildcard ../../makeopts),)
39         $(error ASTTOPDIR/configure hasn't been run)
40     endif
41
42     ifeq ($(PJPROJECT_BUNDLED),yes)
43         ifneq ($(wildcard ../../menuselect.makeopts),)
44             include ../../menuselect.makeopts
45         else
46             $(warning ASTTOPDIR/menuselect hasn't been run yet.  Can't find debug options.)
47         endif
48                 include ../../Makefile.rules
49                 include ../Makefile.rules
50                 include Makefile.rules
51
52         all: _all
53         install: _install
54
55         include source/user.mak
56         include source/version.mak
57         include source/build.mak
58         CF := $(filter-out -W%,$(CC_CFLAGS))
59         CF := $(filter-out -I%,$(CF))
60         ifeq ($(AST_DEVMODE),yes)
61             apps := source/pjsip-apps/bin/pjsua-$(TARGET_NAME) source/pjsip-apps/bin/pjsystest-$(TARGET_NAME)
62             TARGETS += $(apps)
63             ifneq ($(PYTHONDEV_LIB),)
64                 TARGETS += source/pjsip-apps/src/python/_pjsua.so
65             endif
66             CF += -DPJPROJECT_BUNDLED_ASSERTIONS=yes
67         endif
68         MALLOC_DEBUG_LIBS = source/pjsip-apps/lib/libasterisk_malloc_debug.a
69         MALLOC_DEBUG_LDFLAGS = -L$(PJDIR)/pjsip-apps/lib -Wl,-whole-archive -lasterisk_malloc_debug -Wl,-no-whole-archive
70         TARGETS += pjproject.symbols
71     else
72         all install:
73     endif
74 else
75         include ../../Makefile.rules
76         include ../Makefile.rules
77         include Makefile.rules
78 endif
79
80 export PJ_CFLAGS := $(filter-out -O% -g%,$(PJ_CFLAGS))
81 export CFLAGS += $(CF)
82 export LDFLAGS += $(CC_LDFLAGS)
83
84 ECHO_PREFIX := $(ECHO_PREFIX) echo '[pjproject] '
85 SHELL_ECHO_PREFIX := echo '[pjproject] '
86
87 _all: $(TARGETS)
88
89 .DELETE_ON_ERROR:
90
91 $(DOWNLOAD_DIR)/$(TARBALL_FILE): ../versions.mak
92         $(CMD_PREFIX) ($(TARBALL_EXISTS) && $(TARBALL_VERIFY) && touch $@) || (rm -rf $@ ;\
93         $(TARBALL_DOWNLOAD)) || (rm -rf $@ ;\
94         $(SHELL_ECHO_PREFIX) Retrying download ; $(TARBALL_DOWNLOAD))
95
96 source/.unpacked: $(DOWNLOAD_DIR)/$(TARBALL_FILE)
97         $(CMD_PREFIX) $(TARBALL_VERIFY) || (rm -rf $@ ;\
98         $(SHELL_ECHO_PREFIX) Retrying download ; $(TARBALL_DOWNLOAD))
99         $(ECHO_PREFIX) Unpacking $<
100         -@rm -rf source pjproject-*/ >/dev/null 2>&1
101         $(CMD_PREFIX) $(TAR) -xjf $<
102         @mv pjproject-$(PJPROJECT_VERSION) source
103         $(ECHO_PREFIX) Applying patches "$(realpath patches)" "$(realpath .)/source"
104         $(CMD_PREFIX) ../apply_patches $(QUIET_CONFIGURE) "$(realpath patches)" "$(realpath .)/source"
105         -@touch source/.unpacked
106
107 source/version.mak: source/.unpacked
108
109 source/user.mak: source/.unpacked patches/user.mak
110         $(ECHO_PREFIX) Applying user.mak
111         $(CMD_PREFIX) cp -f patches/user.mak source/
112
113 source/pjlib/include/pj/%.h: patches/%.h
114         $(ECHO_PREFIX) Applying custom include file $<
115         $(CMD_PREFIX) cp -f $< source/pjlib/include/pj/
116
117 .rebuild_needed: $(wildcard ../../.lastclean)
118         $(ECHO_PREFIX) Rebuilding
119         $(CMD_PREFIX) $(MAKE) clean $(REALLY_QUIET)
120
121 source/build.mak: Makefile.rules source/version.mak source/user.mak $(addprefix source/pjlib/include/pj/,$(notdir $(wildcard patches/*.h))) .rebuild_needed
122         $(ECHO_PREFIX) Configuring with $(PJPROJECT_CONFIG_OPTS)
123         $(CMD_PREFIX) (cd source ; ./aconfigure $(QUIET_CONFIGURE) $(PJPROJECT_CONFIG_OPTS))
124
125 build.mak: source/build.mak
126         $(CMD_PREFIX) $(GREP) -v -e prefix -e "export PJ_SHARED_LIBRARIES" -e MACHINE_NAME \
127                 -e OS_NAME -e HOST_NAME -e CC_NAME -e CROSS_COMPILE -e LINUX_POLL $< > $@
128
129 configure: source/build.mak
130
131 # We need to filter-out any -O and -g options in PJ_CFLAGS before echoing out
132 # the result so Asterisk modules don't have the optimization and symbolic debug
133 # options overridden by the PJPROJECT configure script selected settings.
134 echo_cflags: source/build.mak
135         @echo $(filter-out -O% -g%,$(PJ_CFLAGS))
136
137 libpj%.a: source/build.mak
138         $(ECHO_PREFIX) Compiling lib $(@F)
139         $(CMD_PREFIX) $(MAKE) -C $(dir $(shell dirname $@))/build $(@F) $(REALLY_QUIET)
140
141 # pjsua needs resample and g711 to successfully run the testsuite
142 libresample%.a: source/build.mak
143         $(ECHO_PREFIX) Compiling lib $(@F)
144         $(CMD_PREFIX) $(MAKE) -C $(dir $(shell dirname $@))/build/resample all $(REALLY_QUIET)
145
146 # We need to compile pjlib, then pjlib-util, then the rest
147 # so we separate them out and create the dependencies
148 PJLIB_LIB_FILES = $(foreach lib,$(PJ_LIB_FILES),$(if $(findstring libpj-,$(lib)),$(lib),))
149 PJLIB_UTIL_LIB_FILES = $(foreach lib,$(PJ_LIB_FILES),$(if $(findstring libpjlib-util,$(lib)),$(lib),))
150 PJSIP_LIB_FILES = $(filter-out $(PJLIB_LIB_FILES) $(PJLIB_UTIL_LIB_FILES) $(APP_THIRD_PARTY_LIB_FILES),$(PJ_LIB_FILES))
151 ALL_LIB_FILES = $(PJLIB_LIB_FILES) $(PJLIB_UTIL_LIB_FILES) $(PJSIP_LIB_FILES)
152
153 $(PJLIB_UTIL_LIB_FILES): $(PJLIB_LIB_FILES)
154 $(PJSIP_LIB_FILES): $(PJLIB_UTIL_LIB_FILES)
155
156 pjproject.symbols: $(ALL_LIB_FILES)
157         $(ECHO_PREFIX) Generating symbols
158         $(CMD_PREFIX) $(NM) -Pog $(ALL_LIB_FILES) | $(SED) -n -r -e "s/.+: ([pP][jJ][^ ]+) .+/\1/gp" | sort -u > pjproject.symbols
159
160 source/pjsip-apps/src/asterisk_malloc_debug.c: patches/asterisk_malloc_debug.c
161         $(ECHO_PREFIX) Copying $< to $@
162         $(CMD_PREFIX) cp -f $< $@
163
164 source/pjsip-apps/lib/asterisk_malloc_debug.o: source/pjsip-apps/src/asterisk_malloc_debug.c .rebuild_needed
165         $(ECHO_PREFIX) Compiling asterisk debug malloc stubs
166         $(CMD_PREFIX) $(CC) -fPIC  $(PJ_CFLAGS) -c $< -o $@
167
168 source/pjsip-apps/lib/libasterisk_malloc_debug.a: source/pjsip-apps/lib/asterisk_malloc_debug.o
169         $(ECHO_PREFIX) Creating archive $(@F)
170         $(CMD_PREFIX) ar qs $@ $< >/dev/null 2>&1
171
172 $(apps): APP = $(filter pj%,$(subst -, ,$(notdir $@)))
173 $(apps): LDFLAGS += $(MALLOC_DEBUG_LDFLAGS)
174 $(apps): $(MALLOC_DEBUG_LIBS) pjproject.symbols $(APP_THIRD_PARTY_LIB_FILES)
175         $(ECHO_PREFIX) Compiling $(APP)
176         $(CMD_PREFIX) +$(MAKE) -C source/pjsip-apps/build $(filter pj%,$(subst -, ,$(notdir $@))) $(REALLY_QUIET)
177
178 source/pjsip-apps/src/python/_pjsua.o: source/pjsip-apps/src/python/_pjsua.c $(apps)
179         $(ECHO_PREFIX) Compiling python bindings
180         $(CMD_PREFIX) $(CC) -o $@ -c $< $(PYTHONDEV_INCLUDE) $(CFLAGS) $(PJ_CFLAGS)
181
182 source/pjsip-apps/src/python/_pjsua.so: LDFLAGS += $(MALLOC_DEBUG_LDFLAGS)
183 source/pjsip-apps/src/python/_pjsua.so: source/pjsip-apps/src/python/_pjsua.o
184         $(ECHO_PREFIX) Linking python bindings $(@F)
185         $(CMD_PREFIX) gcc -shared -pthread -o $@ $< $(LDFLAGS) $(PJ_LDFLAGS) $(APP_LDLIBS) $(PYTHONDEV_LIB) $(REALLY_QUIET)
186
187 _install: _all
188         @if [ ! -d "$(DESTDIR)$(ASTDATADIR)/third-party/pjproject" ]; then \
189                 $(INSTALL) -d "$(DESTDIR)$(ASTDATADIR)/third-party/pjproject"; \
190         fi;
191 ifneq ($(findstring source/pjsip-apps/bin/pjsua-$(TARGET_NAME),$(TARGETS)),)
192         $(ECHO_PREFIX) Installing apps
193         $(CMD_PREFIX) $(INSTALL) -m 755 source/pjsip-apps/bin/pjsua-$(TARGET_NAME) "$(DESTDIR)$(ASTDATADIR)/third-party/pjproject/pjsua"
194         $(CMD_PREFIX) $(INSTALL) -m 755 source/pjsip-apps/bin/pjsystest-$(TARGET_NAME) "$(DESTDIR)$(ASTDATADIR)/third-party/pjproject/pjsystest"
195 endif
196 ifneq ($(findstring _pjsua.so,$(TARGETS)),)
197         $(ECHO_PREFIX) Installing python bindings
198         $(CMD_PREFIX) $(INSTALL) -m 755 source/pjsip-apps/src/python/_pjsua.so "$(DESTDIR)$(ASTDATADIR)/third-party/pjproject/"
199         $(CMD_PREFIX) $(INSTALL) -m 644 source/pjsip-apps/src/python/pjsua.py "$(DESTDIR)$(ASTDATADIR)/third-party/pjproject/"
200 endif
201
202 uninstall:
203         $(ECHO_PREFIX) Uninstalling apps and python bindings
204         $(CMD_PREFIX) rm -rf "$(DESTDIR)$(ASTDATADIR)/third-party/pjproject"
205
206 clean:
207         $(ECHO_PREFIX) Cleaning
208         +-$(CMD_PREFIX) test -d source && ($(SUBMAKE) -C source clean || : ;\
209                 rm -rf source/pjsip-apps/bin/* || : ;\
210                 find source -name *.a | xargs rm -rf  ;\
211                 find source -name *.o | xargs rm -rf  ;\
212                 find source -name *.so  | xargs rm -rf ; ) || :
213         -$(CMD_PREFIX) rm -rf pjproject.symbols
214
215 distclean:
216         $(ECHO_PREFIX) Distcleaning
217         -$(CMD_PREFIX) rm -rf source pjproject.symbols pjproject-*.tar.bz2 build.mak .rebuild_needed