[pulseaudio-discuss] [PATCH] build-sys: Add an Android-friendly build system

Arun Raghavan arun.raghavan at collabora.co.uk
Sun Sep 29 05:22:17 PDT 2013


Some notes:

* This depends on 'androgenizer', a tool to generate Android-style
  Android.mk files from an autotools build system.

* This assumes that PA is run as the system daemon and configures
  accordingly.

* In the Android build, libltdl is likely not available when configure
  is being run, and we know it will be so the check is manually
  overridden.

* NEON support needs to be communicated from an upper-level Android.mk.

* rpaths don't work on Android - you need LD_LIBRARY_PATH set.

* Configuration files for /etc/pulse are shipped out of tree, since they
  vary from device to device.

* The original patch was massive and ugly, but thanks Pekka Paalanen's
  work on Weston to break out common androgenizer snippets, we could
  greatly decrease the size of the Android-specific elements.

* Since we don't use libtool for linking, we need to work around some
  symbol definition problems that turn up. This is done in a separate
  file (pulseaudio-android-symdef.c). More information about this at:
  http://www.sourceware.org/autobook/autobook/autobook_173.html (the
  example snippet needs some fixing to work with current libtool).
---
 Android.mk                             |  94 +++++++++++++++++++++++
 src/Makefile.am                        | 135 +++++++++++++++++++++++++++++++++
 src/daemon/pulseaudio-android.symdef.c |   6 ++
 3 files changed, 235 insertions(+)
 create mode 100644 Android.mk
 create mode 100644 src/daemon/pulseaudio-android.symdef.c

diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..cf05c63
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,94 @@
+# Top-level Makefile for Android
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+pulseaudio_TOP := $(LOCAL_PATH)
+
+PA_BUILT_SOURCES := src/Android.mk
+
+PA_BUILT_SOURCES := $(patsubst %, $(abspath $(pulseaudio_TOP))/%, $(PA_BUILT_SOURCES))
+
+CONFIGURE_CFLAGS += -I$(PULSEAUDIO_TOP)/libtool/libltdl
+
+SPEEX_CFLAGS := -Iexternal/speex/include
+SPEEX_LIBS := -lspeexresampler
+
+# We have to explicitly enable or disable NEON support
+ifeq ($(PA_ENABLE_NEON),yes)
+CONFIGURE_NEON := enable
+else
+CONFIGURE_NEON := disable
+endif
+
+.PHONY: pulseaudio-configure
+
+pulseaudio-configure:
+	echo $(PA_BUILT_SOURCES)
+	cd $(pulseaudio_TOP) ; \
+	CC="$(CONFIGURE_CC)" \
+	CFLAGS="$(CONFIGURE_CFLAGS)" \
+	CXX="$(CONFIGURE_CXX)" \
+	CXXFLAGS="$(CONFIGURE_CXXFLAGS)" \
+	LD="$(TARGET_LD)" \
+	LDFLAGS="$(CONFIGURE_LDFLAGS)" \
+	CPP="$(CONFIGURE_CPP)" \
+	CPPFLAGS="$(CONFIGURE_CPPFLAGS)" \
+	CXXCPP="$(CONFIGURE_CXXCPP)" \
+	CXXCPPFLAGS="$(CONFIGURE_CXXCPPFLAGS)" \
+	PKG_CONFIG_LIBDIR="$(CONFIGURE_PKG_CONFIG_LIBDIR)" \
+	PKG_CONFIG_TOP_BUILD_DIR="/" \
+	LIBSPEEX_CFLAGS="$(SPEEX_CFLAGS)" LIBSPEEX_LIBS="$(SPEEX_LIBS)" \
+	ac_cv_header_sys_un_h=yes \
+	ac_cv_lib_ltdl_lt_dladvise_init=yes \
+	$(abspath $(pulseaudio_TOP))/$(CONFIGURE) --host=$(CONFIGURE_HOST) \
+	--prefix=/system \
+	--localstatedir=/data/pulse \
+	--disable-nls \
+	--$(CONFIGURE_NEON)-neon-opt \
+	--disable-largefile \
+	--disable-rpath \
+	--disable-x11 \
+	--disable-samplerate \
+	--disable-oss-output \
+	--disable-oss-wrapper \
+	--disable-coreaudio-output \
+	--enable-alsa \
+	--disable-esound \
+	--disable-solaris \
+	--disable-waveout \
+	--disable-glib2 \
+	--disable-gconf \
+	--disable-avahi \
+	--disable-jack \
+	--disable-asyncns \
+	--disable-tcpwrap \
+	--disable-lirc \
+	--disable-dbus \
+	--disable-bluez \
+	--disable-udev \
+	--disable-hal-compat \
+	--disable-ipv6 \
+	--disable-openssl \
+	--disable-orc \
+	--disable-manpages \
+	--enable-per-user-esound-socket \
+	--disable-webrtc-aec \
+	--disable-default-build-tests \
+	--disable-legacy-database-entry-format \
+	--disable-static-bins \
+	--disable-force-preopen \
+	--without-caps \
+	--with-database=simple \
+	--without-fftw \
+	--with-system-user=root \
+	--with-system-group=root \
+	&& \
+	for file in $(PA_BUILT_SOURCES); do \
+		rm -f $$file && \
+		make -C $$(dirname $$file) $$(basename $$file) ; \
+	done
+
+PA_CONFIGURE_TARGETS += pulseaudio-configure
+
+-include $(pulseaudio_TOP)/src/Android.mk
diff --git a/src/Makefile.am b/src/Makefile.am
index 9d96a9b..c9ca042 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -2167,3 +2167,138 @@ coverage:
 endif
 
 .PHONY: massif update-all update-ffmpeg update-map-file coverage
