this reads ok to me... On Sun, Nov 8, 2015 at 9:20 PM, Nathaniel Smith <n...@pobox.com> wrote:
> Hi all, > > Following the strategy of trying to break out the different > controversial parts of the new build system interface, here's some > proposed text defining the environment that a build frontend like pip > provides to a project-specific build backend. > > Robert's PEP currently disclaims all of this as out-of-scope, but I > think it's good to get something down, since in practice we'll have to > figure something out before any implementations can exist. And I think > the text below pretty much hits the right points. > > What might be controversial about this nonetheless is that I'm not > sure that pip *can* reasonably implement all the requirements as > written without adding a dependency on virtualenv (at least for older > pythons -- obviously this is no big deal for new pythons since venv is > now part of the stdlib). I think the requirements are correct, so... > Donald, what do you think? > > -n > > ---- > > The build environment > --------------------- > > One of the responsibilities of a build frontend is to set up the > environment in which the build backend will run. > > We do not require that any particular "virtual environment" mechanism > be used; a build frontend might use virtualenv, or venv, or no special > mechanism at all. But whatever mechanism is used MUST meet the > following criteria: > > - All requirements specified by the project's build-requirements must > be available for import from Python. > > - This must remain true even for new Python subprocesses spawned by > the build environment, e.g. code like:: > > import sys, subprocess > subprocess.check_call([sys.executable, ...]) > > must spawn a Python process which has access to all the project's > build-requirements. This is necessary e.g. for build backends that > want to run legacy ``setup.py`` scripts in a subprocess. > > [TBD: the exact wording here will probably need some tweaking > depending on whether we end up using an entrypoint-like mechanism for > specifying build backend hooks (in which case we can assume that hooks > automatically have access to sys.executable), or a subprocess-based > mechanism (in which case we'll need some other way to communicate the > path to the python interpreter to the build backend, e.g. a PYTHON= > envvar). But the basic requirement is pretty much the same either > way.] > > - All command-line scripts provided by the build-required packages > must be present in the build environment's PATH. For example, if a > project declares a build-requirement on `flit > <https://flit.readthedocs.org/en/latest/>`_, then the following must > work as a mechanism for running the flit command-line tool:: > > import subprocess > subprocess.check_call(["flit", ...]) > > A build backend MUST be prepared to function in any environment which > meets the above criteria. In particular, it MUST NOT assume that it > has access to any packages except those that are present in the > stdlib, or that are explicitly declared as build-requirements. > > > Recommendations for build frontends (non-normative) > ................................................... > > A build frontend MAY use any mechanism for setting up a build > environment that meets the above criteria. For example, simply > installing all build-requirements into the global environment would be > sufficient to build any compliant package -- but this would be > sub-optimal for a number of reasons. This section contains > non-normative advice to frontend implementors. > > A build frontend SHOULD, by default, create an isolated environment > for each build, containing only the standard library and any > explicitly requested build-dependencies. This has two benefits: > > - It allows for a single installation run to build multiple packages > that have contradictory build-requirements. E.g. if package1 > build-requires pbr==1.8.1, and package2 build-requires pbr==1.7.2, > then these cannot both be installed simultaneously into the global > environment -- which is a problem when the user requests ``pip install > package1 package2``. Or if the user already has pbr==1.8.1 installed > in their global environment, and a package build-requires pbr==1.7.2, > then downgrading the user's version would be rather rude. > > - It acts as a kind of public health measure to maximize the number of > packages that actually do declare accurate build-dependencies. We can > write all the strongly worded admonitions to package authors we want, > but if build frontends don't enforce isolation by default, then we'll > inevitably end up with lots of packages on PyPI that build fine on the > original author's machine and nowhere else, which is a headache that > no-one needs. > > However, there will also be situations where build-requirements are > problematic in various ways. For example, a package author might > accidentally leave off some crucial requirement despite our best > efforts; or, a package might declare a build-requirement on `foo >= > 1.0` which worked great when 1.0 was the latest version, but now 1.1 > is out and it has a showstopper bug; or, the user might decide to > build a package against numpy==1.7 -- overriding the package's > preferred numpy==1.8 -- to guarantee that the resulting build will be > compatible at the C ABI level with an older version of numpy (even if > this means the resulting build is unsupported upstream). Therefore, > build frontends SHOULD provide some mechanism for users to override > the above defaults. For example, a build frontend could have a > ``--build-with-system-site-packages`` option that causes the > ``--system-site-packages`` option to be passed to > virtualenv-or-equivalent when creating build environments, or a > ``--build-requirements-override=my-requirements.txt`` option that > overrides the project's normal build-requirements. > > The general principle here is that we want to enforce hygiene on > package *authors*, while still allowing *end-users* to open up the > hood and apply duct tape when necessary. > > > -- > Nathaniel J. Smith -- http://vorpus.org > _______________________________________________ > Distutils-SIG maillist - Distutils-SIG@python.org > https://mail.python.org/mailman/listinfo/distutils-sig >
_______________________________________________ Distutils-SIG maillist - Distutils-SIG@python.org https://mail.python.org/mailman/listinfo/distutils-sig