Pagina 1 di 1

[SOLVED] Supporto QScintilla2 per Qt4/Qt5 su current

Inviato: ven ago 30, 2019 21:10
da gian_d
Da parecchio tempo non riuscivo più ad utilizzare la versione installata di QGIS, ferma ormai alla 2.8.18 (non ero mai riuscito ad installare versioni più recenti), sicuramente per problemi associati agli aggiornamenti della current. Ho ricompilato i pacchetti di tutte le dipendenze, ma niente da fare, l'installazione di QGIS 2.8 attraverso lo slackbuild non va a causa di errori durante la compilazione.
A quel punto, invece di sbattermi per cercare di risolvere i problemi di installazione di una versione datata mi sono dedicato agli ultimi rilasci di QGIS, nella fattispecie la versione 3.8.2. Il problema è che le versioni della serie 3 richiedono ormai tutti gli aggiornamenti all'ambiente Qt5 e Python 3 e qui saltavano fuori le rogne. Ho installato dagli slackbuild PyQt5, python3-PyQt5, qca-gt5 e qualcos'altro, tutti pacchetti necessari per poter installare Qgis. Dopo di che ho adattato lo slackbuild per renderlo compatibile con i nuovi sorgenti, verificando le patch, ecc.

Nonostante questo, la compilazione di fermava alla configurazione. Il problema era generato dall'impossibilità di trovare l'integrazione QScintilla2 con Python 3 Sip e Qt5. Da un paio di settimane le ho provate tutte cercando anche soluzioni sporche, ma niente da fare. In sostanza l'installazione di QScintilla dal pacchetto della current (che è stato da poco ricompilato da Alien) non va: vengono installate le librerie compatibili con Qt4 ma nessuna integrazione con Qt5 e tanto meno con l'universo python.

Alla fine ho deciso oggi di disinstallare il pacchetto di QScintilla disponibile sulla current e di compilare il sorgente riadattando lo slackbuild disponibile su /slackware64/current/source. La compilazione è andata a buon fine e ho visto che ha creato le librerie compatibili con Qt5 (libqscintilla2_qt5) e con python3 e sip. Dopo aver installato il pacchetto personalizzato sono finalmente riuscito a installare QGIS 3.8.2. All'avvio mancavano solo alcuni moduli python che ho installato con pip3.

Se qualcuno dovesse avere problemi con QScintilla/Qt5 può eventualmente provare la stessa strada che ho percorso io, perciò posto qui il codice dello slackbuild

Codice: Seleziona tutto

#!/bin/sh

# Slackware build script for QScintilla

# Copyright 2008  Robby Workman <rworkman@slackware.com> Northport, AL, USA
# Copyright 2008, 2009, 2010, 2011, 2012, 2018, 2019  Patrick J. Volkerding, Sebeka, MN, USA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Modified 2018, 2019 by Eric Hameleers <alien@slackware.com> (add Qt5 support)

CWD=$(pwd)

PKGNAM=QScintilla
VERSION="2.11.2"
BUILD=${BUILD:-1_gian}

TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PKGNAM
OUTPUT=${OUTPUT:-/tmp}

# Automatically determine the architecture we're building on:
if [ -z "$ARCH" ]; then
  case "$(uname -m)" in
    i?86) ARCH=i586 ;;
    arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;;
    # Unless $ARCH is already set, use uname -m for all other archs:
    *) ARCH=$(uname -m) ;;
  esac
  export ARCH
fi

# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
# the name of the created package would be, and then exit. This information
# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
  echo "$PKGNAM-$VERSION-$ARCH-$BUILD.txz"
  exit 0
fi

if [ "$ARCH" = "i586" ]; then
  SLKCFLAGS="-O2 -march=i586 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
elif [ "$ARCH" = "armv7hl" ]; then
  SLKCFLAGS="-O2 -march=armv7-a -mfpu=vfpv3-d16"
  LIBDIRSUFFIX=""
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi

rm -rf $PKG
mkdir -p $TMP $PKG
cd $TMP
rm -rf ${PKGNAM}_gpl-$VERSION
tar xvf $CWD/${PKGNAM}_gpl-$VERSION.tar.gz || exit 1
cd ${PKGNAM}_gpl-$VERSION || exit 1

# Fix compilation:
patch -p1 < $CWD/QScintilla_qsciscintillabase_qurl.diff

chown -R root:root .
find . \
 \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \
 -exec chmod 755 {} \; -o \
 \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
 -exec chmod 644 {} \;

# Define QMAKEFEATURES to that we can re-use already built libs
# without spamming the harddisk:
export QMAKEFEATURES=${PWD}/Qt4Qt5/features/

