Moved compiler detection inside Environment.

This commit is contained in:
Jussi Pakkanen 2013-01-01 21:00:22 +02:00
parent 6502708b08
commit 016b9093d7
4 changed files with 19 additions and 32 deletions

View File

@ -67,7 +67,7 @@ class Builder():
raise interpreter.InvalidCode('Builder file is empty.')
assert(isinstance(code, str))
env = environment.Environment(self.source_dir, self.build_dir)
intr = interpreter.Interpreter(code, env.get_scratch_dir())
intr = interpreter.Interpreter(code, env)
g = shellgenerator.ShellGenerator(intr, env)
g.generate()

View File

@ -20,16 +20,6 @@ class EnvironmentException(Exception):
def __init(self, *args, **kwargs):
Exception.__init__(self, *args, **kwargs)
def detect_c_compiler(execmd):
exelist = execmd.split()
p = subprocess.Popen(exelist + ['--version'], stdout=subprocess.PIPE)
out = p.communicate()[0]
out = out.decode()
if (out.startswith('cc ') or out.startswith('gcc')) and \
'Free Software Foundation' in out:
return GnuCCompiler(exelist)
raise EnvironmentException('Unknown compiler "' + execmd + '"')
class CCompiler():
def __init__(self, exelist):
if type(exelist) == type(''):
@ -91,19 +81,6 @@ class GnuCCompiler(CCompiler):
def shell_quote(cmdlist):
return ["'" + x + "'" for x in cmdlist]
def test_cmd_line_building():
src_file = 'file.c'
dst_file = 'file.o'
gnuc = detect_c_compiler('/usr/bin/cc')
cmds = gnuc.get_exelist()
cmds += gnuc.get_std_warn_flags()
cmds += gnuc.get_compile_only_flags()
cmds.append(src_file)
cmds += gnuc.get_output_flags()
cmds.append(dst_file)
cmd_line = ' '.join(shell_quote(cmds))
print(cmd_line)
class Environment():
def __init__(self, source_dir, build_dir):
self.source_dir = source_dir
@ -121,16 +98,26 @@ class Environment():
self.static_lib_prefix = 'lib'
self.object_suffix = 'o'
def get_c_compiler(self):
def get_c_compiler_exelist(self):
evar = 'CC'
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)
out = p.communicate()[0]
out = out.decode()
if (out.startswith('cc ') or out.startswith('gcc')) and \
'Free Software Foundation' in out:
return GnuCCompiler(exelist)
raise EnvironmentException('Unknown compiler "' + execmd + '"')
def get_scratch_dir(self):
return self.scratch_dir
def get_cxx_compiler(self):
def get_cxx_compiler_exelist(self):
evar = 'CXX'
if evar in os.environ:
return os.environ[evar].split()

View File

@ -66,14 +66,14 @@ class Executable(BuildTarget):
class Interpreter():
def __init__(self, code, scratch_dir):
def __init__(self, code, environment):
self.ast = parser.build_ast(code)
self.sanity_check_ast()
self.project = None
self.compilers = []
self.targets = {}
self.variables = {}
self.scratch_dir = scratch_dir
self.environment = environment
def get_project(self):
return self.project
@ -141,8 +141,8 @@ class Interpreter():
raise InvalidCode('Function language() can only be called once (line %d).' % node.lineno())
for lang in args:
if lang.lower() == 'c':
comp = environment.detect_c_compiler('gcc')
comp.sanity_check(self.scratch_dir)
comp = self.environment.detect_c_compiler()
comp.sanity_check(self.environment.get_scratch_dir())
self.compilers.append(comp)
else:
raise InvalidCode('Tried to use unknown language "%s".' % lang)
@ -238,5 +238,5 @@ if __name__ == '__main__':
dep = find_dep('gtk+-3.0')
prog.add_dep(dep)
"""
i = Interpreter(code, '.')
i = Interpreter(code, environment.Environment('.', 'work area'))
i.run()

View File

@ -98,6 +98,6 @@ if __name__ == '__main__':
import interpreter, environment
os.chdir(os.path.split(__file__)[0])
envir = environment.Environment('.', 'work area')
intpr = interpreter.Interpreter(code, envir.get_scratch_dir())
intpr = interpreter.Interpreter(code, envir)
g = ShellGenerator(intpr, envir)
g.generate()