Backport from https://www.riverbankcomputing.com/hg/sip/ changeset: 2771:8543f04b374f branch: 6.6-maint tag: tip user: Phil Thompson date: Tue May 10 13:58:28 2022 +0100 summary: Fixed the PEP571 backend to handle multiple instances of the same config changeset: 2769:c02af095a016 branch: 6.6-maint user: Phil Thompson date: Sat May 07 15:18:14 2022 +0100 summary: Fix an API backward incompatibility. changeset: 2768:98dbce3e62f1 branch: 6.6-maint user: Phil Thompson date: Sat May 07 15:03:49 2022 +0100 summary: Any config settings passed by a PEP 571 frontend are now used. diff -r 8583e2bb1b32 sipbuild/abstract_project.py --- a/sipbuild/abstract_project.py Thu Nov 25 18:15:32 2021 +0000 +++ b/sipbuild/abstract_project.py Tue May 10 16:15:30 2022 +0200 @@ -1,4 +1,4 @@ -# Copyright (c) 2020, Riverbank Computing Limited +# Copyright (c) 2022, Riverbank Computing Limited # All rights reserved. # # This copy of SIP is licensed for use under the terms of the SIP License @@ -34,7 +34,7 @@ """ This specifies the API of a project. """ @classmethod - def bootstrap(cls, tool, tool_description=''): + def bootstrap(cls, tool, tool_description='', arguments=None): """ Return an AbstractProject instance fully configured for a particular command line tool. """ @@ -79,6 +79,10 @@ "The project factory did not return an AbstractProject " "object") + # We set this as an attribute rather than change the API of the ctor or + # setup(). + project.arguments = arguments + # Complete the configuration of the project. project.setup(pyproject, tool, tool_description) diff -r 8583e2bb1b32 sipbuild/api.py --- a/sipbuild/api.py Thu Nov 25 18:15:32 2021 +0000 +++ b/sipbuild/api.py Tue May 10 16:15:30 2022 +0200 @@ -1,4 +1,4 @@ -# Copyright (c) 2019, Riverbank Computing Limited +# Copyright (c) 2022, Riverbank Computing Limited # All rights reserved. # # This copy of SIP is licensed for use under the terms of the SIP License @@ -28,10 +28,8 @@ def build_sdist(sdist_directory, config_settings=None): """ The PEP 517 hook for building an sdist from pyproject.toml. """ - # Note that we ignore config_settings until we have a frontend that we can - # fully test with. (pip seems lacking at the moment.) - - project = AbstractProject.bootstrap('pep517') + project = AbstractProject.bootstrap('sdist', + arguments=_convert_config_settings(config_settings)) # pip executes this in a separate process and doesn't handle exceptions # very well. However it does capture stdout and (eventually) show it to @@ -45,10 +43,8 @@ def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): """ The PEP 517 hook for building a wheel from pyproject.toml. """ - # Note that we ignore config_settings until we have a frontend that we can - # fully test with. (pip seems lacking at the moment.) - - project = AbstractProject.bootstrap('pep517') + project = AbstractProject.bootstrap('wheel', + arguments=_convert_config_settings(config_settings)) # pip executes this in a separate process and doesn't handle exceptions # very well. However it does capture stdout and (eventually) show it to @@ -57,3 +53,26 @@ return project.build_wheel(wheel_directory) except Exception as e: handle_exception(e) + + +def _convert_config_settings(config_settings): + """ Return any configuration settings from the frontend to a pseudo-command + line. + """ + + if config_settings is None: + config_settings = {} + + args = [] + + for name, value in config_settings.items(): + if value: + if not isinstance(value, list): + value = [value] + + for m_value in value: + args.append(name + '=' + m_value) + else: + args.append(name) + + return args diff -r 8583e2bb1b32 sipbuild/configurable.py --- a/sipbuild/configurable.py Thu Nov 25 18:15:32 2021 +0000 +++ b/sipbuild/configurable.py Tue May 10 16:15:30 2022 +0200 @@ -1,4 +1,4 @@ -# Copyright (c) 2021, Riverbank Computing Limited +# Copyright (c) 2022, Riverbank Computing Limited # All rights reserved. # # This copy of SIP is licensed for use under the terms of the SIP License @@ -244,7 +244,7 @@ """ # The tools that will build a set of bindings. - BUILD_TOOLS = ('build', 'install', 'pep517', 'wheel') + BUILD_TOOLS = ('build', 'install', 'wheel') # All the valid tools. _ALL_TOOLS = BUILD_TOOLS + ('sdist', ) diff -r 8583e2bb1b32 sipbuild/project.py --- a/sipbuild/project.py Thu Nov 25 18:15:32 2021 +0000 +++ b/sipbuild/project.py Tue May 10 16:15:30 2022 +0200 @@ -155,6 +155,7 @@ # The current directory should contain the .toml file. self.root_dir = os.getcwd() + self.arguments = None self.bindings = collections.OrderedDict() self.bindings_factories = [] self.builder = None @@ -204,11 +205,6 @@ def apply_user_defaults(self, tool): """ Set default values for user options that haven't been set yet. """ - # If we are the backend to a 3rd-party frontend (most probably pip) - # then let it handle the verbosity of messages. - if self.verbose is None and tool == '': - self.verbose = True - # This is only used when creating sdist and wheel files. if self.name is None: self.name = self.metadata['name'] @@ -569,14 +565,9 @@ # Set the initial configuration from the pyproject.toml file. self._set_initial_configuration(pyproject, tool) - # Add any tool-specific command line options for (so far unspecified) + # Add any tool-specific command line arguments for (so far unspecified) # parts of the configuration. - if tool != 'pep517': - self._configure_from_command_line(tool, tool_description) - else: - # Until pip improves it's error reporting we give the user all the - # help we can. - self.verbose = True + self._configure_from_arguments(tool, tool_description) # Now that any help has been given we can report a problematic # pyproject.toml file. @@ -712,8 +703,8 @@ for bindings in self.bindings.values(): bindings.verify_configuration(tool) - def _configure_from_command_line(self, tool, tool_description): - """ Update the configuration from the user supplied command line. """ + def _configure_from_arguments(self, tool, tool_description): + """ Update the configuration from any user supplied arguments. """ from argparse import SUPPRESS from .argument_parser import ArgumentParser @@ -739,7 +730,7 @@ bindings.add_command_line_options(parser, tool, all_options) # Parse the arguments and update the corresponding configurables. - args = parser.parse_args() + args = parser.parse_args(self.arguments) for option, configurables in all_options.items(): for configurable in configurables: