summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2020-10-13 16:47:23 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2020-10-13 23:51:25 +0300
commite36f713a7f5cc10d3f8adc7ae1c73ef6cce51082 (patch)
tree8b0c072a8ba46fa629bb99dfd460282953076f56
parente00df9046defea68ca449635d9ce3e849bc70807 (diff)
downloadmeson-e36f713a7f5cc10d3f8adc7ae1c73ef6cce51082.tar.gz
include_type: Add CMake subporject dependency method (fixes #6879)
-rw-r--r--docs/markdown/CMake-module.md5
-rw-r--r--docs/markdown/snippets/cmake_include_type.md5
-rw-r--r--mesonbuild/modules/cmake.py13
-rw-r--r--test cases/cmake/1 basic/meson.build3
4 files changed, 21 insertions, 5 deletions
diff --git a/docs/markdown/CMake-module.md b/docs/markdown/CMake-module.md
index 48c3d75b1..f811ab48e 100644
--- a/docs/markdown/CMake-module.md
+++ b/docs/markdown/CMake-module.md
@@ -133,7 +133,10 @@ kept for compatibility. It will not work together with the `options` kwarg.
This object is returned by the `subproject` function described above
and supports the following methods:
- - `dependency(target)` returns a dependency object for any CMake target.
+ - `dependency(target)` returns a dependency object for any CMake target. The
+ `include_type` kwarg *(new in 0.56.0)* controls the include type of the
+ returned dependency object similar to the same kwarg in the
+ [`dependency()`](Reference-manual.md#dependency) function.
- `include_directories(target)` returns a meson `include_directories()`
object for the specified target. Using this function is not necessary
if the dependency object is used.
diff --git a/docs/markdown/snippets/cmake_include_type.md b/docs/markdown/snippets/cmake_include_type.md
new file mode 100644
index 000000000..f8637c021
--- /dev/null
+++ b/docs/markdown/snippets/cmake_include_type.md
@@ -0,0 +1,5 @@
+## `include_type` support for the CMake subproject object dependency method
+
+The `dependency()` method of the CMake subproject object now also supports the
+`include_type` kwarg which is similar to the sane kwarg in the `dependency()`
+function.
diff --git a/mesonbuild/modules/cmake.py b/mesonbuild/modules/cmake.py
index 238375302..35c85a790 100644
--- a/mesonbuild/modules/cmake.py
+++ b/mesonbuild/modules/cmake.py
@@ -20,7 +20,7 @@ from . import ExtensionModule, ModuleReturnValue
from .. import build, dependencies, mesonlib, mlog
from ..cmake import SingleTargetOptions, TargetOptions, cmake_defines_to_args
-from ..interpreter import ConfigurationDataHolder, InterpreterException, SubprojectHolder
+from ..interpreter import ConfigurationDataHolder, InterpreterException, SubprojectHolder, DependencyHolder
from ..interpreterbase import (
InterpreterObject,
ObjectHolder,
@@ -105,11 +105,18 @@ class CMakeSubprojectHolder(InterpreterObject, ObjectHolder):
def get_variable(self, args, kwargs):
return self.held_object.get_variable_method(args, kwargs)
- @noKwargs
+ @FeatureNewKwargs('dependency', '0.56.0', ['include_type'])
+ @permittedKwargs({'include_type'})
@stringArgs
def dependency(self, args, kwargs):
info = self._args_to_info(args)
- return self.get_variable([info['dep']], kwargs)
+ orig = self.get_variable([info['dep']], {})
+ assert isinstance(orig, DependencyHolder)
+ actual = orig.include_type_method([], {})
+ if 'include_type' in kwargs and kwargs['include_type'] != actual:
+ mlog.debug('Current include type is {}. Converting to requested {}'.format(actual, kwargs['include_type']))
+ return orig.as_system_method([kwargs['include_type']], {})
+ return orig
@noKwargs
@stringArgs
diff --git a/test cases/cmake/1 basic/meson.build b/test cases/cmake/1 basic/meson.build
index 19c87c441..246473904 100644
--- a/test cases/cmake/1 basic/meson.build
+++ b/test cases/cmake/1 basic/meson.build
@@ -3,11 +3,12 @@ project('cmakeSubTest', ['c', 'cpp'])
cm = import('cmake')
sub_pro = cm.subproject('cmMod')
-sub_dep = sub_pro.dependency('cmModLib++')
+sub_dep = sub_pro.dependency('cmModLib++', include_type: 'system')
assert(sub_pro.found(), 'found() method reports not found, but should be found')
assert(sub_pro.target_list() == ['cmModLib++'], 'There should be exactly one target')
assert(sub_pro.target_type('cmModLib++') == 'shared_library', 'Target type should be shared_library')
+assert(sub_dep.include_type() == 'system', 'the include_type kwarg of dependency() works')
exe1 = executable('main', ['main.cpp'], dependencies: [sub_dep])
test('test1', exe1)