Skip to content

Commit

Permalink
Enable the use of get_option() as a parameter for project()
Browse files Browse the repository at this point in the history
  • Loading branch information
bcorby committed Dec 16, 2024
1 parent 0b41b36 commit d9edc16
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 24 deletions.
50 changes: 26 additions & 24 deletions mesonbuild/interpreter/interpreter.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright 2012-2021 The Meson development team
# Copyright © 2023-2024 Intel Corporation

Expand Down Expand Up @@ -1085,6 +1084,7 @@ def get_option_internal(self, optname: str) -> options.UserOption:
def func_get_option(self, nodes: mparser.BaseNode, args: T.Tuple[str],
kwargs: 'TYPE_kwargs') -> T.Union[options.UserOption, 'TYPE_var']:
optname = args[0]
self.load_options(nodes, args)
if ':' in optname:
raise InterpreterException('Having a colon in option name is forbidden, '
'projects are not allowed to directly access '
Expand Down Expand Up @@ -1148,6 +1148,23 @@ def set_backend(self) -> None:
options = {k: v for k, v in self.environment.options.items() if self.environment.coredata.optstore.is_backend_option(k)}
self.coredata.set_options(options)

def load_options(self, node: mparser.FunctionNode, args: T.Tuple[str, T.List[str]]) -> None:
option_file = os.path.join(self.source_root, self.subdir, 'meson.options')
old_option_file = os.path.join(self.source_root, self.subdir, 'meson_options.txt')
if not os.path.exists(option_file):
option_file = old_option_file
if os.path.exists(option_file):
with open(option_file, 'rb') as f:
# We want fast not cryptographically secure, this is just to
# see if the option file has changed
self.coredata.options_files[self.subproject] = (option_file, hashlib.sha1(f.read()).hexdigest())
oi = optinterpreter.OptionInterpreter(self.environment.coredata.optstore, self.subproject)
oi.process(option_file)
self.coredata.update_project_options(oi.options, self.subproject)
self.add_build_def_file(option_file)
else:
self.coredata.options_files[self.subproject] = None

@typed_pos_args('project', str, varargs=str)
@typed_kwargs(
'project',
Expand All @@ -1169,19 +1186,9 @@ def func_project(self, node: mparser.FunctionNode, args: T.Tuple[str, T.List[str
if ':' in proj_name:
raise InvalidArguments(f"Project name {proj_name!r} must not contain ':'")

# This needs to be evaluated as early as possible, as meson uses this
# for things like deprecation testing.
if kwargs['meson_version']:
self.handle_meson_version(kwargs['meson_version'], node)
else:
mesonlib.project_meson_versions[self.subproject] = mesonlib.NoProjectVersion()

# Load "meson.options" before "meson_options.txt", and produce a warning if
# it is being used with an old version. I have added check that if both
# exist the warning isn't raised
# Warn about meson.options / meson_options.txt.
option_file = os.path.join(self.source_root, self.subdir, 'meson.options')
old_option_file = os.path.join(self.source_root, self.subdir, 'meson_options.txt')

if os.path.exists(option_file):
if os.path.exists(old_option_file):
if os.path.samefile(option_file, old_option_file):
Expand All @@ -1190,19 +1197,14 @@ def func_project(self, node: mparser.FunctionNode, args: T.Tuple[str, T.List[str
raise MesonException("meson.options and meson_options.txt both exist, but are not the same file.")
else:
FeatureNew.single_use('meson.options file', '1.1', self.subproject, 'Use meson_options.txt instead')
self.load_options(node, args)

# This needs to be evaluated as early as possible, as meson uses this
# for things like deprecation testing.
if kwargs['meson_version']:
self.handle_meson_version(kwargs['meson_version'], node)
else:
option_file = old_option_file
if os.path.exists(option_file):
with open(option_file, 'rb') as f:
# We want fast not cryptographically secure, this is just to
# see if the option file has changed
self.coredata.options_files[self.subproject] = (option_file, hashlib.sha1(f.read()).hexdigest())
oi = optinterpreter.OptionInterpreter(self.environment.coredata.optstore, self.subproject)
oi.process(option_file)
self.coredata.update_project_options(oi.options, self.subproject)
self.add_build_def_file(option_file)
else:
self.coredata.options_files[self.subproject] = None
mesonlib.project_meson_versions[self.subproject] = mesonlib.NoProjectVersion()

if self.subproject:
self.project_default_options = {k.evolve(subproject=self.subproject): v
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Project
project('test',
version: '1.0' + get_option('append_to_version')
)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
option('append_to_version', type : 'string', value : '.0001', description : 'append to version')

0 comments on commit d9edc16

Please sign in to comment.