aboutsummaryrefslogtreecommitdiff
path: root/ninjabackend.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2014-06-18 01:22:55 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2014-06-18 01:22:55 +0300
commitf22376701bdebbda70b8d521a2da8f5376e6fdaa (patch)
tree6e7f995e9953853364fe0f70cc61e9aed29a8a19 /ninjabackend.py
parent5fee2dd325680ca8ca4fa5727259ef17cdb859e9 (diff)
downloadmeson-f22376701bdebbda70b8d521a2da8f5376e6fdaa.zip
meson-f22376701bdebbda70b8d521a2da8f5376e6fdaa.tar.gz
meson-f22376701bdebbda70b8d521a2da8f5376e6fdaa.tar.bz2
Can compile very basic Rust programs.
Diffstat (limited to 'ninjabackend.py')
-rw-r--r--ninjabackend.py38
1 files changed, 37 insertions, 1 deletions
diff --git a/ninjabackend.py b/ninjabackend.py
index 00389c8..8cde99d 100644
--- a/ninjabackend.py
+++ b/ninjabackend.py
@@ -495,6 +495,24 @@ class NinjaBackend(backends.Backend):
element.write(outfile)
return generated_c
+ def generate_rust_target(self, target, outfile):
+ rustc = self.environment.coredata.compilers['rust']
+ relsrc = []
+ for i in target.get_sources():
+ if not rustc.can_compile(i):
+ raise InvalidArguments('Rust target %s contains a non-rust source file.' % target.get_basename())
+ relsrc.append(os.path.join(self.build_to_src, i))
+ target_name = os.path.join(target.subdir, target.get_filename())
+ flags = ['--crate-type']
+ if isinstance(target, build.Executable):
+ flags.append('bin')
+ else:
+ raise InvalidArguments('Unknown target type for rustc.')
+ flags += ['--out-dir', target.subdir, '-o', target.get_basename()]
+ element = NinjaBuildElement(target_name, 'rust_COMPILER', relsrc)
+ element.add_item('FLAGS', flags)
+ element.write(outfile)
+
def generate_static_link_rules(self, is_cross, outfile):
if self.build.has_language('java'):
if not is_cross:
@@ -521,7 +539,7 @@ class NinjaBackend(backends.Backend):
for (complist, is_cross) in ctypes:
for compiler in complist:
langname = compiler.get_language()
- if langname == 'java' or langname == 'vala':
+ if langname == 'java' or langname == 'vala' or langname == 'rust':
continue
crstr = ''
if is_cross:
@@ -576,6 +594,20 @@ class NinjaBackend(backends.Backend):
outfile.write(depstyle)
outfile.write('\n')
+ def generate_rust_compile_rules(self, compiler, outfile):
+ rule = 'rule %s_COMPILER\n' % compiler.get_language()
+ invoc = ' '.join([ninja_quote(i) for i in compiler.get_exelist()])
+ command = ' command = %s $FLAGS $in\n' % invoc
+ description = ' description = Compiling Rust source $in.\n'
+ depfile = ' depfile = $out.d\n'
+ depstyle = ' deps = gcc\n'
+ outfile.write(rule)
+ outfile.write(command)
+ outfile.write(description)
+ outfile.write(depfile)
+ outfile.write(depstyle)
+ outfile.write('\n')
+
def generate_compile_rule_for(self, langname, compiler, qstr, is_cross, outfile):
if langname == 'java':
if not is_cross:
@@ -585,6 +617,10 @@ class NinjaBackend(backends.Backend):
if not is_cross:
self.generate_vala_compile_rules(compiler, outfile)
return
+ if langname == 'rust':
+ if not is_cross:
+ self.generate_rust_compile_rules(compiler, outfile)
+ return
if is_cross:
crstr = '_CROSS'
else: