aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2016-01-17 22:07:35 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2016-01-17 22:07:35 +0200
commit2d1aa395e86848ca948d30d83cc5357777e5b490 (patch)
tree4de376b5b6b69471f3b5edd871902ecd90cc1e1e
parent926b55076f1fa94f887dd62443c66a886af0b78b (diff)
downloadmeson-2d1aa395e86848ca948d30d83cc5357777e5b490.zip
meson-2d1aa395e86848ca948d30d83cc5357777e5b490.tar.gz
meson-2d1aa395e86848ca948d30d83cc5357777e5b490.tar.bz2
Dumped fastvapi and made library linking with Vala work.
-rw-r--r--ninjabackend.py129
-rw-r--r--test cases/vala/6 static library/meson.build11
-rw-r--r--test cases/vala/6 static library/mylib.vala5
-rw-r--r--test cases/vala/6 static library/prog.vala7
4 files changed, 87 insertions, 65 deletions
diff --git a/ninjabackend.py b/ninjabackend.py
index c818f1d..fe0d4c9 100644
--- a/ninjabackend.py
+++ b/ninjabackend.py
@@ -300,7 +300,10 @@ int dummy;
# compile we get precise dependency info from dep files.
# This should work in all cases. If it does not, then just
# move them from orderdeps to proper deps.
- obj_list.append(self.generate_single_compile(target, outfile, src, True, [], header_deps))
+ if self.environment.is_header(src):
+ header_deps.append(src)
+ else:
+ obj_list.append(self.generate_single_compile(target, outfile, src, True, [], header_deps))
for src in target.get_sources():
if src.endswith('.vala'):
continue
@@ -773,22 +776,6 @@ int dummy;
outfile.write(description)
outfile.write('\n')
- def generate_fastvapi_compile(self, target, valac, outfile):
- fastvapis = {}
- for s in target.get_sources():
- if not s.endswith('.vala'):
- continue
- vapibase = os.path.basename(s.fname)[:-4] + 'vapi'
- rel_vapi = os.path.join(self.get_target_private_dir(target), vapibase)
- args = ['--fast-vapi=' + rel_vapi]
- rel_s = s.rel_to_builddir(self.build_to_src)
- element = NinjaBuildElement(rel_vapi, valac.get_language() + '_COMPILER', rel_s)
- element.add_item('ARGS', args)
- element.write(outfile)
- self.check_outputs(element)
- fastvapis[s] = (vapibase, rel_vapi)
- return fastvapis
-
def split_vala_sources(self, sources):
src = []
vapi_src = []
@@ -799,57 +786,73 @@ int dummy;
src.append(s)
return (src, vapi_src)
+ def determine_dep_vapis(self, target):
+ result = []
+ for dep in target.link_targets:
+ for i in dep.sources:
+ if hasattr(i, 'fname'):
+ i = i.fname
+ if i.endswith('vala'):
+ vapiname = os.path.splitext(os.path.split(i)[1])[0] + '.vapi'
+ fullname = os.path.join(self.get_target_private_dir(dep), vapiname)
+ result.append(fullname)
+ break
+ return result
+
def generate_vala_compile(self, target, outfile):
"""Vala is compiled into C. Set up all necessary build steps here."""
valac = self.environment.coredata.compilers['vala']
- fast_vapis = self.generate_fastvapi_compile(target, valac, outfile)
- generated_c = []
(src, vapi_src) = self.split_vala_sources(target.get_sources())
vapi_src = [x.rel_to_builddir(self.build_to_src) for x in vapi_src]
extra_dep_files = []
+ vala_input_files = []
for s in src:
- if not s.endswith('.vala'):
- continue
- args = ['-d', self.get_target_private_dir(target)]
- sc = os.path.basename(s.fname)[:-4] + 'c'
- args += ['-C']
- vapi_order_deps = []
- for (sourcefile, vapi_info) in fast_vapis.items():
- if sourcefile == s:
- continue
- (vapibase, rel_vapi) = vapi_info
- args += ['--use-fast-vapi=' + rel_vapi]
- vapi_order_deps.append(rel_vapi)
- relsc = os.path.join(self.get_target_private_dir(target), sc)
- rel_s = s.rel_to_builddir(self.build_to_src)
- args += ['--deps', relsc + '.d']
- if self.environment.coredata.get_builtin_option('werror'):
- args += valac.get_werror_args()
- for d in target.external_deps:
- if isinstance(d, dependencies.PkgConfigDependency):
- if d.name == 'glib-2.0' and d.version_requirement is not None \
- and d.version_requirement.startswith(('>=', '==')):
- args += ['--target-glib', d.version_requirement[2:]]
- args += ['--pkg', d.name]
- args += vapi_src
- extra_args = []
-
- for a in target.extra_args.get('vala', []):
- if isinstance(a, File):
- relname = a.rel_to_builddir(self.build_to_src)
- extra_dep_files.append(relname)
- extra_args.append(relname)
- else:
- extra_args.append(a)
- args += extra_args
- generated_c += [relsc]
- element = NinjaBuildElement(relsc, valac.get_language() + '_COMPILER', rel_s)
- element.add_item('ARGS', args)
- element.add_orderdep(vapi_order_deps)
- element.add_dep(extra_dep_files)
- element.write(outfile)
- self.check_outputs(element)
- return generated_c
+ if s.endswith('.vala'):
+ vala_input_files.append(s.rel_to_builddir(self.build_to_src))
+ namebase = os.path.splitext(os.path.split(vala_input_files[0])[1])[0]
+ hname = namebase + '.h'
+ vapiname = namebase + '.vapi'
+ outputs = [vapiname]
+
+ args = ['-d', self.get_target_private_dir(target)]
+ args += ['-C']#, '-o', cname]
+ if not isinstance(target, build.Executable):
+ outputs.append(hname)
+ args += ['-H', hname]
+ args += ['--vapi=' + vapiname]
+ for src in vala_input_files:
+ namebase = os.path.splitext(os.path.split(src)[1])[0] + '.c'
+ outputs.append(namebase)
+ if self.environment.coredata.get_builtin_option('werror'):
+ args += valac.get_werror_args()
+ for d in target.external_deps:
+ if isinstance(d, dependencies.PkgConfigDependency):
+ if d.name == 'glib-2.0' and d.version_requirement is not None \
+ and d.version_requirement.startswith(('>=', '==')):
+ args += ['--target-glib', d.version_requirement[2:]]
+ args += ['--pkg', d.name]
+ extra_args = []
+
+ for a in target.extra_args.get('vala', []):
+ if isinstance(a, File):
+ relname = a.rel_to_builddir(self.build_to_src)
+ extra_dep_files.append(relname)
+ extra_args.append(relname)
+ else:
+ extra_args.append(a)
+ dependency_vapis = self.determine_dep_vapis(target)
+ extra_dep_files += dependency_vapis
+ args += extra_args
+ args += dependency_vapis
+ outputs = [os.path.join(self.get_target_private_dir(target), x) for x in outputs]
+ element = NinjaBuildElement(outputs,
+ valac.get_language() + '_COMPILER',
+ vala_input_files + vapi_src)
+ element.add_item('ARGS', args)
+ element.add_dep(extra_dep_files)
+ element.write(outfile)
+ self.check_outputs(element)
+ return outputs
def generate_rust_target(self, target, outfile):
rustc = self.environment.coredata.compilers['rust']
@@ -1130,14 +1133,10 @@ int dummy;
command = ' command = %s $ARGS $in\n' % invoc
description = ' description = Compiling Vala source $in.\n'
restat = ' restat = 1\n' # ValaC does this always to take advantage of it.
- depfile = ' depfile = $out.d\n'
- depstyle = ' deps = gcc\n'
outfile.write(rule)
outfile.write(command)
outfile.write(description)
outfile.write(restat)
- outfile.write(depfile)
- outfile.write(depstyle)
outfile.write('\n')
def generate_rust_compile_rules(self, compiler, outfile):
diff --git a/test cases/vala/6 static library/meson.build b/test cases/vala/6 static library/meson.build
new file mode 100644
index 0000000..ae8eeb9
--- /dev/null
+++ b/test cases/vala/6 static library/meson.build
@@ -0,0 +1,11 @@
+project('valastatic', 'vala', 'c')
+
+valadeps = [dependency('glib-2.0'), dependency('gobject-2.0')]
+
+l = static_library('valalib', 'mylib.vala', dependencies : valadeps)
+
+e = executable('valaprog', 'prog.vala',
+link_with : l,
+dependencies : valadeps)
+
+test('valastatictest', e)
diff --git a/test cases/vala/6 static library/mylib.vala b/test cases/vala/6 static library/mylib.vala
new file mode 100644
index 0000000..5cc903b
--- /dev/null
+++ b/test cases/vala/6 static library/mylib.vala
@@ -0,0 +1,5 @@
+public class LibraryObject : Object {
+ public void func() {
+ stdout.printf("Method in library called.");
+ }
+}
diff --git a/test cases/vala/6 static library/prog.vala b/test cases/vala/6 static library/prog.vala
new file mode 100644
index 0000000..3c4a017
--- /dev/null
+++ b/test cases/vala/6 static library/prog.vala
@@ -0,0 +1,7 @@
+class MainApp : Object {
+ public static int main(string[] args) {
+ var l = new LibraryObject();
+ l.func();
+ return 0;
+ }
+}