diff --git a/installJRMC b/installJRMC index 059c033..84f338d 100755 --- a/installJRMC +++ b/installJRMC @@ -163,7 +163,7 @@ init() { PKG_ALIASES["tigervnc-server"]="tigervnc-standalone-server" fi - # Install script dependencies + # Install dependency dependencies :-) [[ "$ID" == "centos" ]] && installPackage epel-release # Select MC version to work with @@ -389,7 +389,7 @@ getLatestVersion() { # Use a containerized package manager # TODO but how to determine build distro ($_base=buster)? - [[ ! -x $(command -v buildah) ]] && installPackage --silent buildah + installPackage --silent buildah if [[ -x $(command -v buildah) ]] && CNT=$(buildah from debian:$_base); then buildah run "$CNT" -- bash -c \ "echo 'deb [trusted=yes arch=amd64,i386,armhf,arm64] http://dist.jriver.com/latest/mediacenter/ $_base main' > /etc/apt/sources.list 2>&1" @@ -606,13 +606,105 @@ acquireDeb() { } +####################################### +# Translate deb package dependencies for each distro +####################################### +packageTranslations() { + + declare -ga requires recommends + + # Load deb dependencies into array + IFS=',' read -ra requires <<< "$(dpkg-deb -f "$DEBFILENAME" Depends)" + IFS=',' read -ra recommends <<< "$(dpkg-deb -f "$DEBFILENAME" Recommends)" + + # Clean up formatting + for i in "${!requires[@]}"; do + requires[$i]="${requires[$i]%%|*}" + requires[$i]="${requires[$i]/?:/}" + requires[$i]="${requires[$i]# }" + requires[$i]="${requires[$i]% }" + requires[$i]="${requires[$i]//\(/}" + requires[$i]="${requires[$i]//)/}" + done + + # Translate package names + case "$ID" in + fedora|centos) + requires=("${requires[@]/libc6/glibc}") + requires=("${requires[@]/libasound2/alsa-lib}") + requires=("${requires[@]/libuuid1/libuuid}") + requires=("${requires[@]/libX11-6/libX11}") + requires=("${requires[@]/libext6/libXext}") + requires=("${requires[@]/libxcb1/libxcb}") + requires=("${requires[@]/libxdmcp6/libXdmcp}") + requires=("${requires[@]/libstdc++6/libstdc++}") + requires=("${requires[@]/libgtk-3-0/gtk3}") + requires=("${requires[@]/libgl1-mesa-glx/mesa-libGL}") + requires=("${requires[@]/libpango-1.0-0/pango}") + requires=("${requires[@]/libpangoft2-1.0-0/pango}") + requires=("${requires[@]/libpangox-1.0-0/pango}") + requires=("${requires[@]/libpangoxft-1.0-0/pango}") + requires=("${requires[@]/libnss3/nss}") + requires=("${requires[@]/libnspr4/nspr}") + requires=("${requires[@]/libgomp1/libgomp}") + requires=("${requires[@]/libfribidi0/fribidi}") + requires=("${requires[@]/libfontconfig1/fontconfig}") + requires=("${requires[@]/libfreetype6/freetype}") + requires=("${requires[@]/libharfbuzz0b/harfbuzz}") + requires=("${requires[@]/libgbm1/mesa-libgbm}") + requires=("${requires[@]/libva2/libva}") + requires=("${requires[@]/libepoxy0/libepoxy}") + requires=("${requires[@]/liblcms2-2/lcms2}") + requires=("${requires[@]/libvulkan1/vulkan-loader}") + requires=("${requires[@]/libepoxy0/libepoxy}") + ;; + opensuse.*) + requires=("${requires[@]/libc6/glibc}") + requires=("${requires[@]/libasound2/alsa-lib}") + requires=("${requires[@]/libuuid1/libuuid}") + requires=("${requires[@]/libext6/libXext6}") + requires=("${requires[@]/libxdmcp6/libXdmcp6}") + requires=("${requires[@]/libgtk-3-0/gtk3}") + requires=("${requires[@]/libgl1-mesa-glx/Mesa-libGL1}") + requires=("${requires[@]/libpango-1.0-0/pango}") + requires=("${requires[@]/libpangoft2-1.0-0/pango}") + requires=("${requires[@]/libpangox-1.0-0/pango}") + requires=("${requires[@]/libpangoxft-1.0-0/pango}") + requires=("${requires[@]/libnss3/mozilla-nss}") + requires=("${requires[@]/libnspr4/mozilla-nspr}") + requires=("${requires[@]/libfribidi0/fribidi}") + requires=("${requires[@]/libfontconfig1/fontconfig}") + requires=("${requires[@]/libfreetype6/freetype}") + requires=("${requires[@]/libharfbuzz0b/libharfbuzz0}") + ;; + esac + + # Remove duplicates + declare -A dupes + for i in "${requires[@]}"; do + if [[ ! -v dupes[${i%% *}] ]]; then + cleaned_requires+=("$i") + fi + dupes["${i%% *}"]=1 + done + requires=("${cleaned_requires[@]}") + + # Convert array to newline delim'd string (for heredoc) + printf -v requires "Requires: %s\n" "${requires[@]}" + printf -v recommends "Recommends: %s\n" "${recommends[@]}" + # Strip last newline + requires="${requires%?}" + recommends="${recommends%?}" +} + + ####################################### # Creates a SPEC file and builds the RPM from the source DEB using rpmbuild ####################################### buildRPM() { debug "Running: ${FUNCNAME[0]}" - local _build_requires _global_requires _custom_requires _ec + local _ec declare -g _mcrpm="$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" @@ -622,79 +714,11 @@ buildRPM() { return 0 fi - # install build dependencies - installPackage "wget" "dpkg" "rpm-build" - [[ ! -d "$_outputdir/SPECS" ]] && mkdir -p "$_outputdir/SPECS" - # rpmbuild uses rpm to check for build dependencies - # this will fail on non-rpm distros - if [[ "$ID" =~ ^(fedora|centos|opensuse.*)$ ]]; then - _build_requires=$'BuildRequires: rpm >= 4.11.0\nBuildRequires: dpkg' - fi - - read -r -d '' _global_requires <<- 'EOF' - Requires: glibc >= 2.28 - Requires: alsa-lib >= 1.1.8 - Requires: gtk3 >= 3.24 - Requires: pango >= 1.42 - Requires: python3 - Requires: xdg-utils - Requires: fribidi >= 1.0.5 - Requires: fontconfig >= 2.13 - Requires: lcms2 >= 2.9 - Requires: vulkan-headers >= 1.1 - Requires: ca-certificates - Requires: libXScrnSaver - Recommends: vorbis-tools >= 1.4.0 - Recommends: lame >= 3.0 - EOF - - # SUSE dependency name variations - if [[ "$ID" =~ ^opensuse.*$ || -v _build_suse ]]; then - read -r -d '' _custom_requires <<- 'EOF' - Requires: Mesa-libVulkan-devel - Requires: freetype >= 1.3.1 - Requires: libharfbuzz0 >= 2.3.1 - Requires: libX11-6 >= 1.6 - Requires: libX11-data >= 1.6 - Requires: libXdmcp6 >= 1.1 - Requires: libXext6 >= 1.3 - Requires: libepoxy0 >= 1.5.3 - Requires: libgomp1 >= 7.4 - Requires: libstdc++6 >= 7.4 - Requires: libuuid1 >= 2.33 - Requires: libva2 >= 2.4.0 - Requires: libxcb1 >= 1.1 - Requires: libgbm1 >= 18.3.6 - Requires: mozilla-nspr >= 4.20 - Requires: mozilla-nss >= 3.42 - EOF - else - read -r -d '' _custom_requires <<- 'EOF' - Requires: mesa-vulkan-drivers - Requires: freetype >= 2.9.1 - Requires: harfbuzz >= 2.3.1 - Requires: libX11 >= 1.6 - Requires: libX11-common >= 1.6 - Requires: libXdmcp >= 1.1 - Requires: libXext >= 1.3 - Requires: libepoxy >= 1.5.3 - Requires: libgomp >= 7.4 - Requires: libstdc++ >= 7.4 - Requires: libuuid >= 2.33 - Requires: libva >= 2.4.0 - Requires: libxcb >= 1.1 - Requires: mesa-libgbm >= 18.3.6 - Requires: nspr >= 4.20 - Requires: nss >= 3.42 - EOF - fi - if [[ -v _compat ]]; then # Strip minimum versions - _custom_requires=$(echo "$_custom_requires" | awk -F" " 'NF == 4 {print $1 " " $2} NF != 4 {print $0}') - _global_requires=$(echo "$_global_requires" | awk -F" " 'NF == 4 {print $1 " " $2} NF != 4 {print $0}') + requires=$(echo "$requires" | awk -F" " 'NF == 4 {print $1 " " $2} NF != 4 {print $0}') fi # Create spec file @@ -705,14 +729,13 @@ buildRPM() { Summary: JRiver Media Center Group: Applications/Media Source0: http://files.jriver.com/mediacenter/channels/v$_mversion/latest/MediaCenter-$_mcversion-amd64.deb - ${_build_requires:-} BuildArch: x86_64 %define _rpmfilename %%{ARCH}/%%{NAME}-%%{version}.%%{ARCH}.rpm AutoReq: 0 - ${_global_requires:-} - ${_custom_requires:-} + ${requires:-} + ${recommends:-} Provides: mediacenter$_mversion @@ -1466,9 +1489,13 @@ main() { # Build RPM from source deb package if [[ -v _build ]]; then acquireDeb + installPackage "wget" "dpkg" "rpm-build" + packageTranslations + if ! buildRPM; then err "Build failed." - # For automation, let's remove the source DEB and reaquire it on next run in case it is corrupted or buggy + # For automation, let's remove the source DEB and reaquire it on next run + # after failure in case it is corrupted or buggy [[ -f "$DEBFILENAME" ]] && echo "Removing source DEB" && rm -f "$DEBFILENAME" exit 1 fi