diff --git a/mesonbuild/compilers/vala.py b/mesonbuild/compilers/vala.py
index 839d544..2e35db1 100644
--- a/mesonbuild/compilers/vala.py
+++ b/mesonbuild/compilers/vala.py
@@ -142,6 +142,50 @@
     def get_option_link_args(self, options: 'KeyedOptionDictType') -> T.List[str]:
         return []
 
+    def build_wrapper_args(self, env: 'Environment',
+                           extra_args: T.Union[None, CompilerArgs, T.List[str], T.Callable[[CompileCheckMode], T.List[str]]],
+                           dependencies: T.Optional[T.List['Dependency']],
+                           mode: CompileCheckMode = CompileCheckMode.COMPILE) -> CompilerArgs:
+        if callable(extra_args):
+            extra_args = extra_args(mode)
+        if extra_args is None:
+            extra_args = []
+        if dependencies is None:
+            dependencies = []
+
+        # Collect compiler arguments
+        args = self.compiler_args(self.get_compiler_check_args(mode))
+        for d in dependencies:
+            # Add compile flags needed by dependencies
+            if mode is CompileCheckMode.LINK and self.force_link:
+                # As we are passing the parameter to valac we don't need the dependent libraries.
+                a = d.get_compile_args()
+                if a:
+                    p = a[0]
+                    n = p[max(p.rfind('/'), p.rfind('\\'))+1:]
+                    if not n == d.get_name():
+                        args += ['--pkg=' + d.get_name()] # This is used by gio-2.0 among others.
+                    else:
+                        args += ['--pkg=' + n]
+                else:
+                    args += ['--Xcc=-l' + d.get_name()] # This is used by the maths library(-lm) among others.
+            else:
+                args += d.get_compile_args()
+            if mode is CompileCheckMode.LINK:
+                # Add link flags needed to find dependencies
+                if not self.force_link: # There are no need for link dependencies when linking with valac.
+                    args += d.get_link_args()
+
+        if mode is CompileCheckMode.COMPILE:
+            # Add DFLAGS from the env
+            args += env.coredata.get_external_args(self.for_machine, self.language)
+        elif mode is CompileCheckMode.LINK:
+            # Add LDFLAGS from the env
+            args += env.coredata.get_external_link_args(self.for_machine, self.language)
+        # extra_args must override all other arguments, so we add them last
+        args += extra_args
+        return args
+
     def links(self, code: 'mesonlib.FileOrString', env: 'Environment', *,
               compiler: T.Optional['Compiler'] = None,
               extra_args: T.Union[None, T.List[str], CompilerArgs, T.Callable[[CompileCheckMode], T.List[str]]] = None,
diff --git a/test cases/vala/30 dependencies for compiler.links/meson.build b/test cases/vala/30 dependencies for compiler.links/meson.build
new file mode 100644
index 0000000..569cf40
--- /dev/null
+++ b/test cases/vala/30 dependencies for compiler.links/meson.build
@@ -0,0 +1,64 @@
+project('dependency-link-test', ['c', 'vala'], version: '0.1')
+
+valac = meson.get_compiler('vala')
+gee_dep = dependency('gee-0.8', required : false)
+
+code = '''void main() {
+  var a=new Gee.ArrayList<int> ();
+  a.add (42);
+  stdout.printf("%i",a[0]);}'''
+
+if gee_dep.found()
+  # test 1; code should link
+  code_links = valac.links(
+    code,
+    dependencies : [gee_dep],
+    name: 'links with gee-0.8 library? == YES',
+  )
+  assert (code_links, 'gee-0.8 library should link successfully.')
+endif
+
+# test 2; code should not link
+code_links = valac.links(
+  code,
+  name: 'links with gee library? == NO',
+)
+assert (not code_links, 'gee-0.8 library should not link successfully.')
+
+math_dep = meson.get_compiler('c').find_library('m', required : false)
+glib_dep = dependency('glib-2.0', required : false)
+
+code = '''void main() {
+  var a=GLib.Math.cos (GLib.Math.PI / 3);
+  stdout.printf("%f",a);}'''
+
+if math_dep.found() and glib_dep.found()
+  # test 3; code should link
+  code_links = valac.links(
+    code,
+    dependencies : [math_dep, glib_dep],
+    name: 'links with math & glib-2.0 library? == YES',
+  )
+  assert (code_links, 'Math library and glib-2.0 library should link successfully.')
+endif
+
+gio_dep = dependency('gio-2.0', required : false)
+
+code = '''void main() {var s = new GLib.Settings ("test");}'''
+
+if gio_dep.found()
+  # test 4; code should link
+  code_links = valac.links(
+    code,
+    dependencies : [gio_dep],
+    name: 'links with gio-2.0? == YES',
+  )
+  assert (code_links, 'gio-2.0 library should link successfully.')
+endif
+
+# test 5; code should not link
+  code_links = valac.links(
+    code,
+    name: 'links with gio-2.0? == NO',
+)
+assert (not code_links, 'gio-2.0 library should not link successfully.')
