Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot control what proj is used with GDAL #8942

Closed
Chrismarsh opened this issue Dec 8, 2023 · 16 comments
Closed

Cannot control what proj is used with GDAL #8942

Chrismarsh opened this issue Dec 8, 2023 · 16 comments
Assignees

Comments

@Chrismarsh
Copy link

Expected behavior and actual behavior.

GDAL cannot link against arbitrary proj versions and will use proj9 over any other proj >=6, regardless of how the search paths for cmake are constructed.

Specifically:

  1. The documentation suggests that an arbitrary proj location can be specified via these cmake variables PROJ_INCLUDE_DIR and PROJ_LIBRARY_RELEASE
    https://gdal.org/development/building_from_source.html#proj
  2. However, these appear to only be used when searching for proj in a non-CONFIG mode
    https://github.com/OSGeo/gdal/blob/v3.8.0/cmake/modules/packages/FindPROJ.cmake#L37
    which only seems to happen when looking for proj6
    https://github.com/OSGeo/gdal/blob/v3.8.0/cmake/helpers/CheckDependentLibraries.cmake#L378
  3. Otherwise, the proj find logic uses a CONFIG search, and prioritizes proj9 and proj8
    https://github.com/OSGeo/gdal/blob/v3.8.0/cmake/helpers/CheckDependentLibraries.cmake#L371

Therefore, the outcome is that arbitrary versions of proj>=6 cannot be used.
For example, in the context of library dependency management like spack, if proj7 is first in the cmake search paths, GDAL will pass over it, and use proj 9. This is problematic if a system proj9 is used (e.g., from homebrew or apt) instead of a custom-built proj.

Below is a find_pacakge debug trace from cmake where I was expecting a custom-built proj7.2.1 to be used and linked against. Instead, GDAL linked against homebrew's proj9. The path /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/proj-7.2.1-ulvikgu6cuz3c2xwmuxifqlhnnkg6353/lib/cmake/proj/proj-config.cmake was manually confirmed as valid.

  find_package considered the following locations for PROJ's Config module:

    /var/folders/tr/v_kqwm7x25x3y68l_p5qh1gw0000gn/T/cmarsh/spack-stage/spack-stage-gdal-3.8.0-f5a2r5rexdlv74imgptmadls3caz5oyw/spack-src/CMakeFiles/pkgRedirects/PROJConfig.cmake
    /var/folders/tr/v_kqwm7x25x3y68l_p5qh1gw0000gn/T/cmarsh/spack-stage/spack-stage-gdal-3.8.0-f5a2r5rexdlv74imgptmadls3caz5oyw/spack-src/CMakeFiles/pkgRedirects/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/libpng-1.6.39-tkxa7i2fbzr7q5tkht2zn6mbnravekcd/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/libpng-1.6.39-tkxa7i2fbzr7q5tkht2zn6mbnravekcd/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/libgeotiff-1.7.1-7i2pay7n7kyf2lkdgw3ih5k2nkz35ttu/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/libgeotiff-1.7.1-7i2pay7n7kyf2lkdgw3ih5k2nkz35ttu/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/proj-7.2.1-ulvikgu6cuz3c2xwmuxifqlhnnkg6353/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/proj-7.2.1-ulvikgu6cuz3c2xwmuxifqlhnnkg6353/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/proj-7.2.1-ulvikgu6cuz3c2xwmuxifqlhnnkg6353/lib/cmake/proj4/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/proj-7.2.1-ulvikgu6cuz3c2xwmuxifqlhnnkg6353/lib/cmake/proj4/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/proj-7.2.1-ulvikgu6cuz3c2xwmuxifqlhnnkg6353/lib/cmake/proj/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/proj-7.2.1-ulvikgu6cuz3c2xwmuxifqlhnnkg6353/lib/cmake/proj/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/proj-7.2.1-ulvikgu6cuz3c2xwmuxifqlhnnkg6353/share/proj/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/proj-7.2.1-ulvikgu6cuz3c2xwmuxifqlhnnkg6353/share/proj/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/sqlite-3.43.2-cnpvxmmjnwdcyl7x2norcwy5yomtg43a/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/sqlite-3.43.2-cnpvxmmjnwdcyl7x2norcwy5yomtg43a/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/readline-8.2-afhogdyk5ngwn765nyrxopebih2gdctx/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/readline-8.2-afhogdyk5ngwn765nyrxopebih2gdctx/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/libtiff-4.5.1-yflqcndxbcs3jxv2z7lcnqnv5ckphpl3/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/libtiff-4.5.1-yflqcndxbcs3jxv2z7lcnqnv5ckphpl3/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/cmake-3.27.7-3x67s5ytcashm6xvy3jfyohu43spsif6/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/cmake-3.27.7-3x67s5ytcashm6xvy3jfyohu43spsif6/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/curl-8.4.0-fql7y6fhrqrc5acvlqtsdpkojww3ln3n/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/curl-8.4.0-fql7y6fhrqrc5acvlqtsdpkojww3ln3n/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/zlib-ng-2.1.4-cky7voimjpmerjaesrf3xok7jfafae5i/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/zlib-ng-2.1.4-cky7voimjpmerjaesrf3xok7jfafae5i/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/pkgconf-1.9.5-32slusryiobjjsqnxex2acz4lvgsxwfi/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/pkgconf-1.9.5-32slusryiobjjsqnxex2acz4lvgsxwfi/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/ninja-1.11.1-ng2ct2a543iwxerlx3dtt3v5jn45dgw5/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/ninja-1.11.1-ng2ct2a543iwxerlx3dtt3v5jn45dgw5/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/libjpeg-turbo-3.0.0-muokhbxajh2fiv4n4iox2gmpgajq2ftn/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/libjpeg-turbo-3.0.0-muokhbxajh2fiv4n4iox2gmpgajq2ftn/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/ncurses-6.4-jjieq2gyfu7bqrqan3mmsh3gyf2nlom5/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/ncurses-6.4-jjieq2gyfu7bqrqan3mmsh3gyf2nlom5/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/json-c-0.16-ctbahsk5m2gqw42xqm22jywlq6l4qcnb/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/json-c-0.16-ctbahsk5m2gqw42xqm22jywlq6l4qcnb/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/geos-3.12.1-uti3c3v2g7tpxxlof7r3o7jf7syztlb7/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/geos-3.12.1-uti3c3v2g7tpxxlof7r3o7jf7syztlb7/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/expat-2.5.0-ikwq3n2ajyhvfbsbohrju5rjz74dosev/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/expat-2.5.0-ikwq3n2ajyhvfbsbohrju5rjz74dosev/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/nghttp2-1.57.0-6wbi3szx3pt5dzqfpnhvqdts75muw54h/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/nghttp2-1.57.0-6wbi3szx3pt5dzqfpnhvqdts75muw54h/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/lib/spack/env/clang/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/lib/spack/env/clang/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/lib/spack/env/case-insensitive/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/lib/spack/env/case-insensitive/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/lib/spack/env/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/lib/spack/env/proj-config.cmake
    /Users/cmarsh/.pyenv/versions/3.10.4/PROJConfig.cmake
    /Users/cmarsh/.pyenv/versions/3.10.4/proj-config.cmake
    /Users/cmarsh/.pyenv/versions/3.10.4/CMake/PROJConfig.cmake
    /Users/cmarsh/.pyenv/versions/3.10.4/CMake/proj-config.cmake
    /opt/homebrew/Cellar/pyenv/2.3.12/libexec/PROJConfig.cmake
    /opt/homebrew/Cellar/pyenv/2.3.12/libexec/proj-config.cmake
    /opt/homebrew/Cellar/pyenv/2.3.12/plugins/python-build/PROJConfig.cmake
    /opt/homebrew/Cellar/pyenv/2.3.12/plugins/python-build/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/var/spack/environments/chm/.spack-env/view/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/var/spack/environments/chm/.spack-env/view/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/var/spack/environments/chm/.spack-env/view/cmake/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/var/spack/environments/chm/.spack-env/view/cmake/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/var/spack/environments/chm/.spack-env/view/lib/cmake/proj4/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/var/spack/environments/chm/.spack-env/view/lib/cmake/proj4/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/var/spack/environments/chm/.spack-env/view/lib/cmake/proj/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/var/spack/environments/chm/.spack-env/view/lib/cmake/proj/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/var/spack/environments/chm/.spack-env/view/share/proj/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/var/spack/environments/chm/.spack-env/view/share/proj/proj-config.cmake
    /opt/homebrew/Cellar/pyenv-virtualenv/1.2.1/shims/PROJConfig.cmake
    /opt/homebrew/Cellar/pyenv-virtualenv/1.2.1/shims/proj-config.cmake
    /Users/cmarsh/.pyenv/shims/PROJConfig.cmake
    /Users/cmarsh/.pyenv/shims/proj-config.cmake
    /Users/cmarsh/.pyenv/PROJConfig.cmake
    /Users/cmarsh/.pyenv/proj-config.cmake
    /Users/cmarsh/PROJConfig.cmake
    /Users/cmarsh/proj-config.cmake
    /opt/homebrew/opt/qt5/PROJConfig.cmake
    /opt/homebrew/opt/qt5/proj-config.cmake
    /Users/cmarsh/Documents/science/code/spack/PROJConfig.cmake
    /Users/cmarsh/Documents/science/code/spack/proj-config.cmake
    /opt/homebrew/PROJConfig.cmake
    /opt/homebrew/proj-config.cmake
    /opt/homebrew/lib/cmake/proj4/PROJConfig.cmake
    /opt/homebrew/lib/cmake/proj4/proj-config.cmake
    /opt/homebrew/lib/cmake/proj/PROJConfig.cmake
    /opt/homebrew/lib/cmake/proj/proj-config.cmake

  The file was found at

    /opt/homebrew/lib/cmake/proj/proj-config.cmake

Steps to reproduce the problem.

Build gdal with cmake

Operating system

macos & linux (uncertain about windows)

GDAL version and provenance

8.3.x

@rouault
Copy link
Member

rouault commented Dec 8, 2023

@Chrismarsh does #8943 fix your issue ?

@rouault rouault self-assigned this Dec 8, 2023
@adamjstewart
Copy link
Contributor

Would it also be possible to remove prioritization of PROJ 9/8 such that the first PROJ found in your PATH/CMAKE_PREFIX_PATH is used regardless of version? Then Spack wouldn't even need to specify this flag. Not sure if prioritization was added to solve a different issue. We're fine with adding these flags if you need to keep prioritization in place.

@rouault
Copy link
Member

rouault commented Dec 11, 2023

Would it also be possible to remove prioritization of PROJ 9/8 such that the first PROJ found in your PATH/CMAKE_PREFIX_PATH is used regardless of version?

Another attempt at fixing the issue in #8956

@rouault
Copy link
Member

rouault commented Dec 11, 2023

Another attempt at fixing the issue in #8956

@adamjstewart can you give it a try ?

@adamjstewart
Copy link
Contributor

