aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/markdown/Machine-files.md3
-rw-r--r--docs/markdown/snippets/machine-files-case-insensitve.md6
-rw-r--r--mesonbuild/coredata.py8
-rwxr-xr-xrun_unittests.py4
-rw-r--r--test cases/common/43 options/meson.build8
-rw-r--r--test cases/common/43 options/meson_options.txt2
6 files changed, 28 insertions, 3 deletions
diff --git a/docs/markdown/Machine-files.md b/docs/markdown/Machine-files.md
index 5ac66a8..ab450cc 100644
--- a/docs/markdown/Machine-files.md
+++ b/docs/markdown/Machine-files.md
@@ -5,6 +5,9 @@ documentation on the common values used by both, for the specific values of
one or the other see the [cross compilation](Cross-compilation.md) and [native
environments](Native-environments.md).
+*Changed in 0.56.0* Keys within sections are now case sensitive. This is
+*required to make project options work correctly.
+
## Data Types
There are four basic data types in a machine file:
diff --git a/docs/markdown/snippets/machine-files-case-insensitve.md b/docs/markdown/snippets/machine-files-case-insensitve.md
new file mode 100644
index 0000000..cacd37c
--- /dev/null
+++ b/docs/markdown/snippets/machine-files-case-insensitve.md
@@ -0,0 +1,6 @@
+## Machine file keys are stored case sensitive
+
+Previous the keys were always lowered, which worked fine for the values that
+were allowed in the machine files. With the addition of per-project options
+we need to make these sensitive to case, as the options in meson_options.txt
+are sensitive to case already.
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
index 710d8c9..4be828b 100644
--- a/mesonbuild/coredata.py
+++ b/mesonbuild/coredata.py
@@ -850,13 +850,17 @@ class CoreData:
mlog.warning('Please see https://mesonbuild.com/Builtin-options.html#Notes_about_Apple_Bitcode_support for more details.', fatal=False)
class CmdLineFileParser(configparser.ConfigParser):
- def __init__(self):
+ def __init__(self) -> None:
# We don't want ':' as key delimiter, otherwise it would break when
# storing subproject options like "subproject:option=value"
super().__init__(delimiters=['='], interpolation=None)
+ def optionxform(self, option: str) -> str:
+ # Don't call str.lower() on keys
+ return option
+
class MachineFileParser():
- def __init__(self, filenames: T.List[str]):
+ def __init__(self, filenames: T.List[str]) -> None:
self.parser = CmdLineFileParser()
self.constants = {'True': True, 'False': False}
self.sections = {}
diff --git a/run_unittests.py b/run_unittests.py
index 3275a10..1fd436d 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -8179,7 +8179,9 @@ class NativeFileTests(BasePlatformTests):
testcase = os.path.join(self.common_test_dir, '43 options')
for opt, value in [('testoption', 'some other val'), ('other_one', True),
('combo_opt', 'one'), ('array_opt', ['two']),
- ('integer_opt', 0)]:
+ ('integer_opt', 0),
+ ('CaseSenSiTivE', 'SOME other Value'),
+ ('CASESENSITIVE', 'some other Value')]:
config = self.helper_create_native_file({'project options': {opt: value}})
with self.assertRaises(subprocess.CalledProcessError) as cm:
self.init(testcase, extra_args=['--native-file', config])
diff --git a/test cases/common/43 options/meson.build b/test cases/common/43 options/meson.build
index 08c5cca..2eccef7 100644
--- a/test cases/common/43 options/meson.build
+++ b/test cases/common/43 options/meson.build
@@ -34,4 +34,12 @@ if get_option('neg_int_opt') != -3
error('Incorrect value in negative integer option.')
endif
+if get_option('CaseSenSiTivE') != 'Some CAPS'
+ error('Incorrect value in mixed caps option.')
+endif
+
+if get_option('CASESENSITIVE') != 'ALL CAPS'
+ error('Incorrect value in all caps option.')
+endif
+
assert(get_option('wrap_mode') == 'default', 'Wrap mode option is broken.')
diff --git a/test cases/common/43 options/meson_options.txt b/test cases/common/43 options/meson_options.txt
index db649de..8067eae 100644
--- a/test cases/common/43 options/meson_options.txt
+++ b/test cases/common/43 options/meson_options.txt
@@ -5,3 +5,5 @@ option('array_opt', type : 'array', choices : ['one', 'two', 'three'], value : [
option('free_array_opt', type : 'array')
option('integer_opt', type : 'integer', min : 0, max : -(-5), value : 3)
option('neg' + '_' + 'int' + '_' + 'opt', type : 'integer', min : -5, max : 5, value : -3)
+option('CaseSenSiTivE', type : 'string', value: 'Some CAPS', description : 'An option with mixed capitaliziation')
+option('CASESENSITIVE', type : 'string', value: 'ALL CAPS', description : 'An option with all caps')