diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2013-01-02 00:54:32 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2013-01-02 00:54:32 +0200 |
commit | e01200a4abb68050b3f62402aa329692d2ff8cd5 (patch) | |
tree | 99a9f4f9811ba952567c59905bf1591b919d67fe | |
parent | a1efb27a8e9f3e649c25c3ab16524df1a3af3e67 (diff) | |
download | meson-e01200a4abb68050b3f62402aa329692d2ff8cd5.zip meson-e01200a4abb68050b3f62402aa329692d2ff8cd5.tar.gz meson-e01200a4abb68050b3f62402aa329692d2ff8cd5.tar.bz2 |
Added support for C++.
-rwxr-xr-x | environment.py | 60 | ||||
-rwxr-xr-x | interpreter.py | 4 | ||||
-rw-r--r-- | test cases/2 cxx/builder.txt | 3 | ||||
-rw-r--r-- | test cases/2 cxx/trivial.cc | 5 |
4 files changed, 67 insertions, 5 deletions
diff --git a/environment.py b/environment.py index dabb74e..02675fa 100755 --- a/environment.py +++ b/environment.py @@ -63,12 +63,38 @@ class CCompiler(): pe = subprocess.Popen(binary_name) pe.wait() if pe.returncode != 0: - raise RuntimeError('Executables created by compiler %s are not runnable.' % self.name_string()) + raise RuntimeError('Executables created by C compiler %s are not runnable.' % self.name_string()) + +class CXXCompiler(CCompiler): + def __init__(self, exelist): + CCompiler.__init__(self, exelist) + + def can_compile(self, filename): + suffix = filename.split('.')[-1] + if suffix == 'cc' or suffix == 'cpp' or suffix == 'cxx' or \ + suffix == 'hh' or suffix == 'hpp' or suffix == 'hxx': + return True + return False + + def sanity_check(self, work_dir): + source_name = os.path.join(work_dir, 'sanitycheckcxx.cc') + binary_name = os.path.join(work_dir, 'sanitycheckcxx') + ofile = open(source_name, 'w') + ofile.write('class breakCCompiler;int main(int argc, char **argv) { return 0; }\n') + ofile.close() + pc = subprocess.Popen(self.exelist + [source_name, '-o', binary_name]) + pc.wait() + if pc.returncode != 0: + raise RuntimeError('Compiler %s can not compile programs.' % self.name_string()) + pe = subprocess.Popen(binary_name) + pe.wait() + if pe.returncode != 0: + raise RuntimeError('Executables created by C++ compiler %s are not runnable.' % self.name_string()) class GnuCCompiler(CCompiler): std_warn_flags = ['-Wall', '-Winvalid-pch'] std_opt_flags = ['-O2'] - + def __init__(self, exelist): CCompiler.__init__(self, exelist) @@ -78,6 +104,20 @@ class GnuCCompiler(CCompiler): def get_std_opt_flags(self): return GnuCCompiler.std_opt_flags +class GnuCXXCompiler(CXXCompiler): + std_warn_flags = ['-Wall', '-Winvalid-pch'] + std_opt_flags = ['-O2'] + + def __init__(self, exelist): + CXXCompiler.__init__(self, exelist) + + def get_std_warn_flags(self): + return GnuCXXCompiler.std_warn_flags + + def get_std_opt_flags(self): + return GnuCXXCompiler.std_opt_flags + + class Environment(): def __init__(self, source_dir, build_dir): self.source_dir = source_dir @@ -100,7 +140,7 @@ class Environment(): if evar in os.environ: return os.environ[evar].split() return self.default_c - + def detect_c_compiler(self): exelist = self.get_c_compiler_exelist() p = subprocess.Popen(exelist + ['--version'], stdout=subprocess.PIPE) @@ -109,11 +149,21 @@ class Environment(): if (out.startswith('cc ') or out.startswith('gcc')) and \ 'Free Software Foundation' in out: return GnuCCompiler(exelist) - raise EnvironmentException('Unknown compiler "' + execmd + '"') - + raise EnvironmentException('Unknown compiler "' + ' '.join(exelist) + '"') + def get_scratch_dir(self): return self.scratch_dir + def detect_cxx_compiler(self): + exelist = self.get_cxx_compiler_exelist() + p = subprocess.Popen(exelist + ['--version'], stdout=subprocess.PIPE) + out = p.communicate()[0] + out = out.decode() + if (out.startswith('c++ ') or out.startswith('g++')) and \ + 'Free Software Foundation' in out: + return GnuCXXCompiler(exelist) + raise EnvironmentException('Unknown compiler "' + ' '.join(exelist) + '"') + def get_cxx_compiler_exelist(self): evar = 'CXX' if evar in os.environ: diff --git a/interpreter.py b/interpreter.py index 601c5d0..0fa6dfb 100755 --- a/interpreter.py +++ b/interpreter.py @@ -144,6 +144,10 @@ class Interpreter(): comp = self.environment.detect_c_compiler() comp.sanity_check(self.environment.get_scratch_dir()) self.compilers.append(comp) + elif lang.lower() == 'c++': + comp = self.environment.detect_cxx_compiler() + comp.sanity_check(self.environment.get_scratch_dir()) + self.compilers.append(comp) else: raise InvalidCode('Tried to use unknown language "%s".' % lang) diff --git a/test cases/2 cxx/builder.txt b/test cases/2 cxx/builder.txt new file mode 100644 index 0000000..89e9910 --- /dev/null +++ b/test cases/2 cxx/builder.txt @@ -0,0 +1,3 @@ +project('trivial test') +language('c++') +exe = executable('trivialprog', 'trivial.cc') diff --git a/test cases/2 cxx/trivial.cc b/test cases/2 cxx/trivial.cc new file mode 100644 index 0000000..84a584a --- /dev/null +++ b/test cases/2 cxx/trivial.cc @@ -0,0 +1,5 @@ +#include<iostream> + +int main(int argc, char **argv) { + return 0; +} |