Loading pkgs/applications/gis/qgis/default.nix +19 −6 Original line number Diff line number Diff line Loading @@ -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"; Loading @@ -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 = '' Loading @@ -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 ''; Loading pkgs/applications/gis/qgis/set-pyqt6-package-dirs.patch 0 → 100644 +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) pkgs/applications/gis/qgis/unwrapped.nix +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, Loading @@ -25,6 +23,8 @@ grass, gsl, hdf5, libtasn1, libspatialindex, libspatialite, libzip, netcdf, Loading @@ -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, Loading @@ -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; }; }; Loading @@ -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 = { Loading Loading @@ -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}"; }) ]; Loading @@ -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" Loading @@ -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" Loading @@ -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[@]}" \ Loading @@ -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" \ Loading @@ -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 Loading @@ -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] Loading Loading
pkgs/applications/gis/qgis/default.nix +19 −6 Original line number Diff line number Diff line Loading @@ -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"; Loading @@ -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 = '' Loading @@ -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 ''; Loading
pkgs/applications/gis/qgis/set-pyqt6-package-dirs.patch 0 → 100644 +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)
pkgs/applications/gis/qgis/unwrapped.nix +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, Loading @@ -25,6 +23,8 @@ grass, gsl, hdf5, libtasn1, libspatialindex, libspatialite, libzip, netcdf, Loading @@ -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, Loading @@ -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; }; }; Loading @@ -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 = { Loading Loading @@ -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}"; }) ]; Loading @@ -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" Loading @@ -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" Loading @@ -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[@]}" \ Loading @@ -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" \ Loading @@ -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 Loading @@ -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] Loading