jtlcpy/jtlc

62 lines
1.7 KiB
Python
Executable File

#!/usr/bin/env python
import os
import sys
import argparse
import tempfile
from subprocess import *
import re
def main(argv):
parser = argparse.ArgumentParser(prog = 'jtlc',
description = "Josh's Toy Language Compiler")
parser.add_argument('-E', action = 'store_true',
help = 'Translate only; do not compile, assemble, or link')
parser.add_argument('-c', action = 'store_true',
help = 'Translate, compile, and assemble, but do not link')
parser.add_argument('-o', metavar = 'file', dest = 'output_file',
help = 'Output File')
parser.add_argument('sources', metavar = 'source',
nargs = '*', help = 'Input Source File')
args = parser.parse_args(argv[1:])
if len(args.sources) < 1:
sys.stderr.write(argv[0] + ': no input files\n')
return 1
ofiles = []
for s in args.sources:
tf = tempfile.NamedTemporaryFile(suffix = '.c', delete = False)
tfname = tf.name
build(args, s, tf)
tf.close()
m = re.match('(.*)\.jtl', s)
if m is not None:
ofname = m.group(1) + '.o'
else:
ofname = s + '.o'
do_compile(args, tfname, ofname)
os.unlink(tfname)
ofiles.append(ofname)
if not args.c:
do_link(args, ofiles)
return 0
def build(args, source, dest):
dest.write('hi\n')
def do_compile(args, source_fname, ofname):
Popen(['gcc', '-o', ofname, '-c', source_fname]).wait()
def do_link(args, ofiles):
cmd = ['gcc']
if args.output_file is not None:
cmd += ['-o', args.output_file]
cmd += ofiles
Popen(cmd).wait()
if __name__ == '__main__':
sys.exit(main(sys.argv))