diff --git a/.gitignore b/.gitignore index 51abef018..7699b24a5 100644 --- a/.gitignore +++ b/.gitignore @@ -177,3 +177,5 @@ dmypy.json # Scikit-build build folder _skbuild/ + +.pixi/ diff --git a/cmake/DependenciesResolver.cmake b/cmake/DependenciesResolver.cmake index 326c7102b..32a14b3bb 100644 --- a/cmake/DependenciesResolver.cmake +++ b/cmake/DependenciesResolver.cmake @@ -78,7 +78,7 @@ macro(find_or_download_package) FetchContent_GetProperties(${ARG_NAME}) if(NOT ${ARG_NAME}_POPULATED) message(STATUS "Downloading ${ARG_NAME}") - FetchContent_Populate(${ARG_NAME}) + FetchContent_MakeAvailable(${ARG_NAME}) message(STATUS "Building ${ARG_NAME}") # FetchContent_Populate uses lower case name of FetchContent_Declare for directories string(TOLOWER "${ARG_NAME}" ARG_NAME_LOWER) diff --git a/cmake/Python.cmake b/cmake/Python.cmake index 545d18fa9..9d4cc3d51 100644 --- a/cmake/Python.cmake +++ b/cmake/Python.cmake @@ -1,14 +1,8 @@ # Set some variables to find the proper Python version -if(SKBUILD) - # If scikit-build is compiling, let if define the interpreter - set(Python_EXECUTABLE "${PYTHON_EXECUTABLE}") - set(Python_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}") - set(Python_LIBRARY "${PYTHON_LIBRARY}") - set(DUMMY "${PYTHON_VERSION_STRING}") # Not needed, silences a warning - -elseif(NOT DEFINED Python_EXECUTABLE) - # Find Python interpreter from the path and don't resolve symlinks +# scikit-build-core sets Python paths automatically via CMake's FindPython. +# For standalone builds, find Python from the path. +if(NOT SKBUILD AND NOT DEFINED Python_EXECUTABLE) execute_process( COMMAND "python3" "-c" "import sys; print(sys.executable)" OUTPUT_VARIABLE Python_EXECUTABLE diff --git a/dev/conda.yaml b/dev/conda.yaml index ea5d694fe..62bada84a 100644 --- a/dev/conda.yaml +++ b/dev/conda.yaml @@ -18,7 +18,7 @@ dependencies: - pybind11>=2.7 - numpy>=1.4 - xtensor-python - - scikit-build + - scikit-build-core - build # Documentation diff --git a/libecole/dependencies/private.cmake b/libecole/dependencies/private.cmake index 2e3e1f002..a683efbbf 100644 --- a/libecole/dependencies/private.cmake +++ b/libecole/dependencies/private.cmake @@ -1,7 +1,7 @@ find_or_download_package( NAME range-v3 - URL https://github.com/ericniebler/range-v3/archive/0.11.0.tar.gz - URL_HASH SHA256=376376615dbba43d3bef75aa590931431ecb49eb36d07bb726a19f680c75e20c + URL https://github.com/ericniebler/range-v3/archive/0.12.0.tar.gz + URL_HASH SHA256=015adb2300a98edfceaf0725beec3337f542af4915cec4d0b89fa0886f4ba9cb CONFIGURE_ARGS -D RANGE_V3_TESTS=OFF -D RANGE_V3_EXAMPLES=OFF @@ -11,8 +11,8 @@ find_or_download_package( find_or_download_package( NAME fmt - URL https://github.com/fmtlib/fmt/archive/8.0.1.tar.gz - URL_HASH SHA256=b06ca3130158c625848f3fb7418f235155a4d389b2abc3a6245fb01cb0eb1e01 + URL https://github.com/fmtlib/fmt/archive/12.0.0.tar.gz + URL_HASH SHA256=aa3e8fbb6a0066c03454434add1f1fc23299e85758ceec0d7d2d974431481e40 CONFIGURE_ARGS -D FMT_TEST=OFF -D FMT_DOC=OFF @@ -24,7 +24,7 @@ find_or_download_package( find_or_download_package( NAME robin_hood - URL https://github.com/martinus/robin-hood-hashing/archive/refs/tags/3.11.2.tar.gz - URL_HASH SHA256=148b4fbd4fbb30ba10cc97143dcbe385078801b9c9e329cd477c1ea27477cb73 + URL https://github.com/martinus/robin-hood-hashing/archive/refs/tags/3.11.5.tar.gz + URL_HASH SHA256=3693e44dda569e9a8b87ce8263f7477b23af448a3c3600c8ab9004fe79c20ad0 CONFIGURE_ARGS -D RH_STANDALONE_PROJECT=OFF ) diff --git a/libecole/dependencies/public.cmake b/libecole/dependencies/public.cmake index 5a42b820b..f1335c922 100644 --- a/libecole/dependencies/public.cmake +++ b/libecole/dependencies/public.cmake @@ -1,28 +1,28 @@ find_or_download_package( NAME xtl - URL https://github.com/xtensor-stack/xtl/archive/0.7.2.tar.gz - URL_HASH SHA256=95c221bdc6eaba592878090916383e5b9390a076828552256693d5d97f78357c + URL https://github.com/xtensor-stack/xtl/archive/0.8.1.tar.gz + URL_HASH SHA256=e69a696068ccffd2b435539d583665981b6c6abed596a72832bffbe3e13e1f49 CONFIGURE_ARGS -D BUILD_TESTS=OFF ) find_or_download_package( NAME xsimd - URL https://github.com/xtensor-stack/xsimd/archive/7.4.9.tar.gz - URL_HASH SHA256=f6601ffb002864ec0dc6013efd9f7a72d756418857c2d893be0644a2f041874e + URL https://github.com/xtensor-stack/xsimd/archive/14.0.0.tar.gz + URL_HASH SHA256=17de0236954955c10c09d6938d4c5f3a3b92d31be5dadd1d5d09fc1b15490dce CONFIGURE_ARGS -D BUILD_TESTS=OFF ) find_or_download_package( NAME xtensor - URL https://github.com/xtensor-stack/xtensor/archive/0.23.1.tar.gz - URL_HASH SHA256=b9bceea49db240ab64eede3776d0103bb0503d9d1f3ce5b90b0f06a0d8ac5f08 + URL https://github.com/xtensor-stack/xtensor/archive/0.27.1.tar.gz + URL_HASH SHA256=117c192ae3b7c37c0156dedaa88038e0599a6b264666c3c6c2553154b500fe23 CONFIGURE_ARGS -D BUILD_TESTS=OFF ) find_or_download_package( NAME span-lite - URL https://github.com/martinmoene/span-lite/archive/v0.9.0.tar.gz - URL_HASH SHA256=cdb5f86e5f5e679d63700a56de734c44fe22a574a17347d09dbaaef80619af91 + URL https://github.com/martinmoene/span-lite/archive/v0.11.0.tar.gz + URL_HASH SHA256=ef4e028e18ff21044da4b4641ca1bc8a2e2d656e2028322876c0e1b9b6904f9d CONFIGURE_ARGS -D SPAN_LITE_OPT_BUILD_TESTS=OFF -D SPAN_LITE_OPT_BUILD_EXAMPLES=OFF diff --git a/libecole/include/ecole/dynamics/branching.hpp b/libecole/include/ecole/dynamics/branching.hpp index 6838ff85d..9792f1c9a 100644 --- a/libecole/include/ecole/dynamics/branching.hpp +++ b/libecole/include/ecole/dynamics/branching.hpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include "ecole/default.hpp" #include "ecole/dynamics/parts.hpp" diff --git a/libecole/include/ecole/dynamics/primal-search.hpp b/libecole/include/ecole/dynamics/primal-search.hpp index a32fd678a..5710c1ecc 100644 --- a/libecole/include/ecole/dynamics/primal-search.hpp +++ b/libecole/include/ecole/dynamics/primal-search.hpp @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include "ecole/dynamics/parts.hpp" #include "ecole/export.hpp" diff --git a/libecole/include/ecole/observation/hutter-2011.hpp b/libecole/include/ecole/observation/hutter-2011.hpp index abf7d31f9..c058537fd 100644 --- a/libecole/include/ecole/observation/hutter-2011.hpp +++ b/libecole/include/ecole/observation/hutter-2011.hpp @@ -2,7 +2,7 @@ #include -#include +#include #include "ecole/export.hpp" #include "ecole/observation/abstract.hpp" diff --git a/libecole/include/ecole/observation/khalil-2016.hpp b/libecole/include/ecole/observation/khalil-2016.hpp index 7cbeb96b3..7dfccf8b6 100644 --- a/libecole/include/ecole/observation/khalil-2016.hpp +++ b/libecole/include/ecole/observation/khalil-2016.hpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include "ecole/export.hpp" #include "ecole/observation/abstract.hpp" diff --git a/libecole/include/ecole/observation/milp-bipartite.hpp b/libecole/include/ecole/observation/milp-bipartite.hpp index 7a24cd59b..2fda0c8c7 100644 --- a/libecole/include/ecole/observation/milp-bipartite.hpp +++ b/libecole/include/ecole/observation/milp-bipartite.hpp @@ -2,7 +2,7 @@ #include -#include +#include #include "ecole/export.hpp" #include "ecole/observation/abstract.hpp" diff --git a/libecole/include/ecole/observation/node-bipartite.hpp b/libecole/include/ecole/observation/node-bipartite.hpp index 77bcfaa02..fc886a645 100644 --- a/libecole/include/ecole/observation/node-bipartite.hpp +++ b/libecole/include/ecole/observation/node-bipartite.hpp @@ -2,7 +2,7 @@ #include -#include +#include #include "ecole/export.hpp" #include "ecole/observation/abstract.hpp" diff --git a/libecole/include/ecole/observation/pseudocosts.hpp b/libecole/include/ecole/observation/pseudocosts.hpp index 22793e858..7a88f6087 100644 --- a/libecole/include/ecole/observation/pseudocosts.hpp +++ b/libecole/include/ecole/observation/pseudocosts.hpp @@ -2,7 +2,7 @@ #include -#include +#include #include "ecole/export.hpp" #include "ecole/observation/abstract.hpp" diff --git a/libecole/include/ecole/observation/strong-branching-scores.hpp b/libecole/include/ecole/observation/strong-branching-scores.hpp index 9a6aeb2c6..84f478a6a 100644 --- a/libecole/include/ecole/observation/strong-branching-scores.hpp +++ b/libecole/include/ecole/observation/strong-branching-scores.hpp @@ -3,8 +3,8 @@ #include #include -#include -#include +#include +#include #include "ecole/export.hpp" #include "ecole/observation/abstract.hpp" diff --git a/libecole/include/ecole/scip/cons.hpp b/libecole/include/ecole/scip/cons.hpp index 10cc579ee..9d85e7de4 100644 --- a/libecole/include/ecole/scip/cons.hpp +++ b/libecole/include/ecole/scip/cons.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include diff --git a/libecole/include/ecole/utility/sparse-matrix.hpp b/libecole/include/ecole/utility/sparse-matrix.hpp index 1bb7eca84..94b772949 100644 --- a/libecole/include/ecole/utility/sparse-matrix.hpp +++ b/libecole/include/ecole/utility/sparse-matrix.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include namespace ecole::utility { diff --git a/libecole/src/dynamics/branching.cpp b/libecole/src/dynamics/branching.cpp index ecc649e69..9a6e3248e 100644 --- a/libecole/src/dynamics/branching.cpp +++ b/libecole/src/dynamics/branching.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include "ecole/dynamics/branching.hpp" #include "ecole/scip/model.hpp" diff --git a/libecole/src/dynamics/primal-search.cpp b/libecole/src/dynamics/primal-search.cpp index e1f77f0f1..8874116de 100644 --- a/libecole/src/dynamics/primal-search.cpp +++ b/libecole/src/dynamics/primal-search.cpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include "ecole/dynamics/primal-search.hpp" #include "ecole/exception.hpp" diff --git a/libecole/src/instance/capacitated-facility-location.cpp b/libecole/src/instance/capacitated-facility-location.cpp index 4729e664e..f980dcdc8 100644 --- a/libecole/src/instance/capacitated-facility-location.cpp +++ b/libecole/src/instance/capacitated-facility-location.cpp @@ -4,10 +4,10 @@ #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include "ecole/instance/capacitated-facility-location.hpp" #include "ecole/scip/cons.hpp" diff --git a/libecole/src/instance/combinatorial-auction.cpp b/libecole/src/instance/combinatorial-auction.cpp index a0db29588..08f7aeb30 100644 --- a/libecole/src/instance/combinatorial-auction.cpp +++ b/libecole/src/instance/combinatorial-auction.cpp @@ -6,12 +6,12 @@ #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include "ecole/instance/combinatorial-auction.hpp" #include "ecole/scip/cons.hpp" @@ -59,7 +59,7 @@ class Logger { template void log(T&& message) { if (print) { - fmt::print(pattern, std::forward(message)); + fmt::print(fmt::runtime(pattern), std::forward(message)); } } diff --git a/libecole/src/instance/set-cover.cpp b/libecole/src/instance/set-cover.cpp index b0a871c1a..067f3c3d0 100644 --- a/libecole/src/instance/set-cover.cpp +++ b/libecole/src/instance/set-cover.cpp @@ -1,10 +1,10 @@ #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include "ecole/instance/set-cover.hpp" #include "ecole/scip/cons.hpp" diff --git a/libecole/src/observation/hutter-2011.cpp b/libecole/src/observation/hutter-2011.cpp index d5c9122dd..69e8f79e9 100644 --- a/libecole/src/observation/hutter-2011.cpp +++ b/libecole/src/observation/hutter-2011.cpp @@ -10,11 +10,11 @@ #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include "ecole/observation/hutter-2011.hpp" #include "ecole/scip/cons.hpp" diff --git a/libecole/src/observation/khalil-2016.cpp b/libecole/src/observation/khalil-2016.cpp index 3a296dc2a..680e8cb63 100644 --- a/libecole/src/observation/khalil-2016.cpp +++ b/libecole/src/observation/khalil-2016.cpp @@ -9,8 +9,8 @@ #include #include #include -#include -#include +#include +#include #include "ecole/observation/khalil-2016.hpp" #include "ecole/scip/col.hpp" diff --git a/libecole/src/observation/milp-bipartite.cpp b/libecole/src/observation/milp-bipartite.cpp index 05b37d268..2e4490b5f 100644 --- a/libecole/src/observation/milp-bipartite.cpp +++ b/libecole/src/observation/milp-bipartite.cpp @@ -4,9 +4,8 @@ #include #include #include -#include -#include -#include +#include +#include #include "ecole/exception.hpp" #include "ecole/observation/milp-bipartite.hpp" diff --git a/libecole/src/observation/node-bipartite.cpp b/libecole/src/observation/node-bipartite.cpp index e51b7cec2..7a1371663 100644 --- a/libecole/src/observation/node-bipartite.cpp +++ b/libecole/src/observation/node-bipartite.cpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include "ecole/observation/node-bipartite.hpp" #include "ecole/scip/model.hpp" diff --git a/libecole/src/observation/pseudocosts.cpp b/libecole/src/observation/pseudocosts.cpp index 04b33048f..2d1cd4175 100644 --- a/libecole/src/observation/pseudocosts.cpp +++ b/libecole/src/observation/pseudocosts.cpp @@ -4,8 +4,8 @@ #include #include -#include -#include +#include +#include #include "ecole/observation/pseudocosts.hpp" #include "ecole/scip/model.hpp" diff --git a/libecole/src/scip/cons.cpp b/libecole/src/scip/cons.cpp index 9c616f637..e24531ebe 100644 --- a/libecole/src/scip/cons.cpp +++ b/libecole/src/scip/cons.cpp @@ -1,10 +1,11 @@ #include #include #include -#include -#include -#include -#include + +#include +#include +#include +#include #include "ecole/scip/cons.hpp" #include "ecole/utility/sparse-matrix.hpp" @@ -212,8 +213,11 @@ auto get_constraint_linear_coefs(SCIP* const scip, SCIP_CONS* const constraint) &n_constraint_variables, static_cast(buffer_size), &constant_offset, - &requiredsize, - true); + &requiredsize +#if SCIP_VERSION_MAJOR < 10 + , true +#endif + ); } variables.resize(static_cast(n_constraint_variables)); diff --git a/libecole/tests/src/dynamics/test-branching.cpp b/libecole/tests/src/dynamics/test-branching.cpp index 854982cdf..9ad76de10 100644 --- a/libecole/tests/src/dynamics/test-branching.cpp +++ b/libecole/tests/src/dynamics/test-branching.cpp @@ -2,8 +2,8 @@ #include #include -#include -#include +#include +#include #include "ecole/dynamics/branching.hpp" #include "ecole/exception.hpp" diff --git a/libecole/tests/src/dynamics/test-primal-search.cpp b/libecole/tests/src/dynamics/test-primal-search.cpp index a542c5837..7ebfa3733 100644 --- a/libecole/tests/src/dynamics/test-primal-search.cpp +++ b/libecole/tests/src/dynamics/test-primal-search.cpp @@ -2,8 +2,8 @@ #include #include -#include -#include +#include +#include #include diff --git a/libecole/tests/src/observation/test-hutter-2011.cpp b/libecole/tests/src/observation/test-hutter-2011.cpp index a61c2b790..1a77a56e6 100644 --- a/libecole/tests/src/observation/test-hutter-2011.cpp +++ b/libecole/tests/src/observation/test-hutter-2011.cpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include "ecole/observation/hutter-2011.hpp" diff --git a/libecole/tests/src/observation/test-khalil-2016.cpp b/libecole/tests/src/observation/test-khalil-2016.cpp index 1faeb041c..989ac0c9e 100644 --- a/libecole/tests/src/observation/test-khalil-2016.cpp +++ b/libecole/tests/src/observation/test-khalil-2016.cpp @@ -2,10 +2,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include "ecole/observation/khalil-2016.hpp" #include "ecole/tweak/range.hpp" diff --git a/libecole/tests/src/observation/test-milp-bipartite.cpp b/libecole/tests/src/observation/test-milp-bipartite.cpp index 14ae1b694..eef2abadb 100644 --- a/libecole/tests/src/observation/test-milp-bipartite.cpp +++ b/libecole/tests/src/observation/test-milp-bipartite.cpp @@ -1,8 +1,8 @@ #include #include -#include -#include +#include +#include #include "ecole/observation/milp-bipartite.hpp" diff --git a/libecole/tests/src/observation/test-node-bipartite.cpp b/libecole/tests/src/observation/test-node-bipartite.cpp index 352fb325e..5c067f04d 100644 --- a/libecole/tests/src/observation/test-node-bipartite.cpp +++ b/libecole/tests/src/observation/test-node-bipartite.cpp @@ -1,8 +1,8 @@ #include #include -#include -#include +#include +#include #include "ecole/observation/node-bipartite.hpp" diff --git a/libecole/tests/src/observation/test-strong-branching-scores.cpp b/libecole/tests/src/observation/test-strong-branching-scores.cpp index 7b0e60ab2..0369d17cd 100644 --- a/libecole/tests/src/observation/test-strong-branching-scores.cpp +++ b/libecole/tests/src/observation/test-strong-branching-scores.cpp @@ -1,6 +1,6 @@ #include -#include -#include +#include +#include #include "ecole/observation/strong-branching-scores.hpp" diff --git a/pyproject.toml b/pyproject.toml index 35549ac13..78cdfd4bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,59 @@ [build-system] requires = [ - "setuptools>=42", - "wheel", - "pybind11>=2.7", - "cmake>=3.15", + "pybind11>=2.7,<3.0", + "numpy", + "scikit-build-core", +] +build-backend = "scikit_build_core.build" + +[project] +name = "ecole" +dynamic = ["version"] +description = "Extensible Combinatorial Optimization Learning Environments" +readme = "README.rst" +license = "BSD-3-Clause" +authors = [ + { name = "Antoine Prouvost et al." }, +] +requires-python = ">=3.8" +dependencies = [ "numpy>=1.4", - "ninja", - "scikit-build" ] -build-backend = "setuptools.build_meta" +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Science/Research", + "Programming Language :: Python :: 3", + "Topic :: Scientific/Engineering :: Artificial Intelligence", +] + +[project.urls] +Homepage = "https://www.ecole.ai" + +[tool.scikit-build] +cmake.version = ">=3.16" +cmake.build-type = "Release" +wheel.install-dir = "ecole" +wheel.packages = ["python/ecole/src/ecole"] + +[tool.scikit-build.cmake.define] +BUILD_SHARED_LIBS = "ON" +CMAKE_INSTALL_LIBDIR = "lib" +CMAKE_INSTALL_BINDIR = "bin" +CMAKE_INSTALL_INCLUDEDIR = "include" +ECOLE_PY_EXT_INSTALL_LIBDIR = "." + +[tool.scikit-build.metadata.version] +provider = "scikit_build_core.metadata.regex" +input = "VERSION" +regex = '''(?sx) +VERSION_MAJOR\s+(?P\d+).*? +VERSION_MINOR\s+(?P\d+).*? +VERSION_PATCH\s+(?P\d+).*? +VERSION_PRE\s+(?P
[^\s\#]*).*?
+VERSION_POST\s+(?P[^\s\#]*).*?
+VERSION_DEV\s+(?P[^\s\#]*)
+'''
+result = "{major}.{minor}.{patch}{pre}{post}{dev}"
 
 [tool.black]
 line-length = 100
diff --git a/python/ecole/CMakeLists.txt b/python/ecole/CMakeLists.txt
index b0626406a..4fc826329 100644
--- a/python/ecole/CMakeLists.txt
+++ b/python/ecole/CMakeLists.txt
@@ -75,10 +75,16 @@ add_custom_target(
 )
 add_dependencies(ecole-py-ext ecole-py-files)
 
-# Scikit build relies on an installation of the Python module to find the library.
-# Set through the setup.py script.
+# scikit-build-core relies on an installation of the Python module to find the library.
 if(SKBUILD)
-	# Rpath for the Ecole Python extension module
+	# Set default RPATH for the Ecole Python extension module if not provided
+	if(NOT DEFINED ECOLE_PY_EXT_INSTALL_RPATH)
+		if(APPLE)
+			set(ECOLE_PY_EXT_INSTALL_RPATH "@loader_path/lib")
+		else()
+			set(ECOLE_PY_EXT_INSTALL_RPATH "\$ORIGIN/lib")
+		endif()
+	endif()
 	set_target_properties(
 		ecole-py-ext
 		PROPERTIES
diff --git a/python/extension-helper/dependencies/public.cmake b/python/extension-helper/dependencies/public.cmake
index 7f9e61d9d..514458e37 100644
--- a/python/extension-helper/dependencies/public.cmake
+++ b/python/extension-helper/dependencies/public.cmake
@@ -2,8 +2,8 @@ find_package(Python COMPONENTS Interpreter Development NumPy REQUIRED)
 
 find_or_download_package(
 	NAME pybind11
-	URL https://github.com/pybind/pybind11/archive/v2.9.1.tar.gz
-	URL_HASH SHA256=c6160321dc98e6e1184cc791fbeadd2907bb4a0ce0e447f2ea4ff8ab56550913
+	URL https://github.com/pybind/pybind11/archive/v2.13.6.tar.gz
+	URL_HASH SHA256=e08cb87f4773da97fa7b5f035de8763abc656d87d5773e62f6da0587d1f0ec20
 	CONFIGURE_ARGS
 		-D PYBIND11_TEST=OFF
 		-D "Python_EXECUTABLE=${Python_EXECUTABLE}"
@@ -12,8 +12,8 @@ find_or_download_package(
 
 find_or_download_package(
 	NAME xtensor-python
-	URL https://github.com/xtensor-stack/xtensor-python/archive/0.25.1.tar.gz
-	URL_HASH SHA256=1e70db455a4dcba226c450bf9261a05a0c2fad513b84be35a3d139067356e6a1
+	URL https://github.com/xtensor-stack/xtensor-python/archive/0.29.0.tar.gz
+	URL_HASH SHA256=2915b220bd11b70fdd9fbb2db5f313e751189fec083e406228c8e5a31dfaa4a2
 	CONFIGURE_ARGS
 		-D BUILD_TESTS=OFF
 		-D "Python_EXECUTABLE=${Python_EXECUTABLE}"
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 70f90120c..000000000
--- a/setup.py
+++ /dev/null
@@ -1,100 +0,0 @@
-import pathlib
-import re
-import sys
-import os
-import shlex
-import platform
-
-from typing import List
-
-import skbuild
-
-__dir__ = pathlib.Path(__file__).resolve().parent
-
-
-def get_file(file: pathlib.Path) -> str:
-    """Extract all lines from a file."""
-    with open(file, "r") as f:
-        return f.read()
-
-
-def get_version(version_file: pathlib.Path) -> str:
-    """Extract version from the Ecole VERSION file according to PEP440."""
-    lines = get_file(version_file)
-    major = re.search(r"VERSION_MAJOR\s+(\d+)", lines).group(1)
-    minor = re.search(r"VERSION_MINOR\s+(\d+)", lines).group(1)
-    patch = re.search(r"VERSION_PATCH\s+(\d+)", lines).group(1)
-    pre = re.search(r"VERSION_PRE\s+([\.\w]*)", lines).group(1)
-    post = re.search(r"VERSION_POST\s+([\.\w]*)", lines).group(1)
-    dev = re.search(r"VERSION_DEV\s+([\.\w]*)", lines).group(1)
-    return f"{major}.{minor}.{patch}{pre}{post}{dev}"
-
-
-def get_env_cmake_args() -> List[str]:
-    """Return the list of extra CMake arguments from the environment.
-
-    When called through conda-build (environment variable `CONDA_BUILD` is set), the `CMAKE_INSTALL_<>`
-    are filtered out as they
-    """
-    cmake_args = shlex.split(os.environ.get("CMAKE_ARGS", ""))
-    if "CONDA_BUILD" in os.environ:
-        install_re = re.compile(r"-D\s*CMAKE_INSTALL.*")
-        cmake_args = [a for a in cmake_args if not install_re.search(a)]
-    return cmake_args
-
-
-def get_cmake_install_args() -> List[str]:
-    """Return default installation settings."""
-    if "CONDA_BUILD" in os.environ:
-        return get_cmake_out_package_install_args()
-    else:
-        return get_cmake_in_package_install_args()
-
-
-def get_cmake_in_package_install_args() -> List[str]:
-    """Return default installation settings for installing libecole in the package."""
-    system = platform.system()
-    if system == "Linux":
-        origin = r"${ORIGIN}"
-    elif system == "Darwin":
-        origin = "@loader_path"
-    else:
-        raise NotImplementedError(f"OS {system} is not supported")
-    return [
-        "-DBUILD_SHARED_LIBS=ON",
-        "-DCMAKE_INSTALL_LIBDIR=lib",
-        "-DCMAKE_INSTALL_BINDIR=bin",
-        "-DCMAKE_INSTALL_INCLUDEDIR=include",
-        "-DECOLE_PY_EXT_INSTALL_LIBDIR='.'",
-        "-DECOLE_PY_EXT_INSTALL_RPATH={origin}/lib".format(origin=origin),
-    ]
-
-
-def get_cmake_out_package_install_args() -> List[str]:
-    """Return default installation settings for an extrenal libecole installation."""
-    return ["-DECOLE_BUILD_LIB=OFF", "-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON"]
-
-
-skbuild.setup(
-    name="ecole",
-    author="Antoine Prouvost et al.",
-    version=get_version(__dir__ / "VERSION"),
-    url="https://www.ecole.ai",
-    description="Extensible Combinatorial Optimization Learning Environments",
-    long_description=get_file(__dir__ / "README.rst"),
-    long_description_content_type="text/x-rst",
-    license="BSD-3-Clause",
-    packages=["ecole"],
-    package_dir={"": "python/ecole/src"},
-    package_data={"ecole": ["py.typed"]},
-    cmake_languages=["CXX"],
-    cmake_install_dir="python/ecole/src/ecole",  # Must match package_dir layout
-    cmake_minimum_required_version="3.14",
-    # FIXME No way to pass cmake argument to scikit-build through pip (for now)
-    # https://github.com/scikit-build/scikit-build/issues/479
-    # So we read them from an environment variable
-    cmake_args=get_cmake_install_args() + get_env_cmake_args(),
-    zip_safe=False,
-    python_requires=">=3.6",
-    install_requires=["numpy>=1.4"],
-)