make pulseaudio an optional dependency, follow best practices

For my thoughts about optional dependencies, see
https://michael.stapelberg.ch/posts/2019-05-23-optional-dependencies/

This commit follows the best practices outlined in that article:

1. The travis config was modified to verify both code paths build and link/don’t
   link against pulseaudio.

2. If pulseaudio is missing, the build fails until packagers explicitly pass a
   --disable flag. In practice, I think the only situation when this flag should
   be set is in source-based linux distributions where users can express
   package-level compilation preferences (e.g. Gentoo USE flags).

3. The --version output now reflects the status of the optional dependency.

fixes #359
This commit is contained in:
Michael Stapelberg 2019-07-29 20:57:48 +02:00
parent 40aeb7bc44
commit 23da59920c
4 changed files with 26 additions and 14 deletions

View File

@ -22,5 +22,6 @@ addons:
script: script:
- clang-format-3.8 -i $(find . -name "*.[ch]" | tr '\n' ' ') && git diff --exit-code || (echo 'Code was not formatted using clang-format!'; false) - clang-format-3.8 -i $(find . -name "*.[ch]" | tr '\n' ' ') && git diff --exit-code || (echo 'Code was not formatted using clang-format!'; false)
# TODO: re-enable sanitizers once issues are fixed # TODO: re-enable sanitizers once issues are fixed
- autoreconf -fi && mkdir -p build && cd build && (../configure --disable-sanitizers || (cat config.log; false)) && make -j V=1 - autoreconf -fi && mkdir -p build && cd build && (../configure --disable-sanitizers || (cat config.log; false)) && make -j 8 V=1 && ldd ./i3status |& grep -q pulse || (echo "not linked against pulseaudio"; exit 1)
- make -j check V=1 || (cat test-suite.log; false) - make clean && (../configure --disable-sanitizers --disable-pulseaudio || (cat config.log; false)) && make -j 8 V=1 && ldd ./i3status |& grep -q pulse && (echo "linked against pulseaudio"; exit 1) || true
- make -j 8 check V=1 || (cat test-suite.log; false)

View File

@ -80,25 +80,29 @@ AC_CANONICAL_HOST
PKG_CHECK_MODULES([CONFUSE], [libconfuse]) PKG_CHECK_MODULES([CONFUSE], [libconfuse])
PKG_CHECK_MODULES([YAJL], [yajl]) PKG_CHECK_MODULES([YAJL], [yajl])
pulse=true AC_ARG_ENABLE(pulseaudio,
AS_HELP_STRING(
[--disable-pulseaudio],
[build without pulseaudio support]),
[ax_pulse=$enableval],
[ax_pulse=yes])
AM_CONDITIONAL([PULSE], [test x$ax_pulse = xyes])
AS_IF([test x"$ax_pulse" = x"yes"],
[PKG_CHECK_MODULES([PULSE], [libpulse])])
pulse_def=0
AS_IF([test x"$ax_pulse" = x"yes"],
[pulse_def=1])
AC_DEFINE_UNQUOTED([HAS_PULSEAUDIO], [$pulse_def], [Build with pulseaudio])
case $host_os in case $host_os in
linux*) linux*)
PKG_CHECK_MODULES([NLGENL], [libnl-genl-3.0]) PKG_CHECK_MODULES([NLGENL], [libnl-genl-3.0])
PKG_CHECK_MODULES([ALSA], [alsa]) PKG_CHECK_MODULES([ALSA], [alsa])
;; ;;
openbsd*)
pulse=false
;;
dragonfly*)
pulse=false
;;
netbsd*) netbsd*)
AC_SEARCH_LIBS([prop_string_create], [prop]) AC_SEARCH_LIBS([prop_string_create], [prop])
;; ;;
esac esac
AM_CONDITIONAL([PULSE], [test x$pulse = xtrue])
AS_IF([test x"$pulse" = x"true"],
[PKG_CHECK_MODULES([PULSE], [libpulse])])
dnl TODO: check for libbsd for GNU/kFreeBSD dnl TODO: check for libbsd for GNU/kFreeBSD
@ -160,6 +164,7 @@ AS_HELP_STRING([is release version:], [${is_release}])
AS_HELP_STRING([enable debug flags:], [${ax_enable_debug}]) AS_HELP_STRING([enable debug flags:], [${ax_enable_debug}])
AS_HELP_STRING([code coverage:], [${CODE_COVERAGE_ENABLED}]) AS_HELP_STRING([code coverage:], [${CODE_COVERAGE_ENABLED}])
AS_HELP_STRING([enabled sanitizers:], [${ax_enabled_sanitizers}]) AS_HELP_STRING([enabled sanitizers:], [${ax_enabled_sanitizers}])
AS_HELP_STRING([pulseaudio support:], [${ax_pulse}])
To compile, run: To compile, run:

View File

@ -565,7 +565,13 @@ int main(int argc, char *argv[]) {
return 0; return 0;
break; break;
case 'v': case 'v':
printf("i3status " VERSION " © 2008 Michael Stapelberg and contributors\n"); printf("i3status " VERSION " © 2008 Michael Stapelberg and contributors\n"
#if HAS_PULSEAUDIO
"Built with pulseaudio support\n"
#else
"Built without pulseaudio support\n"
#endif
);
return 0; return 0;
break; break;
case 0: case 0:

View File

@ -86,7 +86,7 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
free(instance); free(instance);
} }
#if !defined(__DragonFly__) && !defined(__OpenBSD__) #if HAS_PULSEAUDIO
/* Try PulseAudio first */ /* Try PulseAudio first */
/* If the device name has the format "pulse[:N]" where N is the /* If the device name has the format "pulse[:N]" where N is the