1010from contextlib import contextmanager
1111from dataclasses import asdict , dataclass
1212from pathlib import Path
13- from typing import Any , Dict , Generator , Iterator , List , Mapping , Union , cast
13+ from typing import Any , Callable , Dict , Generator , Iterator , List , Mapping , Union , cast
1414
1515if sys .version_info >= (3 , 11 ):
1616 import tomllib
2323from .environment import EnvironmentParseError , ParsedEnvironment , parse_environment
2424from .oci_container import ContainerEngine
2525from .projectfiles import get_requires_python_str
26- from .typing import PLATFORMS , Literal , PlatformName , TypedDict
26+ from .typing import PLATFORMS , Literal , NotRequired , PlatformName , TypedDict
2727from .util import (
2828 MANYLINUX_ARCHS ,
2929 MUSLLINUX_ARCHS ,
@@ -123,6 +123,7 @@ class Override:
123123class TableFmt (TypedDict ):
124124 item : str
125125 sep : str
126+ quote : NotRequired [Callable [[str ], str ]]
126127
127128
128129class ConfigOptionError (KeyError ):
@@ -329,7 +330,7 @@ def get(
329330 if table is None :
330331 raise ConfigOptionError (f"{ name !r} does not accept a table" )
331332 return table ["sep" ].join (
332- item for k , v in result .items () for item in _inner_fmt (k , v , table [ "item" ] )
333+ item for k , v in result .items () for item in _inner_fmt (k , v , table )
333334 )
334335
335336 if isinstance (result , list ):
@@ -343,14 +344,16 @@ def get(
343344 return result
344345
345346
346- def _inner_fmt (k : str , v : Any , table_item : str ) -> Iterator [str ]:
347+ def _inner_fmt (k : str , v : Any , table : TableFmt ) -> Iterator [str ]:
348+ quote_function = table .get ("quote" , lambda a : a )
349+
347350 if isinstance (v , list ):
348351 for inner_v in v :
349- qv = shlex . quote (inner_v )
350- yield table_item .format (k = k , v = qv )
352+ qv = quote_function (inner_v )
353+ yield table [ "item" ] .format (k = k , v = qv )
351354 else :
352- qv = shlex . quote (v )
353- yield table_item .format (k = k , v = qv )
355+ qv = quote_function (v )
356+ yield table [ "item" ] .format (k = k , v = qv )
354357
355358
356359class Options :
@@ -449,13 +452,13 @@ def build_options(self, identifier: str | None) -> BuildOptions:
449452
450453 build_frontend_str = self .reader .get ("build-frontend" , env_plat = False )
451454 environment_config = self .reader .get (
452- "environment" , table = {"item" : " {k}={v}" , "sep" : " " }
455+ "environment" , table = {"item" : ' {k}=" {v}"' , "sep" : " " }
453456 )
454457 environment_pass = self .reader .get ("environment-pass" , sep = " " ).split ()
455458 before_build = self .reader .get ("before-build" , sep = " && " )
456459 repair_command = self .reader .get ("repair-wheel-command" , sep = " && " )
457460 config_settings = self .reader .get (
458- "config-settings" , table = {"item" : "{k}={v}" , "sep" : " " }
461+ "config-settings" , table = {"item" : "{k}={v}" , "sep" : " " , "quote" : shlex . quote }
459462 )
460463
461464 dependency_versions = self .reader .get ("dependency-versions" )
0 commit comments