Skip to content

Commit

Permalink
Add a feature fixed warning message
Browse files Browse the repository at this point in the history
  • Loading branch information
bcorby committed Dec 17, 2024
1 parent 6732933 commit 1fd24d2
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 1 deletion.
7 changes: 6 additions & 1 deletion mesonbuild/interpreter/interpreter.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
from ..interpreterbase import noPosargs, noKwargs, permittedKwargs, noArgsFlattening, noSecondLevelHolderResolving, unholder_return
from ..interpreterbase import InterpreterException, InvalidArguments, InvalidCode, SubdirDoneRequest
from ..interpreterbase import Disabler, disablerIfNotFound
from ..interpreterbase import FeatureNew, FeatureDeprecated, FeatureBroken, FeatureNewKwargs
from ..interpreterbase import FeatureNew, FeatureFixed, FeatureDeprecated, FeatureBroken, FeatureNewKwargs
from ..interpreterbase import ObjectHolder, ContextManagerObject
from ..interpreterbase import stringifyUserArguments
from ..modules import ExtensionModule, ModuleObject, MutableModuleObject, NewExtensionModule, NotFoundExtensionModule
Expand Down Expand Up @@ -1084,6 +1084,7 @@ def get_option_internal(self, optname: str) -> options.UserOption:
@noKwargs
def func_get_option(self, nodes: mparser.BaseNode, args: T.Tuple[str],
kwargs: 'TYPE_kwargs') -> T.Union[options.UserOption, 'TYPE_var']:
self.get_option_used = True
optname = args[0]
if ':' in optname:
raise InterpreterException('Having a colon in option name is forbidden, '
Expand Down Expand Up @@ -1209,6 +1210,10 @@ def func_project(self, node: mparser.FunctionNode, args: T.Tuple[str, T.List[str
else:
FeatureNew.single_use('meson.options file', '1.1', self.subproject, 'Use meson_options.txt instead')

# Warn about using get_option() in project().
if hasattr(self, 'get_option_used'):
FeatureFixed.single_use('Using get_option() function as a parameter to project()', '1.7', self.subproject)

if self.subproject:
self.project_default_options = {k.evolve(subproject=self.subproject): v
for k, v in kwargs['default_options'].items()}
Expand Down
4 changes: 4 additions & 0 deletions mesonbuild/interpreterbase/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,11 @@
'typed_kwargs',
'FeatureCheckBase',
'FeatureNew',
'FeatureFixed',
'FeatureDeprecated',
'FeatureBroken',
'FeatureNewKwargs',
'FeatureFixedKwargs',
'FeatureDeprecatedKwargs',

'InterpreterBase',
Expand Down Expand Up @@ -98,9 +100,11 @@
typed_kwargs,
FeatureCheckBase,
FeatureNew,
FeatureFixed,
FeatureDeprecated,
FeatureBroken,
FeatureNewKwargs,
FeatureFixedKwargs,
FeatureDeprecatedKwargs,
)

Expand Down
46 changes: 46 additions & 0 deletions mesonbuild/interpreterbase/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -700,6 +700,49 @@ def log_usage_warning(self, tv: T.Union[str, mesonlib.NoProjectVersion], locatio
args.append(self.extra_message)
mlog.warning(*args, location=location)

class FeatureFixed(FeatureCheckBase):
"""Checks for fixed features"""

# Class variable, shared across all instances
#
# Format: {subproject: {feature_version: set(feature_names)}}
feature_registry = {}

@staticmethod
def check_version(target_version: T.Union[str, mesonlib.NoProjectVersion], feature_version: str) -> bool:
if isinstance(target_version, str):
return mesonlib.version_compare_condition_with_min(target_version, feature_version)
else:
# Warn for anything newer than the current semver base slot.
major = coredata.version.split('.', maxsplit=1)[0]
return mesonlib.version_compare(feature_version, f'<{major}.0')

@staticmethod
def get_warning_str_prefix(tv: T.Union[str, mesonlib.NoProjectVersion]) -> str:
if isinstance(tv, str):
return f'Project specifies a minimum meson_version \'{tv}\' but uses features which were fixed in newer versions:'
else:
return 'Project specifies no minimum version but uses features which were fixed in versions:'

@staticmethod
def get_notice_str_prefix(tv: T.Union[str, mesonlib.NoProjectVersion]) -> str:
return ''

def log_usage_warning(self, tv: T.Union[str, mesonlib.NoProjectVersion], location: T.Optional['mparser.BaseNode']) -> None:
if isinstance(tv, str):
prefix = f'Project targets {tv!r}'
else:
prefix = 'Project does not target a minimum version'
args = [
prefix,
'but uses a feature fixed in',
f"'{self.feature_version}':",
f'{self.feature_name}.',
]
if self.extra_message:
args.append(self.extra_message)
mlog.warning(*args, location=location)

class FeatureDeprecated(FeatureCheckBase):
"""Checks for deprecated features"""

Expand Down Expand Up @@ -809,5 +852,8 @@ def wrapped(*wrapped_args: T.Any, **wrapped_kwargs: T.Any) -> T.Any:
class FeatureNewKwargs(FeatureCheckKwargsBase):
feature_check_class = FeatureNew

class FeatureFixedKwargs(FeatureCheckKwargsBase):
feature_check_class = FeatureFixed

class FeatureDeprecatedKwargs(FeatureCheckKwargsBase):
feature_check_class = FeatureDeprecated

0 comments on commit 1fd24d2

Please sign in to comment.