From d1c21100b852630073f5aca32b0199c15d9eff95 Mon Sep 17 00:00:00 2001
From: Johan Mabille <johan.mabille@gmail.com>
Date: Fri, 11 Apr 2025 10:01:08 +0200
Subject: [PATCH 1/8] Upgraded CI compilers (#319)

---
 .github/workflows/linux.yml                   | 58 ++++++++-----------
 .github/workflows/osx.yml                     |  5 +-
 CMakeLists.txt                                | 20 +++----
 cmake/FindNumPy.cmake                         |  4 +-
 docs/source/examples/copy_cast/CMakeLists.txt |  2 +-
 .../examples/readme_example_1/CMakeLists.txt  |  2 +-
 docs/source/examples/sfinae/CMakeLists.txt    |  2 +-
 environment-dev.yml                           |  1 +
 test/CMakeLists.txt                           |  2 +-
 test/copyGTest.cmake.in                       |  2 +-
 test/downloadGTest.cmake.in                   |  4 +-
 11 files changed, 48 insertions(+), 54 deletions(-)

diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index 0c8e40e..ea4dee7 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -12,50 +12,42 @@ defaults:
     shell: bash -e -l {0}
 jobs:
   build:
-    runs-on: ubuntu-latest
+    runs-on: ubuntu-24.04
     name: ${{ matrix.sys.compiler }} ${{ matrix.sys.version }}
     strategy:
       fail-fast: false
       matrix:
         sys:
-        - {compiler: gcc, version: '9'}
-        - {compiler: gcc, version: '10'}
         - {compiler: gcc, version: '11'}
         - {compiler: gcc, version: '12'}
-        - {compiler: clang, version: '15'}
-        - {compiler: clang, version: '16'}
+        - {compiler: gcc, version: '13'}
+        - {compiler: gcc, version: '14'}
+        - {compiler: clang, version: '17'}
+        - {compiler: clang, version: '18'}
+        - {compiler: clang, version: '19'}
+        - {compiler: clang, version: '20'}
 
     steps:
+    - name: Install GCC
+      if: matrix.sys.compiler == 'gcc'
+      uses: egor-tensin/setup-gcc@v1
+      with:
+        version: ${{matrix.sys.version}}
+        platform: x64
 
-    - name: Setup GCC
-      if: ${{ matrix.sys.compiler == 'gcc' }}
-      run: |
-        GCC_VERSION=${{ matrix.sys.version }}
-        sudo apt-get update
-        sudo apt-get --no-install-suggests --no-install-recommends install g++-$GCC_VERSION
-        CC=gcc-$GCC_VERSION
-        echo "CC=$CC" >> $GITHUB_ENV
-        CXX=g++-$GCC_VERSION
-        echo "CXX=$CXX" >> $GITHUB_ENV
-
-    - name: Setup clang
-      if: ${{ matrix.sys.compiler == 'clang' }}
+    - name: Install LLVM and Clang
+      if: matrix.sys.compiler == 'clang'
       run: |
-        LLVM_VERSION=${{ matrix.sys.version }}
-        wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - || exit 1
-        if [[ $LLVM_VERSION -ge 13 ]]; then
-          sudo add-apt-repository "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-$LLVM_VERSION main" || exit 1
-        else
-          sudo add-apt-repository "deb http://apt.llvm.org/focal/ llvm-toolchain-focal main" || exit 1
-        fi || exit 1
-        sudo apt-get update || exit 1
-        sudo apt-get --no-install-suggests --no-install-recommends install clang-$LLVM_VERSION || exit 1
-        sudo apt-get --no-install-suggests --no-install-recommends install g++-9 g++-9-multilib || exit 1
-        sudo ln -s /usr/include/asm-generic /usr/include/asm
-        CC=clang-$LLVM_VERSION
-        echo "CC=$CC" >> $GITHUB_ENV
-        CXX=clang++-$LLVM_VERSION
-        echo "CXX=$CXX" >> $GITHUB_ENV
+        wget https://apt.llvm.org/llvm.sh
+        chmod +x llvm.sh
+        sudo ./llvm.sh ${{matrix.sys.version}}
+        sudo apt-get install -y clang-tools-${{matrix.sys.version}}
+        sudo update-alternatives --install /usr/bin/clang++                 clang++                     /usr/bin/clang++-${{matrix.sys.version}} 200
+        sudo update-alternatives --install /usr/bin/clang                       clang                         /usr/bin/clang-${{matrix.sys.version}} 200
+        sudo update-alternatives --install /usr/bin/clang-scan-deps   clang-scan-deps     /usr/bin/clang-scan-deps-${{matrix.sys.version}} 200
+        sudo update-alternatives --set clang /usr/bin/clang-${{matrix.sys.version}}
+        sudo update-alternatives --set clang++ /usr/bin/clang++-${{matrix.sys.version}}
+        sudo update-alternatives --set clang-scan-deps /usr/bin/clang-scan-deps-${{matrix.sys.version}}
 
     - name: Checkout code
       uses: actions/checkout@v3
diff --git a/.github/workflows/osx.yml b/.github/workflows/osx.yml
index 073c018..118d4fd 100644
--- a/.github/workflows/osx.yml
+++ b/.github/workflows/osx.yml
@@ -18,8 +18,9 @@ jobs:
       fail-fast: false
       matrix:
         os:
-        - 11
-        - 12
+        - 13
+        - 14
+        - 15
 
     steps:
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b17b005..bcf8df5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,7 @@
 # The full license is in the file LICENSE, distributed with this software. #
 ############################################################################
 
-cmake_minimum_required(VERSION 3.14)
+cmake_minimum_required(VERSION 3.29)
 project(xtensor-python)
 
 set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
@@ -46,19 +46,19 @@ else()
     message(STATUS "Found xtensor: ${xtensor_INCLUDE_DIRS}/xtensor")
 endif()
 
-# Running find_package(PythonInterp) to retrieve the Python version
-# which is not exported by Pybind11's cmake.
-# Cf. https://github.com/pybind/pybind11/issues/2268
-find_package(PythonInterp ${PythonLibsNew_FIND_VERSION} REQUIRED)
+find_package(Python COMPONENTS Interpreter REQUIRED)
 
 set(pybind11_REQUIRED_VERSION 2.6.1)
-if(TARGET pybind11 OR TARGET pybind11::headers)
-    # pybind11 has a variable that indicates its version already, so use that
-    message(STATUS "Found pybind11 v${pybind11_VERSION}")
-else()
+if (NOT TARGET pybind11::headers)
+    # Defaults to ON for cmake >= 3.18
+    # https://github.com/pybind/pybind11/blob/35ff42b56e9d34d9a944266eb25f2c899dbdfed7/CMakeLists.txt#L96
+    set(PYBIND11_FINDPYTHON OFF)
     find_package(pybind11 ${pybind11_REQUIRED_VERSION} REQUIRED)
     message(STATUS "Found pybind11: ${pybind11_INCLUDE_DIRS}/pybind11")
-endif()
+else ()
+    # pybind11 has a variable that indicates its version already, so use that
+    message(STATUS "Found pybind11 v${pybind11_VERSION}")
+endif ()
 
 # Look for NumPy headers, except if NUMPY_INCLUDE_DIRS is passed,
 # which is required under some circumstances (such as wasm, where
diff --git a/cmake/FindNumPy.cmake b/cmake/FindNumPy.cmake
index f043566..24f3c32 100644
--- a/cmake/FindNumPy.cmake
+++ b/cmake/FindNumPy.cmake
@@ -40,9 +40,9 @@
 
 # Finding NumPy involves calling the Python interpreter
 if(NumPy_FIND_REQUIRED)
-    find_package(PythonInterp REQUIRED)
+    find_package(Python COMPONENTS Interpreter REQUIRED)
 else()
-    find_package(PythonInterp)
+    find_package(Python COMPONENTS Interpreter)
 endif()
 
 if(NOT PYTHONINTERP_FOUND)
diff --git a/docs/source/examples/copy_cast/CMakeLists.txt b/docs/source/examples/copy_cast/CMakeLists.txt
index e17611c..d8daf2a 100644
--- a/docs/source/examples/copy_cast/CMakeLists.txt
+++ b/docs/source/examples/copy_cast/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.1..3.19)
+cmake_minimum_required(VERSION 3.29)
 
 project(mymodule)
 