I don't actually have the original issue so I won't be able to verify whether or not it worked. I gave up Homebrew entirely and only use Spack.

@rouault
Copy link
Member

rouault commented Dec 11, 2023

@Chrismarsh Are you able to give a try to #8956 ?

@dg0yt
Copy link
Contributor

dg0yt commented Dec 11, 2023

The file was found at

    /opt/homebrew/lib/cmake/proj/proj-config.cmake

If you don't want to use this particular config, configure with -DCMAKE_IGNORE_PATH=/opt/homebrew/lib/cmake/proj.
https://cmake.org/cmake/help/latest/variable/CMAKE_IGNORE_PATH.html#cmake-ignore-path

@adamjstewart
Copy link
Contributor

@dg0yt unfortunately this solution doesn't work for package managers. We need a recipe that will work for all users on all systems. If there isn't a way to tell CMake where a dependency can be found, then we can't reliably build GDAL with a specific PROJ installation.

@Chrismarsh
Copy link
Author

@rouault and all: sorry just been busy this weekend. Thanks for taking a look. I have a family thing this am but can look later today I hope. Tomorrow (Tuesday) at the earliest

I agree that the inverse (ignore this flag) is not ideal as there could be many configurations available and it would be simpler and cleaner to specify exactly what you want versus by exclusion. Easy to miss one!

@rouault
Copy link
Member

rouault commented Dec 11, 2023

shouldn't Spack build recipe sets https://cmake.org/cmake/help/latest/variable/CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH.html#variable:CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH and https://cmake.org/cmake/help/latest/variable/CMAKE_FIND_USE_CMAKE_SYSTEM_PATH.html#variable:CMAKE_FIND_USE_CMAKE_SYSTEM_PATH to NO. That would avoid it looking in other directories than its prefix (I imagine it sets CMAKE_PREFIX_PATH?) as far as I can understand ?

@adamjstewart
Copy link
Contributor

Yes, we set CMAKE_PREFIX_PATH. @Chrismarsh can you try those env vars when you get a chance and see if they help? If so, I can open a PR to add these.

@dg0yt
Copy link
Contributor

dg0yt commented Dec 12, 2023

A cleaner solution would follow the pattern

find_package(PROJ CONFIG)
if(PROJ_FOUND)
    string(APPEND GDAL_IMPORT_DEPENDENCIES "find_dependency(PROJ ${PROJ_VERSION_MAJOR} CONFIG)\n")
else()
    find_package(PROJ 6.3 REQUIRED)
    string(APPEND GDAL_IMPORT_DEPENDENCIES "find_dependency(PROJ 6.3)\n")
endif

This just prefers config mode over module mode, which is a reasonable choice for modern packages.

@Chrismarsh
Copy link
Author

@adamjstewart @rouault sorry for the slowness on my end.

I can confirm that setting both those cmake vars results in a successful build that does not link against homebrew's libproj

            self.define("CMAKE_FIND_USE_CMAKE_SYSTEM_PATH", False),
            self.define("CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH", False),

@adamjstewart I see that you've already set

            self.define("GDAL_USE_EXTERNAL_LIBS", False),
            self.define("GDAL_USE_INTERNAL_LIBS", False),

@rouault Do you still want me to try #8956 given @dg0yt's simpler suggestion above?

rouault added a commit to rouault/gdal that referenced this issue Dec 13, 2023
@rouault
Copy link
Member

rouault commented Dec 13, 2023

Do you still want me to try #8956 given @dg0yt's simpler suggestion above?

no, I've just issued #8964 with those simpler changes

@Chrismarsh
Copy link
Author

@rouault I patched gdal 3.8.0 with /pull/8964 (reverting my other changes) and it works as expected:

$ otool -L /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/gdal-3.8.0-jhtcrr2covijmegzetk7ctrbb5cboibr/lib/libgdal.dylib | grep proj
	@rpath/libproj.19.dylib (compatibility version 19.0.0, current version 21.1.2)

$ otool -l /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/gdal-3.8.0-jhtcrr2covijmegzetk7ctrbb5cboibr/lib/libgdal.dylib | grep LC_RPATH -A2
[snip]
          cmd LC_RPATH
      cmdsize 152
         path /Users/cmarsh/Documents/science/code/spack/opt/spack/darwin-ventura-m1/apple-clang-14.0.3/proj-7.2.1-54oiedo5byobsikslgdy6wnz2z26345f/lib (offset 12)

@adamjstewart I did:

    patch(
        "https://patch-diff.githubusercontent.com/raw/OSGeo/gdal/pull/8964.patch?full_index=1",
        when="@3.8.0",
        # level=1,
        sha256="52459dc9903ced5005ba81515762a55cd829d8f5420607405c211c4a77c2bf79")

@haampie
Copy link

haampie commented Dec 14, 2023

Thanks for simplifying to #8964 :)

As a remark: I think even if we disable "default search paths" it may be that the Homebrew directory is added to CMAKE_PREFIX_PATH because of a different dependency (of a dependency etc...).

That is to say, sticking to the default search procedure is the least surprising, and people who want to force a particular version of a dependency can always shuffle the entries of CMAKE_PREFIX_PATH to make that happen.

