[Git][debian-gis-team/qgis][master] Add patch to fix FTBFS with GDAL 3.13.0. (closes: #1134181)

Bas Couwenberg (@sebastic) gitlab at salsa.debian.org
Fri Apr 17 14:00:29 BST 2026



Bas Couwenberg pushed to branch master at Debian GIS Project / qgis


Commits:
c07362f5 by Bas Couwenberg at 2026-04-17T15:00:20+02:00
Add patch to fix FTBFS with GDAL 3.13.0. (closes: #1134181)

- - - - -


3 changed files:

- debian/changelog
- + debian/patches/gdal-3.13.patch
- debian/patches/series


Changes:

=====================================
debian/changelog
=====================================
@@ -1,3 +1,10 @@
+qgis (3.44.9+dfsg-2) UNRELEASED; urgency=medium
+
+  * Add patch to fix FTBFS with GDAL 3.13.0.
+    (closes: #1134181)
+
+ -- Bas Couwenberg <sebastic at debian.org>  Fri, 17 Apr 2026 14:51:17 +0200
+
 qgis (3.44.9+dfsg-1) unstable; urgency=medium
 
   * Bump Standards-Version to 4.7.4, no changes.


=====================================
debian/patches/gdal-3.13.patch
=====================================
@@ -0,0 +1,245 @@
+Description: Fix FTBFS with GDAL 3.13.0.
+ error: invalid conversion from 'CSLConstList' {aka 'const char* const*'} to 'char**' [-fpermissive]
+ .
+ From GDAL 3.13.0 NEWS:
+ "
+  * GDALMajorObject: Use CSLConstList for GetMetadata, SetMetadata (API breakage)
+ "
+ https://github.com/OSGeo/gdal/blob/v3.13.0beta1/NEWS.md
+Author: Bas Couwenberg <sebastic at debian.org>
+Forwarded: not-needed
+
+--- a/src/core/providers/ogr/qgsogrproviderconnection.cpp
++++ b/src/core/providers/ogr/qgsogrproviderconnection.cpp
+@@ -419,7 +419,11 @@ void QgsOgrProviderConnection::setDefaul
+   mGeometryColumnCapabilities |= GeometryColumnCapability::SinglePolygon;
+ #endif
+ 
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++  CSLConstList driverMetadata = GDALGetMetadata( hDriver, nullptr );
++#else
+   char **driverMetadata = GDALGetMetadata( hDriver, nullptr );
++#endif
+ 
+ #if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,6,0)
+   if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_Z_GEOMETRIES, false ) )
+--- a/external/mdal/frmts/mdal_gdal.cpp
++++ b/external/mdal/frmts/mdal_gdal.cpp
+@@ -175,7 +175,11 @@ double MDAL::DriverGdal::parseMetadataTi
+ MDAL::DriverGdal::metadata_hash MDAL::DriverGdal::parseMetadata( GDALMajorObjectH gdalObject, const char *pszDomain /* = 0 */ )
+ {
+   MDAL::DriverGdal::metadata_hash meta;
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++  CSLConstList GDALmetadata = nullptr;
++#else
+   char **GDALmetadata = nullptr;
++#endif
+   GDALmetadata = GDALGetMetadata( gdalObject, pszDomain );
+ 
+   if ( GDALmetadata )
+--- a/src/core/qgsgdalutils.cpp
++++ b/src/core/qgsgdalutils.cpp
+@@ -496,7 +496,11 @@ QString QgsGdalUtils::helpCreationOption
+   if ( myGdalDriver )
+   {
+     // first report details and help page
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++    CSLConstList GDALmetadata = GDALGetMetadata( myGdalDriver, nullptr );
++#else
+     char **GDALmetadata = GDALGetMetadata( myGdalDriver, nullptr );
++#endif
+     message += QLatin1String( "Format Details:\n" );
+     message += QStringLiteral( "  Extension: %1\n" ).arg( CSLFetchNameValue( GDALmetadata, GDAL_DMD_EXTENSION ) );
+     message += QStringLiteral( "  Short Name: %1" ).arg( GDALGetDriverShortName( myGdalDriver ) );
+--- a/src/core/raster/qgsrasterfilewriter.cpp
++++ b/src/core/raster/qgsrasterfilewriter.cpp
+@@ -1090,7 +1090,11 @@ QString QgsRasterFileWriter::driverForEx
+     GDALDriverH drv = GDALGetDriver( i );
+     if ( drv )
+     {
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++      CSLConstList driverMetadata = GDALGetMetadata( drv, nullptr );
++#else
+       char **driverMetadata = GDALGetMetadata( drv, nullptr );
++#endif
+       if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_RASTER, false ) )
+       {
+         QString drvName = GDALGetDriverShortName( drv );
+@@ -1113,7 +1117,11 @@ QStringList QgsRasterFileWriter::extensi
+   GDALDriverH drv = GDALGetDriverByName( format.toLocal8Bit().data() );
+   if ( drv )
+   {
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++    CSLConstList driverMetadata = GDALGetMetadata( drv, nullptr );
++#else
+     char **driverMetadata = GDALGetMetadata( drv, nullptr );
++#endif
+     if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_RASTER, false ) )
+     {
+       return QString( GDALGetMetadataItem( drv, GDAL_DMD_EXTENSIONS, nullptr ) ).split( ' ' );
+--- a/src/core/providers/gdal/qgsgdalprovider.cpp
++++ b/src/core/providers/gdal/qgsgdalprovider.cpp
+@@ -517,7 +517,11 @@ void QgsGdalProvider::loadMetadata()
+     // read ESRI FileGeodatabase/Personal Geodatabase layer metadata
+     // (This branch is only possible on GDAL 3.7+, in earlier releases there was
+     // no raster OpenFileGDB driver)
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++    if ( CSLConstList GDALmetadata = GDALGetMetadata( mGdalDataset, "xml:documentation" ) )
++#else
+     if ( char **GDALmetadata = GDALGetMetadata( mGdalDataset, "xml:documentation" ) )
++#endif
+     {
+       const QString metadata( GDALmetadata[0] );
+       if ( !metadata.isEmpty() )
+@@ -565,7 +569,11 @@ QString QgsGdalProvider::htmlMetadata()
+   for ( int i = 1; i <= GDALGetRasterCount( dsForMetadata ); ++i )
+   {
+     GDALRasterBandH gdalBand = GDALGetRasterBand( dsForMetadata, i );
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++    CSLConstList GDALmetadata = GDALGetMetadata( gdalBand, nullptr );
++#else
+     char **GDALmetadata = GDALGetMetadata( gdalBand, nullptr );
++#endif
+     myMetadata += QStringLiteral( "<tr><td class=\"highlight\">" ) + tr( "Band %1" ).arg( i ) + QStringLiteral( "</td><td>" );
+     if ( GDALmetadata )
+     {
+@@ -596,7 +604,11 @@ QString QgsGdalProvider::htmlMetadata()
+     myMetadata += tr( "Mask band (exposed as alpha band)" ) + QStringLiteral( "<br />\n" );
+   }
+ 
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++  CSLConstList GDALmetadata = GDALGetMetadata( dsForMetadata, nullptr );
++#else
+   char **GDALmetadata = GDALGetMetadata( dsForMetadata, nullptr );
++#endif
+   if ( GDALmetadata )
+   {
+     QStringList metadata = QgsOgrUtils::cStringListToQStringList( GDALmetadata );
+@@ -1304,7 +1316,11 @@ QString QgsGdalProvider::generateBandNam
+ 
+   if ( mDriverName == QLatin1String( "netCDF" ) || mDriverName == QLatin1String( "GTiff" ) )
+   {
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++    CSLConstList GDALmetadata = GDALGetMetadata( mGdalDataset, nullptr );
++#else
+     char **GDALmetadata = GDALGetMetadata( mGdalDataset, nullptr );
++#endif
+     if ( GDALmetadata )
+     {
+       QStringList metadata = QgsOgrUtils::cStringListToQStringList( GDALmetadata );
+@@ -1847,7 +1863,11 @@ QList<QgsProviderSublayerDetails> QgsGda
+ 
+   QList<QgsProviderSublayerDetails> res;
+ 
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++  CSLConstList metadata = GDALGetMetadata( dataset, "SUBDATASETS" );
++#else
+   char **metadata = GDALGetMetadata( dataset, "SUBDATASETS" );
++#endif
+ 
+   QVariantMap uriParts = decodeGdalUri( baseUri );
+   const QString datasetPath = uriParts.value( QStringLiteral( "path" ) ).toString();
+--- a/src/core/providers/ogr/qgsogrprovidermetadata.cpp
++++ b/src/core/providers/ogr/qgsogrprovidermetadata.cpp
+@@ -103,7 +103,11 @@ bool QgsOgrProviderMetadata::createDatab
+     return false;
+   }
+ 
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++  CSLConstList metadata = GDALGetMetadata( poDriver, nullptr );
++#else
+   char **metadata = GDALGetMetadata( poDriver, nullptr );
++#endif
+ 
+   if ( !CSLFetchBoolean( metadata, GDAL_DCAP_VECTOR, false )
+        || !CSLFetchBoolean( metadata, GDAL_DCAP_CREATE, false ) )
+--- a/src/analysis/processing/qgsalgorithmimportphotos.cpp
++++ b/src/analysis/processing/qgsalgorithmimportphotos.cpp
+@@ -397,7 +397,11 @@ QVariantMap QgsImportPhotosAlgorithm::pr
+       continue;
+     }
+ 
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++    CSLConstList GDALmetadata = GDALGetMetadata( hDS.get(), nullptr );
++#else
+     char **GDALmetadata = GDALGetMetadata( hDS.get(), nullptr );
++#endif
+     if ( !GDALmetadata )
+     {
+       GDALmetadata = GDALGetMetadata( hDS.get(), "EXIF" );
+@@ -413,7 +417,11 @@ QVariantMap QgsImportPhotosAlgorithm::pr
+         continue;
+ 
+       QgsFeature f;
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++      const QVariantMap metadata = parseMetadataList( QgsOgrUtils::CSLConstListToQStringList( GDALmetadata ) );
++#else
+       const QVariantMap metadata = parseMetadataList( QgsOgrUtils::cStringListToQStringList( GDALmetadata ) );
++#endif
+ 
+       QgsPointXY tag;
+       if ( !extractGeoTagFromMetadata( metadata, tag ) )
+--- a/src/core/qgsvectorfilewriter.cpp
++++ b/src/core/qgsvectorfilewriter.cpp
+@@ -158,7 +158,11 @@ bool QgsVectorFileWriter::supportsFeatur
+   if ( !gdalDriver )
+     return false;
+ 
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++  CSLConstList driverMetadata = GDALGetMetadata( gdalDriver, nullptr );
++#else
+   char **driverMetadata = GDALGetMetadata( gdalDriver, nullptr );
++#endif
+   if ( !driverMetadata )
+     return false;
+ 
+@@ -4187,7 +4191,11 @@ QString QgsVectorFileWriter::driverForEx
+     GDALDriverH drv = GDALGetDriver( i );
+     if ( drv )
+     {
++#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3, 13, 0)
++      CSLConstList driverMetadata = GDALGetMetadata( drv, nullptr );
++#else
+       char **driverMetadata = GDALGetMetadata( drv, nullptr );
++#endif
+       if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_CREATE, false ) && CSLFetchBoolean( driverMetadata, GDAL_DCAP_VECTOR, false ) )
+       {
+         QString drvName = GDALGetDriverShortName( drv );
+--- a/src/core/qgsogrutils.cpp
++++ b/src/core/qgsogrutils.cpp
+@@ -1153,6 +1153,21 @@ QgsFields QgsOgrUtils::stringToFields( c
+   return fields;
+ }
+ 
++QStringList QgsOgrUtils::CSLConstListToQStringList( CSLConstList stringList )
++{
++  if ( !stringList )
++    return {};
++
++  QStringList strings;
++  // presume null terminated string list
++  for ( qgssize i = 0; stringList[i]; ++i )
++  {
++    strings.append( QString::fromUtf8( stringList[i] ) );
++  }
++
++  return strings;
++}
++
+ QStringList QgsOgrUtils::cStringListToQStringList( char **stringList )
+ {
+   if ( !stringList )
+--- a/src/core/qgsogrutils.h
++++ b/src/core/qgsogrutils.h
+@@ -308,6 +308,11 @@ class CORE_EXPORT QgsOgrUtils
+     static QgsFields stringToFields( const QString &string, QTextCodec *encoding );
+ 
+     /**
++     * Converts a CSLConstList to a QStringList.
++     */
++    static QStringList CSLConstListToQStringList( CSLConstList stringList );
++
++    /**
+      * Converts a c string list to a QStringList. Presumes a null terminated string list.
+      *
+      * \since QGIS 3.2


=====================================
debian/patches/series
=====================================
@@ -2,3 +2,4 @@ developersmap-use-debian-package.patch
 exclude-elvensword-resources.patch
 exclude-cc-by-nc-resources.patch
 spelling-errors.patch
+gdal-3.13.patch



View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/commit/c07362f5622a30ec16ddc1c74764464a9eca7989

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/qgis/-/commit/c07362f5622a30ec16ddc1c74764464a9eca7989
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260417/ba3ffd29/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list