Bug#1134181: qgis: FTBFS with GDAL 3.13.0

Bas Couwenberg sebastic at debian.org
Fri Apr 17 13:50:48 BST 2026


Source: qgis
Version: 3.44.9+dfsg-1
Severity: important
Tags: upstream ftbfs patch
User: debian-gis at lists.debian.org
Usertags: gdal-3.13

Dear Maintainer,

Your package 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

The attached patch fixes the issue.

Kind Regards,

Bas
-------------- next part --------------
diff -Nru qgis-3.44.9+dfsg/debian/patches/gdal-3.13.patch qgis-3.44.9+dfsg/debian/patches/gdal-3.13.patch
--- qgis-3.44.9+dfsg/debian/patches/gdal-3.13.patch	1970-01-01 01:00:00.000000000 +0100
+++ qgis-3.44.9+dfsg/debian/patches/gdal-3.13.patch	2026-04-17 12:05:14.000000000 +0200
@@ -0,0 +1,244 @@
+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>
+
+--- 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
diff -Nru qgis-3.44.9+dfsg/debian/patches/series qgis-3.44.9+dfsg/debian/patches/series
--- qgis-3.44.9+dfsg/debian/patches/series	2025-08-14 17:02:01.000000000 +0200
+++ qgis-3.44.9+dfsg/debian/patches/series	2026-04-17 12:05:14.000000000 +0200
@@ -2,3 +2,4 @@
 exclude-elvensword-resources.patch
 exclude-cc-by-nc-resources.patch
 spelling-errors.patch
+gdal-3.13.patch


More information about the Pkg-grass-devel mailing list