# Conditional build of Qt5 support:
if qtpaths-qt5 --qt-version 1>/dev/null 2>/dev/null ; then
  echo "-- Compiling Qt5 support --"

  # QT5 support first:
  cd Qt4Qt5
    echo "-- >> Qt4Qt5 --"
    qmake-qt5 \
      -o Makefile \
      QMAKE_CFLAGS+="$SLKCFLAGS" \
      QMAKE_CXXFLAGS+="$SLKCFLAGS -std=c++11" \
      qscintilla.pro || exit 1
    make install DESTDIR=$PKG INSTALL_ROOT=$PKG || exit 1
  cd -

  cd designer-Qt4Qt5
    echo "-- >> designer-Qt4Qt5 --"
    qmake-qt5 \
      -o Makefile \
      INCLUDEPATH+=../Qt4Qt5 QMAKE_LIBDIR+=../Qt4Qt5 \
      QMAKE_CFLAGS+="$SLKCFLAGS" \
      QMAKE_CXXFLAGS+="$SLKCFLAGS -std=c++11" \
      designer.pro || exit 1
    make install DESTDIR=$PKG INSTALL_ROOT=$PKG || exit 1
  cd -

  cd Python
    echo "-- >> Python --"
    python3 configure.py \
      --verbose \
      --qmake /usr/bin/qmake-qt5 \
      --pyqt=PyQt5 \
      -n ../Qt4Qt5/ -o ../Qt4Qt5/ -c \
      || exit 1
    make  || exit 1
    make -j1 install DESTDIR=$PKG INSTALL_ROOT=$PKG || exit 1

    make clean || exit 1

    python2 configure.py \
      --verbose \
      --qmake /usr/bin/qmake-qt5 \
      --pyqt=PyQt5 \
      -n ../Qt4Qt5/ -o ../Qt4Qt5/ -c \
      || exit 1
    make  || exit 1
    make -j1 install DESTDIR=$PKG INSTALL_ROOT=$PKG || exit 1
  cd -

  # In order to compile Qt4 support next, clean up first:
  make clean -C Qt4Qt5 || exit 1
  make clean -C designer-Qt4Qt5 || exit 1
  make clean -C Python || exit 1
fi

# QT4 support:
echo "-- Compiling Qt4 support --"
cd Qt4Qt5
  echo "-- >> Qt4Qt5 --"
  qmake \
    -o Makefile \
    QMAKE_CFLAGS+="$SLKCFLAGS" \
    QMAKE_CXXFLAGS+="$SLKCFLAGS -std=c++11" \
    qscintilla.pro || exit 1
  make install INSTALL_ROOT=$PKG || exit 1
cd -

cd designer-Qt4Qt5
  echo "-- >> designer-Qt4Qt5 --"
  qmake \
    -o Makefile \
    INCLUDEPATH+=../Qt4Qt5 QMAKE_LIBDIR+=../Qt4Qt5 \
    QMAKE_CFLAGS+="$SLKCFLAGS" \
    QMAKE_CXXFLAGS+="$SLKCFLAGS -std=c++11" \
    designer.pro || exit 1
  make install INSTALL_ROOT=$PKG || exit 1
cd -

cd Python
  echo "-- >> Python --"
  python3 configure.py \
      --verbose \
      --qmake /usr/bin/qmake \
      -n ../Qt4Qt5/ -o ../Qt4Qt5/ -c \
      || exit 1
  make -j1 || exit 1
  make -j1 install INSTALL_ROOT=$PKG || exit 1

  make clean || exit 1

  python2 configure.py \
      --verbose \
      --qmake /usr/bin/qmake \
      -n ../Qt4Qt5/ -o ../Qt4Qt5/ -c \
      || exit 1
  make -j1 || exit 1
  make -j1 install INSTALL_ROOT=$PKG || exit 1
cd -

# Link the shared qt4 libraries into /usr/lib${LIBDIRSUFFIX}:
( cd $PKG/usr/lib${LIBDIRSUFFIX}
  for file in $(ls -1 qt/lib/*.so* 2>/dev/null) ; do
    ln -sf $file .
  done
)

find $PKG | xargs file | grep -e "executable" -e "shared object" \
  | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null

mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION
cp -a \
  LICENSE NEWS README* \
  doc/html-Qt4Qt5 doc/Scintilla \
  $PKG/usr/doc/$PKGNAM-$VERSION

mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc

cd $PKG

/sbin/makepkg -l y -c n $OUTPUT/$PKGNAM-$VERSION-$ARCH-$BUILD.txz


Lo slackbuild è predisposto per la release QScintilla 2.11.2, scaricabile da riverbankcomputing (https://www.riverbankcomputing.com/soft ... a/download )
Il codice dello slackbuild è quello disponibile nei sorgenti della current ma è riadattato in modo da fare l'installazione secondo la procedura degli slackbuild di SBo (scompattamento del sorgente e creazione dell'albero del pacchetto in /tmp/SBo e creazione del pacchetto in /tmp).

Per la patch utilizzate questa e salvatela con il nome QScintilla_qsciscintillabase_qurl.diff (praticamente è uguale a quella rilasciata con i sorgenti da current ma contenuta in un archivio compresso)

Codice: Seleziona tutto

--- QScintilla_gpl-2.11.2/Qt4Qt5/qsciscintillabase.cpp   2019-06-25 14:49:27.000000000 +0200
+++ QScintilla_gpl-fixed-2.11.2/Qt4Qt5/qsciscintillabase.cpp   2019-08-30 17:11:19.334543702 +0200
@@ -37,6 +37,7 @@
 #include <QScrollBar>
 #include <QStyle>
 #include <QTextCodec>
+#include <QUrl>
 
 #include "SciAccessibility.h"
 #include "ScintillaQt.h"
 


Per quanto riguarda le dipendenze, se dovessero esserci problemi, si consideri che nel mio sistema è installato:
Qt5-5.9.6
PyQt5-5.13.0
python3-PyQt5-5.13.0

A parte le prime due, necessarie per la piena compatibilità di QScintilla2, la terza è sicuramente necessaria per l'installazione della maggior parte delle applicazioni basate sull'integrazione QScintilla/Qt5 (nel mio caso Qgis), quindi consiglio di installarla prima di compilare QScintilla.