Revert last commit and patch linuxdeployqt so that it doesn't require massaging of files

- After decision to not support Ubuntu 16.04, we can drop the code that copied all the dependency tree
This commit is contained in:
Pedro Pombeiro 2019-03-12 13:11:49 +01:00
parent d37f702b6e
commit 9ac7ceb779
No known key found for this signature in database
GPG Key ID: C4A24185B2AA48A1
3 changed files with 59 additions and 123 deletions

View File

@ -230,116 +230,6 @@ function bundleWindows() {
./deployment/windows/nsis/setup.nsi ./deployment/windows/nsis/setup.nsi
} }
if is_linux; then
declare -A treated_libs=()
function handleLinuxDependency() {
local module="$1"
local targetPath="$2"
local indent="$3"
if [ ${treated_libs[$module]} ]; then
return
fi
treated_libs["$module"]=1
local targetModule="$targetPath/$(basename $module)"
if [ -L "$module" ]; then
handleLinuxDependency "$(dirname $module)/$(readlink -sq $module)" "$targetPath" "$indent"
fi
# Copy library to target
[ $VERBOSE_LEVEL -ge 2 ] && echo "${indent}Copying $module to $targetModule"
cp -a -f $module $targetModule
chmod 777 $targetModule
if [ -f "$targetModule" ]; then
module="$targetModule"
else
echo -e "${RED}FATAL: $DEPLOYQT should have copied the dependency to ${targetPath}${NC}"
exit 1
fi
treated_libs["$module"]=1
if [ ! -L "$module" ]; then
fixupRPathsInModule "$module" "$targetPath" " ${indent}"
fi
}
function fixupRPathsInModule() {
local module="$1"
local targetPath="$2"
local indent="$3"
if program_exists 'realpath'; then
module=$(realpath -m --no-symlinks "$module" 2> /dev/null)
fi
local type=$(realpath $module | xargs file | awk -F':' "/^.*/{print \$2}" | awk -F' ' "/^.*/{print \$1}")
if [ "$type" != 'ELF' ]; then
return
fi
treated_libs["$module"]=1
[ $VERBOSE_LEVEL -ge 2 ] && echo "${indent}Examining ${module}"
if [ -L "$module" ]; then
handleLinuxDependency "$(dirname $module)/$(readlink -sq $module)" "$targetPath" "$indent"
return
fi
# Walk through the dependencies of $module
local package_dep_libs=$(ldd $module | grep '=>')
[ $? -eq 0 ] || return
package_dep_libs=$(echo "$package_dep_libs" | awk -F'=>' -F ' ' "/^.*/{print \$3}")
if [ $(echo "$package_dep_libs" | grep "not found") ]; then
echo "Some dependencies for $module were not found:"
ldd $module
exit 1
fi
# Change dependency rpath in $module to point to $libPath
local relPath="/$(realpath --relative-to="$(dirname $module)" $libPath)"
[ "$relPath" = '/.' ] && relPath=''
local rpath="\$ORIGIN${relPath}"
echo "${indent}Updating $module to point to $rpath"
patchelf --set-rpath "$rpath" "$module"
set +e
patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 "$module" 2> /dev/null
set -e
local nix_package_dep_libs=$(echo "$package_dep_libs" | grep /nix)
if [ ${#nix_package_dep_libs[@]} -eq 0 ]; then
return
fi
for depModule in ${nix_package_dep_libs[@]}; do
local type=$(realpath $depModule | xargs file | awk -F':' "/^.*/{print \$2}" | awk -F' ' "/^.*/{print \$1}")
if [ $type == 'ELF' ]; then
local fileName=$(basename $depModule)
local baseNameGlob="$(dirname $depModule)/${fileName%%.*}.so*"
for file in `ls $baseNameGlob 2> /dev/null`; do
if [ -L "$file" ]; then
handleLinuxDependency "$file" "$targetPath" "$indent"
fi
done
handleLinuxDependency "$depModule" "$targetPath" "$indent"
else
echo "${indent}$depModule is not an ELF file"
fi
done
}
function patchQtPlugins() {
for f in `find $1 -name *.so*`; do
local relPath=$(realpath --relative-to="$(dirname $f)" ${WORKFOLDER}/AppDir/usr/lib)
patchelf --set-rpath "\$ORIGIN/$relPath" $f
touch --no-create -h -t 197001010000.00 $f
done
}
fi
function bundleLinux() { function bundleLinux() {
local QTBIN=$(joinExistingPath "$QT_PATH" 'gcc_64/bin') local QTBIN=$(joinExistingPath "$QT_PATH" 'gcc_64/bin')
if [ ! -d "$QTBIN" ]; then if [ ! -d "$QTBIN" ]; then
@ -369,10 +259,6 @@ function bundleLinux() {
cp ./.env $usrBinPath cp ./.env $usrBinPath
cp ./desktop/bin/Status ./desktop/bin/reportApp $usrBinPath cp ./desktop/bin/Status ./desktop/bin/reportApp $usrBinPath
local libPath=$(joinPath "$WORKFOLDER" "AppDir/usr/lib")
fixupRPathsInModule "$usrBinPath/Status" "$libPath"
fixupRPathsInModule "$usrBinPath/reportApp" "$libPath"
rm -f Application-x86_64.AppImage Status-x86_64.AppImage rm -f Application-x86_64.AppImage Status-x86_64.AppImage
[ $VERBOSE_LEVEL -ge 1 ] && ldd $(joinExistingPath "$usrBinPath" 'Status') [ $VERBOSE_LEVEL -ge 1 ] && ldd $(joinExistingPath "$usrBinPath" 'Status')
@ -383,33 +269,41 @@ function bundleLinux() {
rm -f $usrBinPath/Status.AppImage rm -f $usrBinPath/Status.AppImage
popd popd
# TODO: process plugins
linuxdeployqt \ linuxdeployqt \
$desktopFilePath \ $desktopFilePath \
-verbose=$VERBOSE_LEVEL -no-strip \ -verbose=$VERBOSE_LEVEL -always-overwrite -no-strip \
-no-translations -bundle-non-qt-libs \ -no-translations -bundle-non-qt-libs \
-qmake="$qmakePath" \ -qmake="$qmakePath" \
-executable="$(joinExistingPath "$usrBinPath" 'reportApp')" \ -executable="$(joinExistingPath "$usrBinPath" 'reportApp')" \
-qmldir="$(joinExistingPath "$STATUSREACTPATH" 'node_modules/react-native')" \ -qmldir="$(joinExistingPath "$STATUSREACTPATH" 'node_modules/react-native')" \
-qmldir="$(joinExistingPath "$STATUSREACTPATH" 'desktop/reportApp')" \ -qmldir="$(joinExistingPath "$STATUSREACTPATH" 'desktop/reportApp')" \
-extra-plugins=imageformats/libqsvg.so \ -extra-plugins=imageformats/libqsvg.so
-appimage
patchQtPlugins "${WORKFOLDER}/AppDir/usr/plugins"
patchQtPlugins "${WORKFOLDER}/AppDir/usr/qml"
pushd $WORKFOLDER pushd $WORKFOLDER
rm -f $usrBinPath/Status.AppImage rm -f $usrBinPath/Status.AppImage
# Patch libraries and executables to remove references to /nix/store
set +e
for f in `find ./AppDir/usr/lib/*`; do
patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 $f 2> /dev/null
patchelf --set-rpath "\$ORIGIN" $f
done
set -e
for f in $usrBinPath/Status $usrBinPath/reportApp; do
patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 --set-rpath "\$ORIGIN:\$ORIGIN/../lib" $f
done
# To make the output more reproducible, always set the timestamps to the same value
for f in `find ./AppDir`; do for f in `find ./AppDir`; do
touch --no-create -h -t 197001010000.00 $f touch --no-create -h -t 197001010000.00 $f
done done
[ $VERBOSE_LEVEL -ge 1 ] && ldd $usrBinPath/Status [ $VERBOSE_LEVEL -ge 1 ] && ldd $usrBinPath/Status
appimagetool ./AppDir appimagetool ./AppDir
# Ensure the AppImage isn't using the interpreter in Nix's store # Ensure the AppImage itself isn't using the interpreter in Nix's store
patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 ./Status-x86_64.AppImage patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 --set-rpath "\$ORIGIN" ./Status-x86_64.AppImage
chmod +x ./Status-x86_64.AppImage chmod +x ./Status-x86_64.AppImage
rm -rf Status.AppImage rm -rf Status.AppImage
mv -f ./Status-x86_64.AppImage ..
popd popd
echo -e "${GREEN}Package ready in ./Status-x86_64.AppImage!${NC}" echo -e "${GREEN}Package ready in ./Status-x86_64.AppImage!${NC}"

View File

@ -16,6 +16,9 @@ stdenv.mkDerivation rec {
} }
else throw "${name} is not supported on ${stdenv.hostPlatform.system}"; else throw "${name} is not supported on ${stdenv.hostPlatform.system}";
# Add our own patch to make linuxdeployqt correctly include all /nix/store rpaths to LD_LIBRARY_PATH so we don't have to calculate that ourselves
patches = [ ./linuxdeployqt.patch ];
buildInputs = [ qt5.qtbase appimagekit ]; buildInputs = [ qt5.qtbase appimagekit ];
nativeBuildInputs = [ wget ]; nativeBuildInputs = [ wget ];

View File

@ -0,0 +1,39 @@
diff --git a/tools/linuxdeployqt/shared.cpp b/tools/linuxdeployqt/shared.cpp
index 4c0919a..1a136e0 100644
--- a/tools/linuxdeployqt/shared.cpp
+++ b/tools/linuxdeployqt/shared.cpp
@@ -833,20 +833,23 @@ void changeIdentification(const QString &id, const QString &binaryPath)
LogNormal() << "Checking rpath in" << binaryPath;
QString oldRpath = runPatchelf(QStringList() << "--print-rpath" << binaryPath);
LogDebug() << "oldRpath:" << oldRpath;
- if (oldRpath.startsWith("/")){
- LogDebug() << "Old rpath in" << binaryPath << "starts with /, hence adding it to LD_LIBRARY_PATH";
- // FIXME: Split along ":" characters, check each one, only append to LD_LIBRARY_PATH if not already there
- QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
- QString oldPath = env.value("LD_LIBRARY_PATH");
- if (not oldPath.contains(oldRpath)){
- QString newPath = oldRpath + ":" + oldPath; // FIXME: If we use a ldd replacement, we still need to observe this path
- // FIXME: Directory layout might be different for system Qt; cannot assume lib/ to always be inside the Qt directory
- LogDebug() << "Added to LD_LIBRARY_PATH:" << newPath;
- setenv("LD_LIBRARY_PATH",newPath.toUtf8().constData(),1);
+
+ QStringList rpath = oldRpath.split(":", QString::SkipEmptyParts);
+ foreach(QString path, QStringList(rpath)) {
+ if (path.startsWith("/")){
+ LogDebug() << "Old rpath in" << binaryPath << "starts with /, hence adding it to LD_LIBRARY_PATH";
+ // FIXME: Split along ":" characters, check each one, only append to LD_LIBRARY_PATH if not already there
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+ QString oldPath = env.value("LD_LIBRARY_PATH");
+ if (not oldPath.contains(oldRpath)){
+ QString newPath = oldRpath + ":" + oldPath; // FIXME: If we use a ldd replacement, we still need to observe this path
+ // FIXME: Directory layout might be different for system Qt; cannot assume lib/ to always be inside the Qt directory
+ LogDebug() << "Added to LD_LIBRARY_PATH:" << newPath;
+ setenv("LD_LIBRARY_PATH",newPath.toUtf8().constData(),1);
+ }
}
}
- QStringList rpath = oldRpath.split(":", QString::SkipEmptyParts);
rpath.prepend(id);
rpath.removeDuplicates();
foreach(QString path, QStringList(rpath)) {