diff --git a/docs/source/examples/readme_example_1/CMakeLists.txt b/docs/source/examples/readme_example_1/CMakeLists.txt
index 9c7ed5f..8831bca 100644
--- a/docs/source/examples/readme_example_1/CMakeLists.txt
+++ b/docs/source/examples/readme_example_1/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.18..3.20)
+cmake_minimum_required(VERSION 3.29)
 
 project(mymodule)
 
diff --git a/docs/source/examples/sfinae/CMakeLists.txt b/docs/source/examples/sfinae/CMakeLists.txt
index 10a1a96..1fb8477 100644
--- a/docs/source/examples/sfinae/CMakeLists.txt
+++ b/docs/source/examples/sfinae/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.18..3.20)
+cmake_minimum_required(VERSION 3.29)
 
 project(mymodule)
 
diff --git a/environment-dev.yml b/environment-dev.yml
index 1c2bd8b..f203855 100644
--- a/environment-dev.yml
+++ b/environment-dev.yml
@@ -10,5 +10,6 @@ dependencies:
   - numpy>=2.0
   - pybind11>=2.12.0,<3
   # Test dependencies
+  - setuptools
   - pytest
 
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 0c77b0d..aaaf339 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -7,7 +7,7 @@
 # The full license is in the file LICENSE, distributed with this software. #
 ############################################################################
 
