Unverified Commit 24998d87 authored by Ivan Mincik's avatar Ivan Mincik Committed by GitHub
Browse files

qgis: 3.44.7 -> 4.0.0 (#505253)

parents 65cd8537 23d42570
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -7,20 +7,20 @@

  extraPythonPackages ? (ps: [ ]),

  libsForQt5,
  qt6Packages,

  # unwrapped package parameters
  withGrass ? false,
  withServer ? false,
  withWebKit ? false,
}:

let
  qgis-unwrapped = libsForQt5.callPackage ./unwrapped.nix {
    inherit withGrass withServer withWebKit;
  qgis-unwrapped = qt6Packages.callPackage ./unwrapped.nix {
    inherit withGrass withServer;
  };
in

symlinkJoin {

  inherit (qgis-unwrapped) version outputs src;
  pname = "qgis";

@@ -31,7 +31,7 @@ symlinkJoin {
    qgis-unwrapped.py.pkgs.wrapPython
  ];

  # extend to add to the python environment of QGIS without rebuilding QGIS application.
  # Extend to add to the python environment of QGIS without rebuilding QGIS application.
  pythonInputs = qgis-unwrapped.pythonBuildInputs ++ (extraPythonPackages qgis-unwrapped.py.pkgs);

  postBuild = ''
@@ -40,9 +40,22 @@ symlinkJoin {
    for program in $out/bin/*; do
      wrapProgram $program \
        --prefix PATH : $program_PATH \
        --set PYTHONHOME ${qgis-unwrapped.py} \
        --set PYTHONPATH $program_PYTHONPATH
    done
  ''
  + lib.optionalString stdenv.hostPlatform.isDarwin ''
    QGIS_PYTHON_PATH="$out/Applications/QGIS.app/Contents/Frameworks"
    for program in $out/Applications/QGIS.app/Contents/MacOS/qgis \
                   $out/Applications/QGIS.app/Contents/MacOS/qgis_process; do
      if [[ -e "$program" ]]; then
        wrapProgram "$program" \
          --prefix PATH : $program_PATH \
          --set PYTHONHOME ${qgis-unwrapped.py} \
          --set PYTHONPATH "$QGIS_PYTHON_PATH:$program_PYTHONPATH"
      fi
    done
  ''
  + lib.optionalString (!stdenv.hostPlatform.isDarwin) ''
    ln -s ${qgis-unwrapped.man} $man
  '';
+35 −0
Original line number Diff line number Diff line
diff --git a/cmake/FindPyQt6.cmake b/cmake/FindPyQt6.cmake
index a938417a03f..b3a2d3cf091 100644
--- a/cmake/FindPyQt6.cmake
+++ b/cmake/FindPyQt6.cmake
@@ -25,7 +25,7 @@ ELSE(EXISTS PYQT6_VERSION_STR)
   IF(SIP_BUILD_EXECUTABLE)
     # SIP >= 5.0 path

-    FILE(GLOB _pyqt6_metadata "${Python_SITEARCH}/PyQt6-*.dist-info/METADATA")
+    FILE(GLOB _pyqt6_metadata "@pyQt6PackageDir@/PyQt6-*.dist-info/METADATA")
     IF(_pyqt6_metadata)
       FILE(READ ${_pyqt6_metadata} _pyqt6_metadata_contents)
       STRING(REGEX REPLACE ".*\nVersion: ([^\n]+).*$" "\\1" PYQT6_VERSION_STR ${_pyqt6_metadata_contents})

diff --git a/cmake/FindQsci.cmake b/cmake/FindQsci.cmake
index f6a06ebd5b4..ca502d60fbd 100644
--- a/cmake/FindQsci.cmake
+++ b/cmake/FindQsci.cmake
@@ -24,7 +24,7 @@ ELSE(QSCI_MOD_VERSION_STR)
   IF(SIP_BUILD_EXECUTABLE)
     # SIP >= 5.0 path

-    FILE(GLOB _qsci_metadata "${Python_SITEARCH}/QScintilla*.dist-info/METADATA")
+    FILE(GLOB _qsci_metadata "@qsciPackageDir@/QScintilla*.dist-info/METADATA")
     IF(_qsci_metadata)
       FILE(READ ${_qsci_metadata} _qsci_metadata_contents)
       STRING(REGEX REPLACE ".*\nVersion: ([^\n]+).*$" "\\1" QSCI_MOD_VERSION_STR ${_qsci_metadata_contents})
@@ -33,7 +33,7 @@ ELSE(QSCI_MOD_VERSION_STR)
     ENDIF(_qsci_metadata)

     IF(QSCI_MOD_VERSION_STR)
-      SET(QSCI_SIP_DIR "${PYQT_SIP_DIR}")
+      SET(QSCI_SIP_DIR "@qsciPackageDir@/PyQt6/bindings")
       SET(QSCI_FOUND TRUE)
     ENDIF(QSCI_MOD_VERSION_STR)
+152 −66
Original line number Diff line number Diff line
{
  lib,
  stdenv,

  fetchFromGitHub,
  lndir,
  makeWrapper,
  mkDerivation,
  replaceVars,
  wrapGAppsHook3,
  wrapQtAppsHook,

  withGrass,
  withServer,
  withWebKit,

  darwin,
  libtasn1,
  bison,
  cmake,
  draco,
@@ -25,6 +23,8 @@
  grass,
  gsl,
  hdf5,
  libtasn1,
  libspatialindex,
  libspatialite,
  libzip,
  netcdf,
@@ -35,18 +35,20 @@
  proj,
  protobuf,
  python3,
  qca-qt5,
  qca,
  qscintilla,
  qt3d,
  qt5compat,
  qtbase,
  qtdeclarative,
  qtkeychain,
  qtlocation,
  qtmultimedia,
  qtsensors,
  qtserialport,
  qtsvg,
  qtwebkit,
  qtxmlpatterns,
  qttools,
  qtwebengine,
  qwt,
  sqlite,
  txt2tags,
@@ -57,8 +59,7 @@ let
  py = python3.override {
    self = py;
    packageOverrides = self: super: {
      pyqt5 = super.pyqt5.override {
        withLocation = true;
      pyqt6 = super.pyqt6.override {
        withSerialPort = true;
      };
    };
@@ -72,30 +73,30 @@ let
    owslib
    psycopg2
    pygments
    pyqt5
    pyqt5-sip
    pyqt6
    pyqt-builder
    python-dateutil
    pytz
    pyyaml
    qscintilla-qt5
    qscintilla-qt6
    requests
    setuptools
    sip
    six
    urllib3
  ];

in
mkDerivation rec {
  version = "3.44.7";
stdenv.mkDerivation rec {
  pname = "qgis-unwrapped";
  version = "4.0.1";
  outputs = [ "out" ] ++ lib.optional (!stdenv.hostPlatform.isDarwin) "man";

  src = fetchFromGitHub {
    owner = "qgis";
    repo = "QGIS";
    rev = "final-${lib.replaceStrings [ "." ] [ "_" ] version}";
    hash = "sha256-ewYTl6tR1K7Q/AMA3BDlcSaj4mN3yt+1Kfa4a1JSXL0=";
    hash = "sha256-pH48EhH2kmlscFPYiLStGIqXrmO9zgpidtkWVf1K5Mo=";
  };

  passthru = {
@@ -125,42 +126,47 @@ mkDerivation rec {
    geos
    gsl
    hdf5
    libpq
    libspatialindex
    libspatialite
    libzip
    netcdf
    openssl
    pdal
    libpq
    proj
    protobuf
    qca-qt5
    qca
    qscintilla
    qt3d
    qt5compat
    qtbase
    qtdeclarative
    qtkeychain
    qtlocation
    qtmultimedia
    qtsensors
    qtserialport
    qtsvg
    qtxmlpatterns
    qttools
    qtwebengine
    qwt
    sqlite
    txt2tags
    zstd
  ]
  ++ lib.optional withGrass grass
  ++ lib.optional withWebKit qtwebkit
  ++ lib.optional stdenv.hostPlatform.isDarwin libtasn1
  ++ lib.optionals stdenv.hostPlatform.isDarwin [
    libtasn1
    qtsvg
  ]
  ++ pythonBuildInputs;

  patches = [
    (replaceVars ./set-pyqt-package-dirs.patch {
      pyQt5PackageDir = "${py.pkgs.pyqt5}/${py.pkgs.python.sitePackages}";
      qsciPackageDir = "${py.pkgs.qscintilla-qt5}/${py.pkgs.python.sitePackages}";
    (replaceVars ./set-pyqt6-package-dirs.patch {
      pyQt6PackageDir = "${py.pkgs.pyqt6}/${py.pkgs.python.sitePackages}";
      qsciPackageDir = "${py.pkgs.qscintilla-qt6}/${py.pkgs.python.sitePackages}";
    })
    (replaceVars ./spatialite-path.patch {
      spatialiteLib = "${libspatialite}/lib/mod_spatialite.so";
      spatialiteLib = "${libspatialite}/lib/mod_spatialite${stdenv.hostPlatform.extensions.sharedLibrary}";
    })
  ];

@@ -169,6 +175,8 @@ mkDerivation rec {
  env.QT_QPA_PLATFORM_PLUGIN_PATH = "${qtbase}/${qtbase.qtPluginPrefix}/platforms";

  cmakeFlags = [
    "-DWITH_QTWEBENGINE=True"

    "-DWITH_3D=True"
    "-DWITH_PDAL=True"
    "-DENABLE_TESTS=False"
@@ -178,10 +186,10 @@ mkDerivation rec {
    "-DWITH_INTERNAL_SPATIALINDEX=True"
  ]
  ++ lib.optionals stdenv.hostPlatform.isDarwin [
    "-DQGIS_MACAPP_BUNDLE=0" # Don't copy Qt into bundle; we fix paths in postFixup
    "-DSQLITE3_INCLUDE_DIR=${sqlite.dev}/include" # FindSqlite3.cmake incorrectly assumes framework
    "-DQGIS_MACAPP_BUNDLE=0"
    "-DSQLITE3_INCLUDE_DIR=${sqlite.dev}/include"
    "-DUSE_OPENCL=OFF"
  ]
  ++ lib.optional (!withWebKit) "-DWITH_QTWEBKIT=OFF"
  ++ lib.optional withServer [
    "-DWITH_SERVER=True"
    "-DQGIS_CGIBIN_SUBDIR=${placeholder "out"}/lib/cgi-bin"
@@ -201,12 +209,11 @@ mkDerivation rec {
  dontWrapGApps = true; # wrapper params passed below
  dontWrapQtApps = stdenv.hostPlatform.isDarwin;

  # GRASS has to be available on the command line even though we baked in the
  # path at build time using GRASS_PREFIX. Using wrapGAppsHook also prevents
  # file dialogs from crashing the program on non-NixOS.
  postFixup =
    lib.optionalString (withGrass && stdenv.hostPlatform.isLinux) ''
      # GRASS has to be available on the command line even though we baked in
      # the path at build time using GRASS_PREFIX.
      # Using wrapGAppsHook also prevents file dialogs from crashing the program
      # on non-NixOS.
      for program in $out/bin/*; do
        wrapProgram $program \
          "''${gappsWrapperArgs[@]}" \
@@ -214,54 +221,134 @@ mkDerivation rec {
      done
    ''
    + lib.optionalString stdenv.hostPlatform.isDarwin ''
            mkdir -p $out/Applications $out/bin
            mv $out/QGIS.app $out/Applications/
            ln -s $out/Applications/QGIS.app/Contents/MacOS/QGIS $out/bin/qgis
            mkdir -p $out/Applications/QGIS.app $out/bin
            mv $out/Contents $out/Applications/QGIS.app/
            ln -s $out/Applications/QGIS.app/Contents/MacOS/qgis $out/bin/qgis

            SHORT_VERSION=$(echo "${version}" | cut -d. -f1,2)
            BUNDLE="$out/Applications/QGIS.app"
            FRAMEWORKS="$BUNDLE/Contents/Frameworks"

            for lib in "$FRAMEWORKS"/libqgis*.dylib "$FRAMEWORKS"/libqgispython*.dylib; do
              [[ -f "$lib" && ! -L "$lib" ]] || continue
              libname=$(basename "$lib")
              install_name_tool -id "$FRAMEWORKS/$libname" "$lib" 2>/dev/null || true
            done

            fix_binary() {
              local f="$1"
              [[ -f "$f" ]] || return 0
              file "$f" | grep -q "Mach-O" || return 0
              file "$f" | grep -q "Mach-O" || return 0  # spellok

              # QGIS core libraries
              local qgis_libs=(core gui analysis 3d native app)
              for lib in "''${qgis_libs[@]}"; do
                install_name_tool \
                  -change "$out/lib/libqgis_$lib.${version}.dylib" \
                          "$FRAMEWORKS/libqgis_$lib.${version}.dylib" \
                  "$f" 2>/dev/null || true
              done

              # libqgispython (no underscore, unlike the other qgis libs)
              install_name_tool \
                -change "$out/lib/libqgispython.${version}.dylib" \
                        "$FRAMEWORKS/libqgispython.${version}.dylib" \
                "$f" 2>/dev/null || true

              # QGIS frameworks
              local qgis_frameworks=(core gui analysis 3d native)
              for fw in "''${qgis_frameworks[@]}"; do
                install_name_tool \
                  -change "@loader_path/../../../qgis_$fw.framework/qgis_$fw" \
                          "$FRAMEWORKS/qgis_$fw.framework/Versions/$SHORT_VERSION/qgis_$fw" \
                  "$f" 2>/dev/null || true
              done

              # External libraries - qscintilla
              install_name_tool \
                -change "@loader_path/../lib/libqscintilla2_qt6.dylib" \
                        "${qscintilla}/lib/libqscintilla2_qt6.dylib" \
                "$f" 2>/dev/null || true
              install_name_tool \
                -change "@loader_path/../../../../MacOS/lib/libqscintilla2_qt6.dylib" \
                        "${qscintilla}/lib/libqscintilla2_qt6.dylib" \
                "$f" 2>/dev/null || true
              install_name_tool \
                -change "@loader_path/../lib/libqscintilla2_qt5.dylib" "${qscintilla}/lib/libqscintilla2_qt5.dylib" \
                -change "@loader_path/../lib/libqt5keychain.dylib" "${qtkeychain}/lib/libqt5keychain.dylib" \
                -change "@loader_path/../lib/libqwt.dylib" "${qwt}/lib/libqwt.dylib" \
                -change "@loader_path/../../Frameworks/qca-qt5.framework/qca-qt5" "${qca-qt5}/lib/qca-qt5.framework/qca-qt5" \
                -change "@loader_path/../../../qca-qt5.framework/qca-qt5" "${qca-qt5}/lib/qca-qt5.framework/qca-qt5" \
                -change "@loader_path/../../../../MacOS/lib/libqscintilla2_qt5.dylib" "${qscintilla}/lib/libqscintilla2_qt5.dylib" \
                -change "@loader_path/../../../../MacOS/lib/libqt5keychain.dylib" "${qtkeychain}/lib/libqt5keychain.dylib" \
                -change "@loader_path/../../../../MacOS/lib/libqwt.dylib" "${qwt}/lib/libqwt.dylib" \
                -change "@executable_path/lib/libqwt.dylib" "${qwt}/lib/libqwt.dylib" \
                -change "@executable_path/lib/libqscintilla2_qt5.dylib" "${qscintilla}/lib/libqscintilla2_qt5.dylib" \
                -change "@executable_path/lib/libqt5keychain.dylib" "${qtkeychain}/lib/libqt5keychain.dylib" \
                -change "@executable_path/../Frameworks/qca-qt5.framework/qca-qt5" "${qca-qt5}/lib/qca-qt5.framework/qca-qt5" \
                -change "@loader_path/../../../qgis_core.framework/qgis_core" "$FRAMEWORKS/qgis_core.framework/Versions/$SHORT_VERSION/qgis_core" \
                -change "@loader_path/../../../qgis_gui.framework/qgis_gui" "$FRAMEWORKS/qgis_gui.framework/Versions/$SHORT_VERSION/qgis_gui" \
                -change "@loader_path/../../../qgis_analysis.framework/qgis_analysis" "$FRAMEWORKS/qgis_analysis.framework/Versions/$SHORT_VERSION/qgis_analysis" \
                -change "@loader_path/../../../qgis_3d.framework/qgis_3d" "$FRAMEWORKS/qgis_3d.framework/Versions/$SHORT_VERSION/qgis_3d" \
                -change "@loader_path/../../../qgis_native.framework/qgis_native" "$FRAMEWORKS/qgis_native.framework/Versions/$SHORT_VERSION/qgis_native" \
                -change "@executable_path/lib/libqscintilla2_qt6.dylib" \
                        "${qscintilla}/lib/libqscintilla2_qt6.dylib" \
                "$f" 2>/dev/null || true

              # External libraries - qtkeychain
              install_name_tool \
                -change "@loader_path/../lib/libqt6keychain.dylib" \
                        "${qtkeychain}/lib/libqt6keychain.dylib" \
                "$f" 2>/dev/null || true
              install_name_tool \
                -change "@loader_path/../../../../MacOS/lib/libqt6keychain.dylib" \
                        "${qtkeychain}/lib/libqt6keychain.dylib" \
                "$f" 2>/dev/null || true
              install_name_tool \
                -change "@executable_path/lib/libqt6keychain.dylib" \
                        "${qtkeychain}/lib/libqt6keychain.dylib" \
                "$f" 2>/dev/null || true

              # External libraries - qwt
              install_name_tool \
                -change "@loader_path/../lib/libqwt.dylib" \
                        "${qwt}/lib/libqwt.dylib" \
                "$f" 2>/dev/null || true
              install_name_tool \
                -change "@loader_path/../../../../MacOS/lib/libqwt.dylib" \
                        "${qwt}/lib/libqwt.dylib" \
                "$f" 2>/dev/null || true
              install_name_tool \
                -change "@executable_path/lib/libqwt.dylib" \
                        "${qwt}/lib/libqwt.dylib" \
                "$f" 2>/dev/null || true
              install_name_tool \
                -change "qwt.framework/Versions/6/qwt" \
                        "${qwt}/lib/qwt.framework/Versions/6/qwt" \
                "$f" 2>/dev/null || true

              # QCA framework paths
              local qca_paths=(
                "@loader_path/../../Frameworks/qca-qt6.framework/qca-qt6"
                "@loader_path/../../../qca-qt6.framework/qca-qt6"
                "@executable_path/../Frameworks/qca-qt6.framework/qca-qt6"
              )
              for qca_path in "''${qca_paths[@]}"; do
                install_name_tool \
                  -change "$qca_path" "${qca}/lib/qca-qt6.framework/qca-qt6" \
                  "$f" 2>/dev/null || true
              done
            }

            fix_binary "$BUNDLE/Contents/MacOS/QGIS"
            fix_binary "$BUNDLE/Contents/MacOS/qgis"
            for bin in "$BUNDLE/Contents/MacOS"/*; do fix_binary "$bin"; done
            for lib in "$FRAMEWORKS"/*.dylib; do fix_binary "$lib"; done

            if [[ -d "$BUNDLE/Contents/MacOS/lib" ]]; then
              for lib in "$BUNDLE/Contents/MacOS/lib"/*.dylib; do fix_binary "$lib"; done
            fi

            for fw in qgis_core qgis_gui qgis_analysis qgis_3d qgis_native; do
              fix_binary "$FRAMEWORKS/$fw.framework/Versions/$SHORT_VERSION/$fw"
              [[ -f "$FRAMEWORKS/$fw.framework/$fw" && ! -L "$FRAMEWORKS/$fw.framework/$fw" ]] && \
                fix_binary "$FRAMEWORKS/$fw.framework/$fw"
            done

            for plugin in "$BUNDLE/Contents/PlugIns/qgis"/*.so; do fix_binary "$plugin"; done

            # Fix Python binding .so files in Frameworks/qgis
            for pyso in "$BUNDLE/Contents/Frameworks/qgis"/*.so; do fix_binary "$pyso"; done

            ${lib.optionalString withGrass ''
              fix_binary "$FRAMEWORKS/qgisgrass8.framework/Versions/$SHORT_VERSION/qgisgrass8"

              install_name_tool \
                -change "@loader_path/../../../qgisgrass8.framework/qgisgrass8" "$FRAMEWORKS/qgisgrass8.framework/Versions/$SHORT_VERSION/qgisgrass8" \
                "$BUNDLE/Contents/MacOS/QGIS" 2>/dev/null || true

              for lib in "$BUNDLE/Contents/MacOS/lib"/*.dylib; do
                install_name_tool \
                  -change "@loader_path/../../../qgisgrass8.framework/qgisgrass8" "$FRAMEWORKS/qgisgrass8.framework/Versions/$SHORT_VERSION/qgisgrass8" \
@@ -273,8 +360,8 @@ mkDerivation rec {
              fix_binary "$BUNDLE/Contents/MacOS/lib/libqgis_server.${version}.dylib"
            ''}

            # Merge Python packages (lndir handles namespace packages correctly)
            QGIS_PYTHON="$BUNDLE/Contents/Resources/python"
            if [[ -d "$QGIS_PYTHON" ]]; then
              for pkg in ${
                lib.concatMapStringsSep " " (p: "${p}/${py.pkgs.python.sitePackages}") (
                  py.pkgs.requiredPythonModules pythonBuildInputs
@@ -282,13 +369,12 @@ mkDerivation rec {
              }; do
                [[ -d "$pkg" ]] && lndir -silent "$pkg" "$QGIS_PYTHON"
              done
            # Remove broken symlinks
              find "$QGIS_PYTHON" -type l ! -exec test -e {} \; -delete
            fi

            # Create merged Qt plugins directory in the bundle (LSEnvironment is unreliable)
            mkdir -p "$BUNDLE/Contents/PlugIns"
            lndir -silent "${qtbase}/${qtbase.qtPluginPrefix}" "$BUNDLE/Contents/PlugIns"
            lndir -silent "${qtsvg.bin}/${qtbase.qtPluginPrefix}" "$BUNDLE/Contents/PlugIns"
            lndir -silent "${qtsvg}/${qtbase.qtPluginPrefix}" "$BUNDLE/Contents/PlugIns"

            cat > "$BUNDLE/Contents/Resources/qt.conf" << 'EOF'
      [Paths]