diff --git a/.gitignore b/.gitignore index 67b758e..3bbd73d 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ compile_commands.json CTestTestfile.cmake _deps cmake-build-* +_skbuild diff --git a/CMakeLists.txt b/CMakeLists.txt index 06e7b52..9134090 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,10 +4,22 @@ include(tools/CompilerWarnings.cmake) project(quicktex) +if (SKBUILD) + # Scikit-Build does not add your site-packages to the search path + # automatically, so we need to add it _or_ the pybind11 specific directory + # here. + execute_process( + COMMAND "${PYTHON_EXECUTABLE}" -c + "import pybind11; print(pybind11.get_cmake_dir())" + OUTPUT_VARIABLE _tmp_dir + OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ECHO STDOUT) + list(APPEND CMAKE_PREFIX_PATH "${_tmp_dir}") +endif () + # Find dependencies find_package(Python COMPONENTS Interpreter Development) +find_package(pybind11 CONFIG REQUIRED) find_package(OpenMP) -add_subdirectory(extern/pybind11) # Collect source files file(GLOB SOURCE_FILES @@ -73,3 +85,5 @@ if (CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -stdlib=libc++ -fsanitize=undefined") set(PROJECT_WARNINGS ${CLANG_WARNINGS}) endif () + +install(TARGETS _quicktex LIBRARY DESTINATION quicktex) diff --git a/extern/pybind11 b/extern/pybind11 deleted file mode 160000 index 8de7772..0000000 --- a/extern/pybind11 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8de7772cc72daca8e947b79b83fea46214931604 diff --git a/pyproject.toml b/pyproject.toml index 8a7ea04..6ab47ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,8 +3,10 @@ requires = [ "setuptools>=61", "setuptools_scm>=6.2", "wheel", + "pybind11>=2.9.0", + "cmake>=3.22", + "scikit-build>0.13", "ninja; sys_platform != 'win32'", - "cmake>=3.12", ] build-backend = "setuptools.build_meta" diff --git a/setup.py b/setup.py index 89042b0..14f7cd0 100644 --- a/setup.py +++ b/setup.py @@ -1,116 +1,15 @@ -import os -import re import sys -import subprocess -from setuptools import setup, Extension -from setuptools.command.build_ext import build_ext +try: + from skbuild import setup +except ImportError: + print( + "Please update pip, you need pip 10 or greater,\n" + " or you need to install the PEP 518 requirements in pyproject.toml yourself", + file=sys.stderr, + ) + raise -project_path = os.path.dirname(os.path.realpath(__file__)) - - -# A CMakeExtension needs a sourcedir instead of a file list. -# The name must be the _single_ output extension from the CMake build. -# If you need multiple extensions, see scikit-build. -class CMakeExtension(Extension): - def __init__(self, name, sourcedir=""): - Extension.__init__(self, name, sources=[]) - self.sourcedir = os.path.abspath(sourcedir) - - -class CMakeBuild(build_ext): - def build_extension(self, ext): - from setuptools_scm import get_version - version = get_version(root='.', relative_to=__file__) - - extdir = os.path.abspath(os.path.dirname(self.get_ext_fullpath(ext.name))) - - # required for auto-detection of auxiliary "native" libs - if not extdir.endswith(os.path.sep): - extdir += os.path.sep - - cfg = "Debug" if self.debug else "Release" - - # CMake lets you override the generator - we need to check this. - # Can be set with Conda-Build, for example. - cmake_generator = os.environ.get("CMAKE_GENERATOR", "") - - # Set Python_EXECUTABLE instead if you use PYBIND11_FINDPYTHON - cmake_args = [ - "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={}".format(extdir), - "-DPython_EXECUTABLE={}".format(sys.executable), - "-DQUICKTEX_VERSION_INFO={}".format(version), - "-DCMAKE_BUILD_TYPE={}".format(cfg), # not used on MSVC, but no harm - ] - build_args = [] - - if self.compiler.compiler_type != "msvc": - # Using Ninja-build since it a) is available as a wheel and b) - # multithreads automatically. MSVC would require all variables be - # exported for Ninja to pick it up, which is a little tricky to do. - # Users can override the generator with CMAKE_GENERATOR in CMake - # 3.15+. - if not cmake_generator: - cmake_args += ["-GNinja"] - - else: - # Single config generators are handled "normally" - single_config = any(x in cmake_generator for x in {"NMake", "Ninja"}) - - # CMake allows an arch-in-generator style for backward compatibility - contains_arch = any(x in cmake_generator for x in {"ARM", "Win64"}) - - # Convert distutils Windows platform specifiers to CMake -A arguments - plat_to_cmake = { - "win32": "Win32", - "win-amd64": "x64", - "win-arm32": "ARM", - "win-arm64": "ARM64", - } - - # Specify the arch if using MSVC generator, but only if it doesn't - # contain a backward-compatibility arch spec already in the - # generator name. - if not single_config and not contains_arch: - cmake_args += ["-A", plat_to_cmake[self.plat_name]] - - # Multi-config generators have a different way to specify configs - if not single_config: - cmake_args += [ - "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}".format(cfg.upper(), extdir) - ] - build_args += ["--config", cfg] - - if sys.platform.startswith("darwin"): - # Cross-compile support for macOS - respect ARCHFLAGS if set - archs = re.findall(r"-arch (\S+)", os.environ.get("ARCHFLAGS", "")) - if archs: - cmake_args += ["-DCMAKE_OSX_ARCHITECTURES={}".format(";".join(archs))] - - # Set CMAKE_BUILD_PARALLEL_LEVEL to control the parallel build level - # across all generators. - if "CMAKE_BUILD_PARALLEL_LEVEL" not in os.environ: - # self.parallel is a Python 3 only way to set parallel jobs by hand - # using -j in the build_ext call, not supported by pip or PyPA-build. - if hasattr(self, "parallel") and self.parallel: - # CMake 3.12+ only. - build_args += ["-j{}".format(self.parallel)] - - if not os.path.exists(self.build_temp): - os.makedirs(self.build_temp) - - subprocess.check_call( - ["cmake", ext.sourcedir] + cmake_args, cwd=self.build_temp - ) - subprocess.check_call( - ["cmake", "--build", ".", "--target", ext.name] + build_args, cwd=self.build_temp - ) - - -# The information here can also be placed in setup.cfg - better separation of -# logic and declaration, and simpler if you include description/version in a file. setup( - use_scm_version=True, - ext_modules=[CMakeExtension("_quicktex")], - cmdclass={"build_ext": CMakeBuild}, + cmake_install_dir='.' )