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:
parent
d37f702b6e
commit
9ac7ceb779
|
@ -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}"
|
||||||
|
|
|
@ -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 ];
|
||||||
|
|
||||||
|
|
|
@ -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)) {
|
Loading…
Reference in New Issue