From 97a846866407437ad178937939af0a02af4980b9 Mon Sep 17 00:00:00 2001 From: Ivan Mazhukin Date: Tue, 30 Jun 2026 20:53:48 +0300 Subject: [PATCH] epm play 1c: add local package install (eterbug #18280) --- pack.d/1c83-client.sh | 38 +- pack.d/1c83-universal.sh | 14 +- play.d/1c.sh | 292 +++++++++++++++ repack.d/1c-enterprise-client.sh | 12 +- repack.d/1c-enterprise-server.sh | 12 +- repack.d/1c-enterprise-thin-client.sh | 12 +- repack.d/1c-enterprise.sh | 11 + repack.d/1c83-client.sh | 18 +- repack.d/common-1c-enterprise.sh | 504 ++++++++++++++++++++++++++ 9 files changed, 856 insertions(+), 57 deletions(-) create mode 100755 play.d/1c.sh mode change 100755 => 120000 repack.d/1c-enterprise-client.sh mode change 100755 => 120000 repack.d/1c-enterprise-server.sh mode change 100755 => 120000 repack.d/1c-enterprise-thin-client.sh create mode 100755 repack.d/1c-enterprise.sh create mode 100755 repack.d/common-1c-enterprise.sh diff --git a/pack.d/1c83-client.sh b/pack.d/1c83-client.sh index a1545c4c1..8795f5754 100755 --- a/pack.d/1c83-client.sh +++ b/pack.d/1c83-client.sh @@ -4,6 +4,7 @@ FILENAME="$1" RETURNTARNAME="$2" . $(dirname $0)/common.sh +. $(dirname $0)/../repack.d/common-1c-enterprise.sh # unpack if something like server64_8_3_22_1851.tar.gz if echo "$(basename "$FILENAME")" | grep -q "^server.._8_3.*tar\.gz$" ; then @@ -13,11 +14,17 @@ if echo "$(basename "$FILENAME")" | grep -q "^server.._8_3.*tar\.gz$" ; then FILENAME="$(echo server*/setup-full-8.*.run)" fi -# with run with setup-full.*.run file -echo "$(basename "$FILENAME")" | grep -q "^setup-full-8\.3.*-.*.run$" || fatal "run with file looks like setup-full-8.3.22.1851-x86_64.run" +# with run with setup-full.*.run or setup-training.*.run file +case "$(basename "$FILENAME")" in + setup-full-8.*-*.run|setup-training-8.*-*.run) ;; + *) fatal "run with file looks like setup-full-8.3.22.1851-x86_64.run or setup-training-8.5.1.1150-x86_64.run" ;; +esac -INSTDIR="/opt/1cv8" +case "$(basename "$FILENAME")" in + setup-training-*) INSTDIR="/opt/1cv8t" ;; + *) INSTDIR="/opt/1cv8" ;; +esac VERSION="$(echo $FILENAME | sed 's|.*-8|8|' | sed 's|-.*||')" TARNAME="1c83-client-$VERSION.tar" @@ -37,17 +44,30 @@ else fi # FIXME -UNINSTFILE=$INSTDIR/$arch/$VERSION/uninstaller-full -[ -x "$UNINSTFILE" ] || fatal "Can't detect executable $UNINSTFILE" +UNINSTFILE='' +for file in "$INSTDIR/$arch/$VERSION"/uninstaller-* "$INSTDIR/$arch/$VERSION"/uninstall* "$INSTDIR"/uninstaller-* "$INSTDIR"/uninstall* ; do + [ -x "$file" ] || continue + UNINSTFILE="$file" + break +done +[ -n "$UNINSTFILE" ] || fatal "Can't detect executable uninstaller in $INSTDIR/$arch/$VERSION" + +__1c_enterprise_remove_bundled_runtime_libs_from_root / # 8.3.22.1851 -> 8*3*22*1851 (they use - in 1cv8-8.3.22-1851.desktop) -ADDFILES="/usr/share/applications/1cv8*$(echo $VERSION| sed -e 's|\.|*|g').desktop" -# icons -ADDFILES="$ADDFILES /usr/share/pixmaps/1c* /usr/share/app-install/icons/1c* /usr/share/icons/hicolor/*/apps/1c*" +ADDFILES="$INSTDIR" +for file in /usr/share/applications/1cv8*$(echo $VERSION| sed -e 's|\.|*|g').desktop \ + /usr/share/applications/1cestart*$(echo $VERSION| sed -e 's|\.|*|g').desktop \ + /usr/share/pixmaps/1c* \ + /usr/share/app-install/icons/1c* \ + /usr/share/icons/hicolor/*/apps/1c* ; do + [ -e "$file" ] || continue + ADDFILES="$ADDFILES $file" +done # FIXME: erc? epm install --skip-installed tar || fatal -a= tar cf $TARNAME $INSTDIR $ADDFILES +a= tar cf $TARNAME $ADDFILES esu touch /opt/.placeholder # Задана тихая деинсталяция. diff --git a/pack.d/1c83-universal.sh b/pack.d/1c83-universal.sh index 56e23d5ba..2134f357e 100755 --- a/pack.d/1c83-universal.sh +++ b/pack.d/1c83-universal.sh @@ -4,6 +4,7 @@ FILENAME="$1" RETURNTARNAME="$2" . $(dirname $0)/common.sh +. $(dirname $0)/../repack.d/common-1c-enterprise.sh BASENAME=$(basename "$1" | sed -e 's|\.zip$||') VERSION=$(echo "$BASENAME" | sed -n 's/.*_\([0-9]\+\)_\([0-9]\+\)_\([0-9]\+\)_\([0-9]\+\).*/\1.\2.\3.\4/p') @@ -11,13 +12,6 @@ VERSION=$(echo "$BASENAME" | sed -n 's/.*_\([0-9]\+\)_\([0-9]\+\)_\([0-9]\+\)_\( erc --here unpack "$FILENAME" || fatal cd $BASENAME -__remove_libstdc(){ - - rm -f opt/1cv8/x86_64/$VERSION/libstdc++.so.6 - rm -f opt/1cv8/x86_64/$VERSION/libgcc_s.so.1 - rm -f opt/1cv8/common/libgcc_s.so.1 -} - packages_list=$(echo "1c-enterprise*") for file in $packages_list; do @@ -30,7 +24,7 @@ for file in $packages_list; do case $file in 1c-enterprise-*-server-*) erc --here unpack "$file" || fatal - __remove_libstdc + __1c_enterprise_remove_bundled_runtime_libs_from_root "$PWD" erc pack 1c-enterprise-server-$VERSION.tar opt || fatal rm $file ;; @@ -41,7 +35,7 @@ for file in $packages_list; do mv 1c-enterprise-*-thin-client-*/opt opt mv 1c-enterprise-*-thin-client-*/usr usr - __remove_libstdc + __1c_enterprise_remove_bundled_runtime_libs_from_root "$PWD" rm -r $file $(basename $file | sed -e 's|\.rpm||' -e 's|\.deb||') erc pack 1c-enterprise-thin-client-$VERSION.tar opt usr || fatal @@ -54,7 +48,7 @@ for file in $packages_list; do mv 1c-enterprise-*-client-*/opt opt mv 1c-enterprise-*-client-*/usr usr - __remove_libstdc + __1c_enterprise_remove_bundled_runtime_libs_from_root "$PWD" rm -r $file $(basename $file | sed -e 's|\.rpm||' -e 's|\.deb||') erc pack 1c-enterprise-client-$VERSION.tar opt usr || fatal diff --git a/play.d/1c.sh b/play.d/1c.sh new file mode 100755 index 000000000..f8be4cbd7 --- /dev/null +++ b/play.d/1c.sh @@ -0,0 +1,292 @@ +#!/bin/sh + +PKGNAME=1c-enterprise +SUPPORTEDARCHES="x86_64" +VERSION="${2:-*}" +DESCRIPTION="1C:Enterprise platform from an official local package" +URL="https://releases.1c.ru/" +TIPS="Download the official Linux package from $URL and run: +epm play 1c = /path/to/1c-enterprise-*.rpm +epm play 1c = /path/to/directory-with-1c-packages +epm play 1c = /path/to/1c-enterprise-*.tar.gz +epm play 1c = /path/to/setup-full-8.*.run" + +. $(dirname $0)/common.sh + +SOURCE="$VERSION" + +if [ -n "$3" ] && [ ! -r "$SOURCE" ] && [ -r "$SOURCE-$3" ] ; then + SOURCE="$SOURCE-$3" +fi + +print_usage() +{ + cat </dev/null)" + if [ -n "$name" ] ; then + echo "$name" + return + fi + + case "$pkg" in + *.deb) + name="$(basename "$pkg")" + name="${name%.deb}" + name="${name%%_*}" + ;; + *.rpm) + name="$(rpm -qp --qf '%{NAME}' "$pkg" 2>/dev/null)" || name='' + ;; + esac + + [ -n "$name" ] && echo "$name" +} + +package_name_in_list() +{ + local packages="$1" + local reqname="$2" + local pkg + local name + + for pkg in $packages ; do + name="$(get_package_name "$pkg")" + [ "$name" = "$reqname" ] && return 0 + done + + return 1 +} + +find_sibling_package() +{ + local packages="$1" + local reqname="$2" + local pkg + local dir + local candidate + local name + + for pkg in $packages ; do + dir="$(dirname "$pkg")" + for candidate in "$dir"/*.rpm "$dir"/*.deb ; do + [ -e "$candidate" ] || continue + name="$(get_package_name "$candidate")" + [ "$name" = "$reqname" ] || continue + echo "$candidate" + return 0 + done + done + + return 1 +} + +get_required_package_names() +{ + local name="$1" + + case "$name" in + *-nls) + echo "${name%-nls}" + ;; + esac + + case "$name" in + *-thin-client|1c-enterprise-thin-client) + ;; + *-client|1c-enterprise-client) + echo "${name%-client}-server" + ;; + *-server|1c-enterprise-server) + echo "${name%-server}-common" + ;; + *-ws|1c-enterprise-ws) + echo "${name%-ws}-common" + ;; + *-crs|1c-enterprise-crs) + echo "${name%-crs}-server" + echo "${name%-crs}-ws" + ;; + esac +} + +expand_package_set() +{ + local packages="$1" + local changed=1 + local pkg + local name + local reqname + local reqpkg + + while [ -n "$changed" ] ; do + changed='' + for pkg in $packages ; do + name="$(get_package_name "$pkg")" + [ -n "$name" ] || continue + for reqname in $(get_required_package_names "$name") ; do + package_name_in_list "$packages" "$reqname" && continue + reqpkg="$(find_sibling_package "$packages" "$reqname")" || continue + info "Adding $reqname from $(dirname "$reqpkg")" + packages="$packages $reqpkg" + changed=1 + done + done + done + + echo "$packages" +} + +install_packages() +{ + local packages="$1" + local pkg + local name + local filtered_packages='' + local has_client='' + local names='' + + [ -n "$packages" ] || fatal "Can't find 1C rpm/deb packages" + + epm --auto assure rpm || fatal "rpm is required to inspect 1C packages" + + packages="$(expand_package_set "$packages")" + + for pkg in $packages ; do + name="$(get_package_name "$pkg")" + [ -n "$name" ] || fatal "Can't detect 1C package name for $pkg" + case "$name" in + *-thin-client|*-thin-client-nls|1c-enterprise-thin-client|1c-enterprise-thin-client-nls) + ;; + *-client|1c-enterprise-client) + has_client=1 + ;; + esac + done + + for pkg in $packages ; do + name="$(get_package_name "$pkg")" + [ -n "$name" ] || fatal "Can't detect 1C package name for $pkg" + + if [ -n "$has_client" ] ; then + case "$name" in + *-thin-client|*-thin-client-nls|1c-enterprise-thin-client|1c-enterprise-thin-client-nls) + info "Skipping $name: full client package is selected" + continue + ;; + esac + fi + + names="$names $name" + filtered_packages="$filtered_packages $pkg" + done + + names="$(echo "$names" | sed -e 's|^ *||')" + [ -n "$names" ] || fatal "Can't detect 1C package names" + packages="$(echo "$filtered_packages" | sed -e 's|^ *||')" + [ -n "$packages" ] || fatal "Can't find suitable 1C rpm/deb packages" + + export EPM_REPACK_SCRIPT=1c-enterprise + export EEPM_INTERNAL_PKGNAME="$names" + + # shellcheck disable=SC2086 + epm install --repack $packages +} + +install_archive() +{ + local archive="$1" + local runfile + local packages + + cd_to_temp_dir + case "$archive" in + *.zip) + epm install --skip-installed unzip || true + if command -v unzip >/dev/null 2>&1 ; then + unzip -q "$archive" || fatal "Can't unpack $archive" + else + epm tool erc --here unpack "$archive" || fatal "Can't unpack $archive" + fi + ;; + *) + epm tool erc --here unpack "$archive" || fatal "Can't unpack $archive" + ;; + esac + + runfile="$(find . -type f -name '*.run' | head -n1)" + if [ -n "$runfile" ] ; then + install_run "$runfile" + return + fi + + packages="$(find . -type f \( -name '*.rpm' -o -name '*.deb' \) | sort)" + install_packages "$packages" +} + +install_directory() +{ + local dir="$1" + local packages + + packages="$(find "$dir" -maxdepth 1 -type f \( -name '1c-enterprise*.rpm' -o -name '1c-enterprise*.deb' \) | sort)" + install_packages "$packages" +} + +install_run() +{ + override_pkgname 1c83-client + epm pack --install 1c83-client "$1" +} + +if [ -z "$SOURCE" ] || [ "$SOURCE" = "*" ] ; then + print_usage + exit 1 +fi + +[ -r "$SOURCE" ] || fatal "Can't read $SOURCE" + +if [ -n "$print_url" ] ; then + echo "$SOURCE" + exit 0 +fi + +if [ -d "$SOURCE" ] ; then + install_directory "$SOURCE" + exit 0 +fi + +case "$SOURCE" in + *.rpm|*.deb) + install_packages "$SOURCE" + ;; + *.tar.gz|*.tgz|*.zip) + install_archive "$SOURCE" + ;; + *.run) + install_run "$SOURCE" + ;; + *) + fatal "Unsupported 1C package format: $SOURCE" + ;; +esac diff --git a/repack.d/1c-enterprise-client.sh b/repack.d/1c-enterprise-client.sh deleted file mode 100755 index d21d949c8..000000000 --- a/repack.d/1c-enterprise-client.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -x - -# It will be run with two args: buildroot spec -BUILDROOT="$1" -SPEC="$2" - -. $(dirname $0)/common.sh - -ignore_lib_requires 'libicudata.so.46()(64bit)' 'libicui18n.so.46()(64bit)' 'libicuuc.so.46()(64bit)' 'libnghttp2-v8.so.14()(64bit)' -add_requires 'libicudata.so.74' 'libwebkit2gtk-4.1.so.0' 'libjavascriptcoregtk-4.0.so.18' - diff --git a/repack.d/1c-enterprise-client.sh b/repack.d/1c-enterprise-client.sh new file mode 120000 index 000000000..3793b6dde --- /dev/null +++ b/repack.d/1c-enterprise-client.sh @@ -0,0 +1 @@ +1c-enterprise.sh \ No newline at end of file diff --git a/repack.d/1c-enterprise-server.sh b/repack.d/1c-enterprise-server.sh deleted file mode 100755 index d21d949c8..000000000 --- a/repack.d/1c-enterprise-server.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -x - -# It will be run with two args: buildroot spec -BUILDROOT="$1" -SPEC="$2" - -. $(dirname $0)/common.sh - -ignore_lib_requires 'libicudata.so.46()(64bit)' 'libicui18n.so.46()(64bit)' 'libicuuc.so.46()(64bit)' 'libnghttp2-v8.so.14()(64bit)' -add_requires 'libicudata.so.74' 'libwebkit2gtk-4.1.so.0' 'libjavascriptcoregtk-4.0.so.18' - diff --git a/repack.d/1c-enterprise-server.sh b/repack.d/1c-enterprise-server.sh new file mode 120000 index 000000000..3793b6dde --- /dev/null +++ b/repack.d/1c-enterprise-server.sh @@ -0,0 +1 @@ +1c-enterprise.sh \ No newline at end of file diff --git a/repack.d/1c-enterprise-thin-client.sh b/repack.d/1c-enterprise-thin-client.sh deleted file mode 100755 index d21d949c8..000000000 --- a/repack.d/1c-enterprise-thin-client.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -x - -# It will be run with two args: buildroot spec -BUILDROOT="$1" -SPEC="$2" - -. $(dirname $0)/common.sh - -ignore_lib_requires 'libicudata.so.46()(64bit)' 'libicui18n.so.46()(64bit)' 'libicuuc.so.46()(64bit)' 'libnghttp2-v8.so.14()(64bit)' -add_requires 'libicudata.so.74' 'libwebkit2gtk-4.1.so.0' 'libjavascriptcoregtk-4.0.so.18' - diff --git a/repack.d/1c-enterprise-thin-client.sh b/repack.d/1c-enterprise-thin-client.sh new file mode 120000 index 000000000..3793b6dde --- /dev/null +++ b/repack.d/1c-enterprise-thin-client.sh @@ -0,0 +1 @@ +1c-enterprise.sh \ No newline at end of file diff --git a/repack.d/1c-enterprise.sh b/repack.d/1c-enterprise.sh new file mode 100755 index 000000000..a647f5cd7 --- /dev/null +++ b/repack.d/1c-enterprise.sh @@ -0,0 +1,11 @@ +#!/bin/sh -x + +# It will be run with args: buildroot spec package-name source-package +BUILDROOT="$1" +SPEC="$2" +PKGNAME="$3" + +. $(dirname $0)/common.sh +. $(dirname $0)/common-1c-enterprise.sh + +fix_1c_enterprise_package "$PKGNAME" diff --git a/repack.d/1c83-client.sh b/repack.d/1c83-client.sh index d939e22c9..e98ff221c 100755 --- a/repack.d/1c83-client.sh +++ b/repack.d/1c83-client.sh @@ -7,30 +7,38 @@ SPEC="$2" # source file: 1c83-client-8.3.22.1851.tar PRODUCT=1c83-client.sh -PRODUCTDIR=/opt/1cv8 PREINSTALL_PACKAGES="glib2 libatk libcairo libcairo-gobject libcom_err libcups libenchant libgdk-pixbuf libgio libGL libgst-plugins1.0 libgstreamer1.0 libgtk+3 libharfbuzz-icu libkrb5 libpango libSM libsoup libunwind libX11 libXcomposite libXdamage libXrender libXt" . $(dirname $0)/common.sh +if [ -d "$BUILDROOT/opt/1cv8t" ] ; then + PRODUCTDIR=/opt/1cv8t + PRODUCTSUMMARY="1C Training Client" +else + PRODUCTDIR=/opt/1cv8 + PRODUCTSUMMARY="1C Client" +fi + # installing from tar, so we need fill some fields here subst "s|^Group:.*|Group: Office|" $SPEC subst "s|^License: unknown$|License: Proprietary|" $SPEC subst "s|^URL:.*|URL: https://1c.ru|" $SPEC -subst "s|^Summary:.*|Summary: 1C 8.3 Client|" $SPEC +subst "s|^Summary:.*|Summary: $PRODUCTSUMMARY|" $SPEC #remove_file /usr/local/bin/$PRODUCT #add_bin_link_command -if [ -d "$BUILDROOT/opt/1cv8/x86_64" ] ; then +if [ -d "$BUILDROOT$PRODUCTDIR/x86_64" ] ; then arch="x86_64" -elif [ -d "$BUILDROOT/opt/1cv8/i586" ] ; then +elif [ -d "$BUILDROOT$PRODUCTDIR/i586" ] ; then arch="i586" else fatal "Unsupported arch" fi -VERSION="$(basename $(echo $BUILDROOT/opt/1cv8/$arch/8.3.*))" +VERSION="$(basename "$(echo "$BUILDROOT$PRODUCTDIR"/$arch/8.*.*.* | sed -e 's| .*||')")" +[ -n "$VERSION" ] && [ -d "$BUILDROOT$PRODUCTDIR/$arch/$VERSION" ] || fatal "Can't detect 1C version" #remove_dir /opt/1cv8/$arch/$VERSION/ExtDst diff --git a/repack.d/common-1c-enterprise.sh b/repack.d/common-1c-enterprise.sh new file mode 100755 index 000000000..854c902fa --- /dev/null +++ b/repack.d/common-1c-enterprise.sh @@ -0,0 +1,504 @@ +#!/bin/sh + +info() +{ + echo "$*" >&2 +} + +warning() +{ + echo "WARNING: $*" >&2 +} + +__1c_enterprise_add_requires() +{ + ignore_lib_requires \ + 'libicudata.so.46()(64bit)' 'libicui18n.so.46()(64bit)' 'libicuuc.so.46()(64bit)' \ + 'libnghttp2-v8.so.14()(64bit)' + add_requires 'libicudata.so.74' + + if __1c_enterprise_use_wk41 ; then + ignore_lib_requires 'libwebkit2gtk-4.0.so.*' 'libjavascriptcoregtk-4.0.so.*' 'libsoup-2.4.so.*' + add_requires 'libwebkit2gtk-4.1.so.0' 'libjavascriptcoregtk-4.1.so.0' + else + ignore_lib_requires 'libwebkit2gtk-4.1.so.*' 'libjavascriptcoregtk-4.1.so.*' 'libsoup-3.0.so.*' + add_requires 'libwebkit2gtk-4.0.so.37' 'libjavascriptcoregtk-4.0.so.18' + fi +} + +__1c_enterprise_add_package_requires() +{ + local pkgname="$1" + + case "$pkgname" in + *-nls) + add_directrequires "${pkgname%-nls}" + ;; + esac + + case "$pkgname" in + *-thin-client|1c-enterprise-thin-client) + ;; + *-client|1c-enterprise-client) + add_directrequires "${pkgname%-client}-server" + ;; + *-server|1c-enterprise-server) + add_directrequires "${pkgname%-server}-common" + ;; + *-ws|1c-enterprise-ws) + add_directrequires "${pkgname%-ws}-common" + ;; + *-crs|1c-enterprise-crs) + add_directrequires "${pkgname%-crs}-server" + add_directrequires "${pkgname%-crs}-ws" + ;; + esac +} + +__1c_enterprise_lib_version() +{ + local file="$1" + local libname="$2" + local realfile + + case "$libname" in + libstdc++.so.6) + strings "$file" 2>/dev/null | sed -n 's|^GLIBCXX_\([0-9][0-9.]*\)$|\1|p' | sort -V | tail -n1 + ;; + libgcc_s.so.1) + strings "$file" 2>/dev/null | sed -n 's|^GCC_\([0-9][0-9.]*\)$|\1|p' | sort -V | tail -n1 + ;; + libhwy.so.1) + realfile="$(readlink -f "$file" 2>/dev/null || echo "$file")" + basename "$realfile" | sed -n 's|^libhwy\.so\.\([0-9][0-9.]*\)$|\1|p' + ;; + esac +} + +__1c_enterprise_version_ge() +{ + local ver="$1" + local minver="$2" + + [ -n "$ver" ] || return 1 + [ -n "$minver" ] || return 1 + [ "$(printf '%s\n%s\n' "$ver" "$minver" | sort -V | tail -n1)" = "$ver" ] +} + +__1c_enterprise_version_gt() +{ + local ver="$1" + local minver="$2" + + [ -n "$ver" ] || return 1 + [ -n "$minver" ] || return 1 + [ "$ver" != "$minver" ] || return 1 + __1c_enterprise_version_ge "$ver" "$minver" +} + +__1c_enterprise_assure_strings() +{ + command -v strings >/dev/null 2>&1 && return 0 + + if command -v epm >/dev/null 2>&1 ; then + epm install --skip-installed binutils || true + fi + + command -v strings >/dev/null 2>&1 && return 0 + warning "Keeping bundled runtime libraries: strings command was not found" + return 1 +} + +__1c_enterprise_best_lib_in_dir() +{ + local dir="$1" + local libname="$2" + local file version bestfile bestversion + + for file in "$dir/$libname" "$dir/$libname".* + do + [ -e "$file" ] || [ -L "$file" ] || continue + version="$(__1c_enterprise_lib_version "$file" "$libname")" + [ -n "$version" ] || continue + if [ -z "$bestversion" ] || __1c_enterprise_version_ge "$version" "$bestversion" ; then + bestfile="$file" + bestversion="$version" + fi + done + + [ -n "$bestfile" ] || return 1 + echo "$bestfile" +} + +__1c_enterprise_best_system_lib() +{ + local libname="$1" + local file version bestfile bestversion + + for file in \ + /lib*/"$libname" /lib*/"$libname".* \ + /usr/lib*/"$libname" /usr/lib*/"$libname".* \ + /lib*/*/"$libname" /lib*/*/"$libname".* \ + /usr/lib*/*/"$libname" /usr/lib*/*/"$libname".* + do + [ -e "$file" ] || [ -L "$file" ] || continue + version="$(__1c_enterprise_lib_version "$file" "$libname")" + [ -n "$version" ] || continue + if [ -z "$bestversion" ] || __1c_enterprise_version_ge "$version" "$bestversion" ; then + bestfile="$file" + bestversion="$version" + fi + done + + [ -n "$bestfile" ] || return 1 + echo "$bestfile" +} + +__1c_enterprise_distro_name() +{ + if command -v distr_info >/dev/null 2>&1 ; then + distr_info -d 2>/dev/null && return 0 + fi + + if command -v lsb_release >/dev/null 2>&1 ; then + lsb_release -is 2>/dev/null && return 0 + fi + + sed -n 's|^ID=||p' /etc/os-release 2>/dev/null | tr -d '"' | head -n1 +} + +__1c_enterprise_distro_version() +{ + if command -v distr_info >/dev/null 2>&1 ; then + distr_info -v 2>/dev/null && return 0 + fi + + if command -v lsb_release >/dev/null 2>&1 ; then + lsb_release -r 2>/dev/null | awk '{print $NF}' && return 0 + fi + + sed -n 's|^VERSION_ID=||p' /etc/os-release 2>/dev/null | tr -d '"' | head -n1 +} + +__1c_enterprise_use_wk41() +{ + local distrname distrver + + distrname="$(__1c_enterprise_distro_name | tr '[:upper:]' '[:lower:]')" + distrver="$(__1c_enterprise_distro_version | cut -d_ -f1 | cut -d. -f1)" + + case "$distrname" in + *stra*) + distrver="$(__1c_enterprise_distro_version | cut -d_ -f1)" + __1c_enterprise_version_gt "$distrver" 1.7 || return 1 + ;; + *buntu) + __1c_enterprise_version_gt "$distrver" 23 || return 1 + ;; + *inux*int*) + __1c_enterprise_version_gt "$distrver" 21 || return 1 + ;; + *) + return 1 + ;; + esac +} + +__1c_enterprise_prepare_wk41() +{ + local versiondir="$1" + + [ -n "$versiondir" ] || return 0 + [ -d "$BUILDROOT$versiondir" ] || return 0 + __1c_enterprise_use_wk41 || return 0 + + [ -f "$BUILDROOT$versiondir/libwx_gtk3u-3.0.so.0.1.0.wk41" ] && + ln -sfn libwx_gtk3u-3.0.so.0.1.0.wk41 "$BUILDROOT$versiondir/libwx_gtk3u-3.0.so.0" + + [ -f "$BUILDROOT$versiondir/webkit2_extu-3.0.so.wk41" ] && + [ -d "$BUILDROOT$versiondir/webkit2ext" ] && + ln -sfn ../webkit2_extu-3.0.so.wk41 "$BUILDROOT$versiondir/webkit2ext/webkit2_extu-3.0.so" +} + +__1c_enterprise_prepare_conf() +{ + mkdir -p "$BUILDROOT/opt/1cv8/conf" || fatal + pack_dir /opt/1cv8/conf + + if [ ! -f "$BUILDROOT/opt/1cv8/conf/conf.cfg" ] ; then + echo 'SystemLanguage=System' | create_file /opt/1cv8/conf/conf.cfg + else + pack_file /opt/1cv8/conf/conf.cfg + fi + + chmod 0644 "$BUILDROOT/opt/1cv8/conf/conf.cfg" + mark_config_noreplace /opt/1cv8/conf/conf.cfg +} + +__1c_enterprise_remove_lib_files() +{ + local root="$1" + local dir="$2" + local libname="$3" + local reldir + + reldir="${dir#$root}" + + if [ -n "$BUILDROOT" ] && [ "$root" = "$BUILDROOT" ] && command -v remove_file >/dev/null 2>&1 ; then + remove_file "$reldir/$libname" + remove_file "$reldir/$libname.*" + return + fi + + rm -fv "$dir/$libname" "$dir/$libname".* +} + +__1c_enterprise_remove_bundled_runtime_libs_from_root() +{ + local root="$1" + local dir libname bundled systemlib bundledversion systemversion + + [ -n "$root" ] || root="$BUILDROOT" + [ -n "$root" ] || return 0 + __1c_enterprise_assure_strings || return 0 + + for dir in \ + "$root"/opt/1cv8/*/* "$root"/opt/1cv8/common + do + [ -d "$dir" ] || continue + for libname in libstdc++.so.6 libgcc_s.so.1 libhwy.so.1 ; do + bundled="$(__1c_enterprise_best_lib_in_dir "$dir" "$libname")" || continue + systemlib="$(__1c_enterprise_best_system_lib "$libname")" || { + warning "Keeping bundled $libname: system library was not found" + continue + } + bundledversion="$(__1c_enterprise_lib_version "$bundled" "$libname")" + systemversion="$(__1c_enterprise_lib_version "$systemlib" "$libname")" + + if [ -z "$bundledversion" ] || [ -z "$systemversion" ] ; then + warning "Keeping bundled $libname: can't compare bundled and system versions" + continue + fi + + if __1c_enterprise_version_ge "$systemversion" "$bundledversion" ; then + info "Removing bundled $libname $bundledversion; system $systemversion is enough" + __1c_enterprise_remove_lib_files "$root" "$dir" "$libname" + else + info "Keeping bundled $libname $bundledversion; system $systemversion is older" + fi + done + done +} + +__1c_enterprise_remove_bundled_runtime_libs() +{ + __1c_enterprise_remove_bundled_runtime_libs_from_root "$BUILDROOT" +} + +__1c_enterprise_get_version_dir() +{ + local arch dir + for arch in x86_64 i586 i386 ; do + for dir in "$BUILDROOT/opt/1cv8/$arch"/*.*.*.* ; do + [ -d "$dir" ] || continue + echo "${dir#$BUILDROOT}" + return 0 + done + done + return 1 +} + +__1c_enterprise_copy_to_common() +{ + local versiondir="$1" + local pattern src dest + + [ -n "$versiondir" ] || return 0 + [ -d "$BUILDROOT$versiondir" ] || return 0 + + mkdir -p "$BUILDROOT/opt/1cv8/common" || fatal + pack_dir /opt/1cv8/common + + for pattern in \ + nuke83.so uiproxywx.so core*.so \ + 'libwx_gtk3u-3.0.*' 'libwx_gtk3u_gl-3.0.*' 'libicu*' 'libatomic.so.1*' \ + libunwind.so.8 'libtcmalloc.so.4*' + do + for src in "$BUILDROOT$versiondir"/$pattern ; do + [ -e "$src" ] || [ -L "$src" ] || continue + dest="/opt/1cv8/common/$(basename "$src")" + cp -a "$src" "$BUILDROOT$dest" || fatal + pack_file "$dest" + done + done +} + +__1c_enterprise_prepare_starter() +{ + local versiondir + local desktop + + versiondir="$(__1c_enterprise_get_version_dir)" || return 0 + + __1c_enterprise_prepare_wk41 "$versiondir" + __1c_enterprise_copy_to_common "$versiondir" + + move_file "$versiondir/1cestart" /opt/1cv8/common/1cestart + add_bin_link_command 1cestart /opt/1cv8/common/1cestart + + for desktop in "$BUILDROOT$versiondir"/1cestart*.desktop ; do + [ -e "$desktop" ] || [ -L "$desktop" ] || continue + move_file "${desktop#$BUILDROOT}" /usr/share/applications/1cestart.desktop + chmod 0644 "$BUILDROOT/usr/share/applications/1cestart.desktop" + break + done + + fix_desktop_file /opt/1cv8/common/1cestart 1cestart +} + +__1c_enterprise_install_server_units() +{ + local versiondir + local unit + + versiondir="$(__1c_enterprise_get_version_dir)" || return 0 + + for unit in "$BUILDROOT$versiondir"/*.service ; do + [ -e "$unit" ] || [ -L "$unit" ] || continue + move_file "${unit#$BUILDROOT}" "/usr/lib/systemd/system/$(basename "$unit")" + done + + cat <