# Copyright 1999-2026 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=8 FINDLIB_USE="ocaml" JAVA_PKG_WANT_SOURCE="1.8" JAVA_PKG_WANT_TARGET="1.8" LUA_COMPAT=( lua5-4 ) PYTHON_COMPAT=( python3_{11..14} ) inherit autotools elisp-common findlib java-pkg-opt-2 linux-info lua-single python-r1 tmpfiles toolchain-funcs udev DESCRIPTION="Daemon that provides access to the Linux/Unix console for a blind person" HOMEPAGE="https://brltty.app/" SRC_URI="https://brltty.app/archive/${P}.tar.xz" LICENSE="LGPL-2.1+" SLOT="0" KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~loong ~ppc ~ppc64 ~riscv ~x86" BINDINGS="emacs java lua ocaml python tcl" IUSE="+api +beeper bluetooth caps +fm gpm +hid iconv icu louis +midi ncurses nls +pcm policykit +pcre usb systemd +speech xml X ${BINDINGS}" REQUIRED_USE=" emacs? ( api ) java? ( api ) lua? ( api ${LUA_REQUIRED_USE} ) ocaml? ( api ) policykit? ( api ) python? ( api ${PYTHON_REQUIRED_USE} ) tcl? ( api ) " COMMON_DEPEND=" acct-group/brltty acct-user/brltty bluetooth? ( net-wireless/bluez:= sys-apps/dbus ) caps? ( sys-libs/libcap ) emacs? ( app-editors/emacs:* ) gpm? ( >=sys-libs/gpm-1.20 ) hid? ( virtual/libudev:= ) iconv? ( virtual/libiconv ) icu? ( dev-libs/icu:= ) louis? ( dev-libs/liblouis:= ) midi? ( media-libs/alsa-lib ) ncurses? ( sys-libs/ncurses:0= ) lua? ( ${LUA_DEPS} ) pcm? ( media-libs/alsa-lib ) pcre? ( dev-libs/libpcre2:=[pcre32] ) policykit? ( dev-libs/glib:2 sys-auth/polkit ) python? ( ${PYTHON_DEPS} dev-python/setuptools[${PYTHON_USEDEP}] ) speech? ( app-accessibility/espeak-ng app-accessibility/flite app-accessibility/speech-dispatcher ) systemd? ( sys-apps/systemd ) tcl? ( >=dev-lang/tcl-8.6.13-r1:= ) usb? ( virtual/libusb:1 ) xml? ( dev-libs/expat ) X? ( app-accessibility/at-spi2-core:2 dev-libs/glib:2 sys-apps/dbus x11-libs/libX11 x11-libs/libXaw x11-libs/libXfixes x11-libs/libXt api? ( x11-libs/libXtst ) ) " DEPEND=" ${COMMON_DEPEND} hid? ( sys-kernel/linux-headers ) java? ( >=virtual/jdk-1.8:* ) X? ( x11-base/xorg-proto ) " RDEPEND=" ${COMMON_DEPEND} java? ( >=virtual/jre-1.8:* ) " BDEPEND=" >=dev-lang/tcl-8.6.13-r1 virtual/pkgconfig nls? ( virtual/libintl ) python? ( dev-python/cython[${PYTHON_USEDEP}] ) " CONFIG_CHECK=" ~INPUT_UINPUT ~INPUT_PCSPKR " PATCHES=( "${FILESDIR}"/${PN}-6.4-respect-AR.patch "${FILESDIR}"/${PN}-6.8-atspi2_optional.patch ) pkg_setup() { linux-info_pkg_setup # bindings java-pkg-opt-2_pkg_setup use lua && lua-single_pkg_setup use python && python_setup } src_prepare() { default # api-socket-api is not defined/used if api is not enabled, see bug #878203 if ! use api; then sed -e '/^d @BRLAPI_SOCKETPATH@/s/^/#/' \ -i Autostart/Systemd/tmpfiles.in || die fi java-pkg-opt-2_src_prepare # We run eautoconf instead of using eautoreconf because brltty uses # a custom build system that uses autoconf without the rest of the # autotools. eautoconf use python && python_copy_sources } src_configure() { tc-export AR PKG_CONFIG export JAVAC= export JAVA_JNI_FLAGS= if use java; then export JAVA_HOME="$(java-config -g JAVA_HOME)" export JAVAC_HOME="${JAVA_HOME}/bin" export JAVA_JNI_FLAGS="$(java-pkg_get-jni-cflags)" export JAVAC="$(java-pkg_get-javac) -encoding UTF-8 $(java-pkg_javac-args)" fi # see bug #830239, '-n' arg not handled by musl export brltty_cv_prog_conflibdir="ldconfig" # Override bindir for backward compatibility. # Also override localstatedir so that the lib/brltty directory is installed # correctly. # Disable stripping since we do that ourselves. local myconf=( --bindir="${EPREFIX}"/bin --htmldir="${EPREFIX}"/usr/share/doc/"${PF}"/html --localstatedir="${EPREFIX}"/var --runstatedir="${EPREFIX}"/run # Python bindings are built separately per-impl --disable-python-bindings --disable-stripping --with-updatable-directory="${EPREFIX}"/var/lib/brltty --with-writable-directory="${EPREFIX}"/run/brltty --with-privilege-parameters=lx:user=brltty $(use_enable api) $(use_with beeper beep-package) $(use_with caps pgmprivs-package) $(use_enable emacs emacs-bindings) $(use_with fm fm-package) $(use_enable gpm) $(use_with hid hid-package) $(use_enable iconv) $(use_enable icu) $(use_enable java java-bindings) $(use_enable louis liblouis) $(use_enable lua lua-bindings) $(use_with midi midi-package) $(use_enable nls i18n) $(use_enable ocaml ocaml-bindings) $(use_with pcm pcm-package) $(use_enable policykit polkit) $(use_with pcre rgx-package) $(use_enable speech speech-support) $(use_with systemd service-package) $(use_enable tcl tcl-bindings) $(use_enable xml expat) $(use_enable X x) $(use_with bluetooth bluetooth-package) $(use_with ncurses curses) $(use_with usb usb-package) ) # disable espeak since we use espeak-ng use speech && myconf+=( --with-speech-driver=-es ) econf "${myconf[@]}" if use python; then python_configure() { econf "${myconf[@]}" --enable-python-bindings PYTHON="${PYTHON}" } python_foreach_impl run_in_build_dir python_configure fi } src_compile() { emake -j1 JAVA_JNI_FLAGS="${JAVA_JNI_FLAGS}" JAVAC="${JAVAC}" use emacs && elisp-compile Bindings/Emacs/add_directory.el if use python; then python_build() { emake -C "${BUILD_DIR}"/Bindings/Python -j1 } python_foreach_impl run_in_build_dir python_build fi } src_install() { use ocaml && findlib_src_preinst # install-extras for locales, metainfo, polkit rules, systemd-files, udev rules emake -j1 INSTALL_ROOT="${D}" OCAML_LDCONF= install install-extras use emacs && elisp-install ${PN} Bindings/Emacs/add_directory.el{,c} if use python; then python_install() { emake -C "${BUILD_DIR}"/Bindings/Python -j1 INSTALL_ROOT="${D}" install rm -r "${D}/$(python_get_sitedir)"/*.egg-info || die } python_foreach_impl run_in_build_dir python_install fi if use java; then java-pkg_doso Bindings/Java/libbrlapi_java.so java-pkg_dojar Bindings/Java/brlapi.jar fi insinto /etc doins Documents/brltty.conf newinitd "${FILESDIR}"/brltty.initd-r1 brltty local DOCS=( Documents/{CONTRIBUTORS,ChangeLog,HISTORY,README*,TODO} doc/Manual-BRLTTY ) local HTML_DOCS=( doc/*.html ) use api && DOCS+=( Documents/Manual-BrlAPI/English/BrlAPI.sgml ) einstalldocs keepdir /var/lib/BrlAPI rm -fr "${ED}/run" || die find "${ED}" -name '*.a' -delete || die } pkg_postinst() { use emacs && elisp-site-regen tmpfiles_process ${PN}.conf udev_reload elog "please be sure ${EROOT}/etc/brltty.conf is correct for your system." elog if use systemd; then elog "To make brltty start on boot on systemd system, type these commands:" elog "# systemctl daemon-reload" elog "# systemctl enable brltty.path" elog "To launch manually:" elog "# systemctl start brltty.path" elog "Don't try brltty.service" else elog "To make brltty start on boot on an OpenRC system, type this command:" elog "# rc-update add brltty boot" elog "To launch manually:" elog "# rc-service brltty start" fi if use caps; then elog "To launch brltty as an unprivileged user, please refer to:" elog "${EROOT}/usr/share/doc/${PF}/README.Linux#Assigning Capabilities to the Executable" fi } pkg_postrm() { udev_reload }