mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
	
	
		
			111 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								OS = sys.platform
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def _as_tuple(items):
							 | 
						||
| 
								 | 
							
								    if isinstance(items, str):
							 | 
						||
| 
								 | 
							
								        return tuple(items.strip().replace(',', ' ').split())
							 | 
						||
| 
								 | 
							
								    elif items:
							 | 
						||
| 
								 | 
							
								        return tuple(items)
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        return ()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class PreprocessorError(Exception):
							 | 
						||
| 
								 | 
							
								    """Something preprocessor-related went wrong."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    def _msg(cls, filename, reason, **ignored):
							 | 
						||
| 
								 | 
							
								        msg = 'failure while preprocessing'
							 | 
						||
| 
								 | 
							
								        if reason:
							 | 
						||
| 
								 | 
							
								            msg = f'{msg} ({reason})'
							 | 
						||
| 
								 | 
							
								        return msg
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self, filename, preprocessor=None, reason=None):
							 | 
						||
| 
								 | 
							
								        if isinstance(reason, str):
							 | 
						||
| 
								 | 
							
								            reason = reason.strip()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.filename = filename
							 | 
						||
| 
								 | 
							
								        self.preprocessor = preprocessor or None
							 | 
						||
| 
								 | 
							
								        self.reason = str(reason) if reason else None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        msg = self._msg(**vars(self))
							 | 
						||
| 
								 | 
							
								        msg = f'({filename}) {msg}'
							 | 
						||
| 
								 | 
							
								        if preprocessor:
							 | 
						||
| 
								 | 
							
								            msg = f'[{preprocessor}] {msg}'
							 | 
						||
| 
								 | 
							
								        super().__init__(msg)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class PreprocessorFailure(PreprocessorError):
							 | 
						||
| 
								 | 
							
								    """The preprocessor command failed."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    def _msg(cls, error, **ignored):
							 | 
						||
| 
								 | 
							
								        msg = 'preprocessor command failed'
							 | 
						||
| 
								 | 
							
								        if error:
							 | 
						||
| 
								 | 
							
								            msg = f'{msg} {error}'
							 | 
						||
| 
								 | 
							
								        return msg
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self, filename, argv, error=None, preprocessor=None):
							 | 
						||
| 
								 | 
							
								        exitcode = -1
							 | 
						||
| 
								 | 
							
								        if isinstance(error, tuple):
							 | 
						||
| 
								 | 
							
								            if len(error) == 2:
							 | 
						||
| 
								 | 
							
								                error, exitcode = error
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                error = str(error)
							 | 
						||
| 
								 | 
							
								        if isinstance(error, str):
							 | 
						||
| 
								 | 
							
								            error = error.strip()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.argv = _as_tuple(argv) or None
							 | 
						||
| 
								 | 
							
								        self.error = error if error else None
							 | 
						||
| 
								 | 
							
								        self.exitcode = exitcode
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        reason = str(self.error)
							 | 
						||
| 
								 | 
							
								        super().__init__(filename, preprocessor, reason)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class ErrorDirectiveError(PreprocessorFailure):
							 | 
						||
| 
								 | 
							
								    """The file hit a #error directive."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    def _msg(cls, error, **ignored):
							 | 
						||
| 
								 | 
							
								        return f'#error directive hit ({error})'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self, filename, argv, error, *args, **kwargs):
							 | 
						||
| 
								 | 
							
								        super().__init__(filename, argv, error, *args, **kwargs)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class MissingDependenciesError(PreprocessorFailure):
							 | 
						||
| 
								 | 
							
								    """The preprocessor did not have access to all the target's dependencies."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    def _msg(cls, missing, **ignored):
							 | 
						||
| 
								 | 
							
								        msg = 'preprocessing failed due to missing dependencies'
							 | 
						||
| 
								 | 
							
								        if missing:
							 | 
						||
| 
								 | 
							
								            msg = f'{msg} ({", ".join(missing)})'
							 | 
						||
| 
								 | 
							
								        return msg
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self, filename, missing=None, *args, **kwargs):
							 | 
						||
| 
								 | 
							
								        self.missing = _as_tuple(missing) or None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        super().__init__(filename, *args, **kwargs)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class OSMismatchError(MissingDependenciesError):
							 | 
						||
| 
								 | 
							
								    """The target is not compatible with the host OS."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    def _msg(cls, expected, **ignored):
							 | 
						||
| 
								 | 
							
								        return f'OS is {OS} but expected {expected or "???"}'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self, filename, expected=None, *args, **kwargs):
							 | 
						||
| 
								 | 
							
								        if isinstance(expected, str):
							 | 
						||
| 
								 | 
							
								            expected = expected.strip()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.actual = OS
							 | 
						||
| 
								 | 
							
								        self.expected = expected if expected else None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        super().__init__(filename, None, *args, **kwargs)
							 |