cs24-project05.js 4.16 KB
const CC = 'clang'
const CFLAGS = ['-Wall', '-Wextra', '-Werror', '-DNREADLINE']

const SUBPYTHON = 'subpython'
const OBJS = [
  'arena.o', 'ast.o', 'eval.o', 'eval_dict.o', 'eval_list.o',
  'eval_refs.o', 'eval_types.o', 'exception.o', 'grammar.l.o',
  'grammar.y.o', 'mm.o', 'parser.o', 'refs.o', 'repl.o'
]
const TESTS1 = [
  'simple_math', 'simple_print', 'algo_fizzbuzz', 'algo_csum',
  'algo_join', 'algo_bubble', 'algo_bubble_str', 'stress_int',
  'stress_str', 'multiple_refs', 'long_chain', 'transpose', 'ordered_fractions'
]
const TESTS2 = TESTS1.concat([
  'dict_ops', 'long_chain_dict', 'tree', 'dict_resize', 'stress_struct'
])
const TESTS3 = TESTS2.concat([
  'self_cycle', 'simple_recursive', 'simple_rep', 'long_loops',
  'linked_list', 'gc_ref_counts', 'dense_graph', 'compacting', 'gc_tombstones'
])

const expectedName = test => `tests/${test}-expected.txt`
const actualName = test => `tests/${test}-actual.txt`
const resultName = test => `${test}-result`
const objectCommand = (target, dependencies) => ({
  target,
  dependencies,
  command: [CC, '-c', ...CFLAGS, dependencies[0], '-o', target]
})

module.exports = [
  objectCommand('arena.o', ['arena.c', 'arena.h']),
  objectCommand('ast.o', ['ast.c', 'ast.h', 'arena.h', 'types.h']),
  objectCommand('eval.o', [
    'eval.c', 'eval.h', 'ast.h', 'arena.h', 'types.h', 'config.h',
    'eval_refs.h', 'eval_types.h', 'exception.h', 'mm.h', 'refs.h'
  ]),
  objectCommand('eval_dict.o', [
    'eval_dict.c', 'eval_dict.h', 'types.h', 'eval_refs.h',
    'eval_types.h', 'ast.h', 'arena.h', 'exception.h', 'refs.h'
  ]),
  objectCommand('eval_list.o', [
    'eval_list.c', 'eval_list.h', 'types.h', 'eval_types.h',
    'ast.h', 'arena.h', 'exception.h', 'refs.h'
  ]),
  objectCommand('eval_refs.o', [
    'eval_refs.c', 'eval_refs.h', 'types.h', 'eval_types.h',
    'ast.h', 'arena.h', 'exception.h', 'refs.h'
  ]),
  objectCommand('eval_types.o', [
    'eval_types.c', 'eval_types.h', 'ast.h', 'arena.h', 'types.h', 'config.h',
    'eval_dict.h', 'eval_list.h', 'eval_refs.h', 'exception.h', 'refs.h'
  ]),
  objectCommand('exception.o', ['exception.c', 'exception.h']),
  objectCommand('grammar.l.o', [
    'grammar.l.c', 'grammar.y.h', 'ast.h', 'arena.h', 'types.h', 'config.h', 'parser.h'
  ]),
  objectCommand('grammar.y.o', [
    'grammar.y.c', 'ast.h', 'arena.h', 'types.h', 'config.h', 'parser.h', 'grammar.l.h'
  ]),
  objectCommand('mm.o', [
    'mm.c', 'mm.h', 'types.h', 'refs.h', 'eval_types.h', 'ast.h', 'arena.h', 'exception.h'
  ]),
  objectCommand('parser.o', [
    'parser.c', 'parser.h', 'arena.h', 'ast.h', 'types.h',
    'grammar.h', 'grammar.y.h', 'config.h', 'grammar.l.h'
  ]),
  objectCommand('refs.o', [
    'refs.c', 'refs.h', 'types.h', 'config.h', 'eval.h', 'ast.h', 'arena.h', 'mm.h'
  ]),
  objectCommand('repl.o', [
    'repl.c', 'config.h', 'eval.h', 'ast.h', 'arena.h', 'types.h',
    'eval_types.h', 'exception.h', 'mm.h', 'parser.h', 'refs.h'
  ]),
  {
    target: SUBPYTHON,
    dependencies: OBJS,
    command: [CC, ...CFLAGS, ...OBJS, '-o', SUBPYTHON]
  },
  ...TESTS3.map(test => {
    const dependency = `tests/${test}.py`
    const target = expectedName(test)
    return {
      target,
      dependencies: [dependency],
      command: ['sh', '-c', `grep '# output' ${dependency} | sed 's/# output //' > ${target}`]
    }
  }),
  ...TESTS3.map(test => {
    const dependency = `tests/${test}.py`
    const target = actualName(test)
    return {
      target,
      dependencies: [SUBPYTHON, dependency],
      command: ['sh', '-c', `./subpython \`grep '# -' ${dependency} | sed 's/#//'\` ${dependency} > ${target}`]
    }
  }),
  ...TESTS3.map(test => {
    const dependencies = [expectedName(test), actualName(test)]
    const target = resultName(test)
    return {
      target,
      dependencies,
      command: ['diff', '-u', ...dependencies]
    }
  }),
  {
    target: 'test1',
    dependencies: TESTS1.map(resultName)
  },
  {
    target: 'test2',
    dependencies: TESTS2.map(resultName)
  },
  {
    target: 'test3',
    dependencies: TESTS3.map(resultName)
  },
  {
    target: 'test',
    dependencies: ['test3']
  },
  {
    target: 'clean',
    dependencies: [],
    command: ['sh', '-c', 'rm -f *.d *.o subpython tests/*.txt']
  }
]