-cmake_minimum_required(VERSION 3.1)
+cmake_minimum_required(VERSION 3.29)
 
 if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
     project(xtensor-python-test)
diff --git a/test/copyGTest.cmake.in b/test/copyGTest.cmake.in
index 8341a74..50821d0 100644
--- a/test/copyGTest.cmake.in
+++ b/test/copyGTest.cmake.in
@@ -7,7 +7,7 @@
 # The full license is in the file LICENSE, distributed with this software. #
 ############################################################################
 
-cmake_minimum_required(VERSION 2.8.2)
+cmake_minimum_required(VERSION 3.29)
 
 project(googletest-download NONE)
 
diff --git a/test/downloadGTest.cmake.in b/test/downloadGTest.cmake.in
index 2d5cc5b..6bb5fad 100644
--- a/test/downloadGTest.cmake.in
+++ b/test/downloadGTest.cmake.in
@@ -7,14 +7,14 @@
 # The full license is in the file LICENSE, distributed with this software. #
 ############################################################################
 
-cmake_minimum_required(VERSION 2.8.2)
+cmake_minimum_required(VERSION 3.29)
 
 project(googletest-download NONE)
 
 include(ExternalProject)
 ExternalProject_Add(googletest
     GIT_REPOSITORY    https://github.com/google/googletest.git
-    GIT_TAG           release-1.10.0
+    GIT_TAG           v1.16.0
     SOURCE_DIR        "${CMAKE_CURRENT_BINARY_DIR}/googletest-src"
     BINARY_DIR        "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
     CONFIGURE_COMMAND ""

From 1c85ed85bc90df60608a51fdc66bcf7b097aa84b Mon Sep 17 00:00:00 2001
From: Johan Mabille <johan.mabille@gmail.com>
Date: Fri, 11 Apr 2025 10:43:52 +0200
Subject: [PATCH 2/8] Fixed RTD build (#320)

---
 readthedocs.yml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/readthedocs.yml b/readthedocs.yml
index 38f414b..a8188c4 100644
--- a/readthedocs.yml
+++ b/readthedocs.yml
@@ -5,5 +5,9 @@ build:
   tools:
     python: "mambaforge-22.9"
 
+sphinx:
+  # Path to Sphinx configuration file
+  configuration: docs/source/conf.py
+
 conda:
   environment: docs/environment.yml

From f555d123c06e0e51bbf7335104750b55818beedc Mon Sep 17 00:00:00 2001
From: Daniel Jacobs <44678615+danielcjacobs@users.noreply.github.com>
Date: Mon, 14 Apr 2025 04:14:38 -0400
Subject: [PATCH 3/8] update xtensor includes (#317)

Brings xtensor-python up to date with latest xtensor release (0.26.0),
where https://github.com/xtensor-stack/xtensor/pull/2829 reorganized the
include directory.

---------

Co-authored-by: Daniel Jacobs <daniel.jacobs@is4s.com>
Co-authored-by: Johan Mabille <johan.mabille@gmail.com>
---
 CMakeLists.txt                                 |  4 ++--
 README.md                                      |  2 +-
 benchmark/main.cpp                             |  4 ++--
 docs/source/basic_usage.rst                    |  2 +-
 docs/source/examples/sfinae/main.cpp           |  2 +-
 docs/source/examples/sfinae/mymodule.hpp       |  2 +-
 environment-dev.yml                            |  2 +-
 include/xtensor-python/pyarray.hpp             |  6 +++---
 include/xtensor-python/pycontainer.hpp         |  2 +-
 include/xtensor-python/pytensor.hpp            |  8 ++++----
 include/xtensor-python/pyvectorize.hpp         |  2 +-
 .../xtensor_type_caster_base.hpp               |  4 ++--
 test/CMakeLists.txt                            | 11 +----------
 test/test_common.hpp                           |  4 ++--
 test/test_pyarray.cpp                          |  4 ++--
 test/test_pytensor.cpp                         | 18 +++++++++---------
 test/test_sfinae.cpp                           |  4 ++--
 test_python/main.cpp                           | 12 ++++++------
 test_python/setup.py                           | 11 ++++++-----
 19 files changed, 48 insertions(+), 56 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index bcf8df5..3fe3f34 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,14 +25,14 @@ foreach(ver ${xtensor_python_version_defines})
         set(XTENSOR_PYTHON_VERSION_${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE INTERNAL "")
     endif()
 endforeach()
-set(${PROJECT_NAME}_VERSION 
+set(${PROJECT_NAME}_VERSION
     ${XTENSOR_PYTHON_VERSION_MAJOR}.${XTENSOR_PYTHON_VERSION_MINOR}.${XTENSOR_PYTHON_VERSION_PATCH})
 message(STATUS "xtensor-python v${${PROJECT_NAME}_VERSION}")
 
 # Dependencies
 # ============
 
-set(xtensor_REQUIRED_VERSION 0.25.0)
+set(xtensor_REQUIRED_VERSION 0.26.0)
 if(TARGET xtensor)
     set(xtensor_VERSION ${XTENSOR_VERSION_MAJOR}.${XTENSOR_VERSION_MINOR}.${XTENSOR_VERSION_PATCH})
     # Note: This is not SEMVER compatible comparison
diff --git a/README.md b/README.md
index 2cff672..88e6898 100644
--- a/README.md
+++ b/README.md
@@ -204,7 +204,7 @@ from the `docs` subdirectory.
 
 | `xtensor-python` | `xtensor` |  `pybind11`      |
 |------------------|-----------|------------------|
-| master           |  ^0.25.0  | >=2.6.1,<3       |
+| master           |  ^0.26.0  | >=2.6.1,<3       |
 | 0.27.0           |  ^0.25.0  | >=2.6.1,<3       |
 | 0.26.1           |  ^0.24.0  | ~2.4.3           |
 | 0.26.0           |  ^0.24.0  | ~2.4.3           |
diff --git a/benchmark/main.cpp b/benchmark/main.cpp
index d1d787e..4c18bc7 100644
--- a/benchmark/main.cpp
+++ b/benchmark/main.cpp
@@ -2,8 +2,8 @@
 #include "pybind11/numpy.h"
 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
 #include "numpy/arrayobject.h"
-#include "xtensor/xtensor.hpp"
-#include "xtensor/xarray.hpp"
+#include "xtensor/containers/xtensor.hpp"
+#include "xtensor/containers/xarray.hpp"
 #include "xtensor-python/pyarray.hpp"
 #include "xtensor-python/pytensor.hpp"
 #include "xtensor-python/pyvectorize.hpp"
diff --git a/docs/source/basic_usage.rst b/docs/source/basic_usage.rst
index c97c9ac..32b1c23 100644
--- a/docs/source/basic_usage.rst
+++ b/docs/source/basic_usage.rst
@@ -16,7 +16,7 @@ Example 1: Use an algorithm of the C++ library on a numpy array inplace
 
     #include <numeric>                        // Standard library import for std::accumulate
     #include "pybind11/pybind11.h"            // Pybind11 import to define Python bindings
-    #include "xtensor/xmath.hpp"              // xtensor import for the C++ universal functions
+    #include "xtensor/core/xmath.hpp"              // xtensor import for the C++ universal functions
     #define FORCE_IMPORT_ARRAY                // numpy C api loading
     #include "xtensor-python/pyarray.hpp"     // Numpy bindings
 
diff --git a/docs/source/examples/sfinae/main.cpp b/docs/source/examples/sfinae/main.cpp
index a146cdd..44ffaa7 100644
--- a/docs/source/examples/sfinae/main.cpp
+++ b/docs/source/examples/sfinae/main.cpp
@@ -1,5 +1,5 @@
 #include "mymodule.hpp"
-#include <xtensor/xio.hpp>
+#include <xtensor/io/xio.hpp>
 
 int main()
 {
diff --git a/docs/source/examples/sfinae/mymodule.hpp b/docs/source/examples/sfinae/mymodule.hpp
index 5127eff..33f7b8a 100644
--- a/docs/source/examples/sfinae/mymodule.hpp
+++ b/docs/source/examples/sfinae/mymodule.hpp
@@ -1,4 +1,4 @@
-#include <xtensor/xtensor.hpp>
+#include <xtensor/containers/xtensor.hpp>
 
 namespace mymodule {
 
diff --git a/environment-dev.yml b/environment-dev.yml
index f203855..72275dd 100644
--- a/environment-dev.yml
+++ b/environment-dev.yml
@@ -6,7 +6,7 @@ dependencies:
   - cmake
   - ninja
   # Host dependencies
-  - xtensor>=0.25,<0.26
+  - xtensor>=0.26,<0.27
   - numpy>=2.0
   - pybind11>=2.12.0,<3
   # Test dependencies
diff --git a/include/xtensor-python/pyarray.hpp b/include/xtensor-python/pyarray.hpp
index 6df73cf..0854fb3 100644
--- a/include/xtensor-python/pyarray.hpp
+++ b/include/xtensor-python/pyarray.hpp
@@ -14,9 +14,9 @@
 #include <cstddef>
 #include <vector>
 
-#include "xtensor/xbuffer_adaptor.hpp"
-#include "xtensor/xiterator.hpp"
-#include "xtensor/xsemantic.hpp"
+#include "xtensor/containers/xbuffer_adaptor.hpp"
+#include "xtensor/core/xiterator.hpp"
+#include "xtensor/core/xsemantic.hpp"
 
 #include "pyarray_backstrides.hpp"
 #include "pycontainer.hpp"
diff --git a/include/xtensor-python/pycontainer.hpp b/include/xtensor-python/pycontainer.hpp
index d0a1a1e..5e80a32 100644
--- a/include/xtensor-python/pycontainer.hpp
+++ b/include/xtensor-python/pycontainer.hpp
@@ -32,7 +32,7 @@
 #undef copysign
 
 #include <cmath>
-#include "xtensor/xcontainer.hpp"
+#include "xtensor/containers/xcontainer.hpp"
 
 #include "xtl/xsequence.hpp"
 
diff --git a/include/xtensor-python/pytensor.hpp b/include/xtensor-python/pytensor.hpp
index acf05b8..3eac157 100644
--- a/include/xtensor-python/pytensor.hpp
+++ b/include/xtensor-python/pytensor.hpp
@@ -14,10 +14,10 @@
 #include <array>
 #include <cstddef>
 
-#include "xtensor/xbuffer_adaptor.hpp"
-#include "xtensor/xiterator.hpp"
-#include "xtensor/xsemantic.hpp"
-#include "xtensor/xutils.hpp"
+#include "xtensor/containers/xbuffer_adaptor.hpp"
+#include "xtensor/core/xiterator.hpp"
+#include "xtensor/core/xsemantic.hpp"
+#include "xtensor/utils/xutils.hpp"
 
 #include "pycontainer.hpp"
 #include "pystrides_adaptor.hpp"
diff --git a/include/xtensor-python/pyvectorize.hpp b/include/xtensor-python/pyvectorize.hpp
index 9c7d107..d96f689 100644
--- a/include/xtensor-python/pyvectorize.hpp
+++ b/include/xtensor-python/pyvectorize.hpp
@@ -13,7 +13,7 @@
 #include <type_traits>
 
 #include "pyarray.hpp"
-#include "xtensor/xvectorize.hpp"
+#include "xtensor/core/xvectorize.hpp"
 
 namespace xt
 {
diff --git a/include/xtensor-python/xtensor_type_caster_base.hpp b/include/xtensor-python/xtensor_type_caster_base.hpp
index 840e28c..902235f 100644
--- a/include/xtensor-python/xtensor_type_caster_base.hpp
+++ b/include/xtensor-python/xtensor_type_caster_base.hpp
@@ -14,8 +14,8 @@
 #include <algorithm>
 #include <vector>
 
-#include "xtensor/xtensor.hpp"
-#include "xtensor/xfixed.hpp"
+#include "xtensor/containers/xtensor.hpp"
+#include "xtensor/containers/xfixed.hpp"
 
 #include <pybind11/numpy.h>
 #include <pybind11/pybind11.h>
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index aaaf339..60fcf10 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -29,16 +29,7 @@ include(CheckCXXCompilerFlag)
 
 string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE)
 
-if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -Wunused-parameter -Wextra -Wreorder -Wconversion -fvisibility=hidden")
-    CHECK_CXX_COMPILER_FLAG("-std=c++14" HAS_CPP14_FLAG)
-
-    if (HAS_CPP14_FLAG)
-        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
-    else()
-        message(FATAL_ERROR "Unsupported compiler -- xtensor requires C++14 support!")
-    endif()
-endif()
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
 
 if(MSVC)
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /MP /bigobj")
diff --git a/test/test_common.hpp b/test/test_common.hpp
index 3b4ed85..7115764 100644
--- a/test/test_common.hpp
+++ b/test/test_common.hpp
@@ -10,8 +10,8 @@
 #ifndef TEST_COMMON_HPP
 #define TEST_COMMON_HPP
 
-#include "xtensor/xlayout.hpp"
-#include "xtensor/xmanipulation.hpp"
+#include "xtensor/core/xlayout.hpp"
+#include "xtensor/misc/xmanipulation.hpp"
 
 #include "xtl/xsequence.hpp"
 
diff --git a/test/test_pyarray.cpp b/test/test_pyarray.cpp
index 6406de6..15ede7e 100644
--- a/test/test_pyarray.cpp
+++ b/test/test_pyarray.cpp
@@ -11,8 +11,8 @@
 
 #include "xtensor-python/pyarray.hpp"
 
-#include "xtensor/xarray.hpp"
-#include "xtensor/xview.hpp"
+#include "xtensor/containers/xarray.hpp"
+#include "xtensor/views/xview.hpp"
 
 #include "test_common.hpp"
 
diff --git a/test/test_pytensor.cpp b/test/test_pytensor.cpp
index f2ac013..c7b12cf 100644
--- a/test/test_pytensor.cpp
+++ b/test/test_pytensor.cpp
@@ -11,8 +11,8 @@
 
 #include "xtensor-python/pytensor.hpp"
 
-#include "xtensor/xtensor.hpp"
-#include "xtensor/xview.hpp"
+#include "xtensor/containers/xtensor.hpp"
+#include "xtensor/views/xview.hpp"
 
 #include "test_common.hpp"
 
@@ -22,13 +22,13 @@ namespace xt
 
     TEST(pytensor, initializer_constructor)
     {
-        pytensor<int, 3> t 
-          {{{ 0,  1,  2}, 
-            { 3,  4,  5}, 
-            { 6,  7,  8}}, 
-           {{ 9, 10, 11}, 
-            {12, 13, 14}, 
-            {15, 16, 17}}}; 
+        pytensor<int, 3> t
+          {{{ 0,  1,  2},
+            { 3,  4,  5},
+            { 6,  7,  8}},
+           {{ 9, 10, 11},
+            {12, 13, 14},
+            {15, 16, 17}}};
         EXPECT_EQ(t.dimension(), 3);
         EXPECT_EQ(t(0, 0, 1), 1);
         EXPECT_EQ(t.shape()[0], 2);
diff --git a/test/test_sfinae.cpp b/test/test_sfinae.cpp
index a614485..c9d4733 100644
--- a/test/test_sfinae.cpp
+++ b/test/test_sfinae.cpp
@@ -12,8 +12,8 @@
 #include "gtest/gtest.h"
 #include "xtensor-python/pytensor.hpp"
 #include "xtensor-python/pyarray.hpp"
-#include "xtensor/xarray.hpp"
-#include "xtensor/xtensor.hpp"
+#include "xtensor/containers/xarray.hpp"
+#include "xtensor/containers/xtensor.hpp"
 
 namespace xt
 {
diff --git a/test_python/main.cpp b/test_python/main.cpp
index 7a0c524..d9b9e97 100644
--- a/test_python/main.cpp
+++ b/test_python/main.cpp
@@ -9,15 +9,15 @@
 
 #include <numeric>
 
-#include "xtensor/xmath.hpp"
-#include "xtensor/xarray.hpp"
-#include "xtensor/xfixed.hpp"
+#include "xtensor/core/xmath.hpp"
+#include "xtensor/containers/xarray.hpp"
+#include "xtensor/containers/xfixed.hpp"
 #define FORCE_IMPORT_ARRAY
 #include "xtensor-python/pyarray.hpp"
 #include "xtensor-python/pytensor.hpp"
 #include "xtensor-python/pyvectorize.hpp"
-#include "xtensor/xadapt.hpp"
-#include "xtensor/xstrided_view.hpp"
+#include "xtensor/containers/xadapt.hpp"
+#include "xtensor/views/xstrided_view.hpp"
 
 namespace py = pybind11;
 using complex_t = std::complex<double>;
@@ -336,7 +336,7 @@ PYBIND11_MODULE(xtensor_python_test, m)
     m.def("array_subtraction", array_subtraction);
     m.def("array_multiplication", array_multiplication);
     m.def("array_division", array_division);
-    
+
     m.def("vectorize_example1", xt::pyvectorize(add));
 
     m.def("rect_to_polar", xt::pyvectorize([](complex_t x) { return std::abs(x); }));
diff --git a/test_python/setup.py b/test_python/setup.py
index fa201da..58dbd2d 100644
--- a/test_python/setup.py
+++ b/test_python/setup.py
@@ -75,13 +75,13 @@ def has_flag(compiler, flagname):
 
 
 def cpp_flag(compiler):
-    """Return the -std=c++14 compiler flag  and errors when the flag is
+    """Return the -std=c++17 compiler flag  and errors when the flag is
     no available.
     """
-    if has_flag(compiler, '-std=c++14'):
-        return '-std=c++14'
+    if has_flag(compiler, '-std=c++17'):
+        return '-std=c++17'
     else:
-        raise RuntimeError('C++14 support is required by xtensor!')
+        raise RuntimeError('C++17 support is required by xtensor!')
 
 
 class BuildExt(build_ext):
@@ -92,7 +92,7 @@ class BuildExt(build_ext):
     }
 
     if sys.platform == 'darwin':
-        c_opts['unix'] += ['-stdlib=libc++', '-mmacosx-version-min=10.7']
+        c_opts['unix'] += ['-stdlib=libc++', '-mmacosx-version-min=10.13']
 
     def build_extensions(self):
         ct = self.compiler.compiler_type
@@ -104,6 +104,7 @@ def build_extensions(self):
                 opts.append('-fvisibility=hidden')
         elif ct == 'msvc':
             opts.append('/DVERSION_INFO=\\"%s\\"' % self.distribution.get_version())
+            opts.append('/std:c++17')
         for ext in self.extensions:
             ext.extra_compile_args = opts
         build_ext.build_extensions(self)

From 1d59c294667c907bd97fbb16644f0dc23cad9cdb Mon Sep 17 00:00:00 2001
From: Rohit Goswami <r95g10@gmail.com>
Date: Mon, 14 Apr 2025 08:15:22 +0000
Subject: [PATCH 4/8] BLD: Add a pkgconfig file (#310)

Similar to https://github.com/xtensor-stack/xtensor-blas/pull/243 and
done for the same reason (easier to integrate with `meson`).
---
 CMakeLists.txt       | 6 ++++++
 xtensor-python.pc.in | 7 +++++++
 2 files changed, 13 insertions(+)
 create mode 100644 xtensor-python.pc.in

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3fe3f34..e6b9227 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -124,6 +124,12 @@ export(EXPORT ${PROJECT_NAME}-targets
 install(FILES ${XTENSOR_PYTHON_HEADERS}
         DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/xtensor-python)
 
+configure_file(${PROJECT_NAME}.pc.in
+               "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
+                @ONLY)
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
+        DESTINATION "${CMAKE_INSTALL_DATADIR}/pkgconfig/")
+
 set(XTENSOR_PYTHON_CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" CACHE
     STRING "install path for xtensor-pythonConfig.cmake")
 
diff --git a/xtensor-python.pc.in b/xtensor-python.pc.in
new file mode 100644
index 0000000..c198795
--- /dev/null
+++ b/xtensor-python.pc.in
@@ -0,0 +1,7 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+includedir=${prefix}/include
+
+Name: xtensor-python
+Description: An extension to the xtensor library, offering Python bindings with enhanced NumPy support.
+Version: @xtensor-python_VERSION@
+Cflags: -I${includedir}

From 520e4f8ef255af02aff754f340cfcd3180e59552 Mon Sep 17 00:00:00 2001
From: Johan Mabille <johan.mabille@gmail.com>
Date: Mon, 14 Apr 2025 10:24:09 +0200
Subject: [PATCH 5/8] Release 0.28.0

---
 README.md                                        | 3 ++-
 include/xtensor-python/xtensor_python_config.hpp | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 88e6898..acf2df1 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ Both containers enable the numpy-style APIs of xtensor (see [the numpy to xtenso
 ```cpp
 #include <numeric>                        // Standard library import for std::accumulate
 #include <pybind11/pybind11.h>            // Pybind11 import to define Python bindings
-#include <xtensor/xmath.hpp>              // xtensor import for the C++ universal functions
+#include <xtensor/core/xmath.hpp>              // xtensor import for the C++ universal functions
 #define FORCE_IMPORT_ARRAY
 #include <xtensor-python/pyarray.hpp>     // Numpy bindings
 
@@ -205,6 +205,7 @@ from the `docs` subdirectory.
 | `xtensor-python` | `xtensor` |  `pybind11`      |
 |------------------|-----------|------------------|
 | master           |  ^0.26.0  | >=2.6.1,<3       |
+| 0.28.0           |  ^0.26.0  | >=2.6.1,<3       |
 | 0.27.0           |  ^0.25.0  | >=2.6.1,<3       |
 | 0.26.1           |  ^0.24.0  | ~2.4.3           |
 | 0.26.0           |  ^0.24.0  | ~2.4.3           |
diff --git a/include/xtensor-python/xtensor_python_config.hpp b/include/xtensor-python/xtensor_python_config.hpp
index c3f6707..f6840a7 100644
--- a/include/xtensor-python/xtensor_python_config.hpp
+++ b/include/xtensor-python/xtensor_python_config.hpp
@@ -11,7 +11,7 @@
 #define XTENSOR_PYTHON_CONFIG_HPP
 
 #define XTENSOR_PYTHON_VERSION_MAJOR 0
-#define XTENSOR_PYTHON_VERSION_MINOR 27
+#define XTENSOR_PYTHON_VERSION_MINOR 28
 #define XTENSOR_PYTHON_VERSION_PATCH 0
 
 #endif

From 680c6a43e624ca340b17dfd6a5049c7337be941f Mon Sep 17 00:00:00 2001
From: serge-sans-paille <serge.guelton@telecom-bretagne.eu>
Date: Thu, 31 Jul 2025 09:50:36 +0000
Subject: [PATCH 6/8] Update PyBind11 guard to 3.x release (#324)

Fix #323
---
 include/xtensor-python/pytensor.hpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/xtensor-python/pytensor.hpp b/include/xtensor-python/pytensor.hpp
index 3eac157..e3746cc 100644
--- a/include/xtensor-python/pytensor.hpp
+++ b/include/xtensor-python/pytensor.hpp
@@ -214,7 +214,7 @@ namespace xt
         static self_type ensure(pybind11::handle h);
         static bool check_(pybind11::handle h);
 
-#if PYBIND11_VERSION_MAJOR == 2 && PYBIND11_VERSION_MINOR >= 3
+#if (PYBIND11_VERSION_MAJOR == 2 && PYBIND11_VERSION_MINOR >= 3) || (PYBIND11_VERSION_MAJOR >= 3)
         // Prevent ambiguous overload resolution for operators defined for
         // both xt::xcontainer_semantic and pybind11::object.
         using semantic_base::operator+=;

From afc1672f50e2901f95a32b4cd9f480fa28545468 Mon Sep 17 00:00:00 2001
From: serge-sans-paille <serge.guelton@telecom-bretagne.eu>
Date: Thu, 31 Jul 2025 15:28:06 +0000
Subject: [PATCH 7/8] Fix pybind11 compatibility for version 3.x (#326)

Fix #323 - again
---
 include/xtensor-python/pyarray.hpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/xtensor-python/pyarray.hpp b/include/xtensor-python/pyarray.hpp
index 0854fb3..c24a793 100644
--- a/include/xtensor-python/pyarray.hpp
+++ b/include/xtensor-python/pyarray.hpp
@@ -195,7 +195,7 @@ namespace xt
         static self_type ensure(pybind11::handle h);
         static bool check_(pybind11::handle h);
 
-#if PYBIND11_VERSION_MAJOR == 2 && PYBIND11_VERSION_MINOR >= 3
+#if (PYBIND11_VERSION_MAJOR == 2 && PYBIND11_VERSION_MINOR >= 3) || PYBIND11_VERSION_MAJOR >= 3
         // Prevent ambiguous overload resolution for operators defined for
         // both xt::xcontainer_semantic and pybind11::object.
         using semantic_base::operator+=;

From 2f59002d9930fe61fee19f0808444d0411ac1c70 Mon Sep 17 00:00:00 2001
From: Johan Mabille <johan.mabille@gmail.com>
Date: Thu, 31 Jul 2025 17:39:00 +0200
Subject: [PATCH 8/8] Upgraded to pybind11 3 (#325)

---
 README.md                              | 2 +-
 environment-dev.yml                    | 2 +-
 include/xtensor-python/pycontainer.hpp | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index acf2df1..3f24121 100644
--- a/README.md
+++ b/README.md
@@ -204,7 +204,7 @@ from the `docs` subdirectory.
 
 | `xtensor-python` | `xtensor` |  `pybind11`      |
 |------------------|-----------|------------------|
-| master           |  ^0.26.0  | >=2.6.1,<3       |
+| master           |  ^0.26.0  | >=2.6.1,<4       |
 | 0.28.0           |  ^0.26.0  | >=2.6.1,<3       |
 | 0.27.0           |  ^0.25.0  | >=2.6.1,<3       |
 | 0.26.1           |  ^0.24.0  | ~2.4.3           |
diff --git a/environment-dev.yml b/environment-dev.yml
index 72275dd..876678b 100644
--- a/environment-dev.yml
+++ b/environment-dev.yml
@@ -8,7 +8,7 @@ dependencies:
   # Host dependencies
   - xtensor>=0.26,<0.27
   - numpy>=2.0
-  - pybind11>=2.12.0,<3
+  - pybind11>=2.12.0,<4
   # Test dependencies
   - setuptools
   - pytest
diff --git a/include/xtensor-python/pycontainer.hpp b/include/xtensor-python/pycontainer.hpp
index 5e80a32..f01c390 100644
--- a/include/xtensor-python/pycontainer.hpp
+++ b/include/xtensor-python/pycontainer.hpp
@@ -129,7 +129,7 @@ namespace xt
 
     private:
 
-#if PYBIND11_VERSION_MAJOR == 2 && PYBIND11_VERSION_MINOR >= 3
+#if (PYBIND11_VERSION_MAJOR == 2 && PYBIND11_VERSION_MINOR >= 3) || PYBIND11_VERSION_MAJOR >= 3
         // Prevent ambiguous overload resolution for operators defined for
         // both xt::xcontainer and pybind11::object.
         using pybind11::object::operator~;
