import subprocess as sp

Import('env')

AddOption('--ocamlc', dest='ocamlc', default='ocamlc',
          help = 'Ocaml compiler to use')
AddOption('--ocaml_flags', dest='ocaml_flags', default='-I compiler',
          help = 'Ocaml compiler flags')
AddOption('--native', dest='native', default=False, action='store_true',
          help = 'Compile native code instead of bytecode')

obj_ext = '.cmo'
ocamlc = GetOption('ocamlc')
ocaml_flags = GetOption('ocaml_flags')

if GetOption('native'):
    ocamlc = 'ocamlopt'
    obj_ext = '.cmx'

ocaml_object = Builder(action = '$OCAMLC -c $OCAML_FLAGS $SOURCE')
ocaml_program = Builder(action = '$OCAMLC $OCAML_FLAGS $SOURCES -o $TARGET')
ocamllex = Builder(action = 'ocamllex $SOURCE')
ocamlyacc = Builder(action = 'ocamlyacc $SOURCE')
env.Append(OCAMLC = ocamlc, OCAML_FLAGS = ocaml_flags)
env.Append(BUILDERS = {'OcamlObject': ocaml_object,
                       'OcamlProgram': ocaml_program,
                       'Ocamllex': ocamllex,
                       'Ocamlyacc': ocamlyacc})

parsers = ['parser']
lexers = ['scanner']
source_files = ['symgen', 'ast', 'parser', 'scanner',
                'environment', 'detect', 'generator']

for name in parsers:
    env.Ocamlyacc([name + '.ml', name + '.mli'], name + '.mly')
    env.OcamlObject(name + '.cmi', name + '.mli')

for name in lexers:
    env.Ocamllex(name + '.ml', name + '.mll')

for name in source_files:
    if name in parsers:
        target = name + obj_ext
        deps = [name + '.ml', name + '.cmi']
    else:
        target = [name + '.cmi', name + obj_ext]
        deps = name + '.ml'
    env.OcamlObject(target, deps)

env.Depends('ast' + obj_ext, 'symgen.cmi')
env.Depends('environment' + obj_ext, 'ast.cmi')
env.Depends('parser' + obj_ext, 'ast.cmi')
env.Depends('scanner' + obj_ext, 'parser.cmi')
env.Depends('detect' + obj_ext, ['environment.cmi', 'ast.cmi'])
env.Depends('generator' + obj_ext, ['environment.cmi', 'parser.cmi',
                                    'ast.cmi', 'scanner.cmi'])

env.OcamlProgram('generator',
        [source_file + obj_ext for source_file in source_files])
