summaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2024-03-08 11:17:58 -0800
committerDylan Baker <dylan@pnwbakers.com>2024-03-18 16:06:37 -0700
commit2d7b7c3aaf23d08d51f375fa1eea80e0ffffed87 (patch)
treeb726492b80c80cfc234c21daceee700d1acabb77 /mesonbuild
parentc6875305f327a6be506d6544516f35e792f6d625 (diff)
downloadmeson-2d7b7c3aaf23d08d51f375fa1eea80e0ffffed87.tar.gz
mconf: Reload the options files if they have changed
This fixes issues where a new option is added, an option is removed, the constraints of an option are changed, an option file is added where one didn't previously exist, an option file is deleted, or it is renamed between meson_options.txt and meson.options There is one case that is known to not work, but it's probably a less common case, which is setting options for an unconfigured subproject. We could probably make that work in some cases, but I don't think it makes sense to download a wrap during meson configure.
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/interpreter/interpreter.py4
-rw-r--r--mesonbuild/mconf.py31
2 files changed, 32 insertions, 3 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 2c1ac89f6..730eddd4a 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -1190,8 +1190,8 @@ class Interpreter(InterpreterBase, HoldableObject):
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 of
- # the option file has changed
+ # 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.subproject)
oi.process(option_file)
diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py
index 8c18eab31..2cef24fd7 100644
--- a/mesonbuild/mconf.py
+++ b/mesonbuild/mconf.py
@@ -1,10 +1,11 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright 2014-2016 The Meson development team
-# Copyright © 2023 Intel Corporation
+# Copyright © 2023-2024 Intel Corporation
from __future__ import annotations
import itertools
+import hashlib
import shutil
import os
import textwrap
@@ -19,6 +20,7 @@ from . import mintro
from . import mlog
from .ast import AstIDGenerator, IntrospectionInterpreter
from .mesonlib import MachineChoice, OptionKey
+from .optinterpreter import OptionInterpreter
if T.TYPE_CHECKING:
from typing_extensions import Protocol
@@ -77,6 +79,33 @@ class Conf:
self.source_dir = self.build.environment.get_source_dir()
self.coredata = self.build.environment.coredata
self.default_values_only = False
+
+ # if the option file has been updated, reload it
+ # This cannot handle options for a new subproject that has not yet
+ # been configured.
+ for sub, options in self.coredata.options_files.items():
+ if options is not None and os.path.exists(options[0]):
+ opfile = options[0]
+ with open(opfile, 'rb') as f:
+ ophash = hashlib.sha1(f.read()).hexdigest()
+ if ophash != options[1]:
+ oi = OptionInterpreter(sub)
+ oi.process(opfile)
+ self.coredata.update_project_options(oi.options, sub)
+ self.coredata.options_files[sub] = (opfile, ophash)
+ else:
+ opfile = os.path.join(self.source_dir, 'meson.options')
+ if not os.path.exists(opfile):
+ opfile = os.path.join(self.source_dir, 'meson_options.txt')
+ if os.path.exists(opfile):
+ oi = OptionInterpreter(sub)
+ oi.process(opfile)
+ self.coredata.update_project_options(oi.options, sub)
+ with open(opfile, 'rb') as f:
+ ophash = hashlib.sha1(f.read()).hexdigest()
+ self.coredata.options_files[sub] = (opfile, ophash)
+ else:
+ self.coredata.update_project_options({}, sub)
elif os.path.isfile(os.path.join(self.build_dir, environment.build_filename)):
# Make sure that log entries in other parts of meson don't interfere with the JSON output
with mlog.no_logging():