Add checker classes for options used in the wrong project

Signed-off-by: Gilles Peskine <[email protected]>
This commit is contained in:
Gilles Peskine
2025-09-19 21:12:20 +02:00
parent b74b7c7f1e
commit f7efa1436d
@@ -14,7 +14,7 @@ import re
import sys
import textwrap
import typing
from typing import Iterator, List
from typing import Iterator, List, Optional
from . import build_tree
from . import typing_util
@@ -106,6 +106,68 @@ class Internal(Checker):
"""Checker for an internal-only option."""
class SubprojectInternal(Checker):
"""Checker for an internal macro of a subproject."""
# meant to be overridden in child classes
SUBPROJECT = None #type: Optional[str]
def __init__(self, name: str, suggestion: str = '',
subproject: Optional[str] = None) -> None:
super().__init__(name, suggestion)
if subproject is not None:
self.subproject = subproject
elif self.SUBPROJECT is not None:
self.subproject = self.SUBPROJECT
else:
raise ValueError('No subproject specified for ' + name)
def _basic_message(self) -> str:
return f'{self.name} is an internal macro of {self.subproject} and may not be configured.'
def before(self, prefix: str) -> str:
return f'''
#if defined({self.name})
# define {prefix}_WASSET_{self.name} 1
#else
# define {prefix}_WASSET_{self.name} 0
#endif
#undef {self.name}
'''
def user(self, prefix: str) -> str:
return f'''
#if defined({self.name})
# error {self._quoted_message()}
#endif
#if {prefix}_WASSET_{self.name}
# define {self.name}
#endif
#undef {prefix}_WASSET_{self.name}
'''
class SubprojectOption(SubprojectInternal):
"""Checker for a configuration option of a subproject."""
def __init__(self, name: str, subproject: Optional[str] = None) -> None:
super().__init__(name, subproject=subproject)
def _basic_message(self) -> str:
return f'{self.name} must be configured in {self.subproject}.'
def user(self, prefix: str) -> str:
return f'''
#if defined({self.name}) && !{prefix}_WASSET_{self.name}
# error {self._quoted_message()}
#endif
#if {prefix}_WASSET_{self.name}
# define {self.name}
#endif
#undef {prefix}_WASSET_{self.name}
'''
class Removed(Checker):
"""Checker for an option that has been removed."""