aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2014-05-10 02:26:54 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2014-05-10 02:26:54 +0300
commit7edd58f591a91542ecb3e1ed694f458f5eff586e (patch)
treef6d6ce5d6f4b5962ec4dc644b0f105bd16b1ec5d
parent9c2364b51564f11815c2c04c08fdd53ae01ef1fa (diff)
downloadmeson-7edd58f591a91542ecb3e1ed694f458f5eff586e.zip
meson-7edd58f591a91542ecb3e1ed694f458f5eff586e.tar.gz
meson-7edd58f591a91542ecb3e1ed694f458f5eff586e.tar.bz2
Now can compile Vala executables.
-rw-r--r--backends.py19
-rw-r--r--environment.py3
-rw-r--r--interpreter.py3
-rw-r--r--ninjabackend.py21
-rw-r--r--test cases/vala/1 basic/meson.build4
-rw-r--r--test cases/vala/1 basic/prog.vala4
6 files changed, 45 insertions, 9 deletions
diff --git a/backends.py b/backends.py
index 55f3192..9edb62d 100644
--- a/backends.py
+++ b/backends.py
@@ -179,15 +179,25 @@ class Backend():
self.write_test_file(datafile)
datafile.close()
+ def has_vala(self, target):
+ for s in target.get_sources():
+ if s.endswith('.vala'):
+ return True
+ return False
+
def generate_target(self, target, outfile):
name = target.get_basename()
+ gen_src_deps = []
if name in self.processed_targets:
return
if isinstance(target, build.Jar):
self.generate_jar_target(target, outfile)
return
+ if 'vala' in self.environment.coredata.compilers.keys() and self.has_vala(target):
+ gen_src_deps += self.generate_vala_compile(target, outfile)
# The following deals with C/C++ compilation.
- (gen_src_deps, gen_other_deps) = self.process_dep_gens(outfile, target)
+ (gen_src, gen_other_deps) = self.process_dep_gens(outfile, target)
+ gen_src_deps += gen_src
self.process_target_dependencies(target, outfile)
self.generate_custom_generator_rules(target, outfile)
outname = self.get_target_filename(target)
@@ -228,6 +238,8 @@ class Backend():
# move them from orderdeps to proper deps.
obj_list.append(self.generate_single_compile(target, outfile, src, True, [], header_deps))
for src in target.get_sources():
+ if src.endswith('.vala'):
+ continue
if not self.environment.is_header(src):
src_list.append(src)
if is_unity:
@@ -264,7 +276,10 @@ class Backend():
for s in src:
if c.can_compile(s):
return cpp
- return self.build.compilers[0]
+ for c in self.build.compilers:
+ if c.get_language() != 'vala':
+ return c
+ raise RuntimeError('Unreachable code')
def determine_ext_objs(self, extobj, proj_dir_to_build_root=''):
result = []
diff --git a/environment.py b/environment.py
index d484c2b..15ff7da 100644
--- a/environment.py
+++ b/environment.py
@@ -574,6 +574,9 @@ class ValaCompiler():
if pc.returncode != 0:
raise EnvironmentException('Vala compiler %s can not compile programs.' % self.name_string())
+ def can_compile(self, fname):
+ return fname.endswith('.vala')
+
class VisualStudioCCompiler(CCompiler):
std_warn_flags = ['/W3']
std_opt_flags= ['/O2']
diff --git a/interpreter.py b/interpreter.py
index f9de829..61c32bb 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -894,9 +894,6 @@ class Interpreter():
if 'vala' in langs:
if not 'c' in langs:
raise InterpreterException('Compiling Vala requires a C compiler')
- # These are the implicit dependencies of Vala.
- self.func_dependency(None, ['glib-2.0'], {})
- self.func_dependency(None, ['gobject-2.0'], {})
def func_message(self, node, args, kwargs):
self.validate_arguments(args, 1, [str])
diff --git a/ninjabackend.py b/ninjabackend.py
index cc40d73..ad87377 100644
--- a/ninjabackend.py
+++ b/ninjabackend.py
@@ -419,6 +419,24 @@ class NinjaBackend(backends.Backend):
outfile.write(description)
outfile.write('\n')
+ 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']
+ generated_c = []
+ for s in target.get_sources():
+ if not s.endswith('.vala'):
+ continue
+ flags = ['-d', self.get_target_private_dir(target)]
+ sc = os.path.basename(s)[:-4] + 'c'
+ flags += ['-C', '-o', sc]
+ relsc = os.path.join(self.get_target_dir(target), target.get_basename() + '.dir', sc)
+ rel_s = os.path.join(self.build_to_src, s)
+ generated_c += [relsc]
+ element = NinjaBuildElement(relsc, valac.get_language() + '_COMPILER', rel_s)
+ element.add_item('FLAGS', flags)
+ element.write(outfile)
+ return generated_c
+
def generate_static_link_rules(self, is_cross, outfile):
if self.build.has_language('java'):
if not is_cross:
@@ -445,7 +463,7 @@ class NinjaBackend(backends.Backend):
for (complist, is_cross) in ctypes:
for compiler in complist:
langname = compiler.get_language()
- if langname == 'java':
+ if langname == 'java' or langname == 'vala':
continue
crstr = ''
if is_cross:
@@ -502,6 +520,7 @@ class NinjaBackend(backends.Backend):
if langname == 'vala':
if not is_cross:
self.generate_vala_compile_rules(compiler, outfile)
+ return
if is_cross:
crstr = '_CROSS'
else:
diff --git a/test cases/vala/1 basic/meson.build b/test cases/vala/1 basic/meson.build
index 334583d..53fbf99 100644
--- a/test cases/vala/1 basic/meson.build
+++ b/test cases/vala/1 basic/meson.build
@@ -1,4 +1,6 @@
project('valatest', 'vala', 'c')
-e = executable('valaprog', 'prog.vala')
+valadeps = [dependency('glib-2.0'), dependency('gobject-2.0')]
+
+e = executable('valaprog', 'prog.vala', deps : valadeps)
test('valatest', e)
diff --git a/test cases/vala/1 basic/prog.vala b/test cases/vala/1 basic/prog.vala
index 798def0..638e776 100644
--- a/test cases/vala/1 basic/prog.vala
+++ b/test cases/vala/1 basic/prog.vala
@@ -1,7 +1,7 @@
class MainProg : GLib.Object {
- public static int main(strings[] args) {
- stdout.printf("Vala is working.");
+ public static int main(string[] args) {
+ stdout.printf("Vala is working.\n");
return 0;
}
}