aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter/interpreter.py
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2022-12-14 10:59:36 -0800
committerJussi Pakkanen <jpakkane@gmail.com>2023-03-28 15:01:10 +0300
commit4a014d17240f50059e20ccae3e9faaa395bdbf98 (patch)
tree4b2ae56e23db1cee4d04d602bfb1e154259cba36 /mesonbuild/interpreter/interpreter.py
parent65482497d326b0026eb11419d178d19b20ebe58b (diff)
downloadmeson-4a014d17240f50059e20ccae3e9faaa395bdbf98.zip
meson-4a014d17240f50059e20ccae3e9faaa395bdbf98.tar.gz
meson-4a014d17240f50059e20ccae3e9faaa395bdbf98.tar.bz2
Add support for meson.options as a replacement for meson_options.txt
We will still try to load `meson_options.txt` if `meson.options` doesn't exist. Because there are some advantages to using `meson.options` even with older versions of meson (such as better text editor handling) we will not warn about the existence of a `meson.options` file if a `meson_options.txt` file or symlink also exists. The name `meson.options` was picked instead of alternative proposals, such as `meson_options.build` for a couple of reasons: 1. meson.options is shorter 2. While the syntax is the same, only the `option()` function may be called in meson.options, while, it may not be called in meson.build 3. While the two files share a syntax and elementary types (strings, arrays, etc), they have different purposes: `meson.build` declares build targets, `meson.options` declares options. This is similar to the difference between C's `.c` and `.h` extensions. As an implementation detail `Interpreter.option_file` has been removed, as it is used exactly once, in the `project()` call to read the options, and we can just calculate it there and not store it. Fixes: #11176
Diffstat (limited to 'mesonbuild/interpreter/interpreter.py')
-rw-r--r--mesonbuild/interpreter/interpreter.py28
1 files changed, 22 insertions, 6 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index a033c4f..72bc8e2 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -23,8 +23,9 @@ from .. import compilers
from .. import envconfig
from ..wrap import wrap, WrapMode
from .. import mesonlib
-from ..mesonlib import (MesonBugException, HoldableObject, FileMode, MachineChoice, OptionKey,
- listify, extract_as_list, has_path_sep, PerMachine)
+from ..mesonlib import (MesonBugException, MesonException, HoldableObject,
+ FileMode, MachineChoice, OptionKey, listify,
+ extract_as_list, has_path_sep, PerMachine)
from ..programs import ExternalProgram, NonExistingExternalProgram
from ..dependencies import Dependency
from ..depfile import DepFile
@@ -290,7 +291,6 @@ class Interpreter(InterpreterBase, HoldableObject):
# be different for dependencies provided by wrap files.
self.subproject_directory_name = subdir.split(os.path.sep)[-1]
self.subproject_dir = subproject_dir
- self.option_file = os.path.join(self.source_root, self.subdir, 'meson_options.txt')
self.relaxations = relaxations or set()
if not mock and ast is None:
self.load_root_meson_file()
@@ -1174,11 +1174,27 @@ class Interpreter(InterpreterBase, HoldableObject):
if kwargs['meson_version']:
self.handle_meson_version(kwargs['meson_version'], node)
- if os.path.exists(self.option_file):
+ # 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
+ 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):
+ mlog.debug("Not warning about meson.options with version minimum < 1.1 because meson_options.txt also exists")
+ else:
+ 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')
+ else:
+ option_file = old_option_file
+ if os.path.exists(option_file):
oi = optinterpreter.OptionInterpreter(self.subproject)
- oi.process(self.option_file)
+ oi.process(option_file)
self.coredata.update_project_options(oi.options)
- self.add_build_def_file(self.option_file)
+ self.add_build_def_file(option_file)
# Do not set default_options on reconfigure otherwise it would override
# values previously set from command line. That means that changing