Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .copier-answers.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Changes here will be overwritten by Copier
_commit: ebb6e1c
_commit: '4372075'
_src_path: https://github.com/python-project-templates/base.git
add_docs: false
add_extension: python
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ on:
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
Expand Down
12 changes: 6 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,16 @@ lint-py: ## lint python with ruff
python -m ruff format --check hatch_cpp

lint-docs: ## lint docs with mdformat and codespell
python -m mdformat --check README.md
python -m codespell_lib README.md
python -m mdformat --check README.md $(wildcard docs/src)
python -m codespell_lib README.md $(wildcard docs/src)

fix-py: ## autoformat python code with ruff
python -m ruff check --fix hatch_cpp
python -m ruff format hatch_cpp

fix-docs: ## autoformat docs with mdformat and codespell
python -m mdformat README.md
python -m codespell_lib --write README.md
python -m mdformat README.md $(wildcard docs/src)
python -m codespell_lib --write README.md $(wildcard docs/src)

lint: lint-py lint-docs ## run all linters
lints: lint
Expand All @@ -50,9 +50,9 @@ check-dist: ## check python sdist and wheel with check-dist
check-dist -v

check-types: ## check python types with ty
ty check --python $$(which python)
python -m ty check

checks: check-dist
checks: check-dist check-types

# Alias
check: checks
Expand Down
6 changes: 4 additions & 2 deletions hatch_cpp/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class HatchCppBuildConfig(BaseModel):
name: str | None = Field(default=None)
libraries: list[HatchCppLibrary] = Field(default_factory=list)
cmake: HatchCppCmakeConfiguration | None = Field(default=None)
platform: HatchCppPlatform | None = Field(default_factory=HatchCppPlatform.default)
platform: HatchCppPlatform = Field(default_factory=HatchCppPlatform.default)
vcpkg: HatchCppVcpkgConfiguration | None = Field(default_factory=HatchCppVcpkgConfiguration)

@model_validator(mode="wrap")
Expand Down Expand Up @@ -72,7 +72,7 @@ def generate(self):
self._active_toolchains.append("vcpkg")
else:
log.warning("HATCH_CPP_VCPKG=1 set but no vcpkg configuration found; ignoring.")
elif vcpkg_override != "0" and self.vcpkg and Path(self.vcpkg.vcpkg).exists():
elif vcpkg_override != "0" and self.vcpkg and self.vcpkg.vcpkg and Path(self.vcpkg.vcpkg).exists():
self._active_toolchains.append("vcpkg")

if self.libraries:
Expand All @@ -87,6 +87,7 @@ def generate(self):

# Collect toolchain commands
if "vcpkg" in self._active_toolchains:
assert self.vcpkg is not None
self.commands.extend(self.vcpkg.generate(self))

if "vanilla" in self._active_toolchains:
Expand All @@ -108,6 +109,7 @@ def generate(self):
self.commands.append(f"{compiler} {' '.join(library.sources)} {compile_flags} {link_flags}")

if "cmake" in self._active_toolchains:
assert self.cmake is not None
self.commands.extend(self.cmake.generate(self))

return self.commands
Expand Down
1 change: 1 addition & 0 deletions hatch_cpp/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ def initialize(self, version: str, build_data: dict[str, Any]) -> None:
all(lib.py_limited_api for lib in build_plan.libraries),
)
else:
assert build_plan.cmake is not None
build_data["pure_python"] = False
machine = platform_machine()
version_major = version_info.major
Expand Down
5 changes: 3 additions & 2 deletions hatch_cpp/tests/test_hatch_build.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from importlib import import_module
from os import listdir
from pathlib import Path
from shutil import rmtree
Expand Down Expand Up @@ -41,6 +42,6 @@ def test_hatch_build(self):
# import
here = Path(__file__).parent / project
path.insert(0, str(here))
import project.extension
extension = import_module("project.extension")

assert project.extension.hello() == "A string"
assert extension.hello() == "A string"
3 changes: 2 additions & 1 deletion hatch_cpp/tests/test_hook_registration.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
from hatchling.metadata.core import ProjectMetadata

from hatch_cpp.hooks import hatch_register_build_hook

Expand All @@ -10,7 +11,7 @@ def test_registered_build_hook_accepts_hatchling_configuration(tmp_path):
root=str(tmp_path),
config=config,
build_config=None,
metadata=None,
metadata=ProjectMetadata(str(tmp_path), None, {"project": {"name": "project", "version": "0.1.0"}}),
directory=str(tmp_path),
target_name="wheel",
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
def answer() -> int: ...
5 changes: 3 additions & 2 deletions hatch_cpp/tests/test_projects.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import contextlib
from importlib import import_module
from os import listdir, remove
from pathlib import Path
from subprocess import check_call
Expand Down Expand Up @@ -60,6 +61,6 @@ def test_basic(self, project):
# import
here = Path(__file__).parent / project
path.insert(0, str(here))
import project.extension
extension = import_module("project.extension")

assert project.extension.hello() == "A string"
assert extension.hello() == "A string"
4 changes: 2 additions & 2 deletions hatch_cpp/toolchains/cmake.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
from os import environ
from pathlib import Path
from sys import version_info
from typing import Any

from pydantic import BaseModel, Field

Expand Down Expand Up @@ -33,7 +32,8 @@ class HatchCppCmakeConfiguration(BaseModel):

include_flags: dict[str, str | int | float | bool] | None = Field(default=None)

def generate(self, config) -> dict[str, Any]:
def generate(self, config) -> list[str]:
assert self.root is not None
commands = []

# Derive prefix
Expand Down
84 changes: 45 additions & 39 deletions hatch_cpp/toolchains/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,50 +48,56 @@ class HatchCppLibrary(BaseModel, validate_assignment=True):
binding: Binding = "cpython"
std: str | None = None

include_dirs: list[str] = Field(default_factory=list, alias=AliasChoices("include_dirs", "include-dirs"))
include_dirs_linux: list[str] = Field(default_factory=list, alias=AliasChoices("include_dirs_linux", "include-dirs-linux"))
include_dirs_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("include_dirs_darwin", "include-dirs-darwin"))
include_dirs_win32: list[str] = Field(default_factory=list, alias=AliasChoices("include_dirs_win32", "include-dirs-win32"))
include_dirs: list[str] = Field(default_factory=list, validation_alias=AliasChoices("include_dirs", "include-dirs"))
include_dirs_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("include_dirs_linux", "include-dirs-linux"))
include_dirs_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("include_dirs_darwin", "include-dirs-darwin"))
include_dirs_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("include_dirs_win32", "include-dirs-win32"))

library_dirs: list[str] = Field(default_factory=list, alias=AliasChoices("library_dirs", "library-dirs"))
library_dirs_linux: list[str] = Field(default_factory=list, alias=AliasChoices("library_dirs_linux", "library-dirs-linux"))
library_dirs_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("library_dirs_darwin", "library-dirs-darwin"))
library_dirs_win32: list[str] = Field(default_factory=list, alias=AliasChoices("library_dirs_win32", "library-dirs-win32"))
library_dirs: list[str] = Field(default_factory=list, validation_alias=AliasChoices("library_dirs", "library-dirs"))
library_dirs_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("library_dirs_linux", "library-dirs-linux"))
library_dirs_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("library_dirs_darwin", "library-dirs-darwin"))
library_dirs_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("library_dirs_win32", "library-dirs-win32"))

libraries: list[str] = Field(default_factory=list)
libraries_linux: list[str] = Field(default_factory=list, alias=AliasChoices("libraries_linux", "libraries-linux"))
libraries_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("libraries_darwin", "libraries-darwin"))
libraries_win32: list[str] = Field(default_factory=list, alias=AliasChoices("libraries_win32", "libraries-win32"))

extra_compile_args: list[str] = Field(default_factory=list, alias=AliasChoices("extra_compile_args", "extra-compile-args"))
extra_compile_args_linux: list[str] = Field(default_factory=list, alias=AliasChoices("extra_compile_args_linux", "extra-compile-args-linux"))
extra_compile_args_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("extra_compile_args_darwin", "extra-compile-args-darwin"))
extra_compile_args_win32: list[str] = Field(default_factory=list, alias=AliasChoices("extra_compile_args_win32", "extra-compile-args-win32"))

extra_link_args: list[str] = Field(default_factory=list, alias=AliasChoices("extra_link_args", "extra-link-args"))
extra_link_args_linux: list[str] = Field(default_factory=list, alias=AliasChoices("extra_link_args_linux", "extra-link-args-linux"))
extra_link_args_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("extra_link_args_darwin", "extra-link-args-darwin"))
extra_link_args_win32: list[str] = Field(default_factory=list, alias=AliasChoices("extra_link_args_win32", "extra-link-args-win32"))

extra_objects: list[str] = Field(default_factory=list, alias=AliasChoices("extra_objects", "extra-objects"))
extra_objects_linux: list[str] = Field(default_factory=list, alias=AliasChoices("extra_objects_linux", "extra-objects-linux"))
extra_objects_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("extra_objects_darwin", "extra-objects-darwin"))
extra_objects_win32: list[str] = Field(default_factory=list, alias=AliasChoices("extra_objects_win32", "extra-objects-win32"))

define_macros: list[str] = Field(default_factory=list, alias=AliasChoices("define_macros", "define-macros"))
define_macros_linux: list[str] = Field(default_factory=list, alias=AliasChoices("define_macros_linux", "define-macros-linux"))
define_macros_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("define_macros_darwin", "define-macros-darwin"))
define_macros_win32: list[str] = Field(default_factory=list, alias=AliasChoices("define_macros_win32", "define-macros-win32"))

undef_macros: list[str] = Field(default_factory=list, alias=AliasChoices("undef_macros", "undef-macros"))
undef_macros_linux: list[str] = Field(default_factory=list, alias=AliasChoices("undef_macros_linux", "undef-macros-linux"))
undef_macros_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("undef_macros_darwin", "undef-macros-darwin"))
undef_macros_win32: list[str] = Field(default_factory=list, alias=AliasChoices("undef_macros_win32", "undef-macros-win32"))

export_symbols: list[str] = Field(default_factory=list, alias=AliasChoices("export_symbols", "export-symbols"))
libraries_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("libraries_linux", "libraries-linux"))
libraries_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("libraries_darwin", "libraries-darwin"))
libraries_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("libraries_win32", "libraries-win32"))

extra_compile_args: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_compile_args", "extra-compile-args"))
extra_compile_args_linux: list[str] = Field(
default_factory=list, validation_alias=AliasChoices("extra_compile_args_linux", "extra-compile-args-linux")
)
extra_compile_args_darwin: list[str] = Field(
default_factory=list, validation_alias=AliasChoices("extra_compile_args_darwin", "extra-compile-args-darwin")
)
extra_compile_args_win32: list[str] = Field(
default_factory=list, validation_alias=AliasChoices("extra_compile_args_win32", "extra-compile-args-win32")
)

extra_link_args: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_link_args", "extra-link-args"))
extra_link_args_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_link_args_linux", "extra-link-args-linux"))
extra_link_args_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_link_args_darwin", "extra-link-args-darwin"))
extra_link_args_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_link_args_win32", "extra-link-args-win32"))

extra_objects: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_objects", "extra-objects"))
extra_objects_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_objects_linux", "extra-objects-linux"))
extra_objects_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_objects_darwin", "extra-objects-darwin"))
extra_objects_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_objects_win32", "extra-objects-win32"))

define_macros: list[str] = Field(default_factory=list, validation_alias=AliasChoices("define_macros", "define-macros"))
define_macros_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("define_macros_linux", "define-macros-linux"))
define_macros_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("define_macros_darwin", "define-macros-darwin"))
define_macros_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("define_macros_win32", "define-macros-win32"))

undef_macros: list[str] = Field(default_factory=list, validation_alias=AliasChoices("undef_macros", "undef-macros"))
undef_macros_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("undef_macros_linux", "undef-macros-linux"))
undef_macros_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("undef_macros_darwin", "undef-macros-darwin"))
undef_macros_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("undef_macros_win32", "undef-macros-win32"))

export_symbols: list[str] = Field(default_factory=list, validation_alias=AliasChoices("export_symbols", "export-symbols"))
depends: list[str] = Field(default_factory=list)

py_limited_api: str | None = Field(default="", alias=AliasChoices("py_limited_api", "py-limited-api"))
py_limited_api: str | None = Field(default="", validation_alias=AliasChoices("py_limited_api", "py-limited-api"))

@field_validator("py_limited_api", mode="before")
@classmethod
Expand Down
4 changes: 2 additions & 2 deletions hatch_cpp/toolchains/vcpkg.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
"arm64-windows-static-md",
"wasm32-emscripten",
]
VcpkgPlatformDefaults = {
VcpkgPlatformDefaults: dict[tuple[str, str], VcpkgTriplet] = {
("linux", "x86_64"): "x64-linux",
("linux", "aarch64"): "arm64-linux",
("darwin", "x86_64"): "x64-osx",
Expand Down Expand Up @@ -65,7 +65,7 @@ def _read_vcpkg_ref_from_gitmodules(vcpkg_root: Path) -> str | None:

class HatchCppVcpkgConfiguration(BaseModel):
vcpkg: str | None = Field(default="vcpkg.json")
vcpkg_root: Path | None = Field(default=Path("vcpkg"))
vcpkg_root: Path = Field(default=Path("vcpkg"))
vcpkg_repo: str | None = Field(default="https://github.com/microsoft/vcpkg.git")
vcpkg_triplet: VcpkgTriplet | None = Field(default=None)
vcpkg_ref: str | None = Field(
Expand Down
3 changes: 2 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ develop = [
"hatchling",
"hatch-build>=0.3.2",
"mdformat",
"mdformat-frontmatter",
"mdformat-tables>=1",
"pytest",
"pytest-cov",
Expand Down Expand Up @@ -97,7 +98,7 @@ replace = 'version = "{new_version}"'
[tool.coverage.run]
branch = false
omit = [
"hatch_cpp/tests/integration/",
"hatch_cpp/tests/integration/*",
]
patch = ["subprocess"]

Expand Down
Loading