+
+# Android build targets
+
+ANDROID_CFLAGS = -std=c99 -I$(top_srcdir) -DHAVE_CONFIG_H
+
+myvalue = $($(subst .,_,$(subst -,_,$(1)))_$(2))
+myvalue_p = $($(1)_$(subst .,_,$(subst -,_,$(2)))_$(3))
+empty :=
+slash := $(empty)\$(empty)
+
+define executables
+$(foreach myexec,$(1),	$(slash)
+	-:EXECUTABLE $(myexec) $(slash)
+	-:TAGS eng debug $(slash)
+	-:SOURCES $(call myvalue,$(myexec),SOURCES) $(call myvalue_p,nodist,$(myexec),SOURCES) $(slash)
+	-:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(call myvalue,$(myexec),CFLAGS) $(slash)
+	-:LDFLAGS $(call myvalue,$(myexec),LDFLAGS) $(call myvalue,$(myexec),LDADD) $(slash)
+	-:PASSTHROUGH 'LOCAL_ARM_MODE := arm' $(slash)
+	$(slash)
+)
+endef
+
+define modlibs
+$(foreach mymod,$(1),	$(slash)
+	-:SHARED $(mymod:%.la=%) $(slash)
+	-:TAGS eng debug $(slash)
+	-:SOURCES $(call myvalue,$(mymod),SOURCES) $(call myvalue_p,nodist,$(mymod),SOURCES) $(slash)
+	-:CFLAGS $(DEFS) $(AM_CPPFLAGS) $(ANDROID_CFLAGS) $(call myvalue,$(mymod),CFLAGS) $(slash)
+	-:LDFLAGS $(call myvalue,$(mymod),LDFLAGS) $(call myvalue,$(mymod),LIBADD) $(slash)
+	-:PASSTHROUGH 'LOCAL_ARM_MODE := arm' $(slash)
+	-:PASSTHROUGH 'LOCAL_MODULE_PATH := $$(PRODUCT_OUT)$(modlibexecdir)' $(slash)
+)
+endef
+
+if HAVE_NEON
+neon_libs := pulsecore_sconv_neon pulsecore_mix_neon
+androgenizer_neon = \
+		-:STATIC libpulsecore_sconv_neon \
+		-:TAGS eng debug \
+		-:SOURCES $(libpulsecore_sconv_neon_la_SOURCES) $(nodist_libpulsecore_sconv_neon_la_SOURCES) \
+		-:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(libpulsecore_sconv_neon_la_CFLAGS) \
+		-:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+		\
+		-:STATIC libpulsecore_mix_neon \
+		-:TAGS eng debug \
+		-:SOURCES $(libpulsecore_mix_neon_la_SOURCES) $(nodist_libpulsecore_mix_neon_la_SOURCES) \
+		-:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(libpulsecore_mix_neon_la_CFLAGS) \
+		-:PASSTHROUGH LOCAL_ARM_MODE:=arm
+else
+neon_libs :=
+androgenizer_neon :=
+endif
+
+ANDROID_MODLIBS := 		\
+    libcli.la 			\
+    libprotocol-cli.la		\
+    libprotocol-simple.la	\
+    libprotocol-http.la		\
+    libprotocol-native.la	\
+    librtp.la			\
+    libalsa-util.la
+
+ANDROID_MODULES := 			\
+    module-alsa-card.la			\
+    module-alsa-sink.la			\
+    module-alsa-source.la		\
+    module-null-sink.la			\
+    module-null-source.la		\
+    module-cli.la			\
+    module-native-protocol-unix.la	\
+    module-native-protocol-tcp.la	\
+    module-http-protocol-tcp.la		\
+    module-intended-roles.la		\
+    module-default-device-restore.la	\
+    module-rescue-streams.la		\
+    module-always-sink.la		\
+    module-suspend-on-idle.la		\
+    module-tunnel-sink.la		\
+    module-tunnel-source.la
+
+ANDROID_EXECUTABLES :=	\
+    pactl		\
+    pacmd		\
+    pacat		\
+    pasuspender
+
+# We make all the modules, libs and executables a dependency of the pulseaudio
+# executable to provide 'pulseaudio' as a quick rebuild target for everything
+# in this source tree.
+Android.mk: Makefile.am $(BUILT_SOURCES)
+	androgenizer -:PROJECT pulseaudio \
+		-:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+		-:SHARED libpulsecore- at PA_MAJORMINOR@ \
+		-:TAGS eng debug \
+		-:SOURCES $(libpulsecore_ at PA_MAJORMINOR@_la_SOURCES) $(nodist_libpulsecore_ at PA_MAJORMINOR@_la_SOURCES) \
+		-:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(libpulsecore_ at PA_MAJORMINOR@_la_CFLAGS) \
+		-:LDFLAGS $(libpulsecore_ at PA_MAJORMINOR@_la_LDFLAGS) $(libpulsecore_ at PA_MAJORMINOR@_la_LIBADD) \
+		-:LIBFILTER_STATIC pulsecore-foreign $(neon_libs) \
+		-:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+		\
+		-:SHARED libpulsecommon- at PA_MAJORMINOR@ \
+		-:TAGS eng debug \
+		-:SOURCES $(libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES) $(nodist_libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES) \
+		-:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(libpulsecommon_ at PA_MAJORMINOR@_la_CFLAGS) \
+		-:LDFLAGS $(libpulsecommon_ at PA_MAJORMINOR@_la_LDFLAGS) $(libpulsecommon_ at PA_MAJORMINOR@_la_LIBADD) \
+		-:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+		\
+		-:STATIC libpulsecore-foreign \
+		-:TAGS eng debug \
+		-:SOURCES $(libpulsecore_foreign_la_SOURCES) $(nodist_libpulsecore_foreign_la_SOURCES) \
+		-:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(libpulsecore_foreign_la_CFLAGS) \
+		-:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+		\
+		$(androgenizer_neon) \
+		\
+		-:SHARED libpulse \
+		-:TAGS eng debug \
+		-:SOURCES $(libpulse_la_SOURCES) $(nodist_libpulse_la_SOURCES) \
+		-:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(libpulse_la_CFLAGS) \
+		-:LDFLAGS $(libpulse_la_LDFLAGS) $(libpulse_la_LIBADD) \
+		-:HEADER_TARGET pulse \
+		-:HEADERS $(pulseinclude_HEADERS) \
+		-:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+		\
+		-:EXECUTABLE pulseaudio \
+		-:TAGS eng debug \
+		-:SOURCES $(pulseaudio_SOURCES) $(nodist_libpulseaudio_SOURCES) \
+			  daemon/pulseaudio-android.symdef.c \
+		-:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(pulseaudio_CFLAGS) \
+		-:LDFLAGS $(pulseaudio_LDFLAGS) $(pulseaudio_LDADD) \
+		-:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+		-:PASSTHROUGH LOCAL_REQUIRED_MODULES:='$(foreach m,$(ANDROID_MODLIBS) $(ANDROID_MODULES),$(subst .la,,$(m))) $(ANDROID_EXECUTABLES)' \
+		$(call executables,$(ANDROID_EXECUTABLES)) \
+		$(call modlibs,$(ANDROID_MODLIBS) $(ANDROID_MODULES)) \
+	> $@
diff --git a/src/daemon/pulseaudio-android.symdef.c b/src/daemon/pulseaudio-android.symdef.c
new file mode 100644
index 0000000..643de5c
--- /dev/null
+++ b/src/daemon/pulseaudio-android.symdef.c
@@ -0,0 +1,6 @@
+#include <ltdl.h>
+
+const lt_dlsymlist lt_preloaded_symbols[] = {
+    { "@PROGRAM@", 0 },
+    { 0, 0 }
+};
-- 
1.8.3.1



More information about the pulseaudio-discuss mailing list