aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2018-12-16 21:53:17 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2018-12-22 19:00:40 +0200
commit4df9006ca43338fea07b9d542f94da34369e43d3 (patch)
tree26e1802d99239d6b9c71f050771f323454da1498
parent7d5660dcbe15fb88edcd614c6288e2aa87c0698f (diff)
downloadmeson-4df9006ca43338fea07b9d542f94da34369e43d3.zip
meson-4df9006ca43338fea07b9d542f94da34369e43d3.tar.gz
meson-4df9006ca43338fea07b9d542f94da34369e43d3.tar.bz2
Can specify a string to print when dep not found. Closes #2407.
-rw-r--r--docs/markdown/Reference-manual.md2
-rw-r--r--docs/markdown/snippets/notfound_message.md38
-rw-r--r--mesonbuild/interpreter.py18
-rw-r--r--test cases/linuxlike/1 pkg-config/meson.build6
4 files changed, 62 insertions, 2 deletions
diff --git a/docs/markdown/Reference-manual.md b/docs/markdown/Reference-manual.md
index 2fc61d5..8d0d123 100644
--- a/docs/markdown/Reference-manual.md
+++ b/docs/markdown/Reference-manual.md
@@ -395,6 +395,8 @@ are also supported. This function supports the following keyword arguments:
the build machine system rather than the host system (i.e. where the
cross compiled binary will run on), usually only needed if you build
a tool to be used during compilation.
+- `not_found_message` *(added 0.50.0)* is an optional string that will
+ be printed as a `message()` if the dependency was not found.
- `required`, when set to false, Meson will proceed with the build
even if the dependency is not found. Since *0.47.0* the value of a
[`feature`](Build-options.md#features) option can also be passed.
diff --git a/docs/markdown/snippets/notfound_message.md b/docs/markdown/snippets/notfound_message.md
new file mode 100644
index 0000000..d73c6b2
--- /dev/null
+++ b/docs/markdown/snippets/notfound_message.md
@@ -0,0 +1,38 @@
+## New `not_found_message` for dependency
+
+You can now specify a `not_found_message` that will be printed if the
+specified dependency was not found. The point is to convert constructs
+that look like this:
+
+```meson
+d = dependency('something', required: false)
+if not d.found()
+ message('Will not be able to do something.')
+endif
+```
+
+Into this:
+
+```meson
+d = dependency('something',
+ required: false,
+ not_found_message: 'Will not be able to do something.')
+```
+
+Or constructs like this:
+
+```meson
+d = dependency('something', required: false)
+if not d.found()
+ error('Install something by doing XYZ.')
+endif
+```
+
+into this:
+
+```meson
+d = dependency('something',
+ not_found_message: 'Install something by doing XYZ.')
+```
+
+Which works, because the default value of `required` is `true`.
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 8012486..6fef4a9 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1900,6 +1900,7 @@ permitted_kwargs = {'add_global_arguments': {'language', 'native'},
'modules',
'optional_modules',
'native',
+ 'not_found_message',
'required',
'static',
'version',
@@ -2645,6 +2646,9 @@ external dependencies (including libraries) must go to "dependencies".''')
@noKwargs
def func_message(self, node, args, kwargs):
argstr = self.get_message_string_arg(node)
+ self.message_impl(argstr)
+
+ def message_impl(self, argstr):
mlog.log(mlog.bold('Message:'), argstr)
@FeatureNew('warning', '0.44.0')
@@ -3013,13 +3017,27 @@ external dependencies (including libraries) must go to "dependencies".''')
@FeatureNewKwargs('dependency', '0.49.0', ['disabler'])
@FeatureNewKwargs('dependency', '0.40.0', ['method'])
@FeatureNewKwargs('dependency', '0.38.0', ['default_options'])
+ @FeatureNewKwargs('dependency', '0.50.0', ['not_found_message'])
@disablerIfNotFound
@permittedKwargs(permitted_kwargs['dependency'])
def func_dependency(self, node, args, kwargs):
self.validate_arguments(args, 1, [str])
name = args[0]
display_name = name if name else '(anonymous)'
+ not_found_message = kwargs.get('not_found_message', '')
+ if not isinstance(not_found_message, str):
+ raise InvalidArguments('The not_found_message must be a string.')
+ try:
+ d = self.dependency_impl(name, display_name, kwargs)
+ except Exception:
+ if not_found_message:
+ self.message_impl(not_found_message)
+ raise
+ if not d.found() and not_found_message:
+ self.message_impl(not_found_message)
+ return d
+ def dependency_impl(self, name, display_name, kwargs):
disabled, required, feature = extract_required_kwarg(kwargs, self.subproject)
if disabled:
mlog.log('Dependency', mlog.bold(display_name), 'skipped: feature', mlog.bold(feature), 'disabled')
diff --git a/test cases/linuxlike/1 pkg-config/meson.build b/test cases/linuxlike/1 pkg-config/meson.build
index 17ee192..891fea4 100644
--- a/test cases/linuxlike/1 pkg-config/meson.build
+++ b/test cases/linuxlike/1 pkg-config/meson.build
@@ -2,7 +2,8 @@ project('external dependency', 'c')
# Zlib is probably on all dev machines.
-dep = dependency('zlib', version : '>=1.2')
+dep = dependency('zlib', version : '>=1.2',
+ not_found_message: 'DANGER! DANGER! THIS MUST NEVER BE SEEN!')
exe = executable('zlibprog', 'prog-checkver.c',
dependencies : dep,
c_args : '-DFOUND_ZLIB="' + dep.version() + '"')
@@ -29,7 +30,8 @@ test('zlibtest2', exe2)
# Try to find a nonexistent library to ensure requires:false works.
-dep = dependency('nvakuhrabnsdfasdf', required : false)
+dep = dependency('nvakuhrabnsdfasdf', required : false,
+ not_found_message : 'This dependency was not found as was expected.')
# Try to compile a test that takes a dep and an include_directories