aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/markdown/snippets/per_subproject_builtin.md9
-rw-r--r--mesonbuild/backend/backends.py2
-rw-r--r--mesonbuild/coredata.py2
-rw-r--r--mesonbuild/modules/hotdoc.py2
-rw-r--r--test cases/common/229 persubproject options/meson.build5
-rw-r--r--test cases/common/229 persubproject options/subprojects/sub2/foo.c4
-rw-r--r--test cases/common/229 persubproject options/subprojects/sub2/meson.build5
7 files changed, 20 insertions, 9 deletions
diff --git a/docs/markdown/snippets/per_subproject_builtin.md b/docs/markdown/snippets/per_subproject_builtin.md
index 44ed1c8..b0c3ce9 100644
--- a/docs/markdown/snippets/per_subproject_builtin.md
+++ b/docs/markdown/snippets/per_subproject_builtin.md
@@ -1,8 +1,9 @@
-## Per subproject `default_library` option
+## Per subproject `default_library` and `werror` options
-The `default_library` built-in option can now be defined per subproject. This is
-useful for example when building shared libraries in the main project, but static
-link a subproject.
+The `default_library` and `werror` built-in options can now be defined per subproject.
+This is useful for example when building shared libraries in the main project,
+but static link a subproject, or when the main project must build with no warnings
+but some subprojects cannot.
Most of the time this would be used either by the parent project by setting
subproject's default_options (e.g. `subproject('foo', default_options: 'default_library=static')`),
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index ab922ba..687b122 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -179,7 +179,7 @@ class Backend:
if option_name in target.option_overrides:
override = target.option_overrides[option_name]
return self.environment.coredata.validate_option_value(option_name, override)
- return self.environment.coredata.get_builtin_option(option_name)
+ return self.environment.coredata.get_builtin_option(option_name, target.subproject)
def get_target_filename_for_linking(self, target):
# On some platforms (msvc for instance), the file that is used for
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
index 7038bf7..074f9e6 100644
--- a/mesonbuild/coredata.py
+++ b/mesonbuild/coredata.py
@@ -1104,7 +1104,7 @@ builtin_options = OrderedDict([
('unity', BuiltinOption(UserComboOption, 'Unity build', 'off', choices=['on', 'off', 'subprojects'])),
('unity_size', BuiltinOption(UserIntegerOption, 'Unity block size', (2, None, 4))),
('warning_level', BuiltinOption(UserComboOption, 'Compiler warning level to use', '1', choices=['0', '1', '2', '3'])),
- ('werror', BuiltinOption(UserBooleanOption, 'Treat warnings as errors', False)),
+ ('werror', BuiltinOption(UserBooleanOption, 'Treat warnings as errors', False, yielding=False)),
('wrap_mode', BuiltinOption(UserComboOption, 'Wrap mode', 'default', choices=['default', 'nofallback', 'nodownload', 'forcefallback'])),
])
diff --git a/mesonbuild/modules/hotdoc.py b/mesonbuild/modules/hotdoc.py
index bf4386f..5c04e27 100644
--- a/mesonbuild/modules/hotdoc.py
+++ b/mesonbuild/modules/hotdoc.py
@@ -326,7 +326,7 @@ class HotdocTargetBuilder:
for path in self.include_paths.keys():
self.cmd.extend(['--include-path', path])
- if self.state.environment.coredata.get_builtin_option('werror'):
+ if self.state.environment.coredata.get_builtin_option('werror', self.state.subproject):
self.cmd.append('--fatal-warning')
self.generate_hotdoc_config()
diff --git a/test cases/common/229 persubproject options/meson.build b/test cases/common/229 persubproject options/meson.build
index 6a76697..20dff90 100644
--- a/test cases/common/229 persubproject options/meson.build
+++ b/test cases/common/229 persubproject options/meson.build
@@ -1,6 +1,9 @@
-project('persubproject options', 'c', default_options : ['default_library=both'])
+project('persubproject options', 'c',
+ default_options : ['default_library=both',
+ 'werror=true'])
assert(get_option('default_library') == 'both', 'Parent default_library should be "both"')
+assert(get_option('werror'))
# Check it build both by calling a method only both_libraries target implement
lib = library('lib1', 'foo.c')
diff --git a/test cases/common/229 persubproject options/subprojects/sub2/foo.c b/test cases/common/229 persubproject options/subprojects/sub2/foo.c
index 63e4de6..cf7201b 100644
--- a/test cases/common/229 persubproject options/subprojects/sub2/foo.c
+++ b/test cases/common/229 persubproject options/subprojects/sub2/foo.c
@@ -1,5 +1,9 @@
int foo(void);
+#ifdef __GNUC__
+#warning This should not produce error
+#endif
+
int foo(void) {
return 0;
}
diff --git a/test cases/common/229 persubproject options/subprojects/sub2/meson.build b/test cases/common/229 persubproject options/subprojects/sub2/meson.build
index 546884d..f1226b8 100644
--- a/test cases/common/229 persubproject options/subprojects/sub2/meson.build
+++ b/test cases/common/229 persubproject options/subprojects/sub2/meson.build
@@ -1,6 +1,9 @@
-project('sub2', 'c', default_options : ['default_library=shared'])
+project('sub2', 'c',
+ default_options : ['default_library=shared',
+ 'werror=false'])
assert(get_option('default_library') == 'static', 'Parent should override default_library')
+assert(not get_option('werror'))
# If it doesn't build only a static library, it would make target name clash.
library('lib1', 'foo.c')