Browse Source

Improve excludelist generation (fixes #274)

master
TheAssassin 7 years ago
parent
commit
d883d6df64
  1. 12
      tools/excludelist.sh
  2. 42
      tools/generate-excludelist.sh
  3. 5
      tools/linuxdeployqt/CMakeLists.txt
  4. 69
      tools/linuxdeployqt/excludelist.h
  5. 12
      tools/linuxdeployqt/linuxdeployqt.pro
  6. 18
      tools/linuxdeployqt/shared.cpp

12
tools/excludelist.sh

@ -1,12 +0,0 @@
#!/bin/bash
set -e
# Download excludelist
blacklisted=($(wget --quiet https://raw.githubusercontent.com/probonopd/AppImages/master/excludelist -O - | sort | uniq | grep -v "^#.*" | grep "[^-\s]"))
# Create array
for item in ${blacklisted[@]:0:${#blacklisted[@]}-1}; do
echo -ne '\\"'$item'\\" << '
done
echo -ne '\\"'${blacklisted[-1]}'\\"'

42
tools/generate-excludelist.sh

@ -0,0 +1,42 @@
#!/bin/bash
set -e
# download excludelist
blacklisted=($(wget --quiet https://raw.githubusercontent.com/probonopd/AppImages/master/excludelist -O - | sort | uniq | grep -v "^#.*" | grep "[^-\s]"))
# sanity check
if [ "$blacklisted" == "" ]; then
exit 1;
fi
filename=$(readlink -f $(dirname "$0"))/linuxdeployqt/excludelist.h
# overwrite existing source file
cat > "$filename" <<EOF
/*
* List of libraries to exclude for different reasons.
*
* Automatically generated from
* https://raw.githubusercontent.com/probonopd/AppImages/master/excludelist
*
* This file shall be committed by the developers occassionally,
* otherwise systems without access to the internet won't be able to build
* fully working versions of linuxdeployqt.
*
* See https://github.com/probonopd/linuxdeployqt/issues/274 for more
* information.
*/
#include <QStringList>
static const QStringList generatedExcludelist = {
EOF
# Create array
for item in ${blacklisted[@]:0:${#blacklisted[@]}-1}; do
echo -e ' "'"$item"'",' >> "$filename"
done
echo -e ' "'"${blacklisted[-1]}"'"' >> "$filename"
echo "};" >> "$filename"

5
tools/linuxdeployqt/CMakeLists.txt

@ -9,14 +9,15 @@ add_definitions("-DBUILD_NUMBER=\"${BUILD_NUMBER}\"")
find_package(Qt5 REQUIRED COMPONENTS Core) find_package(Qt5 REQUIRED COMPONENTS Core)
# update excludelist # update excludelist
message(STATUS "Updating excludelist...")
execute_process( execute_process(
COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/../excludelist.sh COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/../generate-excludelist.sh
OUTPUT_VARIABLE EXCLUDELIST OUTPUT_VARIABLE EXCLUDELIST
TIMEOUT 10 TIMEOUT 10
RESULT_VARIABLE EXCLUDELIST_RESULT RESULT_VARIABLE EXCLUDELIST_RESULT
) )
if(NOT EXCLUDELIST_RESULT EQUAL 0) if(NOT EXCLUDELIST_RESULT EQUAL 0)
message(FATAL_ERROR "Failed to fetch and generate excludelist") message(WARNING "Updating excludelist failed, using outdated copy")
endif() endif()
mark_as_advanced(EXCLUDELIST EXCLUDELIST_RESULT) mark_as_advanced(EXCLUDELIST EXCLUDELIST_RESULT)

69
tools/linuxdeployqt/excludelist.h

@ -0,0 +1,69 @@
/*
* List of libraries to exclude for different reasons.
*
* Automatically generated from
* https://raw.githubusercontent.com/probonopd/AppImages/master/excludelist
*
* This file shall be committed by the developers occassionally,
* otherwise systems without access to the internet won't be able to build
* fully working versions of linuxdeployqt.
*
* See https://github.com/probonopd/linuxdeployqt/issues/274 for more
* information.
*/
#include <QStringList>
static const QStringList generatedExcludelist = {
"ld-linux.so.2",
"ld-linux-x86-64.so.2",
"libanl.so.1",
"libasound.so.2",
"libBrokenLocale.so.1",
"libcidn.so.1",
"libcom_err.so.2",
"libcrypt.so.1",
"libc.so.6",
"libdl.so.2",
"libdrm.so.2",
"libexpat.so.1",
"libfontconfig.so.1",
"libfreetype.so.6",
"libgcc_s.so.1",
"libgdk_pixbuf-2.0.so.0",
"libgio-2.0.so.0",
"libglib-2.0.so.0",
"libGL.so.1",
"libgobject-2.0.so.0",
"libgpg-error.so.0",
"libharfbuzz.so.0",
"libICE.so.6",
"libjack.so.0",
"libkeyutils.so.1",
"libm.so.6",
"libmvec.so.1",
"libnsl.so.1",
"libnss_compat.so.2",
"libnss_db.so.2",
"libnss_dns.so.2",
"libnss_files.so.2",
"libnss_hesiod.so.2",
"libnss_nisplus.so.2",
"libnss_nis.so.2",
"libp11-kit.so.0",
"libpango-1.0.so.0",
"libpangocairo-1.0.so.0",
"libpangoft2-1.0.so.0",
"libpthread.so.0",
"libresolv.so.2",
"librt.so.1",
"libSM.so.6",
"libstdc++.so.6",
"libthread_db.so.1",
"libusb-1.0.so.0",
"libutil.so.1",
"libuuid.so.1",
"libX11.so.6",
"libxcb.so.1",
"libz.so.1"
};

12
tools/linuxdeployqt/linuxdeployqt.pro

@ -38,18 +38,12 @@ DEFINES += LINUXDEPLOYQT_VERSION="'\"$(shell cd $$PWD && git describe --tags $(s
contains(DEFINES, EXCLUDELIST.*) { contains(DEFINES, EXCLUDELIST.*) {
message("EXCLUDELIST specified, to use the most recent exclude list, please run qmake without EXCLUDELIST definition and with internet.") message("EXCLUDELIST specified, to use the most recent exclude list, please run qmake without EXCLUDELIST definition and with internet.")
} else { } else {
message("Creating exclude list.") message("Updating exclude list...")
# check whether command _would_ run successfully # check whether command _would_ run successfully
EXCLUDELIST_GENERATION_WORKS = FALSE EXCLUDELIST_GENERATION_WORKS = FALSE
system($$_PRO_FILE_PWD_/../excludelist.sh): EXCLUDELIST_GENERATION_WORKS = TRUE system($$_PRO_FILE_PWD_/../generate-excludelist.sh): EXCLUDELIST_GENERATION_WORKS = TRUE
isEqual(EXCLUDELIST_GENERATION_WORKS, FALSE) { isEqual(EXCLUDELIST_GENERATION_WORKS, FALSE) {
error("Generating excludelist failed") warning("Updating excludelist failed, using outdated copy")
} }
EXCLUDELIST = $$system($$_PRO_FILE_PWD_/../excludelist.sh)
isEmpty(EXCLUDELIST) {
error("Generated excludelist is empty")
}
DEFINES += EXCLUDELIST=\""$$EXCLUDELIST"\"
} }

18
tools/linuxdeployqt/shared.cpp

@ -44,6 +44,7 @@
#include <QRegularExpression> #include <QRegularExpression>
#include <QStandardPaths> #include <QStandardPaths>
#include "shared.h" #include "shared.h"
#include "excludelist.h"
QString appBinaryPath; QString appBinaryPath;
bool runStripEnabled = true; bool runStripEnabled = true;
@ -465,20 +466,13 @@ LibraryInfo parseLddLibraryLine(const QString &line, const QString &appDirPath,
This is more suitable for bundling in a way that is portable between different distributions and target systems. This is more suitable for bundling in a way that is portable between different distributions and target systems.
Along the way, this also takes care of non-Qt libraries. Along the way, this also takes care of non-Qt libraries.
The excludelist can be updated by running The excludelist can be updated by running the bundled script generate-excludelist.sh
#/bin/bash
blacklisted=$(wget https://raw.githubusercontent.com/probonopd/AppImages/master/excludelist -O - | sort | uniq | grep -v "^#.*" | grep "[^-\s]")
for item in $blacklisted; do
echo -ne '"'$item'" << '
done
*/ */
QStringList excludelist; // copy generated excludelist
#ifndef EXCLUDELIST QStringList excludelist = generatedExcludelist;
#error "EXCLUDELIST not defined! Please have your build system download run excludelist.sh and add -DEXCLUDE_LIST=<result>"
#else // append exclude libs
excludelist << EXCLUDELIST;
#endif
excludelist += excludeLibs; excludelist += excludeLibs;
LogDebug() << "excludelist:" << excludelist; LogDebug() << "excludelist:" << excludelist;

Loading…
Cancel
Save