scikit-build-core icon indicating copy to clipboard operation
scikit-build-core copied to clipboard

Possibly misleading warning about including ninja in `build-system.requires`

Open gareth-cross opened this issue 11 months ago • 5 comments
trafficstars

  • scikit-build-core version: 0.10.7
  • python version: 3.12.7
  • OS: Mac OS X (although this happens on linux as well)

My pyproject.toml (full source) contains the following lines in the build-system section:

[build-system]
requires = [
    "scikit-build-core==0.10.7",
    "cmake>=3.20",
    "ninja>=1.5",
    "mypy==1.9.0",
]
build-backend = "scikit_build_core.build"

I also have the following in the sckit-build section:

[tool.scikit-build]
cmake.version = ">=3.20"
# ...
ninja.version = ">=1.5"

When running pip wheel --verbose, I always see the following warnings:

  Running command Preparing metadata (pyproject.toml)
  2024-11-28 11:30:58,845 - scikit_build_core - WARNING - cmake should not be in build-system.requires - scikit-build-core will inject it as needed
  2024-11-28 11:30:58,845 - scikit_build_core - WARNING - ninja should not be in build-system.requires - scikit-build-core will inject it as needed
  *** scikit-build-core 0.10.7 using CMake 3.31.1 (metadata_wheel)
  Preparing metadata (pyproject.toml) ... done
...
  2024-11-28 11:30:59,407 - scikit_build_core - WARNING - cmake should not be in build-system.requires - scikit-build-core will inject it as needed
  2024-11-28 11:30:59,407 - scikit_build_core - WARNING - ninja should not be in build-system.requires - scikit-build-core will inject it as needed

The warning about ninja appears to be incorrect though, since removing it from build-system.requires breaks the build with:

  *** scikit-build-core 0.10.7 using CMake 3.29.2 (wheel)
  *** Configuring CMake...
  Traceback (most recent call last):
  ...
    File "/private/var/folders/j7/mfkd_rrx1lx_qnvj8mpylqrh0000gn/T/pip-build-env-y0a9qq7d/overlay/lib/python3.12/site-packages/scikit_build_core/build/__init__.py", line 33, in build_wheel
      return _build_wheel_impl(
             ^^^^^^^^^^^^^^^^^^
    File "/private/var/folders/j7/mfkd_rrx1lx_qnvj8mpylqrh0000gn/T/pip-build-env-y0a9qq7d/overlay/lib/python3.12/site-packages/scikit_build_core/build/wheel.py", line 175, in _build_wheel_impl
      return _build_wheel_impl_impl(
             ^^^^^^^^^^^^^^^^^^^^^^^
    File "/private/var/folders/j7/mfkd_rrx1lx_qnvj8mpylqrh0000gn/T/pip-build-env-y0a9qq7d/overlay/lib/python3.12/site-packages/scikit_build_core/build/wheel.py", line 402, in _build_wheel_impl_impl
      builder.configure(
    File "/private/var/folders/j7/mfkd_rrx1lx_qnvj8mpylqrh0000gn/T/pip-build-env-y0a9qq7d/overlay/lib/python3.12/site-packages/scikit_build_core/builder/builder.py", line 166, in configure
      local_def = set_environment_for_gen(
                  ^^^^^^^^^^^^^^^^^^^^^^^^
    File "/private/var/folders/j7/mfkd_rrx1lx_qnvj8mpylqrh0000gn/T/pip-build-env-y0a9qq7d/overlay/lib/python3.12/site-packages/scikit_build_core/builder/generator.py", line 130, in set_environment_for_gen
      raise NinjaNotFoundError(msg)
  scikit_build_core.errors.NinjaNotFoundError: Ninja is required to build
  error: subprocess-exited-with-error

It would be good to get clarification on this point - is ninja required in build-system.requires? Maybe the warning is incorrect.

gareth-cross avatar Nov 28 '24 19:11 gareth-cross

This looks like it might be a bug. Any special setup on your system? I can try it soonish.

Also, if you enable logging, it should tell you if it finds ninja.

henryiii avatar Nov 28 '24 20:11 henryiii

Ah, got it. You have the default ninja.make-fallback = true, but you are forcing Ninja via -GNinja. I think we might be able to change the default for this parameter is the generator is selected, we do have the ability to detect what you've selected. You can set ninja.make-fallback = false to fix. Or remove the explicit generator selection if you are okay with the fallback.

henryiii avatar Nov 28 '24 20:11 henryiii

Ah, got it. You have the default ninja.make-fallback = true, but you are forcing Ninja via -GNinja. I think we might be able to change the default for this parameter is the generator is selected, we do have the ability to detect what you've selected. You can set ninja.make-fallback = false to fix. Or remove the explicit generator selection if you are okay with the fallback.

I think maybe that is backwards? I have ninja.make-fallback = false presently on line 52. If I understand that setting, it means ninja will always be required/used (which is what I want). Do I have that correct?

The -G Ninja arg was explicitly set because I found that scikit-build-core would fall back to MSBuild on Windows (at least as far as I recall, it is has been a while since I set that), and I would rather force it to use Ninja everywhere.

gareth-cross avatar Nov 28 '24 23:11 gareth-cross

Yes, the option would allow to fallback to make (and maybe msvc). I think we should flip the default because it would make the builds more predictable by default. Maybe the tricky build to consider would be msvc

LecrisUT avatar Nov 29 '24 07:11 LecrisUT

The behavior I would like to achieve is:

  • ninja is the only build system used on all platforms.
  • If ninja is not available or cannot be installed, fail (no fallback).
  • scikit-build-core adds ninja to the requirements automatically (I sort of thought this was the expected behavior because of the warning, but maybe not?)

My understanding is that my current configuration already achieves this because:

  • I have set make_fallback = false
  • I have placed ninja in my build-system.requirements.

Do I have all that correct?

gareth-cross avatar Dec 04 '24 06:12 gareth-cross