rouault added a commit that referenced this issue Dec 14, 2023
@rouault rouault closed this as completed Dec 18, 2023
clrpackages pushed a commit to clearlinux-pkgs/gdal that referenced this issue Aug 8, 2024
AbelPau (14):
      Add MiraMonVector read/creation driver (#9688)
      Miramon: fixes and additional tests
      MiraMonVector fixes (2) tests improvements (+10) (#9744)
      MiraMonVector driver. Adding tests
      MIraMonVector Fix.
      MiraMonVector: fix memleak in creation error case (#9805)
      Little fixes in MiraMon metadata files
      MiraMonVector: Adding more matchs in the look-up table MM_m_idofic.csv
      MiraMonVector: Fixing error in linestring (from not polygon) metadata file
      MiraMonVector: Fixing chromium bug 68809
      Fixing chromium bug 68809 correctly
      MiraMonVector: fix a case of sensitive comparison
      MIraMonVector: fixing MMResetFeatureRecord
      MiraMonVector: fixing accepted metadata versions/subversions

Adam Gutonski (1):
      OpenFileGDB writer: set xml shape type to "esriGeometryPolyline" for LineString/MultiLineString (#9033)

Alan Ramírez Herrera (1):
      GeoRaster: Added GENSTATS options, security fixes, and prevent failing when password is near expiration (#9290)

Alessandro Pasotti (15):
      OAPIF: add INITIAL_REQUEST_PAGE_SIZE open option (fixes #4556)  (#8763)
      OGR: Add OGRLayer::GetExtent3D() (#8806)
      SubdatasetInfo API: fix protocol and bogus
      SubdatasetInfo: better check for drive letters for netCDF/HDF4/HDF5 (#8891) (fixes #8881)
      GPKG: add GetExtent3D semi-fast implementation (#8910)
      PG: add GetExtent3D fast implementation (#8939)
      GEOJSON: add GetExtent3D "fast" implementation  (#9017)
      OGR: fix read corrupted wkb with mixed 2D and 3D geoms
      GDALSuggestWarpOutput(): make it return original potential non-square pixel shape for a south-up oriented dataset (#9336)
      Overview/RasterIO resampling: fix infinite looping when nodata has a big absolute value (#9428)
      [clang-format] Add line breaks after methods definition
      clang-format all files to add line breaks
      Warp: make target resolution independent from source extent when -te is specified (#9573)
      VSICACHE: avoid EOF read (#9669)
      gdalinfo: use argparser (#9687)

Andrea Giudiceandrea (3):
      [Docs] [CEOS] Fix ref to SAR_CEOS driver
      [Docs] [SAR_CEOS] Fix ref to CEOS driver
      gdal_polygonize.py: handle error if creation of dst ds fails

Andreas Bergstrøm Aarnseth (1):
      SWIG: Exposes additional Dataset methods for the csharp wrapper (fixes #918) (#9398)

Andrew Johnston (1):
      Fix rendering of code block in python readme

Bas Couwenberg (1):
      Include <cstdint> for uint64_t.

Björn (1):
      GML: Fix reference in docs

Brad Hards (1):
      port: minor apidoc cleanup

Charlie Savage (3):
      This commit updates OGC map tiles api to support additional image formats beyond PNG/JPG as well as enables content negotiation.
      OGCAPI: Add geotiff as supported image_format option to avoid warning message (master only)
      QuietDeleteForCreateCopy(): forward source dataset open options (#9422)

Chris Toney (1):
      doc: update ogr2ogr default value for -gt in Performance hints

Dan Baston (5):
      OGRLayer: Have CreateField/CreateGeomField take const OGRFieldDefn/OGRGeomFieldDefn* argument (#8741)
      Update swig/include/python/docs/gdal_dataset_docs.i
      Doc: Update Python API docs for ogr.Feature (#9486)
      Doc: Update Python API docs for FieldDefn, FieldDomain (#9579)
      autotest: run Python tests directly from source tree on Windows (#9224)

Daniel Baston (78):
      CI: Add Ubuntu 22.04 configuration
      CI: Remove Ubuntu 18.04 x64 configuration
      CI: Add Alpine 32-bit configuration
      CI: Remove Ubuntu 18.04 i386 configuration
      CMake: Default to C++17
      DXF: Silence gcc 13 compiler warning in C++17 mode
      CI: Disable LIBKML in Windows builds
      OGRSQL: Store column defs in std::vector
      OGRSQL: Support SELECT * EXCLUDE(...)
      CI: Remove redundant clang-format check
      Doc: Add Python API docs for gdal.Dataset
      Doc: Add Python API docs for gdal.Band
      Python: Update ReadAsArray, WriteArray docstrings
      VRTDerivedRasterBand: Support Int8, (U)Int64 with Python pixel functions
      Doc: Add instructions for Python API documentation
      Doc: Add Python docstrings for some functions in gdal module
      SWIG: Fix gdal.Warp segfault with dst=None
      Doc: Add Python API docs for gdal.Driver
      Python bindings: Invalidate layer ref when Dataset closes
      Python bindings: Accept str arg in FeatureDefn.GetFieldDefn
      Doc: Update Python API docs for ogr.FeatureDefn
      Doc: Organize Python API docs
      Doc: Update vector data model description
      Python: Add Band.ReadAsMaskedArray
      Python bindings: Make gdal.GeneralCmdLineProcessor accept int, os.PathLike
      gdal_translate: avoid dataset leak on invalid -exponent and -scale
      Python bindings: Make ogr.GeneralCmdLineProcessor accept int, os.PathLike
      autotest: remove asserts under pytest.raises(Exception)
      WMS: Use GDAL_HTTP_TIMEOUT
      autotest: test_gdal_edit.py: use_tmp_path fixture
      autotest: test_gdal_fillnodata.py: use_tmp_path fixture
      autotest: test_gdal_polygonize.py: use_tmp_path fixture
      autotest: test_gdal_sieve.py: use_tmp_path fixture
      autotest: test_gdal_utils.py: use_tmp_path fixture
      autotest: test_gdallocationinfo.py: use_tmp_path fixture
      autotest: test_gdalmove.py: use_tmp_path fixture
      autotest: test_validate_geoparquet.py: use_tmp_path fixture
      autotest: test_gdal_proximity.py: use_tmp_path fixture
      autotest: test_gdal_calc.py: use_tmp_path fixture
      autotest: test_ogr_layer_algebra.py: use_tmp_path fixture
      autotest: test_ogrmerge.py: use_tmp_path fixture
      autotest: test_gdal2tiles.py: use_tmp_path fixture
      autotest: test_gdal2xyz.py: use_tmp_path fixture
      Python: remove ogr2ogr.py sample
      CMake: Add missing dependency on SubdatasetInfo.i
      gdalinfo: suggest trying ogrinfo if appropriate
      ogrinfo: suggest trying gdalinfo if appropriate
      netCDF: Add BAND_NAMES creation option
      NEWS: Fix typo
      Doc: Add Python API docs for osr module
      autotest: warn if sequential tests are not sent to same parallel worker
      autotest ogr_hana.py: mark tests as order-dependent
      autotest vsiadls.py: cleanup config options after tests run
      autotest ogr_pgdump.py: use tmp_path, tmp_vsimem
      autotest ogr_pds4.py: use tmp_path, tmp_vsimem
      autotest: Allow custom temp dir in GDALTest
      autotest tiff_read.py: use tmp_path, tmp_vsimem, parametrize
      autotest ogr_fgdb.py: mark as order-dependent, add missing argument
      autotest vsiaz.py: use tmp_vsimem
      autotest vsiadls.py: use tmp_vsimem
      autotest: ogr_pgdump.py: avoid writing to gdaltest module
      autotest ogr_georss.py: combine two interdependent tests
      autotest vsis3.py: avoid setting custom AWS_S3_ENDPOINT in tests that should not use it
      autotest vsis3.py: use tmp_vsimem fixture
      autotest ogr_hana.py: skip tests if connection string not set
      autotest ogr_db2_hack.py: combine interdependent tests
      autotest ogr_openfilegdb.py: use tmp_path, tmp_vsimem
      autotest ogr_gpkg.py: use tmp_path, tmp_vsimem
      autotest: ogr_geojson.py: use tmp_path, tmp_vsimem
      autotest: ogr_geoconcept.py: use tmp_path
      autotest: ogr_dxf.py: use tmp_path
      autotest: ogr_gpx.py: use tmp_vsimem
      autotest: ogr_index_test.py: use tmp_path
      autotest ogr_sql_test.py: use tmp_path
      Python bindings: Avoid crash when accessing closed file
      autotest vsiadls.py: use module scope for setup/cleanup
      Python scripts: Use decorator to enable exceptions
      Python bindings: Avoid crash when using orphaned subgeometry

Dave Martinez (1):
      Dockerfile Ubuntu - Remove apache arrow deb file

David Shean (1):
      gdal_edit: add -a_coord_epoch option with test, update doc

Edouard Choinière (3):
      Doc: Fix some typos in HFA -- Erdas Imagine .img docs (#9387)
      CI: Add branches-ignore on pushes to backport branches for CodeQL workflow
      CI: Add branches-ignore on pushes to dependabot branches

Edvins Liepa (1):
      gdal2xyz: Change -srcwin parameter type to integer.

Even Rouault (1633):
      Add RFC96 text: Deferred in-tree C++ plugin loading
      Set master to 3.9.0dev
      RFC 96: revise to avoid GDALPluginDriverFeatures
      gdal_create: copy GCPs present in the input file
      Travis CI: update to jammy
      RFC96: add out-of-tree deferred loaded plugin capability
      CI Travis: s390x: use ctest for python tests
      exr.py: add expected checksum for s390x jammy
      CI Travis: s390x: disable broken tests
      CI: skip test_tiff_read_cog_with_mask_vsicurl on s390x
      Python utilities: make gdal_edit, gdal_pansharp, gdal_retile and ogr_layer_algebra return 0 error code when invoked with --version switch
      RFC96: mention another backward compatibility issue
      gdalwarp -of COG: use target SRS from -co TILING_SCHEME when specified (fixes #8684)
      VRTSourcedRasterBand: serialize approximate statistics inside .vrt when there are overviews
      gdal_rasterize: fix inverse rasterization of polygon nested inside another one. Requires GEOS enabled build (fixes #8689)
      ubuntu-full/Dockerfile: update Arrow version [ci skip]
      RFC96; update with custom installation message
      S57: stricter dataset identification to avoid recognize S-101 datasets we don't handle
      docker/README.md: advertize 3.8.0 [ci skip]
      Doc: advertize 3.8.0
      swig/python/README.rst: fix link [ci skip]
      GPKG: fix SetFeature()/UpdateFeature()/DeleteFeature() on views with INSTEAD OF triggers (fixes #8707)
      SQLite: fix SRS retrieval of a SELECT layer from a non-Spatialite DB with a point geometry column (fixes #8677)
      various CMakeLists.txt: remove now useless target_compile_features(cxx_std_17)
      Doc: update requirements to C++17
      Replace uses of cpl::make_unique<> with std::make_unique<>
      cpl_conv.h: remove cpl::make_unique<> template
      Python bindings: add RasterAttributeTable::ReadValuesIOAsString, ReadValuesIOAsInteger, ReadValuesIOAsDouble, RemoveStatistics()
      GDALRATValuesIOAsString(): fix wrong type for papszStrList argument
      Add GDALCreateRasterAttributeTableFromMDArrays() to return a virtual Raster Attribute Table from several GDALMDArray's
      Remove deprecated ARG driver (fixes #7920)
      Remove GDALIsDriverDeprecatedForGDAL39StillEnabled()
      RFC96 text: add GDAL_DMD_CONNECTION_PREFIX and GDAL_DCAP_VECTOR_TRANSLATE_FROM to the list of items that must be set on the proxy
      Inverse TPS transformer: speed improvement in gdalwarp use case (fixes #8672)
      Fix a few cppcheck warnings
      MSGN: fix memleak in error code path
      Fix warnings (false positives, or non-important) raised by CSA
      CI: update CLang Static Analyzer job to ubuntu 22.04
      C++17: use if constexpr() construct
      Doc: update createFromGML() doc regarding curves (fixes #8719)
      RFC96 text: add missing word
      Python bindings: define entry_points.console_scripts
      Doc: PG: warn to force PG_USE_COPY=NO when using PgPoolII (fixes #8674)
      gdal_sieve.py/gdalattachpct.py/gdalcompare.py/gdalmove.py: make sure --version and --help return 0 error code (fixes #8717)
      bag.rst: fix MODE=INTERPOLATED
      C++17: replace CPL_FALLTHROUGH by standard [[fallthrough]];
      Replace custom StringView with std::string_view
      C++17: use structured bindings declaration and class template argument deduction for std::pair()
      Doc: change default of GDAL_HTTP_MERGE_CONSECUTIVE_RANGES to YES
      gdaltest.gdalurlopen(): better detect timeout
      sqlite_rtree_bulk_load.c: fix memleak in error code path
      PMTiles: avoid undefined-shift when zoom level is too big (fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=64234)
      RFC96: update voting history and status
      COG: avoid warnings when converting from world coverage to EPSG:3857
      gdalwarp: add a heuristic to clamp northings when projecting from geographic to Mercator (typically EPSG:3857) (fixes #8730)
      fuzzers/CMakeLists.txt: remove CXX_STANDARD redefinition
      GML: SaveClasses(): fix memleak in error code path. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=63871
      Doc: OGRFieldDefn/OGRGeomFieldDefn: add note about not modifying them directly if they belong to a layer definition
      Doc: OGRFeatureDefn: add warning about not modifying directly if belonging to a OGRLayer
      OGRFeatureDefn, OGRFieldDefn, OGRGeomFieldDefn: add Seal() and Unseal() methods
      GPKG: make use of OGRFeatureDefn sealing
      Shape: make use of OGRFeatureDefn sealing
      OpenFileGDB: make use of OGRFeatureDefn sealing
      MITAB: make use of OGRFeatureDefn sealing
      MEM, GeoJSON, JSONFG, TopoJSON, ESRIJSON, ODS, XLSX: make use of OGRFeatureDefn sealing
      PG: make use of OGRFeatureDefn sealing
      MIGRATION_GUIDE.TXT: mention RFC 97
      fuzzers/build_google_oss_fuzzers.sh: enable -std=c++17 otherwise gcc complains about 'use of deleted function ‘OGRFeatureDefn::TemporaryUnsealer::TemporaryUnsealer(const OGRFeatureDefn::TemporaryUnsealer&)' in whileUnsealing() helpers
      swig/include/gdal_array.i: no longer define GDAL_COMPILATION and DO_NOT_USE_DEBUG_BOOL
      Add whileUnsealing() helper method
      autotest/cpp: add testing of sealing functionality
      Internal libtiff: resync with upstream
      Fix build error with libxml2 2.12
      Fix build error with libxml2 2.12 (cont'd)
      GTiff/internal libtiff: Use (future) libtiff 4.6.1 TIFFOpenOptionsSetMaxSingleMemAlloc()
      ogr_swq.h: remove declaration of no longer implemented function swq_select_parse()
      Remove swq_select::Dump(): unused debugging function not testing everything, and superseded by Unparse()
      Fix swq_select::Unparse() and add tests for it
      Shapelib: resync with upstream
      .github/workflows/ubuntu_20.04/build.sh: remove useless -std=c++17
      .github/workflows/alpine/build.sh: build with -std=c++23
      GPKG: fix GetNextArrowArray() when there are more than 125 columns (affects ogr2ogr from such GPKG) (fixes #8757)
      sql_sqlite_dialect.rst: fix loading of spatialite
      ogr2ogr: fix GPKG to shapefile with the -preserve_fid flag (fixes #8761)
      Add a OGRPARSEDATE_OPTION_LAX option to OGRParseDate() and use it when reading GPKG files (fixes #8759)
      GetArrowStreamAsNumPy(): fix missing offset when reading fixed size list of string
      PostFilterArrowArray(): various fixes to pass libarrow full validation checks (fixes #8755)
      CSLLoad2(): remove CPLErrorReset()
      Shapefile reader: fix spurious warning when reading polygons (ammends fix of #8483, fixes #8767)
      OGRGeoJSONDriverIdentify: return -1 when unsure
      test_ogr_basic_10(): better error message
      Add mechanism for deferred plugin loading
      Parquet: implement deferred driver loading
      netCDF: implement deferred driver loading
      HDF5: implement deferred driver loading
      CMake: add [GDAL|OGR]_REGISTER_DRIVER_<driver_name>_FOR_LATER_PLUGIN options
      RFC96: unify the way we set metadata on plugin driver and actual driver
      ECW: implement deferred driver loading
      JP2KAK: implement deferred driver loading
      JPIPKAK: implement deferred driver loading
      HDF4: implement deferred driver loading
      PDF: implement deferred driver loading
      OpenJPEG: implement deferred driver loading
      Arrow: implement deferred driver loading
      CI Conda: add patch to enable OGR_REGISTER_DRIVER_ARROW/PARQUET_FOR_LATER_PLUGIN
      CMake: add a way of defining an external defered driver by setting one or several ADD_EXTERNAL_DEFERRED_PLUGIN_XXX CMake variables that will cause the pointed file to be built in libgdal, and a DeclareDeferredXXX() C function in it to be called by GDALAllRegister()
      JPEGXL: implement deferred driver loading
      gdalmanage: make --utility_version work
      jpegxl.py: test identifying raw codestream
      FileGDB: implement deferred driver loading
      PG: implement deferred driver loading
      MySQL: implement deferred driver loading
      MSSQL: implement deferred driver loading
      OCI: implement deferred driver loading
      HANA: implement deferred driver loading
      LIBKML: implement deferred driver loading
      DGNv8 / DWG: implement deferred driver loading
      load_postgisraster_test_data.sh: unset GDAL_DRIVER_PATH if set
      PostGISRaster: implement deferred driver loading
      WEBP: implement deferred driver loading
      EXR: implement deferred driver loading
      HEIF: implement deferred driver loading
      BASISU_KTX2: implement deferred driver loading
      GEORASTER: implement deferred driver loading
      gdal_frmts.h: remove no longer existing GDALRegister_JPEGLS() declaration
      PCRaster: implement deferred driver loading
      TileDB: implement deferred driver loading
      JP2Lura: implement deferred driver loading
      KEA: implement deferred driver loading
      Rasterlite: implement deferred driver loading
      PNG: implement deferred driver loading
      DDS: implement deferred driver loading
      GTA: implement deferred driver loading
      FITS: implement deferred driver loading
      MongoDBv3: implement deferred driver loading
      IDB: implement deferred driver loading
      SOSI: implement deferred driver loading
      ogr_sosi.py: clean up temporary directory
      XLS: implement deferred driver loading
      frmts/gdalallregister.cpp: remove disabled code
      GRIB: implement deferred driver loading
      OGDI: implement deferred driver loading
      MSG: implement deferred driver loading
      Remove unused declaration of GDALRegister_Istar()
      Zarr: implement deferred driver loading
      NITF: make it plugin capable if not using internal libtiff, libjpeg and libjpeg12
      NITF: implement deferred driver loading
      MRF: make it plugin capable if using external libraries
      MRF: implement deferred driver loading
      GIF: make it plugin capable
      GIF: implement deferred driver loading
      OpenFileGDB: implement deferred driver loading
      PCIDSK: implement deferred driver loading
      JPEG: make it plugin capable if using external libraries
      JPEG: implement deferred driver loading
      WCS: implement deferred driver loading
      WMS: implement deferred driver loading
      WMTS: implement deferred driver loading
      CAD: implement deferred driver loading
      RAW drivers: make them buildable as (a single) plugin
      PDS related drivers (PDSx, ISISx, VICAR): make them buildable as plugin if depending on external libraries
      pds4.py and isis.py: make robust to other missing drivers
      PDS related drivers (PDSx, ISISx, VICAR):implement deferred driver loading
      building_from_source.rst: update
      RFC96: add [GDAL|OGR]_DRIVER_<driver_name>_PLUGIN_INSTALLATION_MESSAGE CMake option to customize error message
      .github/workflows/coverage/build.sh: enable plugin build
      Add autotest/cpp/test_deferred_plugin.cpp
      VFK: implement deferred driver loading
      GMLAS: implement deferred driver loading
      ODBC: implement deferred driver loading
      Carto: implement deferred driver loading
      Elasticsearch: implement deferred driver loading
      PLScenes: implement deferred driver loading
      RFC96: add GDAL_DMD_CONNECTION_PREFIX and GDAL_DCAP_VECTOR_TRANSLATE_FROM to the list of items that must be set on the proxy
      Doc: link to RFC96 in raster and vector driver implementation tutorials
      rasterlitedataset.cpp: avoid CSA warning about potential nullptr
      RFC96: add a DEFINE_DRIVER_METHOD_GET_CALLBACK() macro to make code more compact
      Doc: GDAL_DRIVER_PATH: document 'disable'
      Doc: GDALOpenEx(): explain the 2 passes
      BSB: fix opening datasets with errant 0x1A character in header (fixes #8765)
      Add OGRCloneArrowArray()
      Arrow/Parquet: use OGRCloneArrowArray() for safer filtering
      Parquet test file: write distinct values in struct_field and list_struct fields
      WriteArrowArray(): fix wrong taking into account of struct offset
      GDALDriverManager::DeclareDeferredPluginDriver(): disable debug message
      typo fixes
      frmts/nitf/CMakeLists.txt: fix condition to build as plugin
      GdalDriverHelper.cmake: error out if a driver has been asked as a plugin, but conditions are not met
      [Lint] GTiff: move HasOptimizedReadMultiRange() implementation to appropriate file
      GTiff SRS reader: include VertCRS name from EPSG in CompoundCRS name if there's no citation geokey
      typo fixes
      GTiff multithreaded reader/writer: in update scenarios, do not force serialization to disk of dirty blocks that intersect the area of interest to read (fixes #8729)
      gdalwarp: progress bar tunings
      cmake/helpers/GdalDriverHelper.cmake: use better generated filename (master only)
      RFC96: change status to implemented
      PMTiles: avoid undefined-shift when zoom level is too big (fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=64404)
      KEA: Create(): error out if passing a /vsi file. avoids crashes (fixes #8743)
      OGRCloneArrowArray(): tiny perf improvements
      Avoid 'local variable ... will be copied despite being returned by name [-Wreturn-std-move]' with some clang versions
      Increase a bit test test coverage of WriteArrowBatch()
      gdal_footprint: fix -ovr on RGBA datasets (fixes #8792)
      Add missing '#include <cctype>' (master only)
      Revert "Python bindings: define entry_points.console_scripts"
      CMake: make GDAL_USE_LIBKML and GDAL_USE_OPENJPEG honor GDAL_USE_EXTERNAL_LIBS
      CI: Linux: test install target
      CSV writer: do not quote integer fields by default (only if STRING_QUOTING=ALWAYS is specified)
      swig/python/install_python.cmake.in: detect failure in installation
      swig/python/CMakeLists.txt: do not set SETUPTOOLS_USE_DISTUTILS=stdlib for Python 3.12 on Debian
      Python scripts: define entry_points.console_scripts to have launcher shell/exe scripts
      PDF: silence false positive Coverity warnings (CID 1525215,1525184,1525078)
      cpl_vsil_gzip.cpp: rework code a bit to hopefully silence CID 1525336
      swq_select_summarize(): avoid definition of potential invalid pointer (master only, CID 1525071)
      CI: test that we can compile all headers with C++11 (fixes #8796)
      No longer install cpl_minizip_ioapi.h cpl_minizip_unzip.h cpl_minizip_zip.h.
      GDALOverviewDataset::IRasterIO(): use parent dataset when possible for more efficiency
      Fix gdalgrid_priv.h compilation
      Fix gdalpansharpen.h compilation
      swig/python/setup.py.in: workaround easy_install behavior on Windows to keep .py scripts (fixes #8811)
      test_gdalinfo.py: use temporary file to avoid potential concurrency issues
      CI Windows build: test 'python setup.py install'
      autotest/cpp/CMakeLists.txt: avoid recompiling main_gtest.cpp multiple times
      pmtiles.rst: document it is built-in
      GPX: make detection of <extensions> element more robust (fixes #8827)
      Add VSIVirtualHandle::Printf()
      [Lint] GPX driver: prefix member variables and inline initialize, use smart pointers, etc.
      sozip: support generic command line options
      GeoJSON writer: add FOREIGN_MEMBERS_FEATURE and FOREIGN_MEMBERS_COLLECTION layer creation option
      ogr_CityJSON.py: improve identify() to recognize https://3d.bk.tudelft.nl/opendata/cityjson/3dcities/v2.0/9-284-556.city.json [ci skip]
      GDALDriverManager::GetPluginFullPath(): use std::move() (CID 1528548)
      GPKG: use locking to make Coverity happy (CID 1528549)
      Move Coverity suppression
      WFS: fix memleak in error code path (CID 1214433)
      OGRODBCDataSource::Open(): simplify code to avoid false-positive nullptr deref warning (CID 1525166)
      Add third_party/fast_float/resync_with_upstream.sh
      Resync third_party/fast_float with upstream
      GPSBabel: simplify code to avoid false-positive nullptr deref warning (CID 1297184, 1214416), and increase test coverage
      Doc: add instructions how to build and use the Java bindings
      COG: for JPEG compression, convert single band+alpha as single band JPEG + 1-bit mask band
      gdal_footprint.rst: typo fix
      gdal_footprint: really fix datasets with alpha band, by vectorizing only the alpha band and not the other ones (really fixes #8792, fixes #8834)
      Python bindings: add a combineBands option to gdal.Footprint()
      gdal_footprint: fix taking into account of individual bands that have nodata
      Shapefile: recogize '      0' as a null date
      Shapefile: fix writing an invalid "0000/00/00" date
      RFC 97 text: OGRFeatureDefn, OGRFieldDefn and OGRGeomFieldDefn "sealing" (#8734)
      ExecuteSQL(): add a warning if the dialect name isn't recognized (fixes #8843)
      OGRGeoPackageTableLayer::SetCreationParameters(): add missing sealing (master only)
      ogr2ogr: fix GPKG -> Shapefile when field names are truncated (fix #8849, 3.8.0 regression)
      Doc: SQL dialects: improvements
      LIBKML: fix typo in error message [ci skip]
      ogr_libkml.rst: document AUTHOR_NAME, AUTHOR_URI, AUTHOR_EMAIL options (fixes #8851)
      GDALOpen(): fix memleaks (master only)
      cpl_recode.cpp/cpl_recode_stub.cpp: small cleanup
      OGR SQL: add UTF-8 support for LIKE/ILIKE (for layers declaring OLCStringsAsUTF8) (fixes #8835)
      OGR SQLite/SQLite/GPKG: add UTF-8 support for case-insensitive LIKE (fixes #8835)
      typo fixes
      gdal_footprint: return an error if the requested output layer doesn't exist
      Python bindings: gdal.Footprint(): add a minRingArea option
      Increase test coverage of gdal_footprint
      ogr2ogr: add [--long-usage] in synopsis (fixes #8853)
      /vsis3/: takes into account AWS_CONTAINER_CREDENTIALS_FULL_URI environment variable (fixes #8858)
      FlatGeobuf: add support for reading and writing layer title, description and metadata
      GDALTranslate(): avoid useless extra GDALOpen() call on a target GeoRaster
      autotest: test_osr_esri_28(): make it robust when run against latest EPSG dataset version
      STACTA: use GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR instead of CPL_VSIL_CURL_ALLOWED_EXTENSIONS
      JPEGXL: add compatibility with latest libjxl git HEAD
      OpenFileGDB: add support for Integer64, Date, Time and DateTimeWithOffset data types added in ArcGIS Pro 3.2 (fixes #8862)
      pct2rgb.py: emit explicit exception when source file has no color table (fixes #8793)
      docker/README.md: advertize 3.8.1 [ci skip]
      Doc: advertize 3.8.1
      Python bindings: fix build/install when there's a gdal-config from a pre-installed version in the PATH (fixes #8882)
      GDALTranslate(): avoid useless extra GDALOpen() call on a target GeoRaster (again)
      GDALAllRegister(): fix registration order of raw drivers (master only)
      NGSGEOID: make dataset identification robust to NaN values (fixes #8879)
      OGRGeometryFactory::transformWithOptions(): fix WRAPDATELINE=YES on multipoint geometries (fixes #8889)
      CI: fix brew issue
      OGRSpatialReference::importFromUrl(): changes to no longer use a 'Accept: application/x-ogcwkt' header
      HDF5 classic 2D API: handle char,ushort,uint,int64,uint64 attributes when reading them as double
      HDF5 multidim: better warning when nodata value is out of range
      cpl_safemaths.hpp: fix compilation with clang targetting Windows (fixes #8898)
      GDALGetSubdatasetInfo(): be more friendly of deferred loaded plugins
      README.md: update badges [ci skip]
      OSRPJContextHolder: call pthread_atfork() once for the process
      vrtmisc.py: disable debug traces [ci skip]
      Revert "ogr_proj_p.cpp: disable pthread_atfork() optimization on MacOS (fixes #8497)"
      JP2KAK: make result of RasterIO() consistent depending if it is called directly or through VRT, with non-nearest upsampling (fixes #8911)
      JP2KAK: refactor how overviews work
      OGCAPI: make it robust to missing 'type' on 'self' link (fixes #8912)
      JP2KAK: remove now useless code related to non-nearest resampling
      CI: build-linux-ubuntu-focal: bump to CMake 3.16
      CMakeLists.txt: bump minimum CMake version to 3.16
      Doc: dev_environment.rst: bump to CMake >= 3.16
      code_checks.yml: disable shellcheck SC2129
      swig/java: CMAKE_UNITY_BUILD fix
      port: CMAKE_UNITY_BUILD fixes
      alg: CMAKE_UNITY_BUILD fixes
      apps: CMAKE_UNITY_BUILD fixes
      autotest/cpp: CMAKE_UNITY_BUILD fixes
      AIGRID: CMAKE_UNITY_BUILD fixes
      BASISU_KTX2: CMAKE_UNITY_BUILD fixes
      ERS: CMAKE_UNITY_BUILD fixes
      GIF: CMAKE_UNITY_BUILD fixes
      FITS: CMAKE_UNITY_BUILD fixes
      GRIB: CMAKE_UNITY_BUILD fixes
      Internal libtiff: resync with upstream: CMAKE_UNITY_BUILD fixes
      tifvsi.cpp: include xtiffio.h instead of redefining its functions
      GTiff: CMAKE_UNITY_BUILD fixes
      JAXAPALSAR: CMAKE_UNITY_BUILD fixes
      MRF: CMAKE_UNITY_BUILD fixes
      MSG: CMAKE_UNITY_BUILD fixes
      NITF: CMAKE_UNITY_BUILD fixes
      NORTHWOORD: CMAKE_UNITY_BUILD fixes
      OPENJPEG: CMAKE_UNITY_BUILD fixes
      PCIDSK SDK: CMAKE_UNITY_BUILD fixes
      PCRASTER: CMAKE_UNITY_BUILD fixes
      PDS/ISIS3/VICAR: CMAKE_UNITY_BUILD fixes
      POSTGISRaster: CMAKE_UNITY_BUILD fixes
      R: CMAKE_UNITY_BUILD fixes
      DOQ1/DOQ2: CMAKE_UNITY_BUILD fixes
      ENVI/GenBIN: CMAKE_UNITY_BUILD fixes
      RMF: CMAKE_UNITY_BUILD fixes
      TSX: CMAKE_UNITY_BUILD fixes
      VRT: CMAKE_UNITY_BUILD fixes
      WCS: CMAKE_UNITY_BUILD fixes
      WMS: CMAKE_UNITY_BUILD fixes
      ZARR: CMAKE_UNITY_BUILD fixes
      frmts/zlib/contrib/infback9: CMAKE_UNITY_BUILD fixes
      HDF4: CMAKE_UNITY_BUILD fixes
      frmts/XXXX/CMakeLists.txt: remove useles SKIP_UNITY_BUILD_INCLUSION
      JPEG: CMAKE_UNITY_BUILD fixes
      gcore: CMAKE_UNITY_BUILD fixes
      GNM: CMAKE_UNITY_BUILD fixes
      arrow_common: CMAKE_UNITY_BUILD fixes
      AVC: CMAKE_UNITY_BUILD fixes
      DWG: CMAKE_UNITY_BUILD fixes
      DXF: CMAKE_UNITY_BUILD fixes
      ogr/ogrsf_frmts/generic: CMAKE_UNITY_BUILD fixes
      GeoJSON: CMAKE_UNITY_BUILD fixes
      ILI: CMAKE_UNITY_BUILD fixes
      LIBKML: CMAKE_UNITY_BUILD fixes
      MITAB: CMAKE_UNITY_BUILD fixes
      mssqlspatial: CMAKE_UNITY_BUILD fixes
      MVT: CMAKE_UNITY_BUILD fixes
      NTF: CMAKE_UNITY_BUILD fixes
      OpenFileGDB: CMAKE_UNITY_BUILD fixes
      PG: CMAKE_UNITY_BUILD fixes
      Internal shapelib: resync with upstream: CMAKE_UNITY_BUILD fixes
      SQLite: CMAKE_UNITY_BUILD fixes
      SVG: CMAKE_UNITY_BUILD fixes
      TIGER: CMAKE_UNITY_BUILD fixes
      VFK: CMAKE_UNITY_BUILD fixes
      ogr/: CMAKE_UNITY_BUILD fixes
      Tunings for CMAKE_UNITY_BUILD with internal libjpeg, libz, libjson
      ogr_osm.h: remove unused private members
      KTX2: remove unused private member
      RMF: remove unused private member
      DWG: remove unused private members
      KML: remove unused private member
      MSG: disable UNITY_BUILD on Windows
      If CMAKE_UNITY_BUILD=YES, advertize it in 'gdalinfo --build' output
      .github/workflows/alpine/build.sh: enable -DCMAKE_UNITY_BUILD=ON
      CI: build-windows-conda: enable -DCMAKE_UNITY_BUILD=ON
      ci/travis/osx/install.sh: enable -DCMAKE_UNITY_BUILD=ON
      cmake.rst: document CMAKE_UNITY_BUILD
      NITF: fix undefined behavior when using NITFGetField() several times in the same statement
      Make MSVC happy with TemporaryUnsealer
      Update PROJ requirement to 6.3.1 and do associated cleanups
      Rasterization: avoid burning pixel that we only touch (with an empty intersection) (fixes #8918)
      windows_build.yml: update gisinternals SDK
      Update Python requirement to 3.8
      CMake: remove all remaining traces of CMake < 3.16
      Update GEOS requirement to 3.8.0 and do associated cleanups
      Update Poppler requirement to 0.86 and do associated cleanups
      Update libtiff requirement to 4.1.0 and do associated cleanups
      Update libcurl requirement to 7.68 and do associated cleanups
      Update libpng requirement to 1.6 and do associated cleanups
      Update libsqlite3 requirement to 3.31 and do associated cleanups
      Update libopenjp2 requirement to 2.3.1 and do associated cleanups
      Update libnetcdf requirement to 4.7 and do associated cleanups
      Update libhdf5 requirement to 1.10 and do associated cleanups
      autotest/gdrivers/bag.py: skip check_no_file_leaks() on CI
      Make MSVC happy with TemporaryUnsealer (again)
      GetExtent3D(): better docs, and make sure that it takes into account attribute and spatial filters (in shapefile implementation)
      RFC98 text: Build requirements for GDAL 3.9
      shpopen.c: correctly use uint32_t (was broken in 74d53797679e924cc8d57df6759eec673fa4f38e, master only, fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=64773)
      /vsicurl/: re-emit HTTP error code next times we try opening a resource that failed the first time (fixes #8922)
      Move GPKG GetExtent3D() tests to autotest/ogr/
      ogrinfo: add a -extent3D switch
      STACTA: use STAC Raster extension to get number of bands, their data type, nodata value, scale/offset, units, and avoid fetching a metatile
      gdalhttp.py: skip test_http_4
      STACTA: do not require eo:bands extension to be able to use raster:bands one
      Parquet: support reading and writing layer metadata
      gdal_footprint: fix -split_polys and -convex_hull to not consume the argument specified just after them...
      gdal_footprint: write source dataset path in a 'location' field (fixes #8795)
      GeoRaster: fix build on Windows where libjpeg's boolean typedef conflicts with OCI one
      OGREnvelope3D::Is3D(): fix it to work with MinZ/MaxZ initialization values
      Add OGRWKBGetEnvelope() with a OGREnvelope3D; also fix 2D version with POINT EMPTY
      GPKG: make OGRGeoPackageGetHeader() return bounding box without instanciating a OGRGeometry
      Arrow/Parquet: implement GetExtent3D()
      docker/: update Alpine to 3.19 [ci skip]
      STACTA: add support for upcoming STAC 1.1 which merges eo:bands and raster:bands into bands
      docker/alpine: disable IPO [ci skip]
      GPX: fix crash with GPX_ELE_AS_25D=YES config option (fixes qgis/QGIS#55558, master only); add open options
      docker/alpine-normal/Dockerfile: use py3-pillow package [ci skip]
      docker/alpine-normal/Dockerfile: use correct arrow package names
      OpenFileGDB: implement GetExtent3D()
      Geopackage: tune GetExtent3D()
      ogr_gpkg.py: test lyr.GetExtent3D() on a 2D layer, and with filters
      Shapelib: resync with upstream
      GeoRaster: fix build against external libjpeg (master only)
      Python bindings: add missing reference increment on Py_None in error case of Geometry.GetPoints() (fixes #8945)
      TileDB: silence false positive -Wnull-dereference
      CI/Docker: sort Alpine dependencies and add missing armadillo, basisu, odbc-cpp-wrapper and tiledb
      CI: coverage: add PostGIS and MySQL
      ogrinfo: really honours -if (refs #8590)
      ogr2ogr: implement -if
      Doc: clarify that -if does not relax potential restrictions on file extensions (fixes #8590)
      NITF: in xml:DES metadata domain field, expand content of XML_DATA_CONTENT DES as XML in a <xml_content> sub-node of >field name=DESDATA> instead as a Base64 value
      CI: fix build-mac
      CI: fix build-mac (again)
      OGRWKBIntersectsPessimisticFixture: handle all geometry types and add tests
      test_ogr_wkb.cpp: test return value of createFromWkt() and OGRWKBGetBoundingBox() (CID 1530437)
      PG: avoid COPY_INSTEAD_OF_MOVE warning (CID 1530436)
      Arrow: avoid AUTO_CAUSES_COPY (CID 1530434, 1530435)
      FlatGeoBuf: avoid AUTO_CAUSES_COPY
      Shapefile driver: GetNextArrowArray(): add specialized implementation restricted to situations where only retrieving of FID values is asked
      GPKG: make GetExtent3D() honour filters when there are only 2D geometries
      CMake: simplify PROJ detection (refs https://github.com/OSGeo/gdal/issues/8942#issuecomment-1851319732)
      PG: serialize GDAL multidomain metadata of layer as XML in a ogr_system_tables.metadata table
      Python bindings: add a pyproject.toml with numpy as a build requirement (#8926)
      typo fixes [ci skip]
      Internal libtiff: resync
      VRTComplexSource: fix excessive RAM usage with many sources (fixes #8967, 3.8.0 regression)
      CPLGetPhysicalRAM(): fix getting right value when running inside Docker on a cgroups v1 system (like Amazon Linux 2) (fixes #8968)
      gdal_footprint: fix memleak (master only, CID 1531315)
      test_gdal.cpp: fix warning about dead code (CID 1531312, 1531313)
      Shape: GetNextArrowArray(): avoid potential nullptr deref in OOM situation (master only, CID 1531314)
      docker/alpine-normal/Dockerfile: fix arm64 build (master only)
      Doc: IWriteBlock()/IRasterIO(GF_Write): add comment about potential modification of provided buffer
      FileGDB/OpenFileGDB: fix co-operation between the 2 drivers to make sure .cdf is opened with FileGDB
      GTiff: add JXL_LOSSLESS_OVERVIEW, JXL_EFFORT_OVERVIEW, JXL_DISTANCE_OVERVIEW and JXL_ALPHA_DISTANCE_OVERVIEW configuration options (fixes #8973)
      GTiff overviews: generalize saving resampling method in a RESAMPLING metadata item
      gdaladdo: reuse previous resampling method (from GTiff RESAMPLING metadata item) if not specifying -r and overview levels if not specifying them
      Add autotest/slow_tests and a CI job to run them
      gpkg.rst: mention related tabl extensions in extension list
      CI: macosx: fix issue with lxml
      Advertize 3.8.2
      Shapelib: resync with upstream
      libtiff: resync with upstream
      about_no_title.rst: fix version number
      gdalbuildvrt: in -separate mode, only use ComplexSource if needed
      infback9: fix various build issues with clang 17
      autotest: updates to support libpng 1.6.40 and other library updates of fedora:rawhide
      WMS: change logic to set gdalwmscache directory to honor in particular XDG_CACHE_HOME (fixes #8987)
      FIT driver: some cleanup to reduce cppcheck confusion
      cppcheck related cleanups
      ODS: long name metadata: remove trailing space
      gdalinfo, ogrinfo, etc. --formats: append list of extensions (fixes #8958)
      Update .github/PULL_REQUEST_TEMPLATE.md [ci skip]
      Add specific documentation section about AWS IMDS (and fix typo)
      AWS S3: add explicit error message when IMDS fails and we know we are on EC2
      OGRArrowArrayHelper::SetBoolOn(): fix wrong bit shift computation (affects ogr2ogr from GPKG/FlatGeoBuf to something else) (fixes #8998)
      CoordinateTransformation::TransformBounds(): fix polar stereographic (including pole) to Web Mertactor (fixes #8996)
      utf8.h: disable dead code
      Avoid coverity scan warnings about copied values
      VSICurl and derived: replace most uses of CPLString with std::string
      utf8.h: remove dead code now removed upstream
      autotest/ogr/ogr_feature.py: fix dialect names
      DGN (v7) driver: emit explicit error when attempting to open a DGNv8 file and the DGNv8 driver is not available (fixes #9004)
      GitHub actions: limit permissions further
      HOWTO-RELEASE: add signing [ci skip]
      mkgdaldist.sh: make shellcheck happy [ci skip]
      README.md: add OpenSSF best practices badge
      CI Travis: try to remove get-pip
      ogr2ogr: do not use ArrowArray interface if -clipsrc, -clipdst, -gcp or -wrapdateline are specified (fixes #9013)
      GPKG: disable by default multi-threaded ArrowArray interface. Make it opt-in with the OGR_GPKG_NUM_THREADS config option
      GPKG: fix build with sqlite 3.36.x (fixes #9021)
      GPKG: fix multi-threaded ArrowArray interface and re-enable it by default
      Internal libjson: resync random_seed.c with upstream, and use getrandom() implementation when available (fixes #9024)
      jpegxl.py: make test pass with latest libjxl master
      GMLAS: use CPLHTTPFetch() instead of /vsicurl_streaming/ to allow alternate HTTP downloader
      GMLAS: faster retrieval of GML and ISO schemas by using zip archives
      ogr_gmlas.py: clean temporary files
      HDF5 multidim: fix crash on reading compound data type with fixed-length strings
      S102: add support for spatial metadata of the QualityOfSurvey group
      S102: read nodata value from /Group_F/BathymetryCoverage
      S102: check startSequence=0,0
      EEDA/EEDAI: use 'crsWkt' element
      gdalinfo: do not emit errors if corner coordinate reprojection fails
      Replace uses of #ifdef WIN32 with #ifdef _WIN32
      cpl_port.h: no longer defines WIN32
      HOWTO-RELEASE: update [ci skip]
      Doc: advertize v3.8.3
      Internal libjson: fix warning on Windows
      docker/README.md: advertize 3.8.3 [ci skip]
      OGRGeocode(): avoid using snprintf() with a formatting string coming from an environment variable (CodeQL cpp/tainted-format-string)
      CPLODBCSession::ConnectToMsAccess(): avoid using snprintf() with a formatting string coming from an environment variable (CodeQL cpp/tainted-format-string)
      port/: add explicit widening casts to avoid CodeQL cpp/integer-multiplication-cast-to-long
      SWIG: avoid potential multiplication overflows (CodeQL cpp/integer-multiplication-cast-to-long)
      Internal libjpeg: avoid CodeQL cpp/integer-multiplication-cast-to-long
      TIGER: avoid CodeQL cpp/integer-multiplication-cast-to-long
      Selafin: avoid CodeQL cpp/integer-multiplication-cast-to-long
      cpl_port.h: add cpl::fits_on<> function
      OpenFileGDB: avoid CodeQL cpp/integer-multiplication-cast-to-long
      NTF: fix CodeQL cpp/integer-multiplication-cast-to-long
      NGW: fix CodeQL cpp/integer-multiplication-cast-to-long
      MITAB: avoid CodeQL cpp/integer-multiplication-cast-to-long
      GPKG: avoid CodeQL cpp/integer-multiplication-cast-to-long
      AVC: avoid CodeQL cpp/integer-multiplication-cast-to-long
      OGRSimpleCurve::exportToWkt(): avoid CodeQL cpp/integer-multiplication-cast-to-long
      OGRWKBIntersectsRingSequencePessimistic(): avoid CodeQL cpp/integer-multiplication-cast-to-long
      RAWDataset: avoid CodeQL cpp/integer-multiplication-cast-to-long
      GDALComputeBandStats(): avoid potential loss of precision
      GDALDataset::RasterIOResampled(): avoid CodeQL cpp/integer-multiplication-cast-to-long
      gdalrasterband: avoid CodeQL cpp/integer-multiplication-cast-to-long
      GDALVirtualMem: avoid CodeQL cpp/integer-multiplication-cast-to-long
      gdalmultidim: avoid CodeQL cpp/integer-multiplication-cast-to-long
      gdalnodatavaluesmaskband.cpp: avoid CodeQL cpp/integer-multiplication-cast-to-long
      gdalnodatamaskband.cpp: avoid CodeQL cpp/integer-multiplication-cast-to-long
      gdalexif: avoid CodeQL cpp/integer-multiplication-cast-to-long
      gdalarraybandblockcache: avoid CodeQL cpp/integer-multiplication-cast-to-long
      infback9: avoid CodeQL cpp/integer-multiplication-cast-to-long
      XYZ: avoid CodeQL cpp/integer-multiplication-cast-to-long
      WMS: avoid CodeQL cpp/integer-multiplication-cast-to-long
      VRTDerivedRasterBand::IRasterIO(): fix potential multiplication overflow
      VRT: avoid CodeQL cpp/integer-multiplication-cast-to-long
      TSX: avoid CodeQL cpp/integer-multiplication-cast-to-long
      STACTA: avoid CodeQL cpp/integer-multiplication-cast-to-long
      TGA: avoid CodeQL cpp/integer-multiplication-cast-to-long
      SRTMHGT: avoid CodeQL cpp/integer-multiplication-cast-to-long
      SAFE: avoid CodeQL cpp/integer-multiplication-cast-to-long
      SDTS: avoid CodeQL cpp/integer-multiplication-cast-to-long
      RMF: avoid CodeQL cpp/integer-multiplication-cast-to-long
      RS2: avoid CodeQL cpp/integer-multiplication-cast-to-long
      RIK: avoid CodeQL cpp/integer-multiplication-cast-to-long
      ROI_PAC: avoid CodeQL cpp/integer-multiplication-cast-to-long
      NTv2: avoid CodeQL cpp/integer-multiplication-cast-to-long
      PAux: avoid CodeQL cpp/integer-multiplication-cast-to-long
      LCP: avoid CodeQL cpp/integer-multiplication-cast-to-long
      MFF: avoid CodeQL cpp/integer-multiplication-cast-to-long
      ISCE: avoid CodeQL cpp/integer-multiplication-cast-to-long
      BT: avoid CodeQL cpp/integer-multiplication-cast-to-long
      R: avoid CodeQL cpp/integer-multiplication-cast-to-long
      Rasterlite: avoid CodeQL cpp/integer-multiplication-cast-to-long
      PostGISRaster: fix potential multiplication overflow
      PNG: avoid CodeQL cpp/integer-multiplication-cast-to-long
      PLMosaic: avoid CodeQL cpp/integer-multiplication-cast-to-long
      PDS4: avoid CodeQL cpp/integer-multiplication-cast-to-long
      ISIS3: avoid CodeQL cpp/integer-multiplication-cast-to-long
      PCIDSK: avoid CodeQL cpp/integer-multiplication-cast-to-long
      NITF: avoid CodeQL cpp/integer-multiplication-cast-to-long
      JPEG: avoid CodeQL cpp/integer-multiplication-cast-to-long
      MEM: avoid CodeQL cpp/integer-multiplication-cast-to-long
      GTiff: avoid CodeQL cpp/integer-multiplication-cast-to-long
      GRIB: avoid CodeQL cpp/integer-multiplication-cast-to-long
      ENVISAT: avoid CodeQL cpp/integer-multiplication-cast-to-long
      AIG: avoid CodeQL cpp/integer-multiplication-cast-to-long
      gdalenhance: avoid CodeQL cpp/integer-multiplication-cast-to-long
      Northwood: avoid CodeQL cpp/comparison-with-wider-type
      IRIS: avoid CodeQL cpp/comparison-with-wider-type
      EXR: avoid CodeQL cpp/comparison-with-wider-type
      testblockcache: avoid CodeQL cpp/comparison-with-wider-type
      PDF: avoid CodeQL cpp/comparison-with-wider-type
      GIF: avoid CodeQL cpp/comparison-with-wider-type
      MSGN: avoid CodeQL cpp/comparison-with-wider-type
      MRF: avoid CodeQL cpp/comparison-with-wider-type
      KMLSuperOverlay: avoid CodeQL cpp/comparison-with-wider-type
      L1B: avoid CodeQL cpp/comparison-with-wider-type
      ILWIS: avoid CodeQL cpp/comparison-with-wider-type
      IDRISI: avoid CodeQL cpp/comparison-with-wider-type
      HFA: avoid CodeQL cpp/comparison-with-wider-type
      HF2: avoid CodeQL cpp/comparison-with-wider-type
      libgeotiff: avoid CodeQL cpp/comparison-with-wider-type
      GSBG: avoid CodeQL cpp/comparison-with-wider-type
      GRIB: avoid false-positive CodeQL cpp/new-free-mismatch
      FIT: avoid CodeQL cpp/comparison-with-wider-type
      ERS: avoid CodeQL cpp/comparison-with-wider-type
      EEDA: avoid CodeQL cpp/comparison-with-wider-type
      DAAS: avoid CodeQL cpp/comparison-with-wider-type
      DTED: avoid CodeQL cpp/comparison-with-wider-type
      CTG: avoid CodeQL cpp/comparison-with-wider-type
      COSAR: avoid CodeQL cpp/comparison-with-wider-type
      CEOS2: avoid CodeQL cpp/comparison-with-wider-type
      BMP: avoid CodeQL cpp/comparison-with-wider-type
      BLX: avoid CodeQL cpp/comparison-with-wider-type
      AAIGRID: avoid CodeQL cpp/comparison-with-wider-type
      testvirtualmem: avoid CodeQL cpp/comparison-with-wider-type
      test_gdal: avoid CodeQL cpp/comparison-with-wider-type
      nearblack: avoid CodeQL cpp/comparison-with-wider-type
      gdaldem: avoid CodeQL cpp/comparison-with-wider-type
      gdalwarpoperation: avoid CodeQL cpp/comparison-with-wider-type
      gdalpansharpen: avoid CodeQL cpp/comparison-with-wider-type
      gdalproximity: avoid CodeQL cpp/comparison-with-wider-type
      gdalmediancut: avoid CodeQL cpp/comparison-with-wider-type
      gdallinearsystem: avoid CodeQL cpp/comparison-with-wider-type
      gdaldither: avoid CodeQL cpp/comparison-with-wider-type
      gdal_simplesurf: avoid CodeQL cpp/comparison-with-wider-type
      gdal_rpc: avoid CodeQL cpp/comparison-with-wider-type
      gdal_crs: avoid CodeQL cpp/comparison-with-wider-type
      CPLRecodeToWCharIconv(): avoid CodeQL cpp/incorrect-string-type-conversion
      gdaljp2structure.cpp: fix CodeQL cpp/comparison-with-wider-type
      GPKG: fix CodeQL cpp/sql-injection
      GML: fix potential cpp/external-entity-expansion CodeSQL issue
      GMLAS: fix potential cpp/external-entity-expansion CodeSQL issue
      ILI: fix potential cpp/external-entity-expansion CodeSQL issue
      NAS: fix potential cpp/external-entity-expansion CodeSQL issue
      WEBP: avoid CodeQL cpp/integer-multiplication-cast-to-long
      PDF: avoid CodeQL cpp/integer-multiplication-cast-to-long
      netCDF: avoid CodeQL cpp/integer-multiplication-cast-to-long
      BAG: avoid CodeQL cpp/integer-multiplication-cast-to-long
      HDF5: avoid CodeQL cpp/integer-multiplication-cast-to-long
      g2clib: avoid CodeQL cpp/integer-multiplication-cast-to-long
      autotest: make it compatible with current numpy 2.0dev
      test_gdal.cpp: test GDALWarpApp()/GDALTranslate()/GDALBuildVRT() and GDALReleaseDataset()
      Doc of GDALWarpApp()/GDALTranslate()/GDALBuildVRT(): better document ownership
      Create codeql.yml
      CSV: do not quote numeric fields even if STRING_QUOTING=ALWAYS (3.8.1 regression) (fixes https://github.com/qgis/QGIS/issues/55808)
      Fix querying of GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE
      Improve error message when a dataset could be opened by a plugin, but we can't load it
      fuzzers/build.sh: fix curl build
      Python bindings: implement __arrow_c_stream__() interface for ogr.Layer
      Python bindings: add a ogr.Layer.GetArrowArrayStreamInterface() method
      Add GDALGetOutputDriversForDatasetName()
      Restore use of gmtime_r and localtime_r; extend to ctime_r; use Windows variants too
      netCDF: use VSILocalTime()
      Internal libopencad: use localtime_r() or localtime_s() when possible
      PCIDSK SDK: use ctime_r() or ctime_s() when possible
      Remove port/cpl_config* files no longer used since the switch to CMake
      degrib: use gmtime_r() or gmtime_s() when possible
      Add S104 (Water Level Information for Surface Navigation Product) and S111 (Surface Currents Product) raster read-only drivers
      Modify the logic of selection of overviews for non-nearest resampling; add a GDAL_OVERVIEW_OVERSAMPLING_THRESHOLD config option (#9040)
      warper: fix artifacts when reprojecting from long/lat to ortho (fixes #9056)
      GDALSuggestedWarpOutput2(): ortho->long/lat: limit extent to [lon_0-90,lon_0+90] even when poles are included
      Warper: limit artifacts when doing ortho->long/lat (provided that srcNodata is set)
      README.md: add OpenSSF Scorecard badge [ci skip]
      CI: pin actions by sha
      No longer alias CPLMutex, CPLCond and CPLJoinableThread to void in non-DEBUG builds
      Sentinel2 doc: adjust description of content of L2A subdatasets (fixes #9066)
      Sentinel2: include 10m AOT and WVP bands in 10m subdataset (refs #9066)
      Refresh CITATION and CITATION.cff [ci skip]
      OGR2SQLITE_Setup(): robustify against potential crashing scenario
      OGRCoordinateTransformation transform methods: more accurate description of return value (fixes #9069)
      gdal.cmake: set -DDEBUG for CMAKE_BUILD_TYPE=Debug for Windows builds as well
      OGRCoordinateTransformation::Transform(): change nCount parameter to size_t (C++ API only for now) (fixes #9074)
      multidim API: fix wrong DataAxisToSRSAxisMapping
      VSICurlFilesystemHandlerBase::ReadDirInternal(): avoid false positive Coverity warning about use after free
      Internal libjson: silence 'toctou'
      Avoid/fix Coverity performance warnings
      OGRProjCT::TransformWithErrorCodes(): Improve performance of axis swapping (inspired by @SunBlack proposal) (fixes #9073)
      Test effect of SetDataAxisToSRSAxisMapping([1,2,-3])
      OGRSpatialReference::SetDataAxisToSRSAxisMapping(): improve doc (fixes #9071) (#9072)
      gdalwarp: do not enable blank line detection when -tap and -te are specified (fixes #9059)
      Doc: stactit.rst: mention behavior with overlapping items
      OSR_CT: fix SetDataAxisToSRSAxisMapping([-2, 1]) on target SRS
      WMS: fix nullptr dereference on invalid document (fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=65772)
      Add .github/workflows/scorecard.yml
      Avoid/fix Coverity performance warnings
      Driver manager: avoid warning about 'DMD_PLUGIN_INSTALLATION_MESSAGE whereas its real driver doesn't declare it or with a different value'
      OGRGeometryFactory::forceTo(): make it honour dimensionality of eTargetType (in particular fix POLYGON -> LINESTRING or POLYGON -> LINESTRINGZ) (fixes #9080)
      CPLReplacePointByLocalePoint(): use regular code path for Android API >= 20
      port/CMakeLists.txt: remove unneeded SKIP_UNITY_BUILD_INCLUSION=ON
      Internal libtiff: resync with upstream (_WIN32 related changes)
      Internal shapelib: resync with upstream (_WIN32 related changes)
      .github/workflows/cmake_builds.yml: pin dependency by sha1sum
      CMake: make it ready for GDAL_DATA being filled by each driver
      Move data/vicar.json to frmts/pds/data
      Move data/vdv452.xml and xsd to ogr/ogrsf_frmts/vdv/data
      Move data/*.dxf to ogr/ogrsf_frmts/dxf/data
      Move data/grib2_* to frmts/grib/data
      Move GML data files to ogr/ogrsf_frmts/gml/data
      Move GMLAS data files to ogr/ogrsf_frmts/gmlas/data
      Move S57 data files to ogr/ogrsf_frmts/s57/data
      Move DGN data files to ogr/ogrsf_frmts/dgn/data
      Move OSM data files to ogr/ogrsf_frmts/osm/data
      Move HDF5 data files to frmts/hdf5/data
      Mode PDS4 data file to frmts/pds/data
      Move NITF data files to frmts/nitf/data
      Move netCDF data files to frmts/netcdf/data
      Move PLScenes data files to ogr/ogrsf_frmts/plscenes/data
      Move EEDA data files to frmts/eeda/data
      Move PDF data files to frmts/pdf/data
      Move SXF data files to ogr/ogrsf_frmts/sxf/data
      Move gdalinfo, gdalmdiminfo, ogrinfo output.schema.json to apps/data
      Move data/gdalvrt.xsd to frmts/vrt/data
      Move data/ogrvrt.xsd to ogr/ogrsf_frmts/vrt/data
      Move data/gt_datum.csv and data/gt_ellips.csv to frmts/nitf/data
      Move cubewerx_extra.wkt, ecw_cs.wkt, epsg.wkt, esri_StatePlane_extra.wkt, ozi_*.csv, pci_*.csv, sateplace.csv to ogr/data/
      Move data/template_tiles.mapml to swig/python/data/
      Move data/tms_*.json files to gcore/data
      typo fixes [ci skip]
      OGRParquetDriverOpen(): tune with directory
      OGRGPSBabelDriverIdentifyInternal(): tune
      ogr2ogr: do not copy private layers (would for example break SQLite -> SQLite/GPKG)
      Address cppcheck warnings constVariableReference/constParameterReference
      Avoid false positive warning about accessing moved variable
      GDALBandGetBestOverviewLevel2(): add nullptr check
      GDALMDArray::AsClassicDataset(): make it possible to use overviews
      coordinate_epoch.rst: remove outdated comment
      ogr_gmlas.py: skip test_ogr_gmlas_get_gml_and_iso_schemas() test if https://schemas.opengis.net is down
      ExecuteSQL(dialect=SQLite): support 'SELECT\n' for example (fixes #9093)
      Fix calls to isspace() to make sure argument is unsigned, otherwise unspecified behavior
      Fix calls to isdigit() to make sure argument is unsigned, otherwise unspecified behavior
      Fix calls to isalnum() to make sure argument is unsigned, otherwise unspecified behavior
      Fix calls to isalpha() to make sure argument is unsigned, otherwise unspecified behavior
      Fix calls to islower() to make sure argument is unsigned, otherwise unspecified behavior
      Fix calls to isupper() to make sure argument is unsigned, otherwise unspecified behavior
      Fix calls to tolower() and toupper() to make sure argument is unsigned, otherwise unspecified behavior
      CI: avoid hardcoding -j3
      CI fedora_rawhide: explicitly install python3-setuptools
      TileMatrixSet::parse(): increase maximum zoom level for InspireCRS84Quad to 29
      GPKG: support maximum level up to 29 or 30; add a ZOOM_LEVEL creation option
      GDALBandGetBestOverviewLevel2(): avoid numerical instability with GDAL_OVERVIEW_OVERSAMPLING_THRESHOLD = 1.0
      gdal.cmake: add comment
      [Lint] netCDFIdentifyFormat(): reduce number of magic values
      S102: read NoData value for QualityOfSurvey from /Group_F/QualityOfSurvey
      gdal2tiles.py: add debug message when UnsupportedTileMatrixSet
      FindECW.cmake: make it work for Windows 32-bit builds (fixes #9106)
      FindSQLite3.cmake: improve detection of static libsqlite3.a (fixes #9096)
      Arrow/Parquet: add (minimum) support for libarrow 15.0
      OGRArrowLayer::MapArrowTypeToOGR(): make the code robust to potentially new entries in the arrow::Type enumeration
      PDF: correctly initialize PAM when opening a subdataset (specific page for example)
      GMLAS: recognize GeometricPrimitivePropertyType
      wms.py: set timeout on one test resource
      Internal shapelib: remove CPL_UNUSED
      Add OGRSpatialReference::exportToCF1() and importFromCF1(), and make netCDF driver use them
      SWIG: add osr.SpatialReference.ImportFromCF1(), ExportToCF1(), ExportToCF1Units()
      gdalmdimtranslate: add -arrayoptions
      Zarr: be able to read CRS from CF1 conventions
      OGRSpatialReference::importFromCF1(): make it work with spatial_ref and crs_wkt attributes
      Add raster VRTTI (Virtual Raster Tile Index) driver
      Add documentation for VRTTI driver
      gdaladdo: make --partial-refresh-from-source-timestamp work on VRTTI datasets
      Make gdaltindex a C callable function: GDALTileIndex()
      gdaltindex: add -overwrite, -vrtti_filename, -tr, -te, -ot, -bandcount, -nodata, -colorinterp, -mask, -mo options
      gdaltindex: add -recursive, -filename_filter, -min_pixel_size, -max_pixel_size, -fetch_md
      Add a slow test for VRTTI
      VRTTI: also support setting the metadata as a XML attached to the xml:VRTTI metadata domain of a vector layer
      Rename VRTTI driver to GTI
      GTI: take into account comments of code review
      TileDB: be able to read datasets converted with 'tiledb-cf netcdf-convert'
      GTI / GPKG: make them both be able to handle .gti.gpkg files
      GDALOverviewDataset: avoid setting SetEnableOverviews(false) during lifetime of object. Just do it transiently
      VRTPansharpenedRasterBand::GetOverviewCount(): robustify against potential failure of GDALCreateOverviewDataset()
      LIBKML: fix crash on a gx:Track without when subelements (fixes qgis/qgis#55963)
      gti.rst: formatting fix
      Python bindings: add a ogr.Layer.WriteArrow() method consuming __arrow_c_stream__ or __arrow_c_array__ interfaces
      GDALPamRasterBand::XMLInit(): hopefully avoid false-positive 'Potential use after free' from https://github.com/OSGeo/gdal/security/code-scanning/458
      cpl_userfaultfd.cpp: check sscanf() return value (fixes https://github.com/OSGeo/gdal/security/code-scanning/466)
      CPLAtof()/CPLStrtod(): recognize again INF and -INF
      GDALDeserializeGCPListFromXML(): validate value of GCP Pixel,Line,X,Y,Z attributes
      Python bindings: ogr.Layer.WriteArrow(): also accept requested_schema implementing __arrow_c_schema__
      GPKG: fixes to make most operations compatible with PRAGMA foreign_keys=1 (fixes #9135)
      OGRGeometryFactory::forceToMultiLineString(): hopefully fix false-positive CodeQL potential-double-free (https://github.com/OSGeo/gdal/security/code-scanning/450)
      OGRGeometryFactory::forceToMultiLineString(): hopefully fix false-positive CodeQL potential-double-free (https://github.com/OSGeo/gdal/security/code-scanning/449)
      GDALPamDataset::XMLInit(): hopefully fix false-positive CodeQL potential-double-free (https://github.com/OSGeo/gdal/security/code-scanning/459)
      OGRLayer::FilterGeometry(): make it accept a 'const OGRGeometry*'
      VFK: hopefully fix false-positive CodeQL potential-double-free (https://github.com/OSGeo/gdal/security/code-scanning/485, 484, etc. down to 467)
      MITAB: hopefully fix likely false-positive CodeQL potential-double-free (https://github.com/OSGeo/gdal/security/code-scanning/465)
      OZI: hopefully fix likely false-positive CodeQL potential-double-free (https://github.com/OSGeo/gdal/security/code-scanning/460)
      GTI: fix cpp/integer-multiplication-cast-to-long (https://github.com/OSGeo/gdal/security/code-scanning/448)
      sozip: fix potential (small) leak of papszArgv in error code paths
      OGRGeometryFactory::transformWithOptions(): hopefully fix false-positive CodeQL potential-double-free (https://github.com/OSGeo/gdal/security/code-scanning/454)
      Change GDALRasterBand::poMask to be a GDALRasterBandOwnedOrNot instance, and remove GDALRasterBand::bOwnMask, to hopefully fix false-positive CodeQL potential-double-free (https://github.com/OSGeo/gdal/security/code-scanning/453)
      docker/alpine-small/Dockerfile: remove removal of unused resource files [ci skip]
      GDALDataset::ReportErrorV() and GDALRasterBand::ReportError(): avoid formatting string to be 'tainted' by dataset name (https://github.com/OSGeo/gdal/security/code-scanning/522)
      ogr2ogr: Arrow code path: take into account -limit parameter for MAX_FEATURES_IN_BATCH
      OGRGeometryFactory::forceTo(): fix nullptr dereference in error code path (master only, fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=66177)
      fix previous commit
      gdalwarp: emit explicit error message when transformation isn't inversible (fixes #9149)
      Win32 extended filenames (starting with "\\?\"): various fixes; add support for network UNC paths
      autotest: fix warning 'PytestRemovedIn9Warning: Marks applied to fixtures have no effect'
      gdaltindex: fix potential memory leak (CID 1533976)
      GTIFMemBufFromSRS: fix potential nullptr deref (CID 1533975)
      MySQL: fix/workaround server-side spatial filtering when SRS is geographic with MySQL >= 8 (fixes qgis/QGIS#55463)
      GPKG creation: set Z/M columns of gpkg_geometry_columns when there are Z/M geometries in a 2D declared layer
      VRT: add a NoDataFromMaskSource source
      NoDataFromMaskSource: add RemappedValue
      NoDataFromMaskSource: rename option to -nodata_max_mask_threshold
      GPKG: hopefully unbreak VS2017 builds
      Doc: OpenFileGDB: document OPENFILEGDB_DEFAULT_STRING_WIDTH configuration option (fixes #9165)
      BMP: fix reading images larger than 4GB
      typo fixes in code comments [ci skip]
      Java bindings: bump minimum version to Java 8
      CI: try macOS-14 for M1 MacOS runner
      CI: disable ODBC for Mac for test_cmake.sh
      Shape: make it recognize /vsizip/foo.shp.zip directories
      TileDB: make its identify() method more restrictive
      PDS: fix compilation with Emscripten version 3.1.7
      Python bindings: remove run of 'python -m lib2to3' that is a no-op, given that lib2to3 is removed in python 3.13 (fixes #9173)
      [Lint] OpenFileGDB: rename constant to DEFAULT_STRING_WIDTH and add extensive comments
      OGRGeometryFactory::createGeometry(): do not assert on wkbUnkown input
      OGRGeometryFactory::forceTo(): fix assertion with empty geometry and target type = unknown
      docker/ubuntu-full/Dockerfile: update to Arrow 15.0.0 (fixes #9183) [ci skip]
      CSV: parse header with line breaks (fixes #9172)
      bmp_read.py: fix wrong driver name
      /vsisparse/: fix Stat() on files larger than 4 GB on 32-bit builds
      PG: be robust to inexact case for schema when creating a layer 'schema_name.layer_name' (fixes #9125)
      docker/ubuntu-full/Dockerfile: disable AVX2 when building TileDB [ci skip]
      CI: add build time testing of OCI driver
      gdalwarp_lib.cpp: do floating point division (CID 1534303)
      PG: fix memleak in error code path (master only, CID 1534302)
      TileDB: fix performance warning (CID 1534301)
      exportToCF1(): make it obvious that we don't out-of-bound access param.doubles[] (CID 1534300)
      PG: fix performance warning (CID 1534299)
      HFA: make sure HFADataset::hHFA member is initialized (CID 1073932)
      Rasterlite: avoid false positive Coverity warning about nullptr deref (CID 1214415)
      LIBKML: avoid false positive Coverity warning about nullptr deref (CID 1214419)
      OSM: avoid COPY_INSTEAD_OF_MOVE (CID 1525192)
      LIBKML: avoid COPY_INSTEAD_OF_MOVE (CID 1525205)
      PDF: avoid COPY_INSTEAD_OF_MOVE (CID 1525231)
      WMS: avoid COPY_INSTEAD_OF_MOVE (CID 1525239)
      arrow_common: avoid COPY_INSTEAD_OF_MOVE (CID 1525324)
      HFA: avoid COPY_INSTEAD_OF_MOVE (CID 1525492)
      docker/ubuntu-full/bh-gdal.sh: build drivers with external dependencies as plugins (GDAL_ENABLE_PLUGINS=ON) [ci skip]
      docker/ubuntu-full/bh-gdal.sh: strip symbols from plugins [ci skip]
      CI: revert to previous method to add ppa:ubuntugis/ubuntugis-unstable
      Add VSIGetDirectorySeparator() to return the directory separator for the specified path
      CPLFormFilename(), CPLProjectRelativeFilename(), VSIReadDirRecursive(), NextDirEntry(): useVSIGetDirectorySeparator()
      /vsis3 Sync(): use VSIGetDirectorySeparator(),
      [Internal shapelib] Resync with upstream
      GeoJSONSeq: add missing feature defn sealing
      Zarr: avoid potential infinite…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants