On Jun 2, 2017, at 12:39 PM, Paul Moore email@example.com wrote:
This is precisely the "should look like we built a sdist" principle, so I'm a solid +1 on this, too. It might be worth stating that copy_the_files is only intended to be called after a failed call to build_sdist. I don't know if backends would care, but I don't think we should worry about having to support use of copy_the_files as anything other than a build_sdist fallback.
Sorry? I assume here that you mean "directly call the build_wheel hook in the original source tree"? That's OK, but I think we should be clear that if this happens, it is the backend's responsibility to ensure that the build is equivalent to building from a sdist. It might even be appropriate for the front end to warn if this happens - "Unable to build out of tree - results may differ from a clean build" (The intent is to remind people that they aren't testing the actual sdist they will be deploying, the issue that Nick pointed out).
Should have kept reading before sending my email, sorry!
The steps here would basically be (for building from something that isn’t already a .tar.gz or a .whl):
# Get our backend using the PEP 517 resolving methods
backend = get_the_backend()
# Get a copied source tree that is acceptable for using to build a wheel. We
# allow copy_files to be used in place of build_sdist to provide an optimization
# in cases where build_sdist would be very slow. However the build backend
# must ensure that the resulting wheel would not be different than if we had
# built it from the sdist instead.
If hasattr(backend, “copy_files”): try: backend.copy_files(…) except Exception: backend.build_sdist(…) else: backend.build_sdist(…)
# Determine what depends we need to install the wheel file, we allow the
# build tool to optionally give us the deps without actually invoking the wheel build
# as an optimization that building the wheel might take awhile, however
# the build backend must ensure that the metadata returned here matches the final
# wheel built.
If hasattr(backend, “get_wheel_metadata”): backend.get_wheel_metadata(…) has_already_built_wheel = False else: backend.build_wheel(…) has_already_built_wheel = True
# Resolve dependencies, etc
# Go on to build the wheel if we haven’t already built it.
If not has_already_built_wheel: backend.build_wheel(…)
# Install the wheel
— Donald Stufft