Files
rhasspy/debianize.sh
2019-12-09 22:08:53 +01:00

178 lines
4.8 KiB
Bash
Executable File

#!/usr/bin/env bash
rhasspy_version="2.4.10"
this_dir="$( cd "$( dirname "$0" )" && pwd )"
# -----------------------------------------------------------------------------
# Command-line Arguments
# -----------------------------------------------------------------------------
. "${this_dir}/etc/shflags"
DEFINE_string 'architecture' '' 'Debian architecture'
DEFINE_string 'version' "${rhasspy_version}" 'Package version'
DEFINE_boolean 'package' true 'Create debian package (.deb)'
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"
# -----------------------------------------------------------------------------
# Settings
# -----------------------------------------------------------------------------
export architecture="${FLAGS_architecture}"
version="${FLAGS_version}"
debian_dir="${this_dir}/debian"
set -e
if [[ -z "${architecture}" ]]; then
# Guess architecture
architecture="$(dpkg-architecture | grep 'DEB_BUILD_ARCH=' | sed 's/^[^=]\+=//')"
fi
# -----------------------------------------------------------------------------
# Activate virtual environment
# -----------------------------------------------------------------------------
venv="${this_dir}/.venv"
if [[ ! -d "${venv}" ]]; then
echo "Missing virtual environment at ${venv}"
echo "Did you run create-venv.sh?"
exit 1
fi
cd "${this_dir}"
source "${venv}/bin/activate"
if [[ -z "$(command -v pyinstaller)" ]]; then
echo "Missing PyInstaller"
exit 1
fi
# -----------------------------------------------------------------------------
# Run PyInstaller
# -----------------------------------------------------------------------------
echo "Running PyInstaller"
package_name="rhasspy-server_${version}_${architecture}"
package_dir="${debian_dir}/${package_name}"
output_dir="${package_dir}/usr/lib/rhasspy"
share_dir="${package_dir}/usr/share/rhasspy"
pyinstaller\
-y \
--workpath "pyinstaller/build" \
--distpath "${output_dir}" \
"${this_dir}/rhasspy.spec"
# Remove all symbols (Liantian warning)
strip --strip-all "${output_dir}/rhasspy"/*.so* || true
# Remove executable bit from shared libs (Lintian warning)
chmod -x "${output_dir}/rhasspy"/*.so* || true
# -----------------------------------------------------------------------------
# Copy Rhasspy
# -----------------------------------------------------------------------------
# Profiles
mkdir -p "${output_dir}/profiles"
rsync -av \
--delete \
--exclude 'acoustic_model' \
--exclude 'download' \
--exclude 'flair' \
--exclude 'base_dictionary.txt' \
--exclude 'base_language_model.txt' \
--exclude 'g2p.fst' \
--exclude 'HCLG.fst' \
--exclude 'final.mdl' \
--exclude '*.umdl' \
"${this_dir}/profiles/" \
"${output_dir}/profiles/"
# Sounds
mkdir -p "${output_dir}/etc/wav"
rsync -av \
--delete \
"${this_dir}/etc/wav/" \
"${output_dir}/etc/wav/"
# Web
mkdir -p "${output_dir}/dist"
rsync -av \
--delete \
"${this_dir}/dist/" \
"${output_dir}/dist/"
# Documentation
mkdocs build
mkdir -p "${share_dir}/docs"
rsync -av \
--delete \
"${this_dir}/site/" \
"${share_dir}/docs/"
# Source code
mkdir -p "${share_dir}/src"
rsync -av \
--delete \
--exclude '.mypy_cache' \
--exclude '__pycache__' \
"${this_dir}/rhasspy/" \
"${share_dir}/src/rhasspy/"
cp "${this_dir}/app.py" "${share_dir}/src/"
# -----------------------------------------------------------------------------
# Copy Kaldi
# -----------------------------------------------------------------------------
echo "Copying Kaldi"
kaldi_src="${this_dir}/opt/kaldi"
if [[ ! -d "${kaldi_src}" ]]; then
echo "Missing Kaldi at ${kaldi_src}"
exit 1
fi
kaldi_dest="${output_dir}/kaldi"
mkdir -p "${kaldi_dest}"
rsync -av --delete "${kaldi_src}/" "${kaldi_dest}/"
# Avoid link recursion
rm -f "${kaldi_dest}/egs/wsj/s5/utils/utils"
# Turn duplicate .so files into symbolic links
function fix_library_links {
lib_dir="$1"
for lib in "${lib_dir}"/*.so; do
lib_base="$(basename ${lib})"
for lib_link in "${lib_dir}/${lib_base}".*; do
rm -f "${lib_link}"
ln -s "${lib_base}" "${lib_link}"
done
done
}
fix_library_links "${kaldi_dest}/tools/openfst/lib"
# -----------------------------------------------------------------------------
# Create Debian package
# -----------------------------------------------------------------------------
echo "Creating Debian package"
mkdir -p "${package_dir}/DEBIAN"
cat "${debian_dir}/DEBIAN/control" | \
envsubst > "${package_dir}/DEBIAN/control"
mkdir -p "${package_dir}/usr/bin"
cp "${debian_dir}/bin/rhasspy-server" "${package_dir}/usr/bin/"
if [[ "${FLAGS_package}" -eq "${FLAGS_TRUE}" ]]; then
# Actually build the package
cd 'debian' && fakeroot dpkg --build "${package_name}"
fi