Skip to content

Commit 1c5b844

Browse files
committed
Correct C++ build configuration types
Signed-off-by: Tim Paine <3105306+timkpaine@users.noreply.github.com>
1 parent e335135 commit 1c5b844

10 files changed

Lines changed: 68 additions & 55 deletions

File tree

‎Makefile‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ lint-py: ## lint python with ruff
2525
python -m ruff format --check hatch_cpp
2626

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

3131
fix-py: ## autoformat python code with ruff
3232
python -m ruff check --fix hatch_cpp
3333
python -m ruff format hatch_cpp
3434

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

3939
lint: lint-py lint-docs ## run all linters
4040
lints: lint
@@ -50,7 +50,7 @@ check-dist: ## check python sdist and wheel with check-dist
5050
check-dist -v
5151

5252
check-types: ## check python types with ty
53-
ty check --python $$(which python)
53+
python -m ty check
5454

5555
checks: check-dist check-types
5656

‎hatch_cpp/config.py‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class HatchCppBuildConfig(BaseModel):
2525
name: str | None = Field(default=None)
2626
libraries: list[HatchCppLibrary] = Field(default_factory=list)
2727
cmake: HatchCppCmakeConfiguration | None = Field(default=None)
28-
platform: HatchCppPlatform | None = Field(default_factory=HatchCppPlatform.default)
28+
platform: HatchCppPlatform = Field(default_factory=HatchCppPlatform.default)
2929
vcpkg: HatchCppVcpkgConfiguration | None = Field(default_factory=HatchCppVcpkgConfiguration)
3030

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

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

8888
# Collect toolchain commands
8989
if "vcpkg" in self._active_toolchains:
90+
assert self.vcpkg is not None
9091
self.commands.extend(self.vcpkg.generate(self))
9192

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

110111
if "cmake" in self._active_toolchains:
112+
assert self.cmake is not None
111113
self.commands.extend(self.cmake.generate(self))
112114

113115
return self.commands

‎hatch_cpp/plugin.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ def initialize(self, version: str, build_data: dict[str, Any]) -> None:
104104
all(lib.py_limited_api for lib in build_plan.libraries),
105105
)
106106
else:
107+
assert build_plan.cmake is not None
107108
build_data["pure_python"] = False
108109
machine = platform_machine()
109110
version_major = version_info.major

‎hatch_cpp/tests/test_hatch_build.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from importlib import import_module
12
from os import listdir
23
from pathlib import Path
34
from shutil import rmtree
@@ -41,6 +42,6 @@ def test_hatch_build(self):
4142
# import
4243
here = Path(__file__).parent / project
4344
path.insert(0, str(here))
44-
import project.extension
45+
extension = import_module("project.extension")
4546

46-
assert project.extension.hello() == "A string"
47+
assert extension.hello() == "A string"

‎hatch_cpp/tests/test_hook_registration.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
2+
from hatchling.metadata.core import ProjectMetadata
23

34
from hatch_cpp.hooks import hatch_register_build_hook
45

@@ -10,7 +11,7 @@ def test_registered_build_hook_accepts_hatchling_configuration(tmp_path):
1011
root=str(tmp_path),
1112
config=config,
1213
build_config=None,
13-
metadata=None,
14+
metadata=ProjectMetadata(str(tmp_path), None, {"project": {"name": "project", "version": "0.1.0"}}),
1415
directory=str(tmp_path),
1516
target_name="wheel",
1617
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
def answer() -> int: ...

‎hatch_cpp/tests/test_projects.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import contextlib
2+
from importlib import import_module
23
from os import listdir, remove
34
from pathlib import Path
45
from subprocess import check_call
@@ -60,6 +61,6 @@ def test_basic(self, project):
6061
# import
6162
here = Path(__file__).parent / project
6263
path.insert(0, str(here))
63-
import project.extension
64+
extension = import_module("project.extension")
6465

65-
assert project.extension.hello() == "A string"
66+
assert extension.hello() == "A string"

‎hatch_cpp/toolchains/cmake.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from os import environ
44
from pathlib import Path
55
from sys import version_info
6-
from typing import Any
76

87
from pydantic import BaseModel, Field
98

@@ -33,7 +32,8 @@ class HatchCppCmakeConfiguration(BaseModel):
3332

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

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

3939
# Derive prefix

‎hatch_cpp/toolchains/common.py‎

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -48,50 +48,56 @@ class HatchCppLibrary(BaseModel, validate_assignment=True):
4848
binding: Binding = "cpython"
4949
std: str | None = None
5050

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

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

6161
libraries: list[str] = Field(default_factory=list)
62-
libraries_linux: list[str] = Field(default_factory=list, alias=AliasChoices("libraries_linux", "libraries-linux"))
63-
libraries_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("libraries_darwin", "libraries-darwin"))
64-
libraries_win32: list[str] = Field(default_factory=list, alias=AliasChoices("libraries_win32", "libraries-win32"))
65-
66-
extra_compile_args: list[str] = Field(default_factory=list, alias=AliasChoices("extra_compile_args", "extra-compile-args"))
67-
extra_compile_args_linux: list[str] = Field(default_factory=list, alias=AliasChoices("extra_compile_args_linux", "extra-compile-args-linux"))
68-
extra_compile_args_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("extra_compile_args_darwin", "extra-compile-args-darwin"))
69-
extra_compile_args_win32: list[str] = Field(default_factory=list, alias=AliasChoices("extra_compile_args_win32", "extra-compile-args-win32"))
70-
71-
extra_link_args: list[str] = Field(default_factory=list, alias=AliasChoices("extra_link_args", "extra-link-args"))
72-
extra_link_args_linux: list[str] = Field(default_factory=list, alias=AliasChoices("extra_link_args_linux", "extra-link-args-linux"))
73-
extra_link_args_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("extra_link_args_darwin", "extra-link-args-darwin"))
74-
extra_link_args_win32: list[str] = Field(default_factory=list, alias=AliasChoices("extra_link_args_win32", "extra-link-args-win32"))
75-
76-
extra_objects: list[str] = Field(default_factory=list, alias=AliasChoices("extra_objects", "extra-objects"))
77-
extra_objects_linux: list[str] = Field(default_factory=list, alias=AliasChoices("extra_objects_linux", "extra-objects-linux"))
78-
extra_objects_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("extra_objects_darwin", "extra-objects-darwin"))
79-
extra_objects_win32: list[str] = Field(default_factory=list, alias=AliasChoices("extra_objects_win32", "extra-objects-win32"))
80-
81-
define_macros: list[str] = Field(default_factory=list, alias=AliasChoices("define_macros", "define-macros"))
82-
define_macros_linux: list[str] = Field(default_factory=list, alias=AliasChoices("define_macros_linux", "define-macros-linux"))
83-
define_macros_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("define_macros_darwin", "define-macros-darwin"))
84-
define_macros_win32: list[str] = Field(default_factory=list, alias=AliasChoices("define_macros_win32", "define-macros-win32"))
85-
86-
undef_macros: list[str] = Field(default_factory=list, alias=AliasChoices("undef_macros", "undef-macros"))
87-
undef_macros_linux: list[str] = Field(default_factory=list, alias=AliasChoices("undef_macros_linux", "undef-macros-linux"))
88-
undef_macros_darwin: list[str] = Field(default_factory=list, alias=AliasChoices("undef_macros_darwin", "undef-macros-darwin"))
89-
undef_macros_win32: list[str] = Field(default_factory=list, alias=AliasChoices("undef_macros_win32", "undef-macros-win32"))
90-
91-
export_symbols: list[str] = Field(default_factory=list, alias=AliasChoices("export_symbols", "export-symbols"))
62+
libraries_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("libraries_linux", "libraries-linux"))
63+
libraries_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("libraries_darwin", "libraries-darwin"))
64+
libraries_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("libraries_win32", "libraries-win32"))
65+
66+
extra_compile_args: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_compile_args", "extra-compile-args"))
67+
extra_compile_args_linux: list[str] = Field(
68+
default_factory=list, validation_alias=AliasChoices("extra_compile_args_linux", "extra-compile-args-linux")
69+
)
70+
extra_compile_args_darwin: list[str] = Field(
71+
default_factory=list, validation_alias=AliasChoices("extra_compile_args_darwin", "extra-compile-args-darwin")
72+
)
73+
extra_compile_args_win32: list[str] = Field(
74+
default_factory=list, validation_alias=AliasChoices("extra_compile_args_win32", "extra-compile-args-win32")
75+
)
76+
77+
extra_link_args: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_link_args", "extra-link-args"))
78+
extra_link_args_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_link_args_linux", "extra-link-args-linux"))
79+
extra_link_args_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_link_args_darwin", "extra-link-args-darwin"))
80+
extra_link_args_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_link_args_win32", "extra-link-args-win32"))
81+
82+
extra_objects: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_objects", "extra-objects"))
83+
extra_objects_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_objects_linux", "extra-objects-linux"))
84+
extra_objects_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_objects_darwin", "extra-objects-darwin"))
85+
extra_objects_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("extra_objects_win32", "extra-objects-win32"))
86+
87+
define_macros: list[str] = Field(default_factory=list, validation_alias=AliasChoices("define_macros", "define-macros"))
88+
define_macros_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("define_macros_linux", "define-macros-linux"))
89+
define_macros_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("define_macros_darwin", "define-macros-darwin"))
90+
define_macros_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("define_macros_win32", "define-macros-win32"))
91+
92+
undef_macros: list[str] = Field(default_factory=list, validation_alias=AliasChoices("undef_macros", "undef-macros"))
93+
undef_macros_linux: list[str] = Field(default_factory=list, validation_alias=AliasChoices("undef_macros_linux", "undef-macros-linux"))
94+
undef_macros_darwin: list[str] = Field(default_factory=list, validation_alias=AliasChoices("undef_macros_darwin", "undef-macros-darwin"))
95+
undef_macros_win32: list[str] = Field(default_factory=list, validation_alias=AliasChoices("undef_macros_win32", "undef-macros-win32"))
96+
97+
export_symbols: list[str] = Field(default_factory=list, validation_alias=AliasChoices("export_symbols", "export-symbols"))
9298
depends: list[str] = Field(default_factory=list)
9399

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

96102
@field_validator("py_limited_api", mode="before")
97103
@classmethod

‎hatch_cpp/toolchains/vcpkg.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"arm64-windows-static-md",
3232
"wasm32-emscripten",
3333
]
34-
VcpkgPlatformDefaults = {
34+
VcpkgPlatformDefaults: dict[tuple[str, str], VcpkgTriplet] = {
3535
("linux", "x86_64"): "x64-linux",
3636
("linux", "aarch64"): "arm64-linux",
3737
("darwin", "x86_64"): "x64-osx",
@@ -65,7 +65,7 @@ def _read_vcpkg_ref_from_gitmodules(vcpkg_root: Path) -> str | None:
6565

6666
class HatchCppVcpkgConfiguration(BaseModel):
6767
vcpkg: str | None = Field(default="vcpkg.json")
68-
vcpkg_root: Path | None = Field(default=Path("vcpkg"))
68+
vcpkg_root: Path = Field(default=Path("vcpkg"))
6969
vcpkg_repo: str | None = Field(default="https://github.com/microsoft/vcpkg.git")
7070
vcpkg_triplet: VcpkgTriplet | None = Field(default=None)
7171
vcpkg_ref: str | None = Field(

0 commit comments

Comments